2010-03-12 5 views
4

Le problème auquel je suis confronté est que j'ai mappé certaines touches et les événements de souris pour seraching dans vim lors de l'édition d'un fichier. Mais ces mappages ont un impact sur la fonctionnalité si le tampon quickfix.Comment mapper des clés dans vim différemment pour différents types de tampons

Je me demandais s'il est possible de mapper des clés en fonction du tampon dans lequel elles sont utilisées.

EDIT - J'ajoute plus d'information pour cette question Considérons un scénario. Je veux mapper <C-F4> pour fermer un tampon/fenêtre. Maintenant, ce comportement pourrait dépendre d'un certain nombre de choses.

Si je suis en train d'éditer un tampon, il devrait juste fermer ce tampon sans changer la disposition des fenêtres. J'utilise le plugin buffkil pour cela.

Cela ne dépend pas de l'extension du fichier mais du type de tampon. J'ai vu dans la documentation de vim qu'il y a des tampons non listés et listés. Donc, si le tampon est listé, il devrait fermer en utilisant les commandes bufkill.

Si ce n'est pas un tampon répertorié, il doit utiliser la commande <c-w>c pour fermer le tampon et modifier la disposition de la fenêtre.

Je suis nouveau à l'écriture des fonctions vim/scripts, quelqu'un peut-il me aide pour commencer à ce

Répondre

4
function KillBuffer() 
    if &buflisted 
     " bufkill command here 
    else 
     execute "normal! \<C-w>c" 
    endif 
endfunction 
noremap <C-F4> :call KillBuffer()<CR> 

Mettez dans votre .vimrc Ou, si vous voulez gérer la fenêtre quickfix comme tampons non listés (dans mon Vim est répertorié):

function KillBuffer() 
    if &buflisted && !&filetype=="qf" 
     " bufkill command here 
    else 
     execute "normal! \<C-w>c" 
    endif 
endfunction 
noremap <C-F4> :call KillBuffer()<CR> 

Selon le manuel, vous pouvez remplacer execute "normal! \<C-w>c" par close! plus simple dans les scripts ci-dessus.

+0

merci la première solution fonctionne bien. Mais certains comment je ne suis pas capable de le faire fonctionner pour la fenêtre de quickfix. Quand je suis dans la fenêtre de quickfix et si je fais 'si & filetype ==" qf "' ceci ne retourne pas vrai. J'ai lu la documentation mais je n'ai pas pu trouver ce qui ne va pas ici –

+0

Vim version? Comment obtenez-vous la fenêtre quickfix? J'ai testé cela en exécutant ': helpg smth', que' cw' et il avait le type "qf". La fenêtre Quickfix obtenue par les commandes 'make' que' cw' a aussi ce type de fichier. – ZyX

+0

ahhhh ... je l'ai compris '! & Filetype ==" qf "' doit être '! (& Filetype ==" qf ")' .... stupide moi –

1

Vous pouvez intercepter certains types de fichiers de chargement et affecter des applications spécifiques tampons.

au! BufRead *.ext call <SID>init_hotkeys() 

function s:init_hotkeys() 
    nnoremap <buffer> <CR> :Action<CR> 
endfunction 

Pour mapper une logique complexe sur le raccourci clavier que vous pouvez utiliser écrire quelque chose comme ceci dans votre vimrc, ou mieux encore - mettre ce qui suit au fichier closebuffer.vim dans votre répertoire de plugin vim

function s:close_buffer() 
    if &buflisted 
     " your command here from the killbuf plugin 
     echo "Listed Buffer" 
    else 
     wincmd c 
     " or 
     " normal <c-w>c 
    endif 
endfunction 

nnoremap <C-F4> :call <SID>close_buffer()<CR> 
+0

C'était utile, mais je ne pouvais pas réaliser ce que je voulais. Pouvez-vous m'aider avec la description mise à jour que j'ai posté –

+0

merci pour la réponse –

1

Vous pouvez créer des paramètres spécifiques au type de fichier. Tout d'abord, dans votre fichier vimrc, assurez-vous que les plugins filetype sont activés en ajoutant

plugin filet sur

Ensuite, faire un plugin spécifique filetype. Sous Unix, créez un fichier appelé ~/.vim/after/ftplugin/[nom-type-fichier] .vim et placez-y votre mapping. Sous Windows, le répertoire est $ HOME/vimfiles/after/ftplugin. Le [nom-type-fichier] est le type détecté par Vim, parfois identique à l'extension du nom de fichier, par exemple c.vim, python.vim, etc. Vim peut vous dire quel est le type après avoir ouvert le fichier si vous entrez

: echo & ft

+0

Cela a été utile mais je ne pouvais pas réaliser ce que je voulais. Pouvez-vous m'aider avec la description mise à jour que j'ai posté –

0

J'utilise dans mon vimrc pour insérer une ligne vide au-dessus ou au-dessous de la ligne courante en utilisant uniquement le retour et shift-retour (par opposition à o<Esc> ou O<Esc>) sans interférer avec le comportement de fichier ouvert que vous voulez dans la liste quickfix.

" Use enter to insert newlines in normal mode, but not in quickfix 
function! s:insert_line(direction) 
    if &buftype == "quickfix" 
    execute "normal! \<Enter>" 
    else 
    if a:direction == 'below' 
     execute "normal! o\<Esc>" 
    else 
     execute "normal! O\<Esc>" 
    endif 
    endif 
endfunction 

nmap <Enter> :call <SID>insert_line('below')<CR> 
nmap <S-Enter> :call <SID>insert_line('above')<CR> 

J'espère que quelqu'un d'autre le trouvera utile.

Questions connexes