Как закрыть буфер без закрытия окна?

Vim многослойные представления (Windows, Буферы и вкладки) оставили меня немного запутанным. Скажем, я разделил дисплей (: sp), а затем выберите другой буфер для отображения в каждом окне. Теперь я хочу закрыть один из буферов, но я не хочу, чтобы окно закрывалось (после закрытия он может отображать следующий буфер в списке или пустой буфер, это не имеет значения). Как я могу это сделать?

Спасибо.

Ответ 2

Я немного облажался и наконец придумал:

: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 (если \ - ваш ключ лидера)

Ответ 3

Я искал это сегодня и придумал

:b#|bd#

который изменяет текущее окно на ранее открытый буфер и удаляет/скрывает только что отключенный буфер.

Для этого требуется, по меньшей мере, два известных буфера.

Если другое окно, кроме текущего, показывает тот же буфер, это все равно разрушит расщепление. Вы можете изменить все окна на ранее открытый буфер с помощью

:windo b#

Я добавил более подробную информацию о прежней команде, обсуждая отображение для нее (и некоторые подводные камни) в ответ на аналогичный вопрос.

Ответ 4

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

Работает так, как нужно, пока один буфер не будет открыт в нескольких окнах. Достаточно хорошо, если вы не хотите использовать большие скрипты там.

Изменить: это то, что я использую прямо сейчас:

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

Ответ 5

Я думаю, что это то, что вы ищете

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

Попробуйте следующее:

Посмотрите на свой идентификатор буфера, используя

:buffers

вы увидите список буферов там вроде

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

если вы хотите удалить b.py из буфера

:2bw

если вы хотите удалить/закрыть все из буферов

:1,3bw

Ответ 6

Для тех, кто использует NERDTree.

Я исправлю это, используя этот плагин https://github.com/jistr/vim-nerdtree-tabs, и теперь я могу закрыть единственный буфер/файл/вкладку, не закрывая окно.

После установки вышеописанного плагина поставьте следующий код на мой .vimrc:

let g:nerdtree_tabs_autoclose=0

Описание приведенной выше переменной: Закрыть текущую вкладку, если в ней есть только одно окно, и это NERDTree (по умолчанию 1)

Дополнительная информация здесь: https://github.com/jistr/vim-nerdtree-tabs#configuration

Ответ 7

Я не думаю, что есть один способ сделать это, но вы можете сделать :enew или :ls, чтобы перечислить ваши буферы и обменять их на другой, используя :b [number].

Как только у вас есть другой буфер в окне :bd #, вы удалите предыдущий буфер в окне, и поскольку текущий буфер все еще существует, окно не будет закрыто.

Ответ 8

Я использовал:

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

Но я нашел определенные случаи, когда он закрыл мое окно.

Недавно я заметил, что всегда использую это, когда я работаю над проектом, и мне нужно быстро открыть мой .tmux.conf .zshrc, прежде чем вернуться к работе.

Для этого использования мне лучше:

  • вернитесь в буфер, с которым я ранее работал с C-6
  • введите :bd#, чтобы удалить предыдущий буфер (я отобразил его следующим образом: nnoremap <leader>d :bd#<CR>)

Это позволяет мне управлять буфером, к которому я возвращаюсь, и чувствует себя более естественным.

Ответ 9

Would

:enew

делай, что хочешь? он будет редактировать новый, неназванный буфер в текущем окне, оставляя существующий файл открытым в любых других окнах.

Ответ 10

Моим любимым решением для этого является bufkill.vim плагин (GitHub). Он предоставляет альтернативные версии различных команд :b -prefix, которые работают так же, как и их аналоги, но оставляют окно открытым. Они отображают содержимое последнего видимого буфера или пустой/новый буфер, если ранее не было буфера.

Из документации:

When you want to unload/delete/wipe a buffer, use:
  :bun/:bd/:bw to close the window as well (vim command), or
  :BUN/:BD/:BW to leave the window(s) intact (this script).

Ответ 11

Вот очень читаемая функция vimscript, которая хорошо справляется со всеми случаями,

  • вести себя подобно встроенному :bd (если только одно окно, просто вызовите его!),
    • выдает предупреждение и ничего не делает, если буфер модифицирован.
    • если нет другого буфера, создайте его, :enew.
    • если существует альтернативный буфер, и в buffer-list, переключитесь на него, а затем идите дальше, через :bn.
  • более разумное поведение для компоновки с несколькими окнами
    • не закрывает ни одного окна,
    • всегда остается в исходном окне.
    • для каждого окна, отображающего текущий буфер, выполните указанные выше действия, а затем удалите старый текущий буфер.
nnoremap <Leader>b :call DeleteCurBufferNotCloseWindow()<CR>

func! DeleteCurBufferNotCloseWindow() abort
    if &modified
        echohl ErrorMsg
        echom "E89: no write since last change"
        echohl None
    elseif winnr('$') == 1
        bd
    else  " multiple window
        let oldbuf = bufnr('%')
        let oldwin = winnr()
        while 1   " all windows that display oldbuf will remain open
            if buflisted(bufnr('#'))
                b#
            else
                bn
                let curbuf = bufnr('%')
                if curbuf == oldbuf
                    enew    " oldbuf is the only buffer, create one
                endif
            endif
            let win = bufwinnr(oldbuf)
            if win == -1
                break
            else        " there are other window that display oldbuf
                exec win 'wincmd w'
            endif
        endwhile
        " delete oldbuf and restore window to oldwin
        exec oldbuf 'bd'
        exec oldwin 'wincmd w'
    endif
endfunc

Ответ 12

Чтобы закрыть окно, используйте :hid[e]. Работает, если вам удалось разделить область просмотра или открыть несколько файлов. Вы не можете скрыть последний буфер на дисплее.

1 Еще один совет, который помог мне: используйте :e ./path/to/file.work, чтобы открыть файл в видовом экране, не разбивая его.

P.S. Через два дня в vim мне все еще трудно найти точные команды помощи. Надеюсь, это поможет кому-то еще работать, пока они действительно не получат время, чтобы понять vim.

Ответ 13

Если вы похожи на меня и пришли сюда, пытаясь сделать обратное, закройте окно, не закрывая буфер, вы можете сделать это с помощью:

:close

Ответ 14

используйте ": bd" в качестве команды.