Como posso trabalhar com divisões no Vim sem Ctrl-W?

24

Meu terminal não permite que eu digite Ctrl+ W, porque é um atalho para fechar uma guia do terminal.

Eu gosto de trabalhar com divisões, mas não consigo encontrar nenhuma maneira de fazer isso sem usar C-W. Isso me forçou a usar abas, porque eu posso alternar entre eles com gt, gTou #gtonde # é um número, mas eu acho isso menos conveniente do que divisões como eu só posso ver o conteúdo de um arquivo de cada vez.

Também não posso usá-lo mouse=a, pois meu terminal não suporta isso.

Como posso trabalhar com divisões no Vim sem o combo Ctrl+ Wdisponível?

Mateon1
fonte
11
Use mapeamentos para wincmd Por exemplo, você pode mapear: :nmap wj :wincmd j<cr>ele age da mesma forma que CTRL-W j(mova para a janela abaixo). :help wincmd
Alex Kroll
@AlexKroll Por que você não publica isso como resposta? :-)
Martin Tournoij
11
@Carpetsmoker Não é uma cobertura completa para este problema, eu acho. CTRL-W jfunciona com contadores (vá para a n-ésima janela abaixo da atual) minha solução não.
Alex Kroll
2
Normalmente, não aprecio conselhos como esse, mas gostaria de procurar outro terminal. <C-W>é um atalho muito útil (não apenas em muitos lugares no Vim, mas também no bash) para ser cancelado. Eu ficaria curioso para saber quais outras combinações de teclas são consumidas pelo terminal - <C-T>? No mínimo, eu verificaria se estes são configuráveis ​​no terminal.
tommcdo

Respostas:

23

Você pode apenas remapear <C-w>para outra combinação, por exemplo:

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

Agora você pode usar <C-e>e ele funcionará como se você tivesse pressionado <C-w>.

Isso substituirá o <C-e>mapeamento padrão (role para baixo). O Vim já usa todas as teclas do teclado, e a única maneira de evitar isso é usar a tecla líder, que age como um "prefixo":

:nnoremap <Leader>w <C-w>

A menos que você tenha remapeado <Leader>, agora você pode usar \w(um após o outro). Na verdade, eu prefiro isso, pois não gosto de combinações de teclas CTRL +.

Consulte O que é o <Leader>? e Como posso descobrir o que <Leader> está definido? E é possível remapear <Leader>? .

Martin Tournoij
fonte
Resolve meu problema. Adicionado o mapeamento ao meu vimrc e testado um pouco sem problemas.
Mateon1
13

Na verdade, eu uso :wincmdmais frequentemente do que Ctrl+ Wporque acho mais fácil digitar a abreviada :winc.

Por exemplo, o equivalente a Ctrl+ W Lé :winc l.

user530873
fonte
7

Eu configurei os seguintes remaps no meu .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

Agora eu posso usar Ctrl+hpara mover para a janela esquerda, Ctrl+lpara mover para a janela direita, etc. Parece logicamente se encaixar na navegação normal do Vim.

Yep_It's_Me
fonte
4
Observe que o mapeamento de Ctrl + h em um terminal nem sempre funciona, pois essa é geralmente a tecla backspace. Veja esta resposta e esta pergunta .
Martin Tournoij
Além disso, você pode usar nnoremap <cr> <c-w>w, pois a tecla de retorno não é muito usada no modo normal. Então é fácil percorrer as divisões.
Hope
5

Para lidar com as divisões, eu uso o submode-plugin, que é realmente conveniente: permite criar um novo modo ("modo", como no modo normal, modo visual, modo de inserção, etc ...) onde você define novas ligações de teclas .

Com isso você não precisa Ctrl+wmais usar e, como você está em um novo modo, todas as chaves estão livres para se ligar: não há mais problemas como "Porra, não consigo encontrar uma combinação de teclas que, como um significado e ainda não esteja mapeada "

Você pode instalar o plug-in com qualquer gerenciador de plug-ins comum, e aqui estão algumas das minhas configurações para lhe dar alguma inspiração:


Criei um novo modo que chamei WindowsModeno qual manipulo minhas divisões:

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

Essas linhas significam que eu entro no modo com Leaderke saio do modo com Leader: Depois de pressionar Leaderktodas as teclas, pressione:

  • Não faça nada se eu não definir um mapeamento para eles nesse modo
  • Faça o que eu decidi mapeá-los neste modo (veja o restante da resposta)
  • Volte ao modo normal se eu pressionar Leader

Uma vez WindowsModenessas linhas, hjklnavegue pelas divisões comoCtrl+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')

Eu usei essas linhas para dividir as janelas /e !:

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

E qfeche uma divisão:

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

Mova as divisões com 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')

O Vim-submode permite fazer muitas coisas poderosas; consulte o documento para obter mais detalhes.


EDIT Outra abordagem do submodo Window é descrita aqui . Eu acho que o método usado pelo autor é ainda mais próximo para responder à pergunta: Aqui é usado para criar um novo modo, mas todos os <c-w>somethingmapeamentos estão disponíveis com as mesmas chaves no submodo:

" 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

Desta forma, todos os mapeamentos <c-w>lowerCaseKey, <c-w>upperCaseKey, <c-w><c-Key>e os mapeamentos <c-w>=_+-<>são acessíveis no modo de janela sem o prefixo<c-w>

statox
fonte