Linux 中的 AutoHotKey 键映射替代方案
阅读原文时间:2023年07月09日阅读:2

初次了解AutoHotKey,是在Win 下最爱效率神器:AutoHotKey | 晚晴幽草轩这篇博客中,博主有对AutoHotKey作详细介绍,这里不再赘余。当时打字很慢,更苦于写代码时需要经常按方向键、HomeEnd以及删除键等等按键(当然这些问题有些编辑器就可以解决),还经常涉及到文本选择,对个人而言很是痛苦,直到遇到了AutoHotKey,解决了一大痛点,可以用它来重新布局我的键盘。看到了@冯若航大佬分享的AHK脚本AutoHotKey 常用函数或小技巧有哪些分享?,我稍微做了一丁点修改及删减,主要的按键映射如下图所示(全部是关于和CapsLock按键的组合应用,完整功能见代码):

这里稍微说明一下:将CapsLock键映射为了ESC键,CapsLock键通过CapsLock + \来实现,图中的实现默认为和CapsLock组合按下时生效(如CapsLock + T插入当前的日期和时间,CapsLock + D复制当前行等等);另外,关于光标移动,比如CapsLock + H映射为Home键,若再同时按下Alt键,则可实现选中当前光标到Home键位置之间的文本,其余的比如CapsLock + Alt + U实现向前选中一个字词皆类似,依此类推详见上图(另外,还可按住CapsLock + Alt不松手,多次按下不同的光标移动映射按键,以此来实现快速精确的选中任何文本)。

这里也把代码分享一下,我的CapsLock.ahk脚本如下所示:

;---- CapsLock Initializer ----
SetCapsLockState, AlwaysOff

;---- CapsLock + \ === CapsLock ----
CapsLock & \::
GetKeyState, CapsLockState, CapsLock, T
if CapsLockState = D
    SetCapsLockState, AlwaysOff
else
    SetCapsLockState, AlwaysOn
KeyWait, \
return

;---- CapsLock === ESC ----
CapsLock::Send, {ESC}

;---- Editor ----
CapsLock & z:: Send, ^z             ; Z = Cancel
CapsLock & x:: Send, ^x             ; X = Cut
CapsLock & c:: Send, ^c             ; C = Copy
CapsLock & v:: Send, ^v             ; V = Paste
CapsLock & a:: Send, ^a             ; A = Select All
CapsLock & g:: Send, ^y             ; Y = Redo
;---- Delete ----
CapsLock & ,:: Send, {Del}          ; , = Del char after
CapsLock & .:: Send, ^{Del}         ; . = Del word after
CapsLock & /:: Send, +{End}{Del}    ; / = Del all  after
CapsLock & m:: Send, {BS}           ; m = Del char before
CapsLock & n:: Send, ^{BS}          ; n = Del word before
CapsLock & b:: Send, +{Home}{Del}   ; b = Del all  before
;---- ---- ---- ----
CapsLock & f:: Send, ^f             ; F = Find
CapsLock & w:: Send, ^w             ; W = Close
CapsLock & s:: Send, ^s             ; S = Save
CapsLock & e:: Send, !{F4}          ; E = Exit
;---- ---- ---- ----
CapsLock & q:: Send, {Enter}
CapsLock & r:: Send, {AppsKey}
;---- ---- ---- ----
CapsLock & =:: Send, ^{WheelUp}
CapsLock & -:: Send, ^{WheelDown}

;---- CapsLock + D === Copy Current Line ----
CapsLock & d:: send, {Home}+{End}^c{End}

;---- CapsLock + T === Insert Current Time ----
CapsLock & t:: Send, %A_YYYY%{Asc 45}%A_MM%{Asc 45}%A_DD%{Asc 32}%A_Hour%{Asc 58}%A_Min%{Asc 58}%A_Sec%

;---- U === Word Before ----
CapsLock & u::
if getkeystate("alt") = 0
    Send, ^{Left}
else
    Send, ^+{Left}
return

;---- O === Word After ----
CapsLock & o::
if getkeystate("alt") = 0
    Send, ^{Right}
else
    Send, ^+{Right}
return

;---- P === PageDown ----
CapsLock & p::
if getkeystate("alt") = 0
    Send, {PgDn}
else
    Send, +{PgDn}
return

;---- Y === PageUp ----
CapsLock & y::
if getkeystate("alt") = 0
    Send, {PgUp}
else
    Send, +{PgUp}
return

;---- H === Home ----
CapsLock & h::
if getkeystate("alt") = 0
    Send, {Home}
else
    Send, +{Home}
return

;---- ; === End ----
CapsLock & `;::
if getkeystate("alt") = 0
    Send, {End}
else
    Send, +{End}
return

;---- J === Left ----
CapsLock & j::
if getkeystate("alt") = 0
    Send, {Left}
else
    Send, +{Left}
return

;---- K === Down ----
CapsLock & k::
if getkeystate("alt") = 0
    Send, {Down}
else
    Send, +{Down}
return

;---- I === Up ----
CapsLock & i::
if getkeystate("alt") = 0
    Send, {Up}
else
    Send, +{Up}
return

;---- L === Right ----
CapsLock & l::
if getkeystate("alt") = 0
    Send, {Right}
else
    Send, +{Right}
return

;---- Mouse Controller ----
CapsLock & Up::    MouseMove, 0, -10, 0, R  ; Mouse Up
CapsLock & Down::  MouseMove, 0, 10, 0, R   ; Mouse Down
CapsLock & Left::  MouseMove, -10, 0, 0, R  ; Mouse Left
CapsLock & Right:: MouseMove, 10, 0, 0, R   ; Mouse Right

;---- CapsLock + Enter(Push Release) === Mouse Left Push(Release) ----
CapsLock & Enter::
SendEvent {Blind}{LButton down}
KeyWait Enter
SendEvent {Blind}{LButton up}
return

;---- Scroll Left ----
CapsLock & WheelUp::    ; 向左滚动
ControlGetFocus, fcontrol, A
Loop 2  ; <-- 增加这个值来加快滚动速度
    SendMessage, 0x114, 0, 0, %fcontrol%, A  ; 0x114 是 WM_HSCROLL, 它后面的 0 是 SB_LINELEFT
return

;---- Scroll Right ----
CapsLock & WheelDown::  ; 向右滚动
ControlGetFocus, fcontrol, A
Loop 2  ; <-- 增加这个值来加快滚动速度
    SendMessage, 0x114, 1, 0, %fcontrol%, A  ; 0x114 是 WM_HSCROLL, 它后面的 1 是 SB_LINERIGHT
return

但在使用 Linux 时,没有了AutoHotKey的按键映射,很不习惯,最后找到了Xmodmap的解决方案。参考链接:Xmodmap (简体中文),这里也把配置文件~/.Xmodmap分享出来,如下所示:

!-- xmodmap ~/.Xmodmap --!
! Caps_Lock -> Mode_switch
clear  lock
add    mod5 = Caps_Lock
keycode  66 = Mode_switch

! Caps_Lock + \     -> Caps_Lock
keycode  51 = backslash bar Caps_Lock

! Caps_Lock + space -> Escape
keycode  65 = space NoSymbol Escape

! Caps_Lock + q     -> Enter
keycode  24 = q Q Return

! Caps_Lock + r     -> Menu
keycode  27 = r R Menu

! Caps_Lock + ,     -> Delete
keycode  59 = comma less Delete

! Caps_Lock + m     -> BackSpace
keycode  58 = m M BackSpace

! Caps_Lock + y     -> PageUp
keycode  29 = y Y Prior

! Caps_Lock + p     -> PageDown
keycode  33 = p P Next

! Caps_Lock + i     -> Up
keycode  31 = i I Up

! Caps_Lock + k     -> Down
keycode  45 = k K Down

! Caps_Lock + j     -> Left
keycode  44 = j J Left

! Caps_Lock + l     -> Right
keycode  46 = l L Right

! Caps_Lock + h     -> Home
keycode  43 = h H Home

! Caps_Lock + ;     -> End
keycode  47 = semicolon colon End

具体的功能实现过程可参考上述链接 Xmodmap 以及 Xmodmap Command。不足之处:Xmodmap需要X图形界面的环境支持,在没有安装图形界面的纯文本命令行模式下无法运行;另外,其无法实现组合键的映射,只能实现单一按键或组合按键到某一按键的映射,因此Xmodmap仅仅实现了以上AutoHotKey部分的单个按键的映射(具体仅包含以下按键:CapsLock、Escape、Enter、Menu、Delete、BackSpace、PgUp、PgDn、Up、Down、Left、Right、Home、End)。这里注意:由于CapsLock本身映射为了无意义的Mode_switch按键,所以不能再直接映射为ESC按键了,此时ESCCapsLock + Space来实现,CapsLock功能依然由CapsLock + \来实现。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章