バッファを使用するより効率的な方法は何ですか?


13

最近、使用しているプラ​​グインの数を大幅に減らしているので、組み込みのVim機能のみを使用して回答を探しています。

たくさんのバッファーを編集しているときにワークフローの欠陥に気づいていました:バッファーを使用していて、名前を覚えていない代替バッファーではない別のバッファーに切り替えたい。したがって、使用:b#は不可能であり、コマンドで補完を使用すること:bも便利ではありません。

それをするために、私は次のことをしていました。

  • 最初に使用:buffersして、開いているバッファのリストを取得します
  • 使用したいバッファの番号を覚えておいてください
  • を押しEnterてバッファのリストを閉じます
  • 使用する:bXX、使用するバッファの数。

このワークフローはかなり重いように思えたので、次の行をmyに追加しました .vimrc

" Improve the navigation in the buffers 
nnoremap <Leader><S-b> :B<CR> 
command! B call Buffers() 

function! Buffers() 
    execute "buffers" 
    let buffer=input("Enter a buffer:") 
    execute "b" . buffer 
endfunction 

これは、入力を待つ:B関数を呼び出し、:buffers最後に入力が:b続く呼び出しを行うコマンド(およびマッピング)を提供します。

それはうまく機能しますが、私はそのような関数を開発しなければならなかったことに驚いています:通常、Vimはかなり効率的なデフォルトのワークフローを持っているので、他に何も知らないバッファに切り替えるより良い方法があるかどうか疑問に思っています編集セッションですでに開かれていること。


3
私は:lsその後に続きます:b#(最初にリターンやエスケープを押す必要はありません、 'ls'のバッファリストから直接行くことができます。) '何かが欠けていると間違った質問に答えています。)
リンダジェーン

2
@LindaJeanne:私が言った:b#ように私が探しているものではありませんが、ええ前に:b押すことなく直接入力することでキーストロークを節約できるという事実enterは興味深いです。(実際、それは答えとしては軽すぎるかもしれませんが、コメントする価値がありました:
statox

私は、LindaJeanneが#文字をリテラル#文字ではなく(バッファ)番号の代用として意味していると推測しています。
8ビットツリー

回答:


12

たくさんのバッファーを編集しているときにワークフローの欠陥に気づいていました:バッファーを使用していて、名前を覚えていない代替バッファーではない別のバッファーに切り替えたい。したがって、使用:b#は不可能であり、コマンドで補完を使用すること:bも便利ではありません。

それどころか、タブ補完は非常に便利だと思います。適切なオプションを自分に合った値に設定すると、非常に役立ちます。これらは からの関連する行ですvimrc (それらは私のために機能しますが、あなたのために機能しないかもしれませんので、それらを単にコピーしないでください)

nnoremap ,b :buffer *
set wildmenu
set wildignore+=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=*/min/*,*/vendor/*,*/node_modules/*,*/bower_components/*
set wildignore+=tags,cscope.*
set wildignore+=*.tar.*
set wildignorecase
set wildmode=full

これにより、適切なバッファーがキーストロークを5〜6回以上離れることはほとんどありません。

タブ補完


これは、入力を待つ:B関数を呼び出し、:buffers最後に入力が:b続く呼び出しを行うコマンド(およびマッピング)を提供します。

バリーアーサーは、数年前に非常にシンプルなソリューションを思いつきました。

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

そのうち、私は数年前にもう少し汎用性の高いバリアントを提案しました。

nnoremap gb :ls<CR>:b

GB


vimscriptについて話しているので、ここに、:lsまたはのようなリストのようなコマンドの後に正しいコマンドスタブでコマンドラインを「自動入力」する、ちょっとした素敵な関数を示します:ilist。上記のマッピングに対するこの関数の利点は、特定のマッピングを覚える必要がないことです。Vimと同じように機能しますが、少しひねりがあります。

" smooth listing
cnoremap <expr> <CR> <SID>CCR()

function! s:CCR()
    if getcmdtype() == ":"
        let cmdline = getcmdline()
            if cmdline =~ '\v\C^(dli|il)' | return "\<CR>:" . cmdline[0] . "jump  " . split(cmdline, " ")[1] . "\<S-Left>\<Left>"
        elseif cmdline =~ '\v\C^(cli|lli)' | return "\<CR>:silent " . repeat(cmdline[0], 2) . "\<Space>"
        elseif cmdline =~ '\C^changes' | set nomore | return "\<CR>:sil se more|norm! g;\<S-Left>"
        elseif cmdline =~ '\C^ju' | set nomore | return "\<CR>:sil se more|norm! \<C-o>\<S-Left>"
        elseif cmdline =~ '\C^ol' | set nomore | return "\<CR>:sil se more|e #<"
        elseif cmdline =~ '\C^undol' | return "\<CR>:u "
        elseif cmdline =~ '\C^ls' | return "\<CR>:b"
        elseif cmdline =~ '/#$' | return "\<CR>:"
        else | return "\<CR>" | endif
    else | return "\<CR>" | endif
endfunction

ccr


とはいえ、私は「ファイルベースのナビゲーション」よりも「シンボルベースのナビゲーション」の大きな支持者です。該当する場合、シンボルベースのナビゲーションは、ファイルベースのナビゲーションよりもはるかに高速で経済的です。

ちなみに、最後のGIFは、シンボルベースのナビゲーションの1つの平均を示しています。例は馬鹿げていますが…


私はwild*オプションで十分にプレイしていないと思います、私はそれを自分の方法で微調整しようとします。バリーアーサーのソリューションについては、@ nobe4の興味深い回答に非常に近いものです。最後にCCR()、実際に機能させるために、関数をより詳細に調べる必要がありますが、将来性がありそうです。ご回答有難うございます。
statox

5
私のこの答えを見てください。特にコミック。
ロメインル

私は間違いなくこれらのいくつかを盗みます!
statox

7

私はしばらく前に同じ問題に遭遇し、解決策を見つけました:

nnoremap <leader>b :buffers<CR>:buffer<space>

これにより、バッファリストが開き、非表示にならずに、バッファを切り替えるオプションが提供されます。

ここでは、Vimに「リストと選択」オプションがないことは理にかなっていると思います。これらは2つの別個のアクションです。しかし、Vimはコマンドを組み合わせるのに十分強力です。

これをUnixの哲学と考えてください。1つのことを実行し、それを適切に実行してください。

:buffersバッファを一覧表示し、バッファ:buffer xxxを選択できます。


1
それは私の質問で提案した機能を軽くする良い方法です、面白いです!
statox

1
末尾のスペースをもっと見やすくしたい場合は、次のようにします。nnoremap <leader> b:buffers <CR>:buffer <Space> |
タイラーダーデン

1

しばらくの間、私はこのようなnobe4の手法を使用しました。

nnoremap <Leader>b :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space>

それから私はそれでタブ補完を使い始めました(ロメインルが示唆するように)

しかし最近では、キーストローク最も少ない最速の方法は次の方法を使用することです。

{count} CTRL-^

これはそれほど違いはありません:b#<Enter>が、あなたが言うように、バッファ番号を知る必要があります!

そのために、私はMiniBufExplorerプラグインを実行します。これにより、ファイル名のリストが上部に表示されます(他のほとんどのエディターと同様)。私は多くの選択肢があると確信しています。

最後に、Ctrl-^私の指には少し伸びがあり、これは非常に一般的な操作なので、に移動しましたCtrl-E。そのため実装はそれほど複雑はありません。

nnoremap <C-E> :<C-U>call SwitchToBuffer()<CR>

function! SwitchToBuffer()
  if v:count > 0
    exec v:count . "b"
    return
  endif

  " Whatever you want to do if you didn't provide a count
  " In this case, fall back to nobe4's technique:
  call feedkeys(":ls\n:b ")
endfunction

したがって、現在のバッファー切り替えプロセスは次のようになります。

  1. MiniBufExplorerを見てください
  2. ヒット 3 Ctrl-E

残念ながら、MBEと上記のスクリプトはVimのビルトインではありません。設定のないリモートマシンにいるときは:b [partial]、タブ補完を使用します。

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