如何在VIM中映射CAPS LOCK键?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在VIM中映射CAPS LOCK键?相关的知识,希望对你有一定的参考价值。

我在Windows下使用VIM。并希望将CAPS LOCK映射到Ctrl ^

有什么办法吗?

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

答案

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

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

将Esc映射到Caps Lock键。谷歌更多的例子。

另一答案

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

另一答案

在Mac上,也可以使用Karabiner(bridge the vim-OS gap

$ brew cask安装karabiner-elements

安装后,您可以在简单修改选项卡中将capslock键映射到esc键。警告这是系统范围的,这意味着你到处都丢失了大写密钥。需要封锁的IMO。

另一答案

如果您的目的只是为了避免在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。

另一答案

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

另一答案

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

遵循这条道路:

系统首选项>键盘>修饰键

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

另一答案

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

另一答案

在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

另一答案

Solution that doesn't break Caps Lock outside of vim

视窗

  1. 安装autohotkey。
  2. 运行autohotkey脚本:
;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脚本:
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. 添加新的绑定到qazxsw poi:
~/.xbindkeysrc
  1. "bash $HOME/caps_to_esc.sh" Caps_Lock

How it works:

  1. qazxsw poi将检测何时按下Caps Lock并调用qazxsw poi脚本
  2. 在脚本中通过killall xbindkeys && xbindkeys检测活动窗口wm_class
  3. 检查wm_class是否对我们感兴趣(gnome-terminal,vscode,gvim,chr​​ome),如果不是,请退出
  4. 通过xbindkeys发送Escape键
  5. 检查Caps Lock是否通过caps_to_esc.sh打开,如果是,则通过xprop发送Caps_Lock密钥
  6. xdotool将检测我们发送的Caps_Lock但我们忽略它
另一答案

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

编辑:autohotkey看起来它可以用于xset。这样,第三方应用程序正在操作系统级别的黑客攻击,而您只是挂钩该应用程序。

另一答案

由于Linux和Windows(Autohotkey)有一个解决方案,我想建议使用xdotool for Mac重新映射CapsLock。

以上是关于如何在VIM中映射CAPS LOCK键?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Vim 中将 Esc 重新映射到 CAPS LOCK 如此复杂?

OSX:以编程方式重新映射 Caps Lock 的功能(通过系统偏好设置)?

我如何知道在 Dev-C++ 中 Caps Lock 是不是打开?

交换左Ctrl键和Caps lock键

Selenium webdriver怎么模拟键盘敲下Caps Lock键

是否可以通过编程方式禁用 Windows 上的 Caps Lock 键?