Как закрыть буфер, не открывая окно? [Дубликат]

Попробуйте что-то вроде этого:

\s[a-zA-ZΆΈ-ώἀ-ῼ]{2}\s
102
задан Mosh 18 September 2009 в 13:41
поделиться

13 ответов

Для этого существует скрипт в Vim wiki . Я не думаю, что есть встроенная программа, которая делает то, что вы хотите.

Последняя версия vim-bufkill находится на github .

23
ответ дан Sardathrion 28 August 2018 в 22:22
поделиться

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

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

2
ответ дан Andrew Khosravian 28 August 2018 в 22:22
поделиться

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

:b#|bd#

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

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

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

:windo b#

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

33
ответ дан Community 28 August 2018 в 22:22
поделиться
  • 1
    Также это можно сделать ... :#b|#bd Простое изменение команды буфера & amp; номер буфера в приведенном выше. – Ashish 30 July 2015 в 12:35
  • 2
    ИМО это должен быть принятый ответ, спасибо! – Matekk 19 January 2017 в 09:09
  • 3
    Я использовал это немного, но я все время раздражался, что он снова открыл ранее закрытый буффер. – pean 21 August 2018 в 05:16
  • 4
    @pean Вот что я упомянул в связанном ответе - см. «Важные примечания». Да, было бы лучше, если бы это переключилось на другой открытый буфер. – valid 21 August 2018 в 08:46

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

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

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

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

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

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

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

0
ответ дан DaftWooly 28 August 2018 в 22:22
поделиться
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
11
ответ дан ggustafsson 28 August 2018 в 22:22
поделиться
  • 1
    +1 приятный и простой – hwjp 30 November 2011 в 23:46
  • 2
    Я пробовал этот путь, но он не очень хорошо работал при использовании нескольких разделенных окон. Вот мое решение, если у кого-то такая же проблема: nmap <leader>d :ene<CR>:bd #<CR> – caio 5 September 2012 в 19:41

Моим любимым решением для этого является плагин 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).
1
ответ дан Jim Stewart 28 August 2018 в 22:22
поделиться

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

Исправляю это, используя этот плагин https://github.com/jistr/vim-nerdtree-tabs , и теперь я могу закрыть только buff / file / tab, не закрывая окно.

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

let g:nerdtree_tabs_autoclose=0

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

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

4
ответ дан Lucas Serafim 28 August 2018 в 22:22
поделиться

Будет ли

:enew

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

1
ответ дан mikej 28 August 2018 в 22:22
поделиться
  • 1
    Это откроет новый пустой буфер. Я хочу закрыть текущий буфер, не закрывая окно. – Mosh 18 September 2009 в 15:21

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

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
ответ дан Nope 28 August 2018 в 22:22
поделиться
  • 1
    Я не хочу переместить окно. Я хочу закрыть буфер, не касаясь положения, размера или существования окна. – Mosh 18 September 2009 в 15:21

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

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

109
ответ дан Peter Perháč 28 August 2018 в 22:22
поделиться
  • 1
    Спасибо! Хороший и простой, в отличие от любого другого решения, которое я видел. – jwd 31 January 2013 в 01:23
  • 2
    Это круто! Вы можете скрыть раздражающие сообщения об ошибках с помощью silent! bp | sp | silent! bn | bd – ivan 17 January 2014 в 05:05
  • 3
    Для начинающего бросьте это в .vimrc : map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>. Перезапустите VIM, в следующий раз, когда вы хотите закрыть буфер, просто введите: \q – EasyCo 8 September 2014 в 02:03
  • 4
    Это потрясающий совет! – Anzel 24 April 2015 в 14:43
  • 5
    Это будет иметь неожиданный результат, если у вас есть вертикально разделенное окно. Фактически любая конфигурация разбиения окон, отличная от стандарта (созданная sp). – hitzg 29 June 2015 в 13:26

Вот очень читаемая функция 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
1
ответ дан qeatzy 28 August 2018 в 22:22
поделиться

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

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

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

-1
ответ дан Sennekuyl 28 August 2018 в 22:22
поделиться

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

-5
ответ дан Silvanus 28 August 2018 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: