Jak inaczej zmapować Ctrl + A i Ctrl + Shift + A?

92

W terminalu nie można rozróżnić Ctrl+ Ai Ctrl+ Shift+, Aponieważ oba emitują ten sam kod klucza, więc widzę, dlaczego Vim nie może tego zrobić. Ale gVim, będąc aplikacją X, może rozróżniać Ctrl+ Ai Ctrl+ Shift+ A. Czy istnieje sposób na odwzorowanie tych dwóch rzeczy w inny sposób?

Na początek chciałbym zrobić coś takiego: sprawić, by funkcja „wklej ze schowka” działała jak terminal Gnome, jednocześnie zachowując Ctrl+ Vw trybie wizualnym.

:nmap <C-S-V> "+gP
Kohsuke Kawaguchi
źródło
3
@vivoconunxino Ten link nie wspomina o dodaniu modyfikatora shift do ctrl-a.
graywh

Odpowiedzi:

47

Gvim tego nie robi, ponieważ vim nie może tego zrobić (w normalnych okolicznościach). Przepraszam, ale tak właśnie jest.


Jednak...

Niektóre terminale (np. Xterm i iterm2) można skonfigurować tak, aby wysyłały dowolną sekwencję ucieczki dla dowolnej kombinacji klawiszy.

Na przykład dodać następujące .Xresourcesdla xterm wysłać <Esc>[65;5udo CtrlShiftA. Możesz następnie zmapować to w Vimie na <C-S-a>. (65 to dziesiętna wartość Unicode dla shift-a, a 5 to bit modyfikatora ctrl. Litera u w tym przypadku oznacza „unicode”).

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

iTerm i [u] rxvt mogą być również skonfigurowane, aby to zrobić (przykłady nie są dostarczane).

Więcej informacji: http://www.leonerd.org.uk/hacks/fixterms/

szarość
źródło
Aby zmienić przypisanie wielu kluczy, spójrz na ten dokument : Oddziel wpisy kluczy za pomocą \n. Użyj odwrotnego ukośnika, aby podzielić linie. Np. Aby zmapować również <kbd> CSB </kbd> i <kbd> CSF </kbd> użyj tego: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")
cfi
Ze względu na kompletność, może dodać do odpowiedzi również, jak odwzorować to w vi? Np. map <ESC>[66;5u :echo "ctrl-shift-b received"<CR>Aby zmapować ctrl-shift-b, aby wydrukować komunikat w linii statusu. Na AskUbuntu było podobne pytanie i podsumowałem to.
cfi
Potrzebujemy nowej specyfikacji terminala! xterm-256color(ostatni) cierpią z powodu tak wielu ograniczeń.
Jérôme Pouiller,
@Jezz Ograniczenia dotyczą samego termcap, a nie pliku termcap dla xterm-256color.
graywh
@graywh Jasne, nowe funkcje termcap byłyby konieczne
Jérôme Pouiller,
9

Jak już wspomniano, nie ma możliwości mapowania <C-S-A>inaczej niż <C-A>.

Jednak używając narzędzi takich jak autokey(dla systemu Linux i Windows) lub autohotkey(dla systemu Windows), możesz zmienić mapowanie, <C-S-A>aby wysłać różne naciśnięcia klawiszy dla określonych aplikacji.

np. w moim systemie mam to ustawienie w 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.

Przypisz mu te właściwości:

  1. skrót klawiaturowy jako ctrl+shift+a
  2. klasa okna: gnome-terminal-server.Gnome-terminal

Następnie ~/.vimrcmożesz utworzyć mapowanie, <S-F1>aaby robić, co chcesz.


Uwagi:

  1. Użyłem <S-F1>jako klucza lidera do wykrywania <C-S>. To dlatego, że mój terminal nie akceptował kluczy <F13>- <F37>itp. Jeśli twoja aplikacja to obsługuje, ( gvimmyślę, że) użycie tych klawiszy jest zalecane.
  2. Głównie vimw gnome-terminal. Więc użyłem window class = gnome-terminal-server.Gnome-terminaljako filtra. Zmodyfikuj go, aby użyć, gvimjeśli chcesz. autokeyobsługuje przycisk do przechwytywania właściwości innych okien, takich jak klasa / tytuł.
anishsane
źródło
Wielkie dzięki. Jest wiele rzeczy na temat używania Autokey do zmiany mapowania klawiszy, ale nie ma żadnych instrukcji, jak to zrobić. Wreszcie twoja odpowiedź to robi. Nie mogę uwierzyć, że nikt inny cię nie głosował.
pikle323
1
Cholerny autokey! Zrobiłem wszystko, co mogłem, ale nie mogłem go zainstalować na moim Ubuntu 16.04.
yukashima huksay
apt install autokey-gtk?
anishsane
1
Przed zainstalowaniem dodatkowego oprogramowania możesz sprawdzić, czy Twój menedżer okien obsługuje to bezpośrednio. Na przykład w i3 mój .config ma to bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m h,wmh<C-S-h>,wmh
:,
^^ To też jest dobre. Jednak chciałem ograniczyć tłumaczenie kluczy tylko do gnome-terminal lub gvim. Nie inne aplikacje. Inne aplikacje powinny nadal otrzymywać, <C-S-H>gdy to naciśnę.
anishsane
5

Jeśli przeszkadza Ci utrata istniejącej funkcjonalności CV, możesz zamiast tego użyć CQ. Zobacz: help CTRL-V-alternatywa.

Anurag Priyam
źródło
3

NeoVim oferuje teraz tę funkcjonalność zarówno dla swoich klientów terminala, jak i dla klientów GUI. Zobacz : h nvim-features-new

OliverUv
źródło
3
Niezupełnie, chyba że włączysz kody CSI w swoim terminalu. CTRL-SHIFT warianty że Neovim ma wspierać wyjęciu z pudełka to głównie znaki niedrukowalne (przykłady wymienione w neovim.org/doc/user/vim_diff.html#nvim-features-new ). Jednak meta akordy (w tym <m-s-...>warianty) działają w większości po wyjęciu z pudełka.
Justin M. Keyes
W tym dokumencie jest napisane 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., że przed częścią „Uwzględniana wielkość liter:” jest podział wiersza, co sprawia, że ​​jest to niejednoznaczne. Dzięki za korektę, @ JustinM.Keyes. 8.1 nie rozróżnia także Vim <M-a>i <M-A>jak dobrze.
Adam Katz
@ justin-m-keyes <c-s-l>doskonale odróżnia się od <c-l>in Konsolebez dodatkowych kłopotów
Slava
3

Ze względu na sposób, w jaki wejście klawiatury jest obsługiwane wewnętrznie, niestety nie jest to obecnie generalnie możliwe, nawet w GVIM. Niektórych kombinacji klawiszy, takich jak Ctrl+ niealfabetyczne, nie można zamapować, a Ctrl+ litera i Ctrl+ Shift+ litera nie mogą być rozróżnione. (Chyba że twój terminal wysyła dla niego odrębny kod termcap , czego większość nie robi.) W trybie wstawiania lub linii poleceń spróbuj wpisać kombinację klawiszy. Jeśli nic się nie dzieje / nie jest wstawione, nie możesz użyć tej kombinacji klawiszy. Dotyczy to również <Tab>/ <C-I>, <CR>/ <C-M>/ <Esc>/ <C-[>itd. (Jedynym wyjątkiem jest <BS>/ <C-H>.) Jest to znany problem i temat różnych dyskusji na vim_dev i kanale IRC #vim.

Niektórzy ludzie (przede wszystkim Paul LeoNerd Evans) chcą to naprawić (nawet dla konsoli Vima w terminalach, które to obsługują) i przedstawili różne propozycje, cp. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

Ale na dzień dzisiejszy nie pojawiły się jeszcze żadne poprawki ani ochotnicy, chociaż wielu wyraziło chęć posiadania tego w przyszłym wydaniu Vima.

Ingo Karkat
źródło
1

Jak zauważyłeś, otrzymujesz ten sam kod. Dlatego jedynym sposobem na ich rozróżnienie jest sprawdzenie stanu Shiftklucza w funkcji obsługi zdarzeń. Oczywiście, jeśli masz więcej niż 0,5 sekundy opóźnienia między naciśnięciem klawisza a przetwarzaniem, przegapisz niektóre trafienia.

Javier
źródło
1
Chyba chodziło mi o to, że biorąc pod uwagę, że gvim jest w stanie dokonać takiego rozróżnienia (nawet jeśli zwykły vim nie może), czy istnieje jakieś rozszerzenie specyficzne dla gvim, na którym mógłbym polegać, aby odróżnić Ctrl + Shift + V vs Ctrl + V .
Kohsuke Kawaguchi
9
jak sprawdzić stan klucza Shit? Szukałem, ale nie znalazłem niczego, nawet w niewielkim stopniu przydatnego.
bolov