如何在VIM中映射CAPS LOCK键?

时间:2010-02-01 12:20:06

标签: map vim capslock

我在Windows下使用GVIM。 并希望将CAPSLOCK映射到Ctrl + ^

有什么办法吗?

顺便说一下,我在网上看到大量样本如何使用注册表黑客交换CAPS和Esc,但没有一个使用VIM map命令,而是使用外部工具和注册表更改。

16 个答案:

答案 0 :(得分:55)

Linux呢?使用X,使用xmodmap来改变键映射,例如

xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'

将Esc映射到CapsLock键。 Google提供了更多示例。

答案 1 :(得分:25)

如果您的目的只是为了避免在Vim之外工作,可以将这些行放在.vimrc中:

au VimEnter * !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
au VimLeave * !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Caps_Lock'

当您输入Vim时,第一行将映射转义为大写锁定键,第二行在退出时将正常功能返回到大写锁定。

这需要安装xorg-xmodmap包的Linux。

答案 2 :(得分:16)

在Windows下?使用AutoHotkey。它不是vim映射,但正如其他人所说,你无法映射它。我使用AHK将我的CAPSLOCK映射到CTRL。

答案 3 :(得分:11)

对于Mac OS,您可以在“系统偏好设置”中重新映射系统范围内的“大写锁定”键。

遵循以下道路:

系统偏好>键盘>修饰键

然后点击“大写锁定”旁边的下拉框,选择“^控制”。

答案 4 :(得分:10)

Capslock(和Control,以及Shift等)是一个修饰键,这意味着它与另一个普通键一起使用来修改该键的含义。 AFAIK操作系统不会将修改键传递给应用程序,除非还按下了普通键,例如应用程序将看不到按CTRL,但CTRL-C将会显示。

答案 5 :(得分:9)

在Linux系统中,可以使用xmodmap完成。

将其保存在主文件夹

中的文本文件中
! Swap caps lock and escape
remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock

使用类似.capstoescswitc

的名称保存此文件

然后通过终端执行此文件。

xmodmap ~/.capstoescswitc 

如果想要尊重它,只需在脚本文件中切换关键变量即可。

有关详细信息,请参阅此page

答案 6 :(得分:5)

不会在vim

之外中断Caps Lock的解决方案

  1. 安装autohotkey。
  2. 运行autohotkey脚本:
  3. ;caps_to_esc.ahk
    #IfWinActive, ahk_class Vim ; vim window class
    Capslock::Esc
    #IfWinActive
    

    的Linux

    运行此命令:

    wget -O - https://raw.githubusercontent.com/grabantot/scripts/master/install/install_caps_to_esc.sh | bash
    

    或手动执行以下操作:

    1. sudo apt-get install xdotool xbindkeys。我们还将使用xpropxset(默认情况下应安装)。
    2. 创建~/caps_to_esc.sh脚本:
    3. debug_file=/dev/shm/caps_to_esc.debug
      debug_msg () {
        echo $(date +%s%3N) "$@" >> $debug_file
      }
      
      caps_off () {
        is_caps_on="false"
        xset q | grep "Caps Lock:\s*on" && is_caps_on="true"
        debug_msg "is_caps_on ""$is_caps_on"
      
        [ "$is_caps_on" == "false" ] && return 3
        debug_msg "Sending Caps Lock"
        debug_msg "ignore_next"
        xdotool key Caps_Lock
      }
      
      should_ignore="false"
      tail -n 1 $debug_file | grep "ignore_next" && should_ignore="true"
      
      if [ "$should_ignore" == "true" ]; then
        debug_msg "ignored"
        exit 1
      fi
      
      echo -n "" > $debug_file
      
      # get wm_class by 'xprop | grep WM_CLASS'
      declare -a wm_classes=( \
        'WM_CLASS(STRING) = "gnome-terminal-server", "Gnome-terminal"' \
        'WM_CLASS(STRING) = "gvim", "Gvim"' \
        'WM_CLASS(STRING) = "code", "Code"' \
        'WM_CLASS(STRING) = "google-chrome", "Google-chrome"' \
      )
      
      active_window_id=$(xdotool getactivewindow)
      active_window_wm_class=$(xprop -id $active_window_id WM_CLASS)
      debug_msg "active_wm_class   ""$active_window_wm_class"
      
      detected_wm_class=""
      for wm_class in "${wm_classes[@]}"; do
        # debug_msg "$wm_class"
        if [ "$active_window_wm_class" == "$wm_class" ]; then
          detected_wm_class="$wm_class"
          debug_msg "detected_wm_class ""$detected_wm_class"
        fi
      done
      
      [ "$detected_wm_class" == "" ] && exit 2
      xdotool keyup "Caps_Lock" # !!! very important
      caps_off
      debug_msg "Sending Escape"
      xdotool key "Escape"
      debug_msg "sent"
      
      1. 将新的bindnig添加到~/.xbindkeysrc
      2. "bash $HOME/caps_to_esc.sh"
        Caps_Lock
        
        1. killall xbindkeys && xbindkeys
        2. 工作原理:

          1. xbindkeys会在按下Caps_Lock时检测到并调用caps_to_esc.sh脚本
          2. 脚本中的
          3. 通过xprop
          4. 检测活动窗口wm_class
          5. 检查wm_class是否对我们感兴趣(gnome-terminal,vscode,gvim,chr​​ome),如果不是
          6. 则退出
          7. 通过xdotool
          8. 发送退出密钥
          9. 检查Caps Lock是否已通过xset启用,如果是,则通过xdotool
          10. 发送Caps_Lock密钥
          11. xbindkeys会检测我们发送的Caps_Lock,但我们会忽略它

答案 7 :(得分:4)

我认为你不能。 我相信CAPS-LOCK可能是在vim看到它之前由操作系统翻译的。 因此,您需要在操作系统级别进行操作,就像您已经看到的注册表黑客一样。

编辑:autohotkey看起来可以用于bridge the vim-OS gap。通过这种方式,第三方应用程序正在操作系统级别的黑客攻击,而您只是挂钩该应用程序。

答案 8 :(得分:3)

由于有适用于Linux和Windows(Autohotkey)的解决方案,我建议使用pckeyboardhack for Mac在任何地方重新映射CapsLock。

答案 9 :(得分:1)

@rsoren的答案有效。但是,这样做的问题是,如果打开多个缓冲区(从一个缓冲区退出),那么也会恢复所有其他缓冲区的映射。用BufEnter和BufLeave代替VimEnter和VimLeave,对我有用。

au BufEnter * silent! !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
au BufLeave * silent! !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Caps_Lock'

答案 10 :(得分:1)

在Windows上将CAPSLOCK重映射到ESCCTRL

如果您想将CAPSLOCK重新映射到两者

  1. ESC(单独按下时)
  2. CTRL(用其他键按下时) 您可以使用 ililim this little piece of open source software

您不需要管理员权限,ESCCTRL仍可以按预期工作。

我用它来享受方便的CTRL + anything按下操作而不会伤害我的小拇指,并切换了我在MobaXterm中通过ssh使用的Vim模式。要安装,请遵循this description

在Linux上将CAPSLOCK重映射到ESCCTRL

要在Linux上执行相同的操作,可以使用XCAPE。要在Ubuntu上安装,请使用:

sudo apt install xcape

对于实际映射,请执行以下操作:

setxkbmap -option ctrl:nocaps
xcape -e 'Control_L=Escape'

第一个命令是将CAPSLOCK映射到ESC,而第二个命令则负责用其他键按下CTRL

要在X会话中永久使用此功能,可以将其添加到~/.xprofile

答案 11 :(得分:0)

我想这样做的原因之一是像其他人提到的那样创建一个软封锁,可能是为了避免在正常模式下保持大写锁定。 我在离开插入模式时使用vimcaps插件来关闭大写锁定,似乎工作正常。

答案 12 :(得分:0)

在Mac上,也可以使用Karabiner(https://pqrs.org/osx/karabiner/

  

$ brew jar安装karabiner元素

安装后,您可以在简单的修改标签中将 capslock 键映射到 esc 键。请注意,这是系统范围的,这意味着您到处都会丢失Capslock密钥。需要大写锁定的IMO。

答案 13 :(得分:0)

截至2020年,像我这样的凡人WINDOWS用户的一个工作示例正在使用AutoHotkey

当前使用此1行脚本:

Capslock::Esc

运行它,您的问题已解决。希望能帮助到你。 :)

答案 14 :(得分:0)

我仔细研究了这个问题的答案以自己做,但我正在寻找稍微不同的东西:

  1. 我使用的是 Linux
  2. 我很高兴改变大写甚至在 Vim 之外(我几乎总是错误地按下,无论如何我可以将它保留在 Esc 按钮上以实现我正在使用的目标)
  3. 我想尽可能使用最常用的软件,不需要进一步安装
  4. 我更喜欢KISS,然后甚至避免需要更多冗长的脚本
  5. 如果可能,我想同时拥有 CAPS -> EscCAPS + <something> -> Ctrl + <something>

那么我目前的解决方案是:

# ~/.xprofile
xmodmap $HOME/.xmodmap

和:

! ~/.xmodmap
clear lock
keycode 66 = Escape
keycode 9 = Caps_Lock
add lock = Caps_Lock

clear control
add control = Control_L Control_R Escape

看起来它暂时像一种魅力,但我正在寻找反馈:)

答案 15 :(得分:0)

对于 X (Linux),正如@Dan Andreatta 所提到的,使用 xmodmap 来更改键映射,例如

xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'

Esc 映射到 CapsLock 键。

您也可以通过将其添加到 X 初始化文件中来设置它,例如 .xinitrc — 在使用 startx 时运行 —:

clear lock
keycode 0x42 = Escape

通常,它被放在一个 .Xmodmap 文件中,然后它在 .xinitrc 中运行。

Vim 的文档有一整页专门讨论这个主题,comments section 特别有用。