Jak mogę pracować z podziałami w Vimie bez Ctrl-W?

24

Mój terminal nie pozwala mi pisać Ctrl+ W, ponieważ jest to skrót do zamykania karty terminalu.

Lubię pracować z podziałami, ale nie mogę znaleźć sposobu, aby to zrobić bez użycia C-W. To zmusiło mnie do używania kart, bo mogę przełączać się między nimi gt, gTalbo #gtgdzie # to numer, ale uważam, że to mniej wygodne niż podziały jak widzę tylko zawartość jednego pliku naraz.

Nie mogę też użyć mouse=a, ponieważ mój terminal tego nie obsługuje.

Jak mogę pracować z podziałami w Vimie bez dostępnej kombinacji Ctrl+ W?

Mateon1
źródło
1
Użyj odwzorowań, aby wincmd na przykład można zmapować: :nmap wj :wincmd j<cr>działa tak samo jak CTRL-W j(przejdź do okna poniżej). :help wincmd
Alex Kroll,
@AlexKroll Dlaczego nie opublikujesz tego jako odpowiedzi? :-)
Martin Tournoij
1
@Carpetsmoker Myślę, że to nie jest pełne pokrycie tego problemu. CTRL-W jdziała z licznikami (przejdź do n-tego okna poniżej z bieżącego) moje rozwiązanie nie działa.
Alex Kroll
2
Zwykle nie doceniam takich porad, ale szukałem innego terminala. <C-W>jest zbyt przydatnym skrótem (nie tylko w wielu miejscach w Vimie, ale także w bash), aby go przepuścić. Byłbym ciekawy, jakie inne powiązania klawiszy są używane przez terminal - <C-T>? Przynajmniej sprawdziłbym, czy można je skonfigurować w terminalu.
tommcdo

Odpowiedzi:

23

Możesz po prostu zmienić przypisanie <C-w>do innej kombinacji, na przykład:

:nnoremap <C-e> <C-w>

Możesz teraz użyć <C-e>i będzie działać tak, jakbyś nacisnął <C-w>.

Spowoduje to zastąpienie domyślnego <C-e>mapowania (przewiń w dół). Vim już używa każdego klawisza na klawiaturze, a jedynym sposobem, aby temu zapobiec, jest użycie klawisza wiodącego, który działa jak „przedrostek”:

:nnoremap <Leader>w <C-w>

O ile nie odwzorowano ponownie <Leader>, możesz teraz używać \w(po sobie). Właściwie wolę to, ponieważ nie lubię kombinacji klawiszy CTRL +.

Zobacz Co to jest <Leader>? i jak mogę dowiedzieć się, do czego ustawiony jest <Leader>? Czy jest możliwe ponowne mapowanie <Leader>? .

Martin Tournoij
źródło
Rozwiązuje mój problem. Dodano mapowanie do mojego vimrc i przetestowałem trochę bez problemów.
Mateon1,
13

Właściwie używam :wincmdczęściej niż Ctrl+, Wponieważ łatwiej jest mi pisać skróty :winc.

Na przykład odpowiednikiem Ctrl+ W Ljest :winc l.

użytkownik530873
źródło
7

Skonfigurowałem następujące remapy w moim .vimrc:

nmap <C-h> <C-w>h
nmap <C-j> <C-w>j
nmap <C-k> <C-w>k
nmap <C-l> <C-w>l

Teraz mogę użyć, Ctrl+haby przejść do lewego okna, Ctrl+laby przejść do prawego okna itp. Wygląda na to, że logicznie pasuje do normalnej nawigacji Vima.

Tak, to ja
źródło
4
Zauważ, że mapowanie Ctrl + h w terminalu nie zawsze działa, ponieważ często jest to klawisz cofania. Zobacz tę odpowiedź i to pytanie .
Martin Tournoij
Możesz także użyć nnoremap <cr> <c-w>w, ponieważ klawisz powrotu nie jest często używany w trybie normalnym. Następnie bez wysiłku można przejść przez podziały.
Hope,
5

Do radzenia sobie z podziałami używam wtyczki submode, która jest całkiem wygodna: pozwala ci stworzyć nowy tryb („tryb” jak w trybie normalnym, tryb wizualny, tryb wstawiania itp.), W którym definiujesz nowe powiązania klawiszy .

Dzięki temu nie musisz Ctrl+wjuż używać, a ponieważ jesteś w nowym trybie, wszystkie klucze mogą swobodnie wiązać: nigdy więcej problemów takich jak „Cholera, nie mogę znaleźć kombinacji klawiszy, która jako symbol i nie jest jeszcze zmapowana „

Możesz zainstalować wtyczkę za pomocą dowolnego zwykłego menedżera wtyczek, a oto niektóre z mojej konfiguracji, aby dać ci inspirację:


Utworzyłem nowy tryb, który wywołałem, WindowsModew którym manipuluję swoimi podziałami:

call submode#enter_with('WindowsMode', 'n', '', '<Leader>k', ':echo "windows mode"<CR>')
call submode#leave_with('WindowsMode', 'n', '', '<Leader>')

Te linie oznaczają, że wchodzę w tryb za pomocą Leaderki wychodzę z tego za pomocą Leader: Po naciśnięciu Leaderkwszystkich klawiszy, które uderzyłem:

  • Nie rób nic, jeśli nie zdefiniowałem dla nich mapowania w tym trybie
  • Zrób to, co postanowiłem zmapować w tym trybie (zobacz resztę odpowiedzi)
  • Jeśli uderzę, wróć do normalnego trybu Leader

Gdy będę już w WindowsModetych liniach, hjklnawiguj między podziałami jakCtrl+whjkl

" Change of windows with hjkl
call submode#map('WindowsMode', 'n', '', 'j', '<C-w>j')
call submode#map('WindowsMode', 'n', '', 'k', '<C-w>k')
call submode#map('WindowsMode', 'n', '', 'h', '<C-w>h')
call submode#map('WindowsMode', 'n', '', 'l', '<C-w>l')

Użyłem tych linii do podzielenia okien za pomocą /i !:

" split windows with / and !
call submode#map('WindowsMode', 'n', '', '/', '<C-w>s')
call submode#map('WindowsMode', 'n', '', '!', '<C-w>v')

I qzamknij podział:

call submode#map('WindowsMode', 'n', '', 'q', '<C-w>c')

Przenieś podziały za pomocą Ctrlhjkl:

call submode#map('WindowsMode', 'n', '', '<C-j>', '<C-w>J')
call submode#map('WindowsMode', 'n', '', '<C-k>', '<C-w>K')
call submode#map('WindowsMode', 'n', '', '<C-h>', '<C-w>H')
call submode#map('WindowsMode', 'n', '', '<C-l>', '<C-w>L')

Vim-submode pozwala robić wiele potężnych rzeczy, więcej informacji można znaleźć w dokumencie .


EDYCJA W tym miejscu opisano inne podejście do podmoduła Window . Myślę, że metoda zastosowana przez autora jest jeszcze bliższa odpowiedzi na pytanie: tutaj jest używana do stworzenia nowego trybu, ale wszystkie <c-w>somethingmapowania są dostępne z tymi samymi kluczami w submode:

" Go through every letter
for key in ['a','b','c','d','e','f','g','h','i','j','k','l','m',
\           'n','o','p','q','r','s','t','u','v','w','x','y','z']
  " maps lowercase, uppercase and <C-key>
  call submode#map('window', 'n', '', key, '<C-w>' . key)
  call submode#map('window', 'n', '', toupper(key), '<C-w>' . toupper(key))
  call submode#map('window', 'n', '', '<C-' . key . '>', '<C-w>' . '<C-'.key . '>')
endfor

" Go through symbols. Sadly, '|', not supported in submode plugin.
for key in ['=','_','+','-','<','>']
  call submode#map('window', 'n', '', key, '<C-w>' . key)
endfor

W ten sposób wszystkie mapowania <c-w>lowerCaseKey, <c-w>upperCaseKey, <c-w><c-Key>i mapowania <c-w>=_+-<>są dostępne w trybie okienkowym bez prefiksu<c-w>

statox
źródło