Jak mapować Ctrl+A i Ctrl+Shift+a inaczej?

W terminalu nie można odróżnić Ctrl+A i Ctrl+Shift+a ponieważ oba emitują ten sam kod klucza, więc widzę, dlaczego Vim nie może tego zrobić. Ale gVim, będąc aplikacją X, potrafi odróżnić Ctrl+A i Ctrl+Shift+A . Czy jest jakiś sposób, aby mapować te dwie rzeczy inaczej?

Na początek chciałbym zrobić coś takiego: niech "wklej ze schowka" działa jak Terminal Gnome, zachowując Ctrl+V do trybu wizualnego.

:nmap <C-S-V> "+gP
Author: Sridhar Ratnakumar, 2009-10-01

7 answers

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


Jednak...

Niektóre terminale (np. xterm i iterm2) mogą być skonfigurowane tak, aby wysyłać dowolną sekwencję ucieczki dla dowolnej kombinacji klawiszy.

Na przykład dodaj następujący tekst do .Xresources dla Xterm aby wysłać <Esc>[65;5u dla CtrlShiftA . Następnie możesz odwzorować to w Vimie na <C-S-a>. (65 jest dziesiętną wartością Unicode dla shift-a i 5 jest bitem modyfikatora ctrl. 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 do tego celu (przykłady nie są podane).

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

 47
Author: graywh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-18 04:51:53

Jak już wspomniano, nie ma sposobów na mapowanie <C-S-A> inaczej niż <C-A>.

Jednak przy użyciu takich narzędzi jak autokey (dla Linuksa i windows) lub autohotkey (W przypadku systemu windows), można przerobić <C-S-A>, Aby wysłać inny obrys klawisza dla określonych aplikacji.

Np. w moim systemie mam takie 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.

Przypisać mu te właściwości:

  1. klawiatura-Skrót jako ctrl+shift+a
  2. klasa okien: gnome-terminal-server.Gnome-terminal

Wtedy Twój {[9] } może tworzyć mapowanie dla <S-F1>a, aby robić, co chcesz.


Uwagi:

  1. użyłem <S-F1> jako swego rodzaju klucz leader do wykrywania <C-S>. To dlatego, że mój terminal nie akceptował <F13>-<F37> klucze itp. Jeśli aplikacja obsługuje go, (gvim czy myślę) używanie tych kluczy jest zalecane.
  2. głównie vim w gnome-terminal. Więc użyłem window class = gnome-terminal-server.Gnome-terminal jako filtra. Zmodyfikuj go do użycia gvim, jeśli chcesz. autokey obsługuje przycisk do przechwytywania innych okien właściwości takie jak class / title.
 9
Author: anishsane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-18 04:27:16

Jeśli przeszkadza ci utrata funkcjonalności C-V, możesz użyć C-Q zamiast tego. Zobacz: help Ctrl-V-alternative.

 5
Author: Anurag Priyam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-07 10:31:51

Ze względu na sposób, w jaki wejście z klawiatury jest obsługiwane wewnętrznie, niestety nie jest to obecnie możliwe, nawet w GVIM. Niektóre kombinacje klawiszy, takie jak Ctrl + nie-Alfabetyczne nie mogą być mapowane, oraz Ctrl + litera vs. Ctrl + Shift + litera nie może być rozróżniona. (Chyba że twój terminal wyśle dla niego oddzielny kod termcap, którego większość nie wysyła.) w trybie wstawiania lub Wiersza poleceń spróbuj wpisać kombinację klawiszy. Jeśli nic się nie dzieje / jest włożony, nie można 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 punkt bólu 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 Vim w terminalach, które to obsługują), i mają 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 łatki ani ochotnicy, chociaż wielu wyraziło chęć posiadania tego w przyszłym wydaniu Vima.

 4
Author: Ingo Karkat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-05 15:08:11

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

 3
Author: OliverUv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-24 09:44:55

Jak już zauważyłeś, dostajesz ten sam kod. Tak więc jedynym sposobem na ich rozróżnienie jest sprawdzenie stanu klawisza Shift 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 kilka trafień.

 1
Author: Javier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-18 05:12:59

Większość emulatorów terminali domyślnie traktuje control plus shift po prostu jako control. Zamiast tego zazwyczaj mapujesz te kombinacje klawiszy do sekwencji escape i słuchasz tego wewnątrz aplikacji terminala.

Krok 1: Skonfiguruj emulator terminala do bindowania Ctrl+Shift+A do sekwencji Esc,A .

Twój emulator terminala to program, który pokazuje rzeczywiste okno terminala. Przy dostępie do serwera poprzez SSH, terminal emulator jest programem na komputerze lokalnym. Binding keys działa inaczej w różnych emulatorach terminali. Na przykład:

  • dla urxvt, dodaj {[1] } do pliku konfiguracyjnego ~/.Xresources i przeładuj go za pomocą xrdb ~/.Xresources.
  • Dla iTerm2 otwórz Preferences - > Keys, Dodaj wpis i bind Ctrl+Shift+A do akcji "Send Escape Sequence" i wpisz A w poniższe pole.

Krok 2: Bind Esc,a do polecenia w Vim.

Dodaj mapowanie klucza do konfiguracji ~/.vimrc i przeładuj go za pomocą :source ~/.vimrc:

nnoremap <esc>a your command here
 0
Author: danijar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-19 21:32:20