Dlaczego Vim wymaga, aby każde mapowanie klucza miało unikalny kod ascii?

2

Rozumiem, że Vim nie może odróżnić <c-s-[key]> i <c-[key]> ponieważ mapują do tego samego kodu ascii. I również z tego samego powodu <c-i> jest równa <tab>. Podobnie nie możesz mapować <c-1>, <c-;>, itp., ponieważ nie ma reprezentacji ascii.

Czytałem, że niektórzy twierdzą, że to ograniczenie jest w porządku, ponieważ bardziej ergonomiczne jest unikanie akordów / modyfikatorów na rzecz słów (np. Z klawiszem lidera). Ale niektóre operacje są po prostu bardziej odpowiednie dla akordów / modyfikatorów (takich jak rzeczy, które prawdopodobnie powtórzą się)

Pytam się, dlaczego Vim był tak zaprojektowany? Albo dlaczego, ponieważ Vim jest open source, nie ma kompilacji Vima ani GVima, która dodała wsparcie dla tego? Szkoda, że ​​edytor jest tak śmiesznie konfigurowalny, aby ograniczyć się w ten sposób. Czy ktoś może mi to wytłumaczyć?

Steve Vermeulen
źródło
Dla każdego, kto jest zainteresowany obejściami, udało mi się uniknąć użycia autohotkey. Vim rozpoznaje & lt; c-f1 & gt; do
Steve Vermeulen

Odpowiedzi:

3

Ze względu na sposób, w jaki dane wejściowe klawiatury są 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, i Ctrl + litera vs. Ctrl + Przesunięcie + list nie może być rozróżniony. (Chyba że twój terminal wysyła wyraźne termcap kod dla tego, czego większość nie robi.) W trybie wstawiania lub wiersza polecenia spróbuj wpisać kombinację klawiszy. Jeśli nic się nie dzieje / nie jest wstawione, 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 temat vim_dev i kanału #vim IRC.

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

Zasadniczo Vim musiałby używać bardziej nowoczesnych bibliotek, które obsługują nowoczesne funkcje emulatora terminali, aby pobierać nieprzetworzone kody kluczy. Wyzwanie polega na tym, że te kody kluczy są (błędnie) wykorzystywane w wielu miejscach w kodzie źródłowym Vima, a aktualizacja takiej centralnej struktury jest trudna.

Ale na dzień dzisiejszy nie pojawiły się żadne poprawki ani ochotnicy, choć wielu wyraziło chęć posiadania tego w przyszłej głównej wersji Vima 8. \ t Jeśli uważasz, że jest to punkt bólu i jesteś w stanie się przyczynić, lista dyskusyjna vim_dev lista mailingowa to miejsce, w którym możesz się zgłosić.

Ingo Karkat
źródło
3

Vim zezwala na modyfikatory & lt; C- i & lt; C-S- na klawiszach strzałek, ponieważ te kombinacje są obsługiwane przez niektóre emulatory terminali, ale myślę, że to wszystko. Ogólnie ogranicza się do kodów kluczowych, które mogą być generowane przez emulatory terminali.

Vim został zaprojektowany w ten sposób, ponieważ jest Vi-IMproved, a vi został zaprojektowany do użycia z terminalami CRT w tym czasie, które wysyłały i otrzymywały znaki ASCII. Od tego czasu Vim ewoluował zgodnie z zasadami omówionymi w

:help design-goals

Szczególnie istotne są następujące elementy:

  • Minimalizuj używając CTRL i innych modyfikatorów, są trudniejsze do wpisania.
  • Ludzie przechodzą z jednej platformy na drugą iz GUI na terminal wersja. Funkcje powinny być obecne we wszystkich wersjach lub przynajmniej w tylu jak to możliwe przy rozsądnym wysiłku. Staraj się unikać przełączania użytkowników między platformami, aby skutecznie wykonywać swoją pracę.
  • Vim nie jest fantazyjnym edytorem GUI, który próbuje wyglądać ładnie kosztem mniej spójne na wszystkich platformach. Ale funkcjonalne funkcje GUI to mile widziana.

Tak więc unika się generalnie wszystkich kodów kluczy dostępnych tylko z GUI, a nie z emulatora terminala, dzięki czemu wszystko, co można zrobić w gvimie, można zrobić w vim. Jest to uważane przez większość użytkowników Vima za funkcję.

garyjohn
źródło
1

Lista mailingowa vim-dev jest prawdopodobnie lepszym miejscem na to pytanie.

Czy mógłbyś rozwinąć tę część: „lubisz rzeczy, które prawdopodobnie powtórzysz”?

W każdym razie vim, który robi to, co chcesz, nie istnieje, ponieważ nie troszczy się o to za mało użytkowników. Akordy są zarówno ergonomicznym koszmarem, jak i wynikiem ograniczeń edycji bez modelowania. Po usunięciu wszystkich skrótów na poziomie systemu operacyjnego po prostu nie ma wystarczającej liczby dostępnych kluczy do mapowań, co z kolei zmusza cię do konstruowania skomplikowanych i niepraktycznych akordów. <C-S-w> nie jest lepszy niż ,w przez dowolną część wyobraźni.

Podejście Vima, z takimi kluczowymi sekwencjami ,bc lub cokolwiek chcesz, jest dużo bardziej skalowalne i dużo łagodniejsze dla twojego ciała.

romainl
źródło
1
Niektóre rzeczy, takie jak mapowanie dla: tabnext /: tabprev, są często wykonywane wielokrotnie (a także nie działają z operatorem powtarzania). Lub zamiana bieżącego okna na inne. Lub posuwając się naprzód przez słowo przypadku wielbłąda. Twierdzę, że c-s-w jest lepszy niż, w w tych przypadkach, gdy zaczniesz je robić wielokrotnie.
Steve Vermeulen
. powtarza zmiany, nic dziwnego, że nie działa :tabnext / :tabprev. Biorąc pod uwagę, że używanie wielu kart jest w dużej mierze błędem w Vimie, gt / gT są więcej niż wystarczające, IMO. Mniej „znajome” niż skomplikowane i nieintuicyjne skróty używane przez większość innych edytorów, być może, ale w dużej mierze równie skuteczne, jeśli nie więcej. Ale najwyraźniej się z tym nie zgadzamy. W każdym razie, jeśli masz ochotę rozwidlić Vima… na wszelki wypadek, śmiało!
romainl