如何在VIM中映射CAPS LOCK键?

Evg*_*nyt 53 vim map capslock

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

有什么办法吗?

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

Dan*_*tta 56

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

xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
Run Code Online (Sandbox Code Playgroud)

将Esc映射到CapsLock键.谷歌更多的例子.

  • 除了你说"谷歌提供更多例子"而不是提供链接之外,我会给你一点意见.每当有人这样做时,他们总是站在所提到的Google搜索结果的顶部:https://www.google.com/search?q = vim +remap+escape +capslock (14认同)
  • 在问题中明确指出这是不可接受的(“注册表黑客”)。 (3认同)
  • 喜欢这个黑客。但是当我的眼睛被大写锁定闪烁的 LED 分心时,这很烦人。 (2认同)

rso*_*ren 26

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

au VimEnter * !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
au VimLeave * !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Caps_Lock'
Run Code Online (Sandbox Code Playgroud)

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

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

  • 注意au是autocmd (5认同)
  • 您可以在!!之前使用`:silent`进行修改,以避免出现按ENTER继续的提示。 (4认同)
  • 为了清楚起见,为避免出现提示,代码为“ au VimEnter * silent!!xmodmap -e'clear Lock'-e'keycode 0x42 = Escape'`和`au VimLeave *无声!!xmodmap -e'清除锁定'-e'键码0x42 = Caps_Lock'` (3认同)
  • .vimrc 中的详细信息是件好事 (3认同)

hom*_*ast 16

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


Cou*_*son 12

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

遵循这条道路:

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

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

  • 我认为该选项仅适用于OS X 10.12 (3认同)
  • 只需从下拉菜单中选择“转义”即可:) (2认同)

liw*_*iwp 11

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

  • 不完全的.应用程序完全可以检测ctrl,shift,alt和windows按键.Caps Lock和Num Lock等键的问题在于操作系统坚持将它们解释为切换键. (8认同)
  • 是的,如果您编写本机应用程序,则可以在大多数操作系统中执行此操作.不幸的是,如果你编写一个从另一个应用程序获取输入的应用程序(比如在终端应用程序中运行的vim或在浏览器中运行的JS应用程序),你只能获得本机包装器传递给你的键盘事件.旧的终端没有现代键盘事件.我不知道任何终端应用程序会传递按键事件按下大写锁定键或任何其他修饰键 - 只有修饰符+其他键,并且只有*某些*.因此,在实践中,您无法将大写锁定键本身映射到vim中的任何操作. (3认同)

Nir*_*han 10

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

将其保存在主文件夹中的文本文件中

! Swap caps lock and escape
remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock
Run Code Online (Sandbox Code Playgroud)

使用类似.capstoescswitc的名称保存此文件

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

xmodmap ~/.capstoescswitc 
Run Code Online (Sandbox Code Playgroud)

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

有关详细信息,请参阅此页面


gra*_*tot 7

Caps Lock永不超出vim范围的解决方案

视窗

  1. 安装自动热键。
  2. 运行自动热键脚本:
;caps_to_esc.ahk
#IfWinActive, ahk_class Vim ; vim window class
Capslock::Esc
#IfWinActive
Run Code Online (Sandbox Code Playgroud)

的Linux

运行以下命令:

wget -O - https://raw.githubusercontent.com/grabantot/scripts/master/install/install_caps_to_esc.sh | bash
Run Code Online (Sandbox Code Playgroud)

或手动执行以下操作:

  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"
Run Code Online (Sandbox Code Playgroud)
  1. 将新的bindnig添加到~/.xbindkeysrc
"bash $HOME/caps_to_esc.sh"
Caps_Lock
Run Code Online (Sandbox Code Playgroud)
  1. killall xbindkeys && xbindkeys

怎么运行的:

  1. xbindkeys按下Caps_Lock并调用caps_to_esc.sh脚本时将检测
  2. 在脚本中通过以下方式检测活动窗口wm_class xprop
  3. 检查wm_class是否对我们感兴趣(gnome-terminal,vscode,gvim,chr​​ome),如果不是,则退出
  4. 通过发送Escape键 xdotool
  5. 检查Caps Lock是否通过开启xset,然后通过来发送Caps_Lock密钥xdotool
  6. xbindkeys 将检测到我们发送的Caps_Lock,但我们将其忽略


Mic*_*son 5

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

编辑:autohotkey 看起来可以用来弥合 vim-OS 差距。这样,第三方应用程序就可以在操作系统级别进行黑客攻击,而您只需挂钩该应用程序即可。