每当按住某个修改键时,将箭头键重新映射到JKLI上

时间:2015-06-01 14:41:29

标签: keyboard-shortcuts keyboard-events key-bindings

我只是想知道是否有一种方法可以按住控制键或其他东西并使用我的jkli键作为箭头键。我认为编程会更容易。那可能吗?感谢。

6 个答案:

答案 0 :(得分:5)

这是我使用的.ahk脚本。

它将箭头键重新映射到 ALT + I / J / K / L

NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

; AHK Command       ; key   = Effect        (Description)   

; ALT Keypress Implied for all below

!i::Send {UP}       ; i UP          (Cursor up line)
!k::Send {DOWN}     ; k DOWN            (Cursor down line)

!j::Send {LEFT}     ; j LEFT        (Cursor left one character)
!l::Send {RIGHT}    ; l RIGHT       (Cursor right one character)

!h::Send {HOME}     ; h     ALT + RIGHT (Cursor to beginning of line)
!;::Send {END}      ; ; ALT + LEFT  (Cursor to end of line)

!u::Send ^{HOME}    ; h     SHIFT + HOME    (Cursor to beginning of document)
!o::Send ^{END}     ; o SHIFT + END (Cursor to end of document)

; CTRL + ALT Keypress Implied for all below

!^j::Send ^{LEFT}   ; j     CTRL + LEFT (Cursor left per word)
!^l::Send ^{RIGHT}  ; l CTRL + RIGHT    (Cursor right per word)

; SHIFT + ALT Keypress Implied for all below

!+i::Send +{UP}     ; i SHIFT + UP  (Highlight per line)
!+k::Send +{DOWN}   ; k SHIFT + DOWN    (Highlight per line)

!+j::Send +{LEFT}   ; j SHIFT + LEFT    (Highlight per character)
!+l::Send +{RIGHT}  ; l SHIFT + RIGHT   (Highlight per character)

!+h::Send +{HOME}   ; h SHIFT + ALT + LEFT  (Highlight to beginning of line)
!+;::Send +{END}    ; ; SHIFT + ALT + RIGHT (Hightlight to end of line) 

!+u::Send ^+{HOME}  ; u SHIFT + CTRL + HOME (Highlight to beggininng of document)
!+o::Send ^+{END}   ; o SHIFT + CTRL + END  (Hightlight to end of document) 

; SHIFT + CTRL + ALT Keypress Implied for all below

!+^j::Send +^{LEFT}     ; j SHIFT + CTRL + LEFT (Highlight per word)
!+^l::Send +^{RIGHT}    ; l SHIFT + CTRL + RIGHT    (Hightlight per word)

!+^i::Send +!{UP}   ; i SHIFT + ALT + UP    (Multiply cursor up)
!+^k::Send +!{DOWN} ; k SHIFT + ALT + DOWN  (Multiply cursor down) 

; CTRL + SHIFT Keypress Implied for all below

+^i::Send +^{UP}
+^k::Send +^{DOWN}

一切之后;是评论。

要解密,请使用:https://autohotkey.com/docs/Hotkeys.htm

答案 1 :(得分:2)

我还想使用AutoHotKey来进行CAPSLOCK的键导航,这比特殊的修饰键(Ctrl,Alt等)要棘手。窍门最终是使用内置函数GetKeyState(...)

我在下面分享我的结果。下面的自动热键脚本基于nafzal的回答,但我使它更简洁了:)

; Main Navigation
CAPSLOCK & j::MoveCursor("{LEFT}")
CAPSLOCK & l::MoveCursor("{RIGHT}")
CAPSLOCK & i::MoveCursor("{UP}")
CAPSLOCK & k::MoveCursor("{DOWN}")
CAPSLOCK & h::MoveCursor("{HOME}")
CAPSLOCK & `;::MoveCursor("{END}")
CAPSLOCK & BACKSPACE::Send {DELETE}

; Navigation Combos
MoveCursor(key) {
    shift := GetKeyState("SHIFT","P")
    control := GetKeyState("CONTROL","P")
    controlShift := control && shift

    if controlShift {
        Send, ^+%key%
    }
    else if shift {
        Send, +%key%
    }
    else if control {
        Send, ^%key%
    }
    else {
        Send, %key%
    }
}

; Alternatively, using Alt...
ALT & j::MoveCursor("{LEFT}")
ALT & l::MoveCursor("{RIGHT}")
ALT & i::MoveCursor("{UP}")
ALT & k::MoveCursor("{DOWN}")
ALT & h::MoveCursor("{HOME}")
ALT & `;::MoveCursor("{END}")
ALT & BACKSPACE::Send {DELETE}

答案 2 :(得分:1)

经过一些试验和错误,我能够做到这一点。我把它放在这里所以任何有相同问题的人都可以使用这个代码。

!j::Send {Left}
!k::Send {Down}
!l::Send {Right}
!i::Send {Up}

答案 3 :(得分:0)

简单opening a ticket脚本。

Ctrl + T 打开切换,然后IJKL表现为箭头键,直到 Ctrl + T 为再次按下。

#SingleInstance ignore
Hotkey, I, Off
Hotkey, J, Off
Hotkey, K, Off
Hotkey, L, Off

^t::
    Hotkey, I, Toggle
    Hotkey, J, Toggle
    Hotkey, K, Toggle
    Hotkey, L, Toggle
return

I::
    Send {Up}
return

J::
    Send {Left}
return

K::
    Send {Down}    
return

L::
    Send {Right} 
return

(虽然我建议学习vim HJKL方法!)

答案 4 :(得分:0)

我尝试了Internet上的许多AutoHotKey脚本来解决此问题,包括先前对该问题的回答中提到的所有版本。不幸的是,它们都无法正常工作。其中的一些功能乍一看似乎有用,但是存在一些细微的问题。

在这个问题上花了很多时间之后,我终于设法创建了一个似乎可行的版本。

将代码张贴在这里,供那些通过谷歌搜索找到该页面的人使用。

使用此脚本,只要按下 right alt ,ijkl就可以用作箭头键。与换档和控制结合使用似乎效果很好。

但是,不利的一面是 right alt失去了其原始功能。对我来说这不是问题,因为我只使用left alt。 如果您不想牺牲正确的Alt值,可以将“ RAlt”替换为“ CapsLock”,它也可以正常工作。

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

; Arrows & navigation

Hotkey, *i, Off
Hotkey, *j, Off
Hotkey, *k, Off
Hotkey, *l, Off

*RAlt::
    Hotkey, *i, on
    Hotkey, *j, on
    Hotkey, *k, on
    Hotkey, *l, on
return

*RAlt up::
    Hotkey, *i, off
    Hotkey, *j, off
    Hotkey, *k, off
    Hotkey, *l, off
return

*i::send {blind}{up}
*j::send {blind}{left}
*k::send {blind}{down}
*l::send {blind}{right}

汉斯·温特豪德(Hans Winterhalter)的版本几乎可以使用。但是,至少在我的电脑上,如果我按住alt + shift + j,它将开始选择文本(如预期的那样),但是如果我将其按住足够长的时间,在某些时候,快捷方式将无法使用,而只是打印字母J,破坏所选文本,这绝对是不希望的。

答案 5 :(得分:0)

此自动热键脚本主要基于nafzal和Hans Winterhalter的答案(非常感谢)。关键的区别在于“修改键”。如果将“修饰键”映射到Alt或Ctrl,有时会导致依赖此键的应用程序中的滥用功能,因此您将遇到意外的行为。将“修饰键”重新映射为“虚幻键”,即当前键盘上实际上不存在的键,使其像“ Fn键”(1)一样工作。按下此键将不会修改,也不会打扰其他任何键(例如Win,Alt,Ctrl,Shift等),您将可以使用任何键组合。 要重新映射“修改键”,您需要SharpKeys或手动编辑Windows注册表(2)。

这里是example的“虚幻键”(AHK特殊键(3)),它是我的键盘上不存在的那个键,重新映射为Right Alt。

放置类似于vim“ hjkl”的箭头键,但是向右移动-“ jkl;”是很容易的。因此手指总是在打字位置,外加其他按键。

具有自动启动功能(4)-像超级魅力一样工作,并减少了配置不同文本编辑器,浏览器,终端等的开销。

有一个例外-它不适用于某些管理应用程序(5)。

备注:

  1. 至少在没有修改键盘驱动程序或PCB的情况下,没有任何方法可以重新映射真实的Fn键。 https://superuser.com/questions/65/remap-fn-to-another-key

  2. 有关手动编辑Windows注册表的详细指南。 https://isenselabs.com/posts/keyboard-key-kills-and-remaps-for-windows-users

  3. 使用AHK特殊键的详细指南。 https://www.autohotkey.com/docs/KeyList.htm#SpecialKeys

  4. 使脚本自动启动。 https://www.autohotkey.com/docs/FAQ.htm#Startup

  5. 任务管理器,Regedit编辑器,Admin PowerShell等。我想是特权很高的核心Windows应用程序,如果我错了,请纠正我。对于此stackoverflow线程上的任何其他解决方案也是如此。

     MoveCursor(key) {
       control := GetKeyState("CONTROL","P")
       shift := GetKeyState("SHIFT","P")
       alt := GetKeyState("ALT","P")
       win := GetKeyState("LWIN","P")
       ctrlShift := control && shift
       ctrlAlt := control && alt 
       altShift := alt && shift
       ctrlAltShift := control && alt && shift    
    if ctrlAltShift {
       Send, ^!+%key%
    } else if altShift {
       Send, !+%key%
    } else if ctrlShift {
       Send, ^+%key%
    } else if ctrlAlt {
       Send, ^!%key%
    } else if control {
       Send, ^%key%
    } else if shift {
       Send, +%key%
    } else if alt {
       Send, !%key%
    } else if win {
       Send, #%key%
    } else {
       Send, %key%
    }}
    SC163 & j::MoveCursor("{LEFT}")
    SC163 & k::MoveCursor("{DOWN}")
    SC163 & l::MoveCursor("{UP}")
    SC163 & `;::MoveCursor("{RIGHT}")
    SC163 & m::MoveCursor("{HOME}")
    SC163 & ,::MoveCursor("{PGDN}")
    SC163 & .::MoveCursor("{PGUP}")
    SC163 & /::MoveCursor("{END}")
    SC163 & BS::MoveCursor("{DEL}")
    ;SC163 & u::BS.SetBrightness(-10)
    ;SC163 & i::BS.SetBrightness(10)
    ;SC163 & o::Volume_Down
    ;SC163 & p::Volume_Up