Le moyen le plus rapide de passer à un tampon dans vim?

43

Une façon de sélectionner un tampon dans vim pourrait consister à parcourir la liste des tampons, à l’aide de commandes standard :ls, ou avec du code de plug-in / vimscript externe pour parcourir une liste dans une fenêtre .

Disons que je veux aller directement à un tampon, le plus rapidement possible.

Pour parcourir la liste des tampons en mode séquentiel, j'utilise maintenant des <C-J> <C-K>raccourcis, définis dans mon fichier .vimrc:

" move among buffers with CTRL
map <C-J> :bnext<CR>
map <C-K> :bprev<CR>

Une autre façon (accès direct) pourrait être de changer de numéro : en connaissant le numéro du tampon, il est possible de passer directement en entrant le numéro du tampon suivi de <C-^>. Donc, si je veux passer à la mémoire tampon numéro 5, je voudrais appuyer sur 5<C-^>.

Mais cela ne semble pas fonctionner pour moi (j'utilise vim 7.4 sur une boîte Ubuntu, à partir d'un invité Windows, avec un clavier italien ). J'imagine que c'est parce que le ^caractère est dans la touche majuscule du clavier italien, alors en fait ^je dois appuyer surSHIFT-^

Des idées?

Giorgio Robino
la source
2
Pouvez-vous appuyer <c-6>au lieu de <c-^>?
Peter Rincker
voulez-vous dire Ctrl-1 pour aller au tampon numéro 1? Malheureusement, ça ne marche pas. rien ne se passe
Giorgio Robino
1
Certains terminaux peuvent comprendre Ctrl-6, ce qui est identique à Ctrl- ^ sur le clavier américain.
Peter Rincker
2
+1 Génial, ça marche! J'utilise un clavier italien (avec un émulateur de terminal à mastic). Donc: passe 1<C-6>au tampon numéro 1. Merci!
Giorgio Robino
Vous pouvez essayer d'utiliser CtrlSpace .
Hongbo Liu

Réponses:

52

La :bcommande peut également prendre une sous - chaîne du nom du fichier du tampon vers lequel vous voulez vous rendre, ce qui est très pratique.

Par exemple, si vous avez trois tampons foo, baret baz, puis

  • :b barva basculer vers le barfichier.

  • :b ova basculer vers le foofichier.

  • :b avous donnera une erreur car cela pourrait signifier soit barou baz, mais vous pouvez corriger le nom pour qu'il soit plus spécifique, par exemple : r Enter.

Cela peut être très utile, car cela signifie au lieu de

:buffer very/very/long/path/to/a/veryVeryLongFileName.txt

vous pouvez faire quelque chose comme

:b LongFileName

ce qui est beaucoup plus court et facile.

Cette commande peut également prendre un numéro, si vous voulez l'utiliser:

:b 5
Poignée de porte
la source
8
Une mise en garde concernant l'utilisation de noms de tampons partiels: si le nom de tampon partiel apparaît au début d'une limite de mot dans le chemin d'un tampon, aucun tampon avec le nom partiel au milieu d'un mot ne sera accessible par la :bcommande. Par exemple, si vous avez deux mémoires tampons path/to/fooet path/to/tofu, la commande :b f<Tab>ne correspondra jamais path/to/tofu, car elle correspond au début d'un mot dans path/to/foo.
tommcdo
2
:5best légèrement plus courte alors :b 5 ;-)
joeytwiddle
16

C'est ce que j'utilise:

nnoremap <Leader>b :ls<CR>:b<Space>

Appuyez maintenant pour \bafficher la liste des mémoires tampons disponibles et vous préparer :b.

Ensuite, vous pouvez simplement taper le numéro de la mémoire tampon et appuyer sur Entrée.

Ou vous pouvez taper une partie du nom de fichier et appuyer sur Entrée. (Cependant, j'appuie généralement sur Tab avant de frapper Entrée pour vérifier que j'ai le bon tampon. Sinon, je continue à pédaler avec Tab jusqu'à obtenir celui que je voulais.)


En fait, j'utilise une version légèrement modifiée de ce qui précède:

nnoremap <C-e> :set nomore <Bar> :ls <Bar> :set more <CR>:b<Space>

Cela empêchera l' -- More --invite d'apparaître lorsque vous aurez plus de tampons que de lignes disponibles pour les afficher.

Mais si l' 'more'option est toujours désactivée de toute façon, ce mappage va vraiment vous ennuyer, car il réactive l' 'more'option après l'avoir fait ls!

Joeytwiddle
la source
1
À vrai dire, je n’utilise réellement aucun de ceux-ci, j’utilise mon propre petit plugin , mais les fonctionnalités sont très similaires. Avec le plugin, je peux aussi exécuter Tab-complete sur les noms de fichiers des tampons non ouverts.
joeytwiddle
1
Bien que cette technique ne soit pas aussi rapide que [count]<C-^>lorsque vous connaissez le numéro de la mémoire tampon, elle est plutôt utile lorsque vous ne le savez pas.
joeytwiddle
2
merci joeytwiddle pour vos notes. Je vérifierai votre plugin dès que possible. Dans mon cas (voir le problème de clavier ci-dessus), il [count]<C-6>me semble que le moyen le plus rapide de passer à un tampon connu
Giorgio Robino
Oui, j'utilise aussi [count]<C-^>ces jours-ci. Mais cela signifie que je dois exécuter MiniBufExplorer ou quelque chose de similaire pour savoir quels sont les numéros de mémoire tampon!
joeytwiddle
pourquoi avez-vous besoin du <CR> et du <SPACE>? Au début, cela me semble, comme si cela fonctionnait bien sans eux ...
Felix Crazzolara
9

:CtrlPBufferdepuis le plugin CtrlP (4k ★)

La principale caractéristique de ce plugin est de fournir une correspondance floue pour ouvrir facilement un tampon différent avec retour visuel.

Ouvrez la liste des mémoires tampons floues avec :CtrlPBufferou appuyez sur, <C-p>puis sur <C-b>pour changer le mode buffer.

Entrez un nombre de caractères suffisant pour spécifier le tampon à ouvrir.
Vous pouvez également utiliser <C-j>et <C-k>pour parcourir la liste et sélectionner manuellement le tampon.

entrez la description de l'image ici

Personnalisation

Si vous souhaitez ouvrir immédiatement la liste des tampons avec <C-p>, ajoutez la ligne suivante à votre vimrc:

let g:ctrlp_cmd = 'CtrlPBuffer'

Vous pouvez utiliser <C-f/b>pour changer le mode de la fenêtre ctrlp.

Je l'utilise personnellement let g:ctrlp_cmd = 'CtrlPMRU'. La liste la plus récemment utilisée (mru) contient également les tampons ouverts. Si vous utilisez différents modes ctrlp et souhaitez vous en tenir à votre dernier mode, vous pouvez définir let g:ctrlp_cmd = 'CtrlPLastMode [--dir]'.

Plugins similaires

Il y a plus de plugins qui fournissent une liste de tampons avec une invite interactive avec correspondance fuzzy, par exemple

Le côté obscur contre le côté clair

(c.-à-d. configuration de vim par plugin lourde par rapport à la manière vim)

Avant de décider d'utiliser ces plugins plus complexes, étudiez les réponses de @Doorknob et @joeytwiddle . En particulier, cochez one-liner si l’un d’entre eux répond déjà à vos besoins.

  1. nnoremap <Leader>b :b <C-d>
  2. nnoremap <Leader>b :ls<Cr>:b<Space>

L'installation des plugins juste pour la commutation de mémoire tampon peut s'avérer un processus excessif. Voir aussi les remarques sur https://www.vi-improved.org/recommendations et l'article de Drew Neil 'Sur l'affûtage de la scie' .

Hotschke
la source
oui Hotschke, j'avoue que j'utilise souvent: CtrlPBuffer
Giorgio Robino
J'utilise map <leader>a <ESC>:CtrlPBuffer<CR><CR>pour sauter au tampon précédemment ouvert avec <leader>a(alors que <leader>bvient d'ouvrir la liste des tampons pour moi)
Rolf
@Rolf: connaissez-vous <C-^>(= <C-6>)? voir :h CTRL-^. Afaik, cela ne fait que ce que votre cartographie <leader>asemble faire. Par conséquent, je pense que vous venez juste de donner un exemple de la raison pour laquelle les utilisateurs affirment que l’utilisation de plugins pourrait conduire à un utilisateur vim qui ne sait pas ce que vim peut déjà faire par lui-même.
Hotschke
@ Hotschke: Non, je ne le savais pas. Appris quelque chose savait, merci! Je vais remapper <C - ^> cependant.
Rolf
1
Excellente référence à <Cd> avec vanilla vim. Je n'ai vu cette référence nulle part ailleurs.
dimanche
8

En plus des réponses très utiles de joeytwiddle et Doorknob, n'oubliez pas le :b#dernier tampon utilisé. Cela peut aussi être fait avec juste <C-^>. Lorsque vous avez beaucoup de mémoires tampons et que vous passez constamment de l'une à l'autre, la mémoire tampon la plus récente est généralement la destination la plus courante.

Personnellement, j'utilise une combinaison de plusieurs méthodes. Lorsque je travaille principalement avec deux mémoires tampons et que le reste est ouvert uniquement à titre de référence occasionnelle, j'ai tendance à basculer entre elles avec :b#ou <C-^>. Lorsque je dois travailler avec plusieurs d’entre eux et changer plus souvent, j’utilise soit des chiffres (comme dans joeytwiddle tip), soit une partie de noms (comme dans Doorknob tip) avec TAB pour les compléter. Lorsque les noms sont déroutants et que de nombreux tampons sont ouverts (généralement plus de 10), j'utilise plus souvent le plug-in Ctrl-P ( https://github.com/kien/ctrlp.vim ). En deux frappes rapides, j'ai la liste des et je suis capable d’utiliser une puissante recherche floue pour trouver rapidement ce que je veux.

qiubix
la source
2
<C - ^> seul (<C-6> dans mon cas, comme l’a suggéré Peter Rincker) est une bonne astuce dans le cas où il n’ya que 2 tampons :-)
Giorgio Robino le
5

[bet ]bdu plugin vim-unimpaired(> 2k ★)

Si vous avez installé vim-unimpaired, vous pouvez utiliser

  • [b( :bp[revious]) et
  • ]b( :bn[ext])

pour parcourir des tampons ouverts. Pas besoin de définir des correspondances plus précieuses pour les mêmes commandes. De plus, le saut vers le premier et le dernier tampon peut être effectué en

  • [B( :bf[irst]) et
  • ]B( :bl[ast])

Il y a beaucoup plus de correspondances entre crochets dans vim-unimpairedlesquelles vous pourriez trouver utile. Ils suivent tous le même schéma, ce qui facilite leur mémorisation.

Le côté obscur contre le côté clair

Ce plugin peut être considéré comme léger et «vimish». Il est désigné par la communauté #vim comme un plugin "ne nuit pas".

Hotschke
la source
+1 Il est également intéressant de noter que vous pouvez fournir un décompte. 3[bsauter trois tampons en arrière.
Joeytwiddle
1

Actuellement, j'utilise la touche <Leader>+ numberpour basculer. La clé de chef est ma <space>clé. J'utilise également vim-airline pour afficher le numéro de tampon en haut de la fenêtre.

" airline settings
let g:airline#extensions#tabline#buffer_nr_show = 1
let g:airline#extensions#tabline#enabled = 1

Bien que le nombre de commandes dépasse souvent 10, je modifie donc mon propre mappage. Si la numberseule correspondance est sélectionnée, changez immédiatement de tampon, sinon attendez plus de chiffres ou de <space>clés pour confirmer:

nnoremap <expr> <Leader>1 tweak#wtb_switch#key_leader_bufnum(1)
nnoremap <expr> <Leader>2 tweak#wtb_switch#key_leader_bufnum(2)
nnoremap <expr> <Leader>3 tweak#wtb_switch#key_leader_bufnum(3)
nnoremap <expr> <Leader>4 tweak#wtb_switch#key_leader_bufnum(4)
nnoremap <expr> <Leader>5 tweak#wtb_switch#key_leader_bufnum(5)
nnoremap <expr> <Leader>6 tweak#wtb_switch#key_leader_bufnum(6)
nnoremap <expr> <Leader>7 tweak#wtb_switch#key_leader_bufnum(7)
nnoremap <expr> <Leader>8 tweak#wtb_switch#key_leader_bufnum(8)
nnoremap <expr> <Leader>9 tweak#wtb_switch#key_leader_bufnum(9)




func! tweak#wtb_switch#key_leader_bufnum(num)
    let l:buffers = tweak#wtb_switch#buflisted()
    let l:input = a:num . ""

    while 1

        let l:cnt = 0
        let l:i=0
        " count matches
        while l:i<len(l:buffers)
            let l:bn = l:buffers[l:i] . ""
            if l:input==l:bn[0:len(l:input)-1]
                let l:cnt+=1
            endif
            let l:i+=1
        endwhile

        " no matches
        if l:cnt==0 && len(l:input)>0
            echo "no buffer [" . l:input . "]"
            return ''
        elseif l:cnt==1
            return ":b " . l:input . "\<CR>"
        endif

        echo ":b " . l:input

        let l:n = getchar()

        if l:n==char2nr("\<BS>") ||  l:n==char2nr("\<C-h>")
            " delete one word
            if len(l:input)>=2
                let l:input = l:input[0:len(l:input)-2]
            else
                let l:input = ""
            endif
        elseif l:n==char2nr("\<CR>") || (l:n<char2nr('0') || l:n>char2nr('9'))
            return ":b " . l:input . "\<CR>"
        else
            let l:input = l:input . nr2char(l:n)
        endif

        let g:n = l:n

    endwhile
endfunc

func! tweak#wtb_switch#buflisted()
  return filter(range(1, bufnr('$')), 'buflisted(v:val)')
endfunc

Le code est collé d' ici

Par ailleurs, j'utilise aussi <S-h>et <S-l>pour :bpet :bn, ou :tabpet :tabnsi plusieurs onglets sont ouverts en ce moment. C'est assez intuitif pour moi.

Rox
la source
1

Ces jours-ci, j’utilise [buffer_number]<Ctrl-^>pour changer de tampon car c’est très rapide.

Mais comment connaître le numéro de tampon? J'utilise MiniBufExplorer pour pouvoir toujours voir les numéros de mémoire tampon en haut de Vim.

J'utilise également le mappage suivant, car il <C-^>est un peu difficile à atteindre avec une seule main.

:nmap <C-E> <C-^>

Sur une machine fraîche sans configuration, je retombe sur :b [part_of_filename]<Tab><Enter>

Joeytwiddle
la source