Vim закрыть буфер, но не разделить окно - PullRequest
24 голосов
/ 28 ноября 2010

Если у меня есть 2 буфера, разделенных по горизонтали / вертикали, и я хочу закрыть один из них, но я не хочу закрывать окно. Я хочу, чтобы места разделенных окон были такими же, как и до закрытия буфера.

Если я нажму: bd, окно, в котором был закрыт буфер, также станет закрытым.

Ответы [ 7 ]

27 голосов
/ 27 октября 2013

Как @RusAlex, я не люблю плагины.Мне также нравится знать, какой код я на самом деле ввожу.

nmap ,d :b#<bar>bd#<CR>

Короче говоря это добавляет сопоставление клавиш в обычный режим vim, ожидая последовательность клавиш ,d.При выполнении это переключается на ранее открытый буфер и пытается удалить буфер, с которого вы переключились.

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

Команда состоит изтри разделенные пробелами части:

  • nmap - добавление / изменение соответствия клавиш для нормального режима
  • ,d - последовательность клавиш, на которые нужно реагировать;сначала , (запятая), затем d
  • :b#<bar>bd#<CR> - последовательность клавиш для выполнения

Команда для выполнения состоит из пяти частей:

  • : - переключить vim в командную строку режима
  • b# - переключить окно в ранее открытый буфер
  • <bar> - ожидать команду на выполнение;представляет | (символ трубы);используется для создания цепочек команд
  • bd# - удалить ранее открытый буфер, т. е. буфер только что отключился от
  • <CR> - выполнить команду (и);представляет возврат каретки, в основном ключи Return или Enter

Команда в том формате, в котором она используется в файле конфигурации, например ~/.vimrc.Если вы хотите добавить сопоставление из vim, вы добавляете : (двоеточие) - сопоставление будет потеряно при выходе из vim:

:nmap ,d :b#<bar>bd#<CR>

Когда вы открываете vim, этообычно в обычном режиме, в отличие от режимов вставки (обозначается в нижней части экрана -- INSERT -- после нажатия i), визуального отображения и так далее.n в nmap указывает сопоставление клавиш, которое будет добавлено только в обычный режим.Подробнее о отображениях здесь

Важные примечания:

  • b# переключится на текущий буфер, если он является единственным известнымbuffer.
  • b# может переключиться на скрытый / закрытый буфер, например тот, который вы только что закрыли нажатием ,d.
  • bd# закроет текущий буфер, если этоединственный известный буфер, не разделяющий экран, оставляющий вас с пустым буфером.
  • bd# потерпит неудачу, если буфер, на который был переключен буфер, является скрытым / закрытым буфером.
  • bd# все еще не будет разделен, еслипосле переключения другое окно показывает закрытие буфера.

Дополнительные примечания:

  • :windo b# переключит все окна в ранее открытый буфер.Не уверен, как сочетать с bd.
  • <CR> можно не указывать, в этом случае необходимо вручную нажать Return или Enter для выполнения.
  • :nmap , отображает все сопоставления в нормальном режиме, начиная с ,.
  • :ls перечисляет открытые буферы.
9 голосов
/ 29 ноября 2010

Невозможно иметь пустое окно в vim, но вы можете просто создать новый пустой файл в текущем окне, используя :enew.

4 голосов
/ 28 ноября 2010

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

2 голосов
/ 28 ноября 2010

Вы хотите удалить буфер, но сохранить разделение? Тогда вам нужен новый буфер -: new сделает это за вас, создав буфер для нового / пустого файла, но вам все равно придется уничтожить старый буфер / окно. В vim окно - это окно просмотра в буфере, поэтому, если вы хотите пустое окно, вам нужен пустой буфер.

1 голос
/ 24 марта 2015

Вот вариант ответа @zenbro, который сохраняет все ваши (разделенные) окна и вкладки открытыми, даже если закрываемый вами буфер является последним.

Функция переключает все окна, указывающие на текущий буфер (который вы закрываете), на следующий буфер (или новый буфер, если текущий буфер последний).

function! CloseBuffer()
    let curBuf = bufnr('%')
    let curTab = tabpagenr()
    exe 'bnext'

    " If in last buffer, create empty buffer
    if curBuf == bufnr('%')
        exe 'enew'
    endif

    " Loop through tabs
    for i in range(tabpagenr('$'))
        " Go to tab (is there a way with inactive tabs?)
        exe 'tabnext ' . (i + 1)
        " Store active window nr to restore later
        let curWin = winnr()
        " Loop through windows pointing to buffer
        let winnr = bufwinnr(curBuf)
        while (winnr >= 0)
            " Go to window and switch to next buffer
            exe winnr . 'wincmd w | bnext'
            " Restore active window
            exe curWin . 'wincmd w'
            let winnr = bufwinnr(curBuf)
        endwhile
    endfor

    " Close buffer, restore active tab
    exe 'bd' . curBuf
    exe 'tabnext ' . curTab  
endfunction

Чтобы отобразить это:

map <silent> <F4> :call CloseBuffer()<cr>
1 голос
/ 27 июля 2014

@ Версия RusAlex + активировать текущий буфер в случае необходимости, если дважды удалить буфер.

nmap ,d :b#<bar>bd#<bar>b<CR>
0 голосов
/ 02 июля 2014

Вот некоторые обходные пути:

function! CloseSplitOrDeleteBuffer()
  let curNr = winnr()
  let curBuf = bufnr('%')
  wincmd w                    " try to move on next split
  if winnr() == curNr         " there is no split"
    exe 'bdelete'
  elseif curBuf != bufnr('%') " there is split with another buffer
    wincmd W                  " move back"
    exe 'bdelete'
  else                        " there is split with same buffer"
    wincmd W
    wincmd c
  endif
endfunction


nnoremap <silent> Q :call CloseSplitOrDeleteBuffer()<CR>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...