vimでバッファに切り替える最も速い方法は?


43

vimでバッファを選択する1つの方法は、標準コマンドasを使用:lsするか、外部プラグイン/ vimscriptコードを使用してバッファリストを参照し、ウィンドウ内のリストを参照することです。

できるだけ早く、直接バッファにジャンプしたいとしましょう。

シーケンシャルモードでバッファリストをトラバースするには<C-J> <C-K>、.vimrcで設定したショートカットを使用します。

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

別の方法(直接アクセス)は番号切り替えることもできます。バッファ番号を知っている場合は、バッファ番号に続けてを入力して直接切り替えることができ<C-^>ます。したがって、バッファー番号5に切り替えたい場合は、を押し5<C-^>ます。

しかし、これは私には機能していないようです(Windowsゲストから、イタリア語キーボードを使用して、ubuntuボックスでvim 7.4を使用します)。ので、私はそれの容疑者^の文字が大文字のキーであるイタリアのキーボードで非常に実際に入ったし、^私はマスコミに必要SHIFT-^

何か案は?


2
<c-6>代わりに押すことができます<c-^>か?
ピーターリンカー

Ctrl-1でバッファ番号1に移動するということですか?残念ながら機能しません。何も起こらない
ジョルジオロビーノ

1
いいえ。一部の端末は、USキーボードのCtrl- ^と同じCtrl-6を理解できます。
ピーターリンカー

2
+1すばらしい、うまくいきました!イタリアのキーボードレイアウトを使用します(パテ端末エミュレーターを使用)。だから、:1<C-6>番号1感謝を緩衝するswitchs!
ジョルジオRobino

CtrlSpaceを使用してみてください
Hongbo劉

回答:


51

この:bコマンドは、移動先のバッファーのファイル名のサブストリングを取ることもできます。これは非常に便利です。

たとえば、3つのバッファを持っている場合foobarおよびbaz、その後、

  • :b barbarファイルに切り替えます。

  • :b ofooファイルに切り替えます。

  • :b abarまたはのいずれかを意味する可能性があるため、エラーbazが表示されますが、たとえばを使用して、より具体的な名前に修正できます: r Enter

これは非常に便利です。なぜなら、

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

あなたは次のようなことができます

:b LongFileName

ずっと短くて簡単です。

使用したい場合、このコマンドは数字を取ることもできます:

:b 5

8
部分的なバッファー名の使用に関する注意:部分的なバッファー名がバッファーのパスの単語境界の先頭に表示される場合、単語の途中に部分的な名前を持つバッファーは:bコマンドからアクセスできません。たとえば、2つのバッファpath/to/fooとがあるpath/to/tofu場合、コマンド:b f<Tab>path/to/tofuの単語の先頭で一致するため、一致しませんpath/to/foo
tommcdo

2
:5bその後、わずかに短いです:b 5 ;-)
joeytwiddle

16

これは私が使用するものです:

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

ここでを押す\b、使用可能なバッファーリストされ、準備:bができます。

次に、バッファ番号を入力してEnterを押すだけです。

または、ファイル名の一部を入力してEnterを押すこともできます。(ただし、通常はEnterキーを押す前にTabキーを押して、適切なバッファーが得られたことを確認します。そうでない場合は、必要なものが得られるまでTabキーでサイクリングを続けます。)


実際、上記を少し調整したバージョンを使用しています。

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

これにより、-- More --表示可能な行よりも多くのバッファがある場合にプロンプ​​トが表示されなくなります。

しかし、あなたが通常持っている場合は'more'とにかく無効オプションを、このマッピングは本当にあなたを悩ますでしょう、それはので、再度有効に'more'やった後にオプションがls


1
実は、私はそれらのどちらも実際には使用せず、独自の小さなプラグインを使用しますが、機能は非常に似ています。プラグインを使用すると、開いていないバッファーのファイル名に対してTab-completeを実行することもできます。
joeytwiddle

1
この手法は[count]<C-^>、バッファ番号がわかっている場合ほど高速ではありませんが、知らない場合は非常に便利です。
joeytwiddle

2
あなたのノートをありがとうjoeytwiddle。プラグインをできるだけ早く確認します。私の場合は(上記のキーボードの問題を参照)[count]<C-6>が知らバッファへの切り替えに私に最速の方法を出現
ジョルジオRobino

ええ、私も[count]<C-^>最近使っています。しかし、それは、バッファー番号が何であるかを知るために、MiniBufExplorerまたは同様のものを実行する必要があることを意味します!
joeytwiddle

なぜ<CR>と<SPACE>が必要なのですか?それはそれらなしで罰金を作品かのように最初は...、私には見える
フェリックスCrazzolara

9

:CtrlPBufferプラグインCtrlPから(4k★)

このプラグインの主な機能は、ファジーマッチングを提供して、視覚的なフィードバックで別のバッファーを便利に開くことです。

で上場ファジーバッファを開く:CtrlPBufferか、Enterキーを押して<C-p>続く<C-b>のモードを変更しますbuffer

十分な数の文字を入力して、開くバッファーを指定します。またはを
使用してリストを循環し、手動でバッファを選択することもできます。<C-j><C-k>

ここに画像の説明を入力してください

カスタマイズ

ですぐにバッファリストを開く場合は<C-p>、vimrcに次の行を追加します。

let g:ctrlp_cmd = 'CtrlPBuffer'

を使用<C-f/b>して、ctrlpウィンドウのモードを切り替えることができます。

私は個人的に使用しますlet g:ctrlp_cmd = 'CtrlPMRU'。最近使用した(mru)リストには、開いているバッファーも含まれます。異なるctrlpモードを使用していて、最後のモードに固執したい場合は、を設定できますlet g:ctrlp_cmd = 'CtrlPLastMode [--dir]'

同様のプラグイン

バッファリストにファジーマッチングを備えた対話型プロンプトを提供するプラグインが他にもあります。たとえば、

暗い側と明るい側

(つまり、プラグインが重いvimセットアップとvimの方法)

これらのより複雑なプラグインを使用することに決める前に、@Doorknob@joeytwiddleによる回答を調べください。特に、ワ​​ンライナーが既にニーズを満たしている場合は、ワンライナーを確認してください。

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

バッファの切り替えのためだけにプラグインをインストールするのはやり過ぎかもしれません。https://www.vi-improved.org/recommendationsの備考およびDrew Neil 記事「のこぎりを研ぐ」も参照してください


はいHotschke、私は頻繁に使用することを告白します:CtrlPBuffer
ジョルジオ

map <leader>a <ESC>:CtrlPBuffer<CR><CR>以前に開いたバッファーにジャンプするために使用しています<leader>a<leader>bバッファーリストを開くだけです)
ロルフ

@Rolf:知っていますか<C-^>(= <C-6>)?を参照してください:h CTRL-^。Afaik、これはあなたのマッピングがする<leader>aように見えることをします。したがって、プラグインを使用すると、vimがすでに自分で何ができるかを知らないvimユーザーにつながる可能性があると言う理由の例を紹介したと思います。
Hotschke

@Hotschke:いいえ、私はそれを知りませんでした。知っていることを学んだ、ありがとう!ただし、<C-^>を再マップします。
ロルフ

バニラvimを使用した<Cd>への優れたリファレンス。私はその参照を他のどこにも見ませんでした。
ラドケ

8

joeytwiddleとDoorknobによる本当に便利な回答に加えて:b#、を忘れないでください。これは、最近使用したバッファーに切り替わります。だけで行うこともでき<C-^>ます。多くのバッファがあり、それらを絶えず切り替える場合、通常、最新のバッファが最も一般的な宛先です。

個人的に私は多くの方法の組み合わせを使用しています。主に2つのバッファーで作業しており、残りがたまに参照するためだけに開いている場合、:b#またはでバッファーを切り替える傾向があり<C-^>ます。より多く作業して、より頻繁に切り替える必要がある場合は、TABで数字(joeytwiddle tipなど)または名前の一部(Doorknob tipなど)を使用してそれらを完成させます。名前がわかりにくく、多くのバッファが開いている場合(通常は10以上)、Ctrl-Pプラグインをより頻繁に使用します(https://github.com/kien/ctrlp.vim)それらすべてであり、強力なファジー検索を使用して、必要なものをすばやく見つけることができます。


2
<C - ^>のみ(<C-6>私の場合では、ピーターRinckerが提案されているように)ちょうど2バッファ:-)の場合は良いトリックです
ジョルジオRobino

5

[bおよび]bプラグインからvim-unimpaired(> 2k★)

をインストールvim-unimpairedしたことがある場合は、使用できます

  • [b:bp[revious]および
  • ]b:bn[ext]

オープンバッファを循環するため。同じコマンドに対してより貴重なマッピングを定義する必要はありません。さらに、最初と最後のバッファへのジャンプは

  • [B:bf[irst])および
  • ]B:bl[ast])。

あるもっとたくさんのブラケットのマッピングに含まれているvim-unimpairedあなたは便利かもしれないが。それらはすべて同じスキームに従っているため、簡単に暗記できます。

暗い側と明るい側

このプラグインは、軽量で「ビミッシュ」と見なすことができます。#vimコミュニティでは、「害を与えない」プラグインとして示されています。


+1カウントを提供できることにも注意してください。3[b3つのバッファをジャンプして戻します。
joeytwiddle

1

現在、<Leader>+ numberキーを使用して切り替えています。リーダーキーは私の<space>キーです。また、vim-airlineを使用して、ウィンドウの上部にバッファーnrを表示します。

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

bufnrは多くの場合10を超えますが、独自のマッピングを調整します。number一致するものがあれば、すぐにバッファーを切り替え<space>ます。

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

コードはここから貼り付けられます

ちなみに、私は<S-h>and <S-l>:bpand :bn、または:tabpandを使用:tabnしています。複数のタブページが現在開かれている場合。それは私にとって非常に直感的です。


1

最近[buffer_number]<Ctrl-^>では、非常に高速であるため、バッファーの切り替えに使用しています。

しかし、バッファ番号を知る方法は?MiniBufExplorerを使用しているため、Vimの上部にあるバッファー番号を常に確認できます。

また、次のマッピングも使用します<C-^>。片手では届きにくいからです。

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

設定のない新しいマシンでは、 :b [part_of_filename]<Tab><Enter>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.