Vim:これ以外のすべてのバッファを閉じる


回答:


61

このスクリプトはvim.orgから使用できます。

http://www.vim.org/scripts/script.php?script_id=1071

それを.vim/pluginディレクトリに置き、:BufOnlyコマンドを使用してアクティブなものを除くすべてのバッファを閉じます。また、自分の好きな場所にマッピングすることもできます.vimrc

Githubのソース(vim-scriptsミラー経由):https : //github.com/vim-scripts/BufOnly.vim/blob/master/plugin/BufOnly.vim


171

これを試して

bufdo bd

bufdoはすべてのバッファーに対してコマンドを実行します

http://vim.wikia.com/wiki/Run_a_command_in_multiple_buffers


これはNERDTreeバッファを閉じません。
Uri

オタクツリーパネルにフォーカスがある場合NERDTreeは閉じられます
gayavat 2015

2
bdコマンドがvim自体を閉じるのを防ぐために、これを行う前にNERDTreeを閉じることができます。nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>
lvarayut

11
ドキュメンテーションは、:bufdo「バッファを削除したり、バッファリストにバッファを追加したりしてはならない」という引数に警告しています。したがって、この解決策が機能する場合、それは偶然に機能します。そして、私にとってはしばしば機能しません(別のバッファーに切り替えます)。
glts

10
これは私にとってすべてのバッファを閉じます。これは質問がすることではありません。(MacVimバージョン8.0.1207)
Michael Leonard

143

私はこれを次のようにかなり簡単に行うことができました:

:%bd|e#

4
これはいい答えです。BufOnlyの引数渡し機能を使用している場合を除き、BufOnlyは少しやりすぎ(つまり、プラグイン全体)と感じます。私が本当にしたいのは:%bd|e#
shmup 2017年

41
@jorgeh %bd=すべてのバッファを削除します。e#=編集のために最後のバッファを開く。その間のパイプは、次々とコマンドを実行するだけです。
OldTimeGuitarGuy 2017年

20
@Jaredを使用%bd|e#|bd#して、[No Name]作成されたバッファーを削除できます。
kshenoy 2018

12
素晴らしい。そして、ここで1つのコマンドに蒸留、私は永遠にBufOnlyプラグインを使用するだけのものを持っている:command! BufOnly silent! execute "%bd|e#|bd#"
shmup

4
@Finnあなたは脱出する必要があります|map <leader>o :%bd\|e#<cr>
HalilÖzgür19年

57

現在のものを気にしない場合は、次のようなことを行うほうが簡単です(スクリプトは必要ありません)。

1,100bd

4
オタクバッファも閉じます。
Afshin Mehrabani 2014年

NERDTreeが有効になっているときにこのコマンドを使用すると、いくつかの問題に直面しました。@VoYで言及されているBufOnly.vimプラグインを使用することをお勧めします。
moeabdol

1
私はNERDTreeバッファを削除するためのアカウント次のマッピングを行った:nnoremap <leader>bd :%bd | NERDTree<cr>
ウリ

5
私はこれを長い間使用していましたE16: Invalid rangeが、範囲内の一部のバッファーが実際には存在しないために取得しました。最近までそれを無視していた。
Jon

3
@Jonチェック:lsして、実際に開いている最大のバッファーを確認し、範囲をそれに設定します(つまり、最高のバッファーが22の場合、:1,22bd)。それを行うまで、同じエラーが発生しました。
Nairou 2016年

51

私はこれをします

:w | %bd | e#

現在のバッファーを開いて他のすべてのバッファーを閉じたい場合の私のお気に入り。

仕組み:最初に現在のバッファーの変更を書き込み、次に開いているすべてのバッファーを閉じてから、現在使用していたバッファーを再度開きます。Vimでは、|コマンドの実行をチェーン化します。バッファが最新の場合、上記を短縮して:%bd | e#


ほとんど問題なく動作します。ただし%、すべてのセレクターとして機能しない場合があります。何か分かりますか?
Jinyoung Kim

@JinyoungKim([1]から) ":%bd"コマンドでは、 '%'の範囲は現在のバッファーの開始行番号と終了行番号に置き換えられます。範囲として「%」を使用する代わりに、範囲の数値を指定する必要があります。たとえば、すべてのバッファを削除するには、コマンド ":1,9999bd" [1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
iamnotsam

ドキュメントをチェックアウトしました。では、「%」の範囲は現在のファイル行の数に依存していますか?
Jinyoung Kim

2
bufnr("$")最後のバッファ番号を返す組み込み関数を見つけました。しかし、私がこのように使用する場合、文字列に補間する考えはありません:1,bufnr("$")bd。たぶん..最善の解決策は次のようになります:1,9999bd
キム・ジニョン

2
:help :bd示しています:%bdelete " delete all buffers。だから、%正確に何をしたいです。私はあなたの解決策の変形を使用します::%bd<CR><C-O>:bd#<CR>これはすべてのバッファを削除し、次に<C-O>現在のファイルの位置を復元するために使用し、次に:bd#名前のないバッファを削除します。これにより、すべてのバッファが閉じ、ファイル内の同じ場所に残ります。
アレハンドロ

25

juananruizの答えに基づく。

保持したいバッファーを少し変更してから、

:1,1000bd

コマンド bd(buffer delete)は、変更が保存されていないバッファーを削除しません。このようにして、現在の(変更された)ファイルをバッファリストに保持できます。

編集:これによりNERDTreeBufferも削除されることに注意してください。:NERDTreeでそれを取り戻すことができます


完璧、短くてシンプル!:)
アーコッド2014

49
:%bdは実際には1〜1000ではなく「すべて」です。
John Tyree、2015年

これはset nohidden設定に依存していますか?
フェリペアルバレス2016年

15

を使用して

:on[ly][!]

そして

:h only

27
これはバッファではなくウィンドウを閉じます。
ZyX 2012

13
人々は間違った用語をググるので、これを見つけることができるので、まだ有用です。両方のおかげで。:)
archgoon

1
@archgoonそうですが、答えで指定する必要があります。
andho

10

開いているすべてのバッファを閉じる:

silent! execute "1,".bufnr("$")."bd"

現在のバッファを除くすべての開いているバッファ閉じる:

function! CloseAllBuffersButCurrent()
  let curr = bufnr("%")
  let last = bufnr("$")

  if curr > 1    | silent! execute "1,".(curr-1)."bd"     | endif
  if curr < last | silent! execute (curr+1).",".last."bd" | endif
endfunction

この関数をに追加し.vimrc、を使用して呼び出します:call CloseAllBuffersButCurrent()

便利マップ:

nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>

バッファを復元するvimセッションを再開するときに、上記を使用してバッファを削除できなくなっていることに気付きました。代わりに、使用しなければなり:%bd|e#|bd#
ませんでした

最良のソリューション。NERDTreenmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Gjaa

5

これを.vimrcファイルに入れます

nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>

その後、あなた leader + ca(すべて閉じる)現在のバッファを除くすべてのバッファを閉じます。

それは何ですか

:w-現在のバッファを保存します

%bd-すべてのバッファを閉じる

e#-最後に編集されたファイルを開く

bd#-名前のないバッファを閉じます



1

これが私がすることです。したがって、すべてのバッファを削除した後もカーソル位置を維持したいので、上記のソリューションのほとんどはこの事実を無視しています。また、コマンドの再マッピングは入力よりも良いと思うので、ここで<leader>bdすべてのバッファを削除して、元のカーソル位置に戻ります。

noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"

%bd =すべてのバッファを削除します。

e# =最後のバッファを開いて編集します(作業中のバッファはどれですか)。

bd#を使用したときに作成される[No Name]バッファを削除します%bd

その間のパイプは、次々とコマンドを実行するだけです。あなたはそれをエスケープしなければならない\|

'" =カーソル位置を保持します。


0

私は1,100bdjuananruizによって提案された)私にとってはうまくいくようです。

quit!マッピングにを追加して、

nnoremap <leader>bd :1,100bd<CR>
nnoremap <leader>bdq :1,100bd<CR>:q!<CR>

これにより、すべてのバッファーが強制終了され、Vimがシャットダウンされます。これは、私が最も探していたものです。


1
bdqすべてのバッファを閉じてvimを終了するマッピングを使用する理由はありませんが、:q!代わりにを使用できます:qa!。私が何かを見落としているのでなければ
shmup

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