Come posso lavorare con le divisioni in Vim senza Ctrl-W?


24

Il mio terminale non mi consente di digitare Ctrl+ W, perché è una scorciatoia per chiudere una scheda del terminale.

Mi piace lavorare con le divisioni, ma non riesco a trovare un modo per farlo senza usare C-W. Questo mi ha costretto a utilizzare le schede, perché posso passare da uno all'altro con gt, gTo #gtdove # è un numero, ma trovo questo meno conveniente di quanto si divide come posso vedere solo il contenuto di un file alla volta.

Nemmeno io posso usarlo mouse=apoiché il mio terminale non lo supporta.

Come posso lavorare con le divisioni in Vim senza la combo Ctrl+ Wdisponibile?


1
Usa le mappature wincmd Ad esempio puoi mappare: :nmap wj :wincmd j<cr>si comporta come CTRL-W j(passa alla finestra in basso). :help wincmd
Alex Kroll,

@AlexKroll Perché non lo pubblichi come risposta? :-)
Martin Tournoij,

1
@Carpetsmoker Non è una copertura completa per questo problema, penso. CTRL-W jfunziona con i contatori (vai alla n-esima finestra in basso dalla corrente) la mia soluzione no.
Alex Kroll,

2
Normalmente non apprezzo consigli come questo, ma cercherò un altro terminale. <C-W>è troppo utile una scorciatoia (non solo in molti luoghi di Vim, ma anche in bash) per rinunciare. Sarei curioso di sapere quali altri collegamenti chiave vengono consumati dal terminale - <C-T>? Per lo meno, esaminerei se questi sono configurabili nel terminale.
Tommaso,

Risposte:


23

Puoi semplicemente rimappare <C-w>in un'altra combinazione, ad esempio:

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

Ora puoi usare <C-e>e si comporterà come se avessi premuto <C-w>.

Questo sovrascriverà il <C-e>mapping predefinito (scorrere verso il basso). Vim utilizza già tutti i tasti della tastiera e l'unico modo per impedirlo è utilizzare il tasto guida, che si comporta come un "prefisso":

:nnoremap <Leader>w <C-w>

A meno che tu non abbia rimappato <Leader>, ora puoi usare \w(uno dopo l'altro). In realtà preferisco questo poiché non mi piacciono le combinazioni di tasti CTRL +.

Vedi Cos'è <Leader>? e come posso sapere su quale <Leader> è impostato? Ed è possibile rimappare <Leader>? .


Risolve il mio problema Aggiunta la mappatura al mio vimrc e testata un po 'senza problemi.
Mateon1,

13

In realtà uso :wincmdpiù spesso di Ctrl+ Wperché trovo più facile digitare l'abbreviazione :winc.

Ad esempio, l'equivalente di Ctrl+ W Lè :winc l.


7

Ho impostato i seguenti riassunti nel mio .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

Ora posso usare Ctrl+hper spostarmi nella finestra a sinistra, Ctrl+lper spostarmi nella finestra a destra, ecc. Sembra adattarsi logicamente alla normale navigazione di Vim.


4
Si noti che la mappatura di Ctrl + h in un terminale non funziona sempre, poiché questo è spesso il tasto backspace. Vedi questa risposta e questa domanda .
Martin Tournoij,

Inoltre, è possibile utilizzare nnoremap <cr> <c-w>w, poiché la chiave di ritorno non viene utilizzata molto in modalità normale. Quindi è facile scorrere le divisioni.
Spero il

5

Per gestire le divisioni, utilizzo il plug-in submode che in realtà è abbastanza conveniente: ti consente di creare una nuova modalità ("modalità" come in modalità normale, modalità visiva, modalità di inserimento, ecc ...) in cui definisci nuove combinazioni di tasti .

Detto questo, non devi Ctrl+wpiù utilizzarlo e, dato che sei in una nuova modalità, tutti i tasti sono liberi di legarsi: niente più problemi come "Accidenti, non riesco a trovare una combinazione di tasti che come significato e non ancora mappata "

Puoi installare il plug-in con qualsiasi normale gestore di plug-in, e qui sono alcune delle mie configurazioni per darti l'ispirazione:


Ho creato una nuova modalità che ho chiamato WindowsModein cui manipolo le mie divisioni:

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

Queste righe indicano che entro nella modalità con Leaderke esco dalla modalità con Leader: Dopo aver premuto Leaderktutti i tasti premuti:

  • Non fare nulla se non ho definito una mappatura per loro in questa modalità
  • Fai quello che ho deciso di mapparli in questa modalità (vedi il resto della risposta)
  • Torna alla modalità normale se colpisco Leader

Una volta che sono in WindowsModequeste righe fai hjklnavigare attraverso le spaccature comeCtrl+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')

Ho usato queste linee per dividere le finestre con /e !:

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

E qchiudi una divisione:

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

Sposta le divisioni con 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 ti permette di fare molte cose potenti, vedi il documento per maggiori dettagli.


EDIT Un altro approccio della sottomodalità Window è descritto qui . Penso che il metodo usato dall'autore sia ancora più vicino per rispondere alla domanda: qui è usato per creare una nuova modalità ma tutti i <c-w>somethingmapping sono disponibili con le stesse chiavi nel sottomodice:

" 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

In questo modo tutte le mappature <c-w>lowerCaseKey, <c-w>upperCaseKey, <c-w><c-Key>e le mappature <c-w>=_+-<>sono tutti accessibili in modalità finestra senza il prefisso<c-w>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.