Подтвердить что ты не робот

Vim закрыть буфер, но не разделить окно

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

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

4b9b3361

Ответ 1

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

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

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

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

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

  • nmap - добавить/изменить отображение клавиш для режима normal
  • ,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# переключится на текущий буфер, если он является единственным известным буфером.
  • b# может переключиться на скрытый/закрытый буфер, например. тот, который вы только что закрыли, нажав ,d.
  • bd# закроет текущий буфер, если он является единственным известным буфером, который отключает экран, оставляя вас с пустым буфером.
  • bd# выйдет из строя, если буфер, отключаемый от него, является скрытым/закрытым буфером.
  • bd# будет по-прежнему нерасщепляться, если после переключения в другое окно будет закрыт буфер.

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

Здесь вариант ответа предоставлен @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>

Ответ 7

Вот несколько способов:

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>