【问题标题】:Remap arrow keys onto JKLI whenever holding down a certain modifier key每当按住某个修饰键时,将箭头键重新映射到 JKLI
【发布时间】:2015-06-01 14:41:29
【问题描述】:

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

【问题讨论】:

  • 您可以使用自动热键脚本来执行此操作。不过这样的问题最适合超级用户
  • 感谢您的回复,我看到了,但我真的不知道如何在自动热键中“编写脚本”。有没有更简单的方法?谢谢

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


【解决方案1】:

这是我使用的 .ahk 脚本。

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

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

【讨论】:

  • 非常感谢。在 alt + p 上添加一个删除按钮会很好,这样我们就不必移动到键盘上的那个位置,例如!p::发送{删除} !+p::发送{删除}
【解决方案2】:

同样使用AutoHotKey,我真的很想为 CAPSLOCK 提供键导航,这比特殊修饰键(Ctrl、Alt 等)更复杂。诀窍最终是使用内置函数GetKeyState(...)

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

; 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}

【讨论】:

  • 仅供参考,您必须使用 &。 >! (我使用的)不适用于组合修饰符
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    简单的autohotkey 脚本。

    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 方法!)

    【讨论】:

    • 哇,非常感谢!!这真的很好用!有没有办法通过按住控制键来做到这一点呢?谢谢
    • 您的个人资料列出了“对编程感兴趣”。我相信你可以做这样的调整:)。 autohotkey.com/docs(删除切换代码,将热键更改为具有 Ctrl 修饰符前缀 ^K、^L)
    • 真快,你能告诉我这有什么问题吗?
    • #SingleInstance ignore #InstallMouseHook #UseHook Hotkey, I, Off Hotkey, J, Off Hotkey, K, Off Hotkey, L, Off !f:: while GetKeyState("I") { Send {Up } } while GetKeyState("J") { Send {Left} } while GetKeyState("K") { Send {Down} } while GetKeyState("L") { Send {Right} } 返回
    • Hotkey 行在您的脚本中是多余的,您可以删除它们。 !f while-loops 不是最简单的做事方式;我想您可能想将每个按键都视为Alt+F+I,然后有 4 个单独的热键。
    【解决方案5】:

    我尝试了许多来自互联网的 AutoHotKey 脚本来解决这个问题,包括这个问题之前的答案中提到的所有版本。不幸的是,它们都没有正常工作。其中一些一开始似乎有效,但存在一些微妙的问题。

    在这个问题上花了很长时间后,我终于设法创建了一个似乎可以工作的版本(有点)。

    在此处发布代码,供那些通过谷歌搜索找到此页面的人使用。

    使用此脚本,只要按下 right alt,ijkl 就会用作箭头键。它似乎与 shift 和 control 结合使用效果很好。

    不过,缺点是右alt失去了原来的功能。这对我来说不是问题,因为我只使用左 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,破坏选定的文本,这绝对是不可取的。

    【讨论】:

      【解决方案6】:

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

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

      使用类似于 vim "hjkl" 的箭头键是方便的,但要向右移动 - "jkl;"所以手指总是在打字位置,加上额外的键。

      使用自动启动 (4) - 它就像一个魅力,减少了配置不同文本编辑器、浏览器、终端等的开销。

      有一个例外 - 它在某些管理应用程序中不起作用 (5)。

      备注:

      1. 没有办法重新映射真正的 Fn 键,至少在不修改键盘驱动程序或 PCB 的情况下是这样。 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
        

      【讨论】:

        【解决方案7】:

        我使用 Hammerspoon 重新映射了我的箭头键(在 Mac 上)并记录在 GitHub 存储库 https://github.com/RobotCharlie/key-remapping-hammerspoon

        【讨论】:

          猜你喜欢
          • 2019-05-04
          • 2011-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-31
          • 1970-01-01
          相关资源
          最近更新 更多