ウィンドウを閉じずにバッファを閉じるにはどうすればよいですか?


120

Vimのマルチレイヤービュー(Windows、バッファー、タブ)は、少し混乱しました。表示を分割して(:sp)、各ウィンドウに表示する別のバッファーを選択するとします。バッファの1つを閉じたいが、ウィンドウを閉じたくない(閉じた後、リストの次のバッファまたは空のバッファを表示できるので、問題ではない)。これどうやってするの?

ありがとう。


バッファをもう表示しないだけでなく、バ​​ッファを閉じたい理由はありますか?
ランプオン

9
私も実際にこれについて疑問に思っています。バッファを削除し、その後、プロセスで破棄された分割の一部を再構築しなければならないのは面倒です。
brettkelly 2009

3
これまでに29票。これはかなり一般的なユースケースだと思います。たくさんのバッファで作業しているときにこれが必要です。2つのウィンドウを使用していて、バッファを閉じたい場合があります。その窓が消えてほしくない。次のバッファをそこに表示したいだけです。
Wilson Freitas


回答:



145

私はこれを少しいじって、ついに思いつきました:

:bp | sp | bn | bd

キーマッピングのコピー/貼り付けバージョンは次のとおりです。

:bp<bar>sp<bar>bn<bar>bd<CR>

私はそれをかなりテストしました、そしてそれは様々な条件で一貫して働きます。最後のバッファで使用すると、新しい空のバッファが残ります。

これを.vimrcにスローします。

map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>

Vimを再起動するか:source ~/.vimrc、変更を有効にします。次にバッファーを閉じたいときは、次のように入力します\q\リーダーのキーの場合)


1
ありがとうございました!私が見た他のすべてのソリューションとは異なり、素晴らしくシンプルです。
jwd 2013年

15
初心者の場合、これを.vimrcに入れますmap <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>。再起動VIM、あなただけの入力バッファを閉じたい次の時間:\q
EasyCo

5
垂直方向に分割されたウィンドウがある場合、これは予期しない結果になります。実際、標準(で作成sp)以外のウィンドウ分割構成。
hitzg

2
.vimrcに挿入する内容のスニペットには、最後にピリオドを含めないでください。それ以外、すごい!これは受け入れられる答えになるはずです。
Ernesto

3
これはエレガントです。他の人が言ってきたように、あなたがほとんど垂直分割を使用する場合、切り替えるspvsp。このような私の.vimrcエントリールックス:cnoremap bd bp<bar>vsp<bar>bn<bar>bd
コナー

38

今日これを検索して思いついた

:b#|bd#

現在のウィンドウを以前に開いていたバッファに変更し、切り替えたばかりのバッファを削除/非表示にします。

これには、少なくとも2つの既知のバッファが必要です。

別のウィンドウで現在のウィンドウに同じバッファが表示されている場合でも、分割は破棄されます。すべてのウィンドウを以前に開いていたバッファに変更することができます

:windo b#

同様の質問への回答に、以前のコマンドのマッピング(およびいくつかの落とし穴)について説明した詳細を追加しました。


これも行うことができます... :#b|#bd上記のバッファコマンドとバッファ番号を交換するだけです。
Ashish、2015

私はこれを少し使用しましたが、以前に閉じていたバッファを再び開いてしまうことに苛立ち続けました。
ピーン

@peanそれは私がリンクされた回答で述べたことです-「重要な注意」を参照してください。ええ、これが別の開いているバッファに切り替わればもっといいでしょう。
有効

1
あなたも行うことができます:bn|bd#:bp|bd#ではなく、あなたが最も最近アクセスバッファ(B#)と比べて、それぞれ、代わりに前または次のオープンのバッファに切り替えます。
パボン

12
nmap <leader>d :bprevious<CR>:bdelete #<CR>

1つのバッファが複数のウィンドウで開かれるまで、正常に機能します。もっと大きなスクリプトを使いたくないのであれば十分です。

編集:これは私が今使っているものです:

function! BufferDelete()
    if &modified
        echohl ErrorMsg
        echomsg "No write since last change. Not closing buffer."
        echohl NONE
    else
        let s:total_nr_buffers = len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))

        if s:total_nr_buffers == 1
            bdelete
            echo "Buffer deleted. Created new buffer."
        else
            bprevious
            bdelete #
            echo "Buffer deleted."
        endif
    endif
endfunction

1
私はこの方法を試しましたが、複数の分割ウィンドウを使用しているときはうまく機能しませんでした。:ここで誰かが同じ問題を抱えている場合、私のソリューションですnmap <leader>d :ene<CR>:bd #<CR>
カイオは

7

これはあなたが探しているものだと思います

http://www.vim.org/htmldoc/windows.html#window-moving

これを試して:

使用してあなたのバッファIDを見てください

:buffers

そこにあるようなバッファのリストが表示されます

1  a.cpp
2  b.py
3  c.php

バッファからb.pyを削除したい場合

:2bw

バッファからすべてを削除/閉じる場合

:1,3bw

1
ウィンドウを動かしたくない。ウィンドウの位置、サイズ、存在に触れずにバッファを閉じたい。
モッシュ

5

NERDTreeを使用する人向け。

このプラグインhttps://github.com/jistr/vim-nerdtree-tabsを使用してこれを修正し、ウィンドウを閉じることなく、唯一のbuff / file / tabを閉じることができます。

上記のプラグインをインストールした後、次のコードを.vimrcに追加します。

let g:nerdtree_tabs_autoclose=0

上記の変数の説明は次のとおりです。ウィンドウにウィンドウが1つしかなく、それがNERDTreeである場合は、現在のタブを閉じます(デフォルトは1)。

詳細はこちら:https : //github.com/jistr/vim-nerdtree-tabs#configuration


2

これを行うためのワンショットの方法はないと思いますが、バッファをリストする:enew:ls、を使用して別のバッファに切り替えることができます:b [number]

ウィンドウに別のバッファを取得すると、ウィンドウ内の:bd #前のバッファが削除され、現在のバッファがまだ存在しているため、ウィンドウは閉じられません。


2

以前使用していた:

:bp<bar>sp<bar>bn<bar>bd<CR>

しかし、それが私の窓を閉める特定の機会を見つけました。

最近、プロジェクトに取り組んでいるときはいつもこれを使用していて、.tmux.conf .zshrc仕事に戻る前にすばやく開く必要があることに気付きました。

この使用法では、私は次のことを行う方が良いと思います:

  • 以前に作業していたバッファに切り替えます C-6
  • 入力:bd#前のバッファを削除するには(私はこのようにそれをマッピングしていますnnoremap <leader>d :bd#<CR>

それは私が戻るバッファを制御することを可能にし、より自然に感じます。


1

だろう

:enew

何をしたいですか?現在のウィンドウで名前のない新しいバッファを編集して、既存のファイルを他のウィンドウで開いたままにします。


これにより、新しい空のバッファが開きます。ウィンドウを閉じずに現在のバッファを閉じたい。
モッシュ

1

これに対する私のお気に入りのソリューションは、bufkill.vimプラグイン(GitHub)です。さまざまな:b-prefixコマンドの代替バージョンを提供し、対応するコマンドと同じように機能しますが、ウィンドウは開いたままにします。最後に表示されていたバッファが含まれていれば何でも表示します。前のバッファがなかった場合は空のバッファまたは新しいバッファを表示します。

ドキュメントから:

バッファをアンロード/削除/ワイプしたい場合は、以下を使用します:
  :bun /:bd /:bwもウィンドウを閉じる(vimコマンド)、または
  :BUN /:BD /:BWは、ウィンドウをそのままにします(このスクリプト)。

1

ビューを「閉じる」には、を使用します:hid[e]。ビューポートを分割したり、複数のファイルを開いたりした場合に機能します。ディスプレイの最後のバッファを非表示にすることはできません。

1さらに役立つヒント::e ./path/to/file.workウィンドウを分割せずにビューポートでファイルを開くために使用します。

PS vimを開始して2日になっても、正確なヘルプコマンドを見つけるのにまだ問題があります。うまくいけば、誰かが本当にvimを理解する時間を得るまで、他の誰かが働き続けるのを助けるでしょう。


1

これは非常に読みやすいvimscript関数で、すべてのケースを適切処理します

  • ビルトインと同じように動作します:bd(ウィンドウが1つだけの場合は、それを呼び出してください!)、
    • 警告を発行し、バッファが変更された場合は何もしません。
    • 他にバッファがない場合は、を使用して作成します:enew
    • 代替バッファが存在する場合はbuffer-list、それに切り替え、そうでない場合はを介して次に進み:bnます。
  • マルチウィンドウレイアウトのより合理的な動作
    • ウィンドウを閉じない、
    • 常に元のウィンドウのままにします。
    • 現在のバッファを表示するウィンドウごとに、上記のようにしてから、古い現在のバッファを削除します。
nnoremap <Leader> b:call DeleteCurBufferNotCloseWindow()<CR>

func!DeleteCurBufferNotCloseWindow()アボート
    変更された場合
        echohl ErrorMsg
        echom "E89:最後の変更以降書き込みなし"
        echohlなし
    elseif winnr( '$')== 1
        bd
    他の "複数のウィンドウ
        oldbuf = bufnr( '%')にします
        oldwin = winnr()にします
        一方、1 "oldbufを表示するすべてのウィンドウは開いたままになります
            buflisted(bufnr( '#'))の場合
                b#
            そうしないと
                bn
                let curbuf = bufnr( '%')
                curbuf == oldbufの場合
                    enew "oldbufが唯一のバッファです。作成してください
                endif
            endif
            勝つ= bufwinnr(oldbuf)
            勝った場合== -1
                ブレーク
            それ以外の場合は、「oldbufを表示する他のウィンドウがあります。
                exec win 'wincmd w'
            endif
        終わりに
        "oldbufを削除し、ウィンドウをoldwinに戻します
        exec oldbuf 'bd'
        exec oldwin 'wincmd w'
    endif
endfunc

0

あなたが私のようで、反対のことをしようとしてここに来た場合は、バッファを閉じずにウィンドウを閉じてください:

:close


0

私が個人的に使用するシンプルなバージョンは

:bp|bd#

前のバッファに移動して、他のバッファ(実際にはジャンプ元の元のバッファ)を削除します。これは、複雑なスクリプトを使用せずに99%の場合に期待することを行います。

キーボードショートカットとして、以下を使用します

nnoremap <silent> <Leader>c :bp<BAR>bd#<CR>

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