Naviguer entre les fenêtres VIM d'une manière alternative

J'utilise CtrlW {[2] } pour naviguer entre les fenêtres divisées VIM. Il existe différentes façons de le faire?

Par exemple, si j'ai, disons, 5 fenêtres divisées ouvertes et que je veux naviguer vers la fenêtre du coin supérieur gauche, CtrlW est très inconfortable car il nécessite de nombreuses frappes.

29
demandé sur Zsolt Botykai 2012-01-28 21:06:34

5 réponses

Pourquoi ne pas configurer quelque chose comme ça?

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

Beaucoup plus rapide ...

42
répondu Rook 2012-01-28 17:22:39

, Vous pouvez utiliser <number><c-w>w pour passer à une fenêtre particulière. Donc 1<c-w>w va la première fenêtre (coin supérieur gauche) 11<c-w>w se déplace vers la dernière fenêtre (ici, je suppose que vous avez moins de 11 divisions).

Je trouve aussi les mappages suivants pratiques et les avoir dans mon .vimrc

nnoremap <tab> <c-w>
nnoremap <tab><tab> <c-w><c-w>

Que j'utilise pour la couture de fenêtre (pour une raison quelconque si Je ne définis pas le deuxième mappage si je frappe tab deux fois, je reçois un message " Pas d'identifiant sous le curseur)

Lire la page d'aide pour CTRL-W, là est même un moyen plus pratique que 1<c-w>w et 11<c-w>w pour aller à la première et à la dernière fenêtre: {[6] } va à la fenêtre supérieure et <c-w>b va à la fenêtre inférieure.

18
répondu skeept 2012-02-07 16:20:14

Vous pouvez utiliser le nnoremap commande dans votre vimrc pour utiliser des raccourcis clavier.

La syntaxe de nnoremap est ceci:

nnoremap new_keybinding keystrokes

La commande nnoremap attribue une nouvelle liaison de touches qui, lorsque vous appuyez dessus en mode normal, la séquence de frappes qui ont été assignées à cette commande est répercutée sur Vim.

EDIT : Il y a aussi la commande nmap. la différence entre les deux est que nmap permet d'écraser vos raccourcis clavier actuels, alors que nnoremap ne le fait pas. La différence entre eux est expliquée dans cette réponse .

Par exemple, j'ai mis ces lignes dans mon .vimrc:

"Better window navigation
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-h> <C-w>h
nnoremap <C-l> <C-w>l

Ce qui me permet d'utiliser Ctrl+j, Ctrl+k, Ctrl+h, Ctrl+l au lieu de Ctrl+W j, Ctrl+W k, Ctrl+W h, Ctrl+W l pour la fenêtre de navigation, tout en conservant les vieux claviers.

Vous pouvez également rechercher :help key-mappings pour plus d'informations.

4
répondu Alexandros 2017-05-23 11:33:14

Merci à cette réponse sur le site se dédié à Vim, je suis venu à une autre alternative qui utilise un plugin pour créer un sous-mode dédié à la gestion de windows. Cela signifie qu'avec une combinaison de touches, j'entre dans un nouveau mode dans lequel certaines touches me permettront de faire différentes actions sur les fenêtres.

Après avoir installé vim-submode ajoutons quelques lignes à notre vimrc pour configurer un nouveau mode:

" Create a submode to handle windows
" The submode is entered whith <Leader>k and exited with <Leader>
call submode#enter_with('WindowsMode', 'n', '', '<Leader>k', ':echo "windows mode"<CR>')
call submode#leave_with('WindowsMode', 'n', '', '<Leader>')

Maintenant, vous devez simplement appuyer sur chef+k pour entrer dans le nouveau mode (Vous pouvez changer cela avec la ligne submode#enter_with) et appuyez sur Leader pour le quitter.

" 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')

Avec ces lignes, après avoir entré le nouveau mode (avec Leader+k) vous pourrez vous déplacer entre vos fenêtres avec les touches hjkl comme si vous utilisiez <c-w>hjlk en mode normal.

" Resize windows with <C-yuio> (interesting on azerty keyboards)
call submode#map('WindowsMode', 'n', '', 'u', '<C-w>-')
call submode#map('WindowsMode', 'n', '', 'i', '<C-w>+')
call submode#map('WindowsMode', 'n', '', 'y', '<C-w><')
call submode#map('WindowsMode', 'n', '', 'o', '<C-w>>')

, quelques lignes de plus pour permettre le redimensionnement de la fenêtre avec yuio (je choisis ces touches parce que sur un clavier azerty, ils sont juste sur la ligne sur hjkl et sont assez pratiques à utiliser, peut-être qu'il serait plus utile de changer cela sur un clavier qwerty, Je ne suis pas sûr).

" Move windows with <C-hjkl>
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')

Déplaçons les fenêtres avec <C-hjkl>.

" close a window with q
call submode#map('WindowsMode', 'n', '', 'q', '<C-w>c')

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

Et quelques mappages supplémentaires pour fermer une fenêtre et créer de nouveaux splits.

let g:submode_keep_leaving_key = 1
let g:submode_timeout = 0

Enfin, ces options permettent de maintenir une touche enfoncée et elle répétera son action.

Note je suis conscient que cette réponse décrire plus que simplement naviguer entre les fenêtres comme OP demandait. Je pense que la création d'un sous-mode est assez pratique mais n'est intéressante que si le sous-mode permet de faire plus qu'une seule action.

1
répondu statox 2017-04-13 12:51:57

Vous pouvez créer des mouvements diagonaux en continuant <C-w> une seconde fois dans une autre direction.

  "move from bottom left to top right diagonally
  "Mnemonic: keyboard finger movement from j to i
  nnoremap <C-i> <C-w>l<C-w>k 

  "move from top right to bottom left diagonally
  "Mnemonic: keyboard finger movement from j to n
  nnoremap <C-n> <C-w>h<C-w>j 

  "move from  top left to bottom right diagonally
  "Mnemonic: keyboard finger movement from j to m
  nnoremap <C-m> <C-w>l<C-w>j

  "move from bottom right to top left diagonally
  "Mnemonic: keyboard finger movement from j to y
  nnoremap <C-y> <C-w>h<C-w>k 
0
répondu zundarz 2015-09-21 14:44:29