Как сопоставить ключ CAPS LOCK в VIM?

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

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

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

16 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Windows

  1. Установите автоотключение.
  2. Запустите скрипт autohotkey:

`` `

;caps_to_esc.ahk
#IfWinActive, ahk_class Vim ; vim window class
Capslock::Esc
#IfWinActive

`` `

Linux

  1. sudo apt-get install xdotool xbindkeys python, Мы также будем использовать xprop а также cut,
  2. Создать ~/caps_to_esc.sh сценарий:

`` `

#!/bin/bash

capsOff () {
  python -c '\
    from ctypes import *; \
    X11 = cdll.LoadLibrary("libX11.so.6"); \
    display = X11.XOpenDisplay(None); \
    X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); \
    X11.XCloseDisplay(display) \
  '
}

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=$(xprop -root _NET_ACTIVE_WINDOW | cut -f2 -d#)
active_window_wm_class=$(xprop -id $active_window_id WM_CLASS)

for wm_class in "${wm_classes[@]}"; do
  # echo "$wm_class" >> xbindkeys.debug
  if [ "$active_window_wm_class" == "$wm_class" ]; then
    # echo true >> xbindkeys.debug
    xdotool getactivewindow key Escape
    capsOff
  fi
done

`` `

  1. sudo chmod +x ~/caps_to_esc.sh
  2. Добавить новую привязку к ~/.xbindkeysrc:

    "~/caps_to_esc.sh"
    Caps_Lock
    
  3. xbindkeys (если вы уже начали xbindkes затем убей это сначала killall xbindkeys).

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

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

Ответ @rsoren работает. Но проблема в том, что если открыто несколько буферов, то при выходе из одного происходит обратное отображение и для всех остальных. Замена VimEnter и VimLeave на BufEnter и BufLeave помогла мне.

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

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

Переназначить CAPSLOCK к ESC а также CTRL в Windows

Если вы хотите переназначить CAPSLOCK как для

  1. к ESC (при нажатии в одиночку)
  2. к CTRL(при нажатии с другими клавишами) вы можете использовать эту небольшую часть программного обеспечения с открытым исходным кодом от ililim.

Для этого вам не нужны права администратора и ESC а также CTRL все еще работают, как ожидалось.

Я использую это, чтобы наслаждаться удобным CTRL + anythingнажимает, не повреждая мой мизинец, и переключает режимы в Vim, который я использую через ssh в MobaXterm. Для установки просто следуйте этому описанию.

Переназначить CAPSLOCK к ESC а также CTRL в Linux

Чтобы сделать то же самое в Linux, вы можете использовать XCAPE. Чтобы установить его в Ubuntu, используйте:

sudo apt install xcape

Для фактического отображения выполните:

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

Первая команда - отобразить CAPSLOCK к ESC тогда как второй заботится о CTRL нажата другими клавишами.

Чтобы это постоянно работало в сеансах X, вы можете добавить это в ~/.xprofile.

Я просмотрел ответы на этот вопрос, чтобы сделать это самостоятельно, но я искал что-то немного другое:

  1. я использую линукс
  2. Я с удовольствием меняю ЗАГЛАВНЫЕ БУКВЫ даже вне Vim (я нажимаю почти всегда по ошибке, и я могу оставить его на кнопке Esc в любом случае для целей, которые я использую)
  3. Я хотел бы использовать наиболее распространенное программное обеспечение , чтобы не требовать дополнительной установки
  4. Я бы предпочел KISS, а затем даже избегаю необходимости в дальнейших длинных сценариях.
  5. Я хотел бы иметь оба CAPS -> EscА ТАКЖЕ CAPS + <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

Похоже, пока что это работает как шарм, но я ищу отзывы :)

Я полагаю, что одной из причин для этого является создание мягкого колпачка, как уже упоминалось другими, возможно, чтобы избежать удержания колпака в обычном режиме. Я использовал плагин vimcaps для отключения capslock при выходе из режима вставки, похоже, работает нормально.

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

$ brew cask установить карабин-элементы

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

С X (Linux), как упоминал @Dan Andreatta, используйте xmodmapизменить сопоставление клавиш, например

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

Будет сопоставлен Escс CapsLockключом.

Вы также можете установить это в камне, добавив его в файл инициализации X, например — который запускается при использовании startx—:

      clear lock
keycode 0x42 = Escape

Как правило, это помещается внутри .Xmodmapфайл, а затем он запускается внутри .xinitrc.

В документации Vim есть целая страница, посвященная этой теме, и раздел комментариев особенно полезен.

Рабочий пример для простого пользователя Mortal WINDOWS, такого как я, по состоянию на 2020 год, использует AutoHotkey.

В настоящее время используется этот однострочный скрипт:

Capslock::Esc

Запустите его, и ваша проблема будет решена. Надеюсь, это поможет.:)

Другие вопросы по тегам