Comment puis-je travailler avec des divisions dans Vim sans Ctrl-W?

25

Mon terminal ne me permet pas de taper Ctrl+ W, car c'est un raccourci pour fermer un onglet de terminal.

J'aime travailler avec des scissions, mais je ne trouve aucun moyen de le faire sans utiliser C-W. Cela m'a forcé à utiliser des onglets, parce que je peux basculer entre eux avec gt, gTou #gtoù # est un nombre, mais je trouve cela moins pratique que splits que je ne peux voir le contenu d'un fichier à la fois.

Je ne peux pas utiliser non mouse=aplus car mon terminal ne prend pas en charge cela.

Comment puis-je travailler avec des divisions dans Vim sans le combo Ctrl+ Wdisponible?

Mateon1
la source
1
Utilisez des mappages pour wincmd Par exemple, vous pouvez mapper: :nmap wj :wincmd j<cr>c'est la même chose que CTRL-W j(déplacer vers la fenêtre ci-dessous). :help wincmd
Alex Kroll
@AlexKroll Pourquoi ne postez-vous pas cela comme réponse? :-)
Martin Tournoij
1
@Carpetsmoker Ce n'est pas une couverture complète pour ce problème, je pense. CTRL-W jfonctionne avec des compteurs (allez à la nième fenêtre ci-dessous du courant), ma solution ne fonctionne pas.
Alex Kroll
2
Je n'apprécie pas normalement les conseils comme celui-ci, mais je chercherais un autre terminal. <C-W>est un raccourci trop utile (non seulement dans de nombreux endroits de Vim, mais aussi dans bash) pour être perdu. Je serais curieux de savoir quelles autres liaisons de touches sont consommées par le terminal - <C-T>? À tout le moins, je vérifierais si ceux-ci sont configurables dans le terminal.
tommcdo

Réponses:

24

Vous pouvez simplement remapper <C-w>vers une autre combinaison, par exemple:

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

Vous pouvez maintenant utiliser <C-e>et cela agira comme si vous aviez appuyé <C-w>.

Cela écrasera le <C-e>mappage par défaut (faites défiler vers le bas). Vim utilise déjà toutes les touches du clavier, et la seule façon d'empêcher cela est d'utiliser la touche leader, qui agit comme un "préfixe":

:nnoremap <Leader>w <C-w>

Sauf si vous avez remappé <Leader>, vous pouvez maintenant utiliser \w(les uns après les autres). En fait, je préfère cela car je n'aime pas les combinaisons de touches CTRL +.

Voir Qu'est-ce que <Leader>? et comment savoir à quoi <Leader> est réglé? Et est-il possible de remapper <Leader>? .

Martin Tournoij
la source
Résout mon problème. Ajout du mappage à mon vimrc et testé un peu sans problème.
Mateon1
13

J'utilise en fait :wincmdplus souvent que Ctrl+ Wcar je trouve plus facile de taper l'abrégé :winc.

Par exemple, l'équivalent de Ctrl+ W Lest :winc l.

user530873
la source
7

J'ai configuré les remaps suivants dans mon .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

Maintenant, je peux utiliser Ctrl+hpour passer à la fenêtre de gauche, Ctrl+lpour passer à la fenêtre de droite, etc. Il semble juste correspondre logiquement à la navigation normale de Vim.

Yep_It's_Me
la source
4
Notez que le mappage Ctrl + h dans un terminal ne fonctionne pas toujours, car il s'agit souvent de la touche de retour arrière. Voir cette réponse et cette question .
Martin Tournoij
Vous pouvez également l'utiliser nnoremap <cr> <c-w>w, car la touche retour n'est pas beaucoup utilisée en mode normal. Ensuite, il est facile de parcourir les divisions.
Hope
5

Pour gérer les splits, j'utilise le plugin de sous-mode qui est en fait assez pratique: il vous permet de créer un nouveau mode ("mode" comme en mode normal, mode visuel, mode insert, etc ...) où vous définissez de nouveaux raccourcis clavier .

Avec cela, vous n'avez plus à utiliser Ctrl+wet comme vous êtes dans un nouveau mode, toutes les touches sont libres de se lier: plus de problèmes comme "Merde, je ne trouve pas une combinaison de touches qui, en tant que signification et qui n'est pas encore mappée "

Vous pouvez installer le plugin avec n'importe quel gestionnaire de plugins classique, et voici quelques unes de mes configurations pour vous inspirer:


J'ai créé un nouveau mode que j'ai appelé WindowsModedans lequel je manipule mes divisions:

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

Ces lignes signifient que j'entre dans le mode avec Leaderket je quitte le mode avec Leader: Après avoir appuyé sur Leaderktoutes les touches, je vais:

  • Ne rien faire si je n'ai pas défini de mappage pour eux dans ce mode
  • Faites ce que j'ai décidé de les mapper dans ce mode (voir le reste de la réponse)
  • Reviens au mode normal si je frappe Leader

Une fois que je suis dans WindowsModeces lignes, faites hjklnaviguer à travers les divisions commeCtrl+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')

J'ai utilisé ces lignes pour diviser les fenêtres avec /et !:

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

Et qfermez une scission:

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

Déplacez les divisions avec 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')

Le sous-mode Vim permet de faire beaucoup de choses puissantes, voir la doc pour plus de détails.


EDIT Une autre approche du sous-mode Window est décrite ici . Je pense que la méthode utilisée par l'auteur est encore plus proche pour répondre à la question: Ici, on utilise pour créer un nouveau mode mais tous les <c-w>somethingmappings sont disponibles avec les mêmes touches dans le sous-mode:

" 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

Ainsi , toutes les correspondances <c-w>lowerCaseKey, <c-w>upperCaseKey, <c-w><c-Key>et les applications <c-w>=_+-<>sont accessibles en mode fenêtre sans le préfixe<c-w>

statox
la source