Wie ordne ich Strg + A und Strg + Umschalt + A unterschiedlich zu?

92

In einem Terminal kann man nicht zwischen Ctrl+ Aund Ctrl+ Shift+ unterscheiden, Ada beide denselben Schlüsselcode ausgeben, sodass ich sehen kann, warum Vim dies nicht kann. Aber gVim, eine X-Anwendung, kann Ctrl+ Aund Ctrl+ Shift+ unterscheiden A. Gibt es eine Möglichkeit, diese beiden Dinge unterschiedlich abzubilden?

Für den Anfang möchte ich Folgendes tun: "Aus Zwischenablage einfügen" funktioniert wie das Gnome-Terminal, während der visuelle Modus Ctrl+ Vbeibehalten wird.

:nmap <C-S-V> "+gP
Kohsuke Kawaguchi
quelle
3
@vivoconunxino In diesem Link wird nicht erwähnt, dass Strg-a ein Shift-Modifikator hinzugefügt wird.
Graywh

Antworten:

46

Gvim tut es nicht, weil vim es nicht kann (unter normalen Umständen). Sorry, aber so ist es eben.


Jedoch...

Einige Terminals (z. B. xterm und iterm2) können so konfiguriert werden, dass für jede Tastenkombination eine beliebige Escape-Sequenz gesendet wird.

Fügen Sie zum Beispiel die folgenden zu .Xresourcesfür xterm zu senden <Esc>[65;5ufür CtrlShiftA. Sie können das dann in Vim zuordnen <C-S-a>. (65 ist der dezimale Unicode-Wert für Shift-a und 5 ist das Bit für den Strg-Modifikator. Das u steht in diesem Fall für "Unicode".)

! .Xresources
XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u")

iTerm und [u] rxvt können auch dafür konfiguriert werden (Beispiele nicht angegeben).

Weitere Informationen: http://www.leonerd.org.uk/hacks/fixterms/

greywh
quelle
Informationen zum erneuten Zuordnen mehrerer Schlüssel finden Sie in diesem Dokument : Separate Schlüsseleinträge mit \n. Verwenden Sie Backslash, um Linien zu teilen. Um beispielsweise auch <kbd> CSB </ kbd> und <kbd> CSF </ kbd> zuzuordnen, verwenden Sie XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u") \n Ctrl ~Meta Shift <Key>b: string(0x1b) string("[66;5u") \n Ctrl ~Meta Shift <Key>f: string(0x1b) string("[70;5u")
Folgendes
Fügen Sie der Vollständigkeit halber der Antwort vielleicht auch hinzu, wie dies in vi abgebildet werden kann? ZB map <ESC>[66;5u :echo "ctrl-shift-b received"<CR>Strg-Umschalt-B zuordnen, um eine Nachricht in der Statuszeile zu drucken. Auf AskUbuntu gab es eine ähnliche Q und ich habe zusammengefasst dies.
cfi
Was wir brauchen, ist eine neue Terminalspezifikation! xterm-256color(die jüngsten) leiden unter so vielen Einschränkungen.
Jérôme Pouiller
@Jezz Die Einschränkungen liegen bei termcap selbst, nicht bei der termcap-Datei für xterm-256color.
Graywh
@graywh Sicher, neue Funktionen zu Termcap wären notwendig
Jérôme Pouiller
9

Wie bereits erwähnt, gibt es keine Möglichkeit, eine <C-S-A>andere Zuordnung vorzunehmen als <C-A>.

Mit Tools wie autokey(für Linux & Windows) oder autohotkey(für Windows) können Sie jedoch eine Neuzuordnung vornehmen <C-S-A>, um für bestimmte Anwendungen andere Tastenanschläge zu senden.

zB Auf meinem System habe ich diese Einstellung in autokey:

$ cat ~/.config/autokey/data/gnome-terminal/ctrlshifta-gnome-terminal.py
#ctrl+shift+a sends '<S-F1>a'
keyboard.send_keys("<shift>+<f1>a") # Note that `f` in `f1` needs to be in lower case.

Weisen Sie ihm folgende Eigenschaften zu:

  1. Tastaturkürzel als ctrl+shift+a
  2. Fensterklasse: gnome-terminal-server.Gnome-terminal

Dann ~/.vimrckönnen Sie ein Mapping erstellen, um <S-F1>azu tun, was Sie wollen.


Anmerkungen:

  1. Ich habe <S-F1>als eine Art Führungsschlüssel zum Erkennen verwendet <C-S>. Das war , weil mein Terminal nicht akzeptieren <F13>- <F37>etc Schlüssel. Wenn Ihre Anwendung dies unterstützt, wird ( gvimglaube ich) die Verwendung dieser Schlüssel empfohlen.
  2. Ich hauptsächlich vimin gnome-terminal. Also habe ich window class = gnome-terminal-server.Gnome-terminalals Filter verwendet. Ändern Sie es, um es zu verwenden, gvimwenn Sie möchten. autokeyunterstützt eine Schaltfläche zum Erfassen der Eigenschaften anderer Fenster wie Klasse / Titel.
anishsane
quelle
Tausend Dank. Es gibt viele Dinge über die Verwendung von Autokey für die Neuzuordnung von Schlüsseln, aber keine tatsächlichen Anweisungen dazu. Schließlich macht Ihre Antwort das. Ich kann nicht glauben, dass dich sonst niemand gestimmt hat.
pickle323
1
Verdammt autokey! Ich habe alles getan, was ich konnte, aber ich konnte es nicht auf meinem Ubuntu 16.04 installieren.
Yukashima Huksay
apt install autokey-gtk?
Anishsane
1
Bevor Sie zusätzliche Software installieren, überprüfen Sie möglicherweise, ob Ihr Fenstermanager dies direkt erledigt. Zum Beispiel hat meine .config in i3 Folgendes : bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m h, was drückt, ,wmhwenn ich drücke <C-S-h>, und dann weiß vim, wie man damit ,wmh
umgeht
^^ Das ist auch gut. Ich wollte die Schlüsselübersetzung jedoch nur auf gnome-terminal oder gvim beschränken. Keine anderen Apps. Andere Bewerbungen sollten weiterhin eingehen, <C-S-H>wenn ich darauf drücke.
Anishsane
5

Wenn Sie die vorhandene CV-Funktionalität verlieren, können Sie stattdessen CQ verwenden. Siehe: Hilfe STRG-V-Alternative.

Anurag Priyam
quelle
3

NeoVim bietet diese Funktionalität jetzt sowohl für Terminal- als auch für GUI-Clients an. Siehe : h nvim-features-new

OliverUv
quelle
3
Nicht ganz, es sei denn, Sie aktivieren CSI-Codes in Ihrem Terminal. Die STRG + SHIFT - Varianten , dass Neovim nicht der Box heraus stützen, sind meist nicht druckbare Zeichen (Beispiele bei aufgelistet neovim.org/doc/user/vim_diff.html#nvim-features-new ). Allerdings Meta - Akkord (einschließlich <m-s-...>Varianten) Sie arbeiten meist vollständig aus dem Kasten heraus .
Justin M. Keyes
In diesem Dokument heißt ALT (|META|) chords always work (even in the |TUI|). Map |<M-| with any key: <M-1>, <M-BS>, <M-Del>, <M-Ins>, <M-/>, <M-\>, <M-Space>, <M-Enter>, etc. Case-sensitive: <M-a> and <M-A> are two different keycodes.es, dass vor dem Teil "Groß- und Kleinschreibung beachten" ein Zeilenumbruch steht, der dies mehrdeutig macht. Danke für die Korrektur, @ JustinM.Keyes. Außerdem scheint vim 8.1 zwischen <M-a>und zu unterscheiden <M-A>.
Adam Katz
@ justin-m-keyes unterscheidet <c-s-l>sich perfekt von <c-l>in Konsoleohne zusätzlichen Aufwand
Slava
3

Aufgrund der Art und Weise, wie die Tastatureingabe intern behandelt wird, ist dies heute selbst in GVIM leider nicht mehr möglich. Einige Tastenkombinationen wie Ctrl+ nicht alphabetisch können nicht zugeordnet werden, und Ctrl+ Buchstabe vs. Ctrl+ Shift+ Buchstabe kann nicht unterschieden werden. (Es sei denn, Ihr Terminal sendet einen eindeutigen Termcap- Code dafür, was die meisten nicht tun.) Geben Sie im Einfüge- oder Befehlszeilenmodus die Tastenkombination ein. Wenn nichts passiert / eingefügt wird, können Sie diese Tastenkombination nicht verwenden. Dies gilt auch für <Tab>/ <C-I>, <CR>/ <C-M>/ <Esc>/ <C-[>usw. (Einzige Ausnahme ist <BS>/ <C-H>.) Dies ist ein bekannter Schmerzpunkt und Gegenstand verschiedener Diskussionen über vim_dev und den # vim-IRC-Kanal.

Einige Leute (vor allem Paul LeoNerd Evans) wollen das beheben (sogar für Konsolen-Vim in Terminals, die dies unterstützen) und haben verschiedene Vorschläge unterbreitet, vgl. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

Bis heute haben sich jedoch noch keine Patches oder Freiwilligen gemeldet, obwohl viele den Wunsch geäußert haben, dies in einer zukünftigen Vim-Version zu tun.

Ingo Karkat
quelle
1

Wie Sie bereits bemerkt haben, erhalten Sie denselben Schlüsselcode. Die einzige Möglichkeit, sie zu unterscheiden, besteht darin, den Status des ShiftSchlüssels in Ihrer Ereignisbehandlungsfunktion zu überprüfen . Wenn Sie zwischen Tastendruck und Verarbeitung eine Verzögerung von mehr als 0,5 Sekunden haben, werden Sie natürlich einige Treffer verpassen.

Javier
quelle
1
Ich denke, der Punkt meiner Frage war, dass es angesichts der Tatsache, dass gvim in der Lage ist, eine solche Unterscheidung zu treffen (obwohl dies bei einfachem vim nicht möglich ist), eine gvim-spezifische Erweiterung gibt, auf die ich mich verlassen kann, um Strg + Umschalt + V von Strg + V zu unterscheiden .
Kohsuke Kawaguchi
9
Wie überprüfe ich den Status des Shit-Schlüssels? Ich suchte, fand aber nichts, was auch nur annähernd nützlich war.
Bolov