Как сопоставить ключ CAPS LOCK в VIM? - PullRequest
50 голосов
/ 01 февраля 2010

Я использую GVIM под Windows. И хотите сопоставить CAPSLOCK с Ctrl + ^

Есть ли способ сделать это?

Кстати, я вижу в Интернете множество примеров того, как поменять CAPS и Esc, используя взлом реестра, но ни один из них не использует команду сопоставления VIM, вместо этого используются внешние инструменты и изменения реестра.

Ответы [ 11 ]

55 голосов
/ 01 февраля 2010

Linux?С X используйте xmodmap, чтобы изменить отображение клавиш, например,

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

Будет отображать Esc на ключ CapsLock.Google для большего количества примеров.

25 голосов
/ 15 января 2014

Если вы хотите избежать работы вне Vim, вы можете поместить эти строки в ваш .vimrc:

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

Первая строка отображает экранирование ключа блокировки заглавных букв при входе в Vim, а вторая строка возвращает нормальную функциональность блокировке заглавных букв при выходе.

Для этого требуется Linux с установленным пакетом xorg-xmodmap.

16 голосов
/ 01 февраля 2010

под окнами? Используйте AutoHotkey . Это не отображение vim, но, как утверждают другие, вы не можете отобразить его. Я использую AHK, чтобы сопоставить мой CAPSLOCK с CTRL.

12 голосов
/ 20 ноября 2014

Для Mac OS вы можете переназначить системный ключ «caps lock» в «системные настройки».

Следуйте по этому пути:

системные настройки> клавиатура> клавиши-модификаторы

Затем щелкните раскрывающийся список рядом с «Caps Lock» и выберите «^ Control».

10 голосов
/ 29 сентября 2016

В системах 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 

Если вы хотите его почитать, просто переключите ключевые переменные в файле скрипта.

Для получения дополнительной информации см. страница

10 голосов
/ 01 февраля 2010

Capslock (и Control, и Shift и т. Д.) - это клавиша-модификатор, которая означает, что она используется с другой нормальной клавишей для изменения значения этой клавиши. AFAIK ОС не передает клавиши-модификаторы приложению, если не была нажата обычная клавиша, например, нажатие CTRL не будет видно приложению, но CTRL-C будет.

7 голосов
/ 02 октября 2017

Решение, которое не ломается Caps Lock вне vim

Windows

  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. Мы также будем использовать xprop и xset (должны быть установлены по умолчанию).
  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. Добавить новую привязку к ~/.xbindkeysrc:
"bash $HOME/caps_to_esc.sh"
Caps_Lock
  1. killall xbindkeys && xbindkeys

Как это работает:

  1. xbindkeys обнаружит при нажатии Caps_Lock и вызовет caps_to_esc.sh script
  2. в скрипте обнаружить активное окно wm_class по xprop
  3. проверьте, представляет ли нас интерес wm_class (gnome-терминал, vscode, gvim, chrome), выйдите, если это не
  4. отправить ключ Escape через xdotool
  5. проверьте, включен ли Caps Lock через xset, и если он включен, отправьте ключ Caps_Lock через xdotool
  6. xbindkeys обнаружит отправленный нами Caps_Lock, но мы его игнорируем
4 голосов
/ 01 февраля 2010

Не думаю, что ты можешь. Я полагаю, что CAPS-LOCK, вероятно, переведен ОС еще до того, как vim его увидит. Так что вам нужно будет взломать на уровне ОС, как взломы реестра, которые вы уже видели.

РЕДАКТИРОВАТЬ: autohotkey выглядит так, как будто его можно использовать для преодоления разрыва vim-OS . Таким образом, стороннее приложение делает хаки на уровне ОС, и вы просто подключаете это приложение.

3 голосов
/ 14 ноября 2012

Поскольку существует решение для Linux и Windows (Autohotkey), я хотел бы предложить использовать pckeyboardhack для Mac, чтобы переназначить CapsLock везде.

0 голосов
/ 10 ноября 2018

На Mac также можно использовать Карабинер (https://pqrs.org/osx/karabiner/)

$ brew cask install karabiner-elements

После установки вы можете сопоставить ключ capslock с ключом esc на вкладке простых изменений. Предостережение - это общесистемная система, а это означает, что вы теряете ключ от заглавной буквы везде. ИМО, кому нужен кепслок.

...