77 Stimmen

Wie wird die CAPS LOCK-Taste in VIM zugeordnet?

Ich verwende GVIM unter Windows. Und möchte CAPSLOCK auf Ctrl+^ abbilden.

Gibt es eine Möglichkeit, dies zu tun?

Btw, ich sehe tonnenweise Beispiele im Web, wie man CAPS und Esc mit einem Registry-Hack vertauscht, aber keines davon verwendet den VIM-Map-Befehl, sondern externe Tools und Registry-Änderungen.

0 Stimmen

Ich denke, Sie sollten sich für die unten stehende Antwort von Dan Andreatta entscheiden.

7 Stimmen

Wenn ich im Befehlsmodus aus Versehen die Feststelltaste drücke, ist das der beste Teil meines Tages.

0 Stimmen

Mehrere alte Antworten auf diese Frage schlagen vor, die xmodmap um die Feststelltaste unter Linux zuzuordnen. Wer dies im Jahr 2016 versucht, sollte jedoch die setxkbmap Befehl, z.B. setxkbmap -option caps:escape . Ich habe ein kleines Projekt namens Uncap unter github.com/susam/uncap die all dies dokumentiert und auch ein unauffälliges kleines Tool für Windows bereitstellt, um die Feststelltaste der Escape-Taste zuzuordnen. Siehe die Alternativen Abschnitt der README für Details zur Verwendung von setxkbmap unter Linux.

10voto

liwp Punkte 6536

Capslock (und Control, und Shift usw.) ist eine Modifikatortaste, was bedeutet, dass sie mit einer anderen normalen Taste verwendet wird, um die Bedeutung dieser Taste zu ändern. AFAIK gibt das Betriebssystem die Modifikatortasten nur dann an die Anwendung weiter, wenn auch eine normale Taste gedrückt wurde, z. B. durch Drücken von CTRL wird von der Anwendung nicht gesehen, aber CTRL-C sein wird.

10voto

grabantot Punkte 1976

Eine Lösung, die nicht kaputt geht Caps Lock außerhalb von vim

Windows

  1. Installieren Sie Autohotkey.
  2. Autohotkey-Skript ausführen:

    ;caps_to_esc.ahk

    IfWinActive, ahk_class Vim ; vim window class

    Capslock::Esc

    IfWinActive


Ubuntu

Führen Sie diesen Befehl aus:

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

Sie können diese Aktionen auch manuell durchführen:

  1. sudo apt-get install xdotool xbindkeys . Wir werden auch verwenden xprop y xset (sollte standardmäßig installiert sein).

  2. Erstellen einer ~/caps_to_esc.sh Drehbuch:

    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"

  3. Neues Bindemittel hinzufügen zu ~/.xbindkeysrc :

    "bash $HOME/caps_to_esc.sh" Caps_Lock

  4. killall xbindkeys && xbindkeys

Wie es funktioniert:

  1. xbindkeys erkennt, wenn Caps_Lock gedrückt wird und ruft caps_to_esc.sh Skript
  2. im Skript das aktive Fenster wm_class durch xprop
  3. prüfen, ob wm_class für uns von Interesse ist (gnome-terminal, vscode, gvim, chrome), falls nicht, beenden
  4. Escape-Taste senden über xdotool
  5. prüfen, ob die Feststelltaste eingeschaltet ist über xset und wenn ja, dann die Caps_Lock-Taste über xdotool
  6. xbindkeys wird das von uns gesendete Caps_Lock erkennen, aber wir ignorieren es

5voto

Michael Anderson Punkte 65535

Ich glaube nicht, dass Sie das können. Ich glaube, CAPS-LOCK wird wahrscheinlich vom Betriebssystem übersetzt, bevor vim es überhaupt sieht. Sie müssten also einen Hack auf OS-Ebene machen, wie die Registry-Hacks, die Sie bereits gesehen haben.

EDIT: Autohotkey könnte verwendet werden, um die Vim-OS-Lücke überbrücken . Auf diese Weise führt eine Drittanbieter-Anwendung die Hacks auf Betriebssystemebene durch, und Sie binden diese Anwendung einfach ein.

4voto

akalankae99 Punkte 49

@rsoren's Antwort funktioniert. Aber das Problem dabei ist, wenn mehrere Puffer geöffnet sind, führt das Verlassen eines Puffers dazu, dass die Zuordnung auch für alle anderen zurückgesetzt wird. Das Ersetzen von VimEnter und VimLeave mit BufEnter und BufLeave, hat den Trick für mich.

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

3voto

Jakob Punkte 127

Da es eine Lösung für Linux und Windows gibt (Autohotkey), möchte ich vorschlagen, die pckeyboardhack für Mac, um CapsLock überall neu zuzuordnen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X