Ответ 1
Здесь script на Vim wiki. Я не думаю, что есть встроенная программа, которая делает то, что вы хотите.
Vim многослойные представления (Windows, Буферы и вкладки) оставили меня немного запутанным. Скажем, я разделил дисплей (: sp), а затем выберите другой буфер для отображения в каждом окне. Теперь я хочу закрыть один из буферов, но я не хочу, чтобы окно закрывалось (после закрытия он может отображать следующий буфер в списке или пустой буфер, это не имеет значения). Как я могу это сделать?
Спасибо.
Здесь script на Vim wiki. Я не думаю, что есть встроенная программа, которая делает то, что вы хотите.
Я немного облажался и наконец придумал:
: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
(если \
- ваш ключ лидера)
Я искал это сегодня и придумал
:b#|bd#
который изменяет текущее окно на ранее открытый буфер и удаляет/скрывает только что отключенный буфер.
Для этого требуется, по меньшей мере, два известных буфера.
Если другое окно, кроме текущего, показывает тот же буфер, это все равно разрушит расщепление. Вы можете изменить все окна на ранее открытый буфер с помощью
:windo b#
Я добавил более подробную информацию о прежней команде, обсуждая отображение для нее (и некоторые подводные камни) в ответ на аналогичный вопрос.
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
Я думаю, что это то, что вы ищете
http://www.vim.org/htmldoc/windows.html#window-moving
Попробуйте следующее:
Посмотрите на свой идентификатор буфера, используя
:buffers
вы увидите список буферов там вроде
1 a.cpp
2 b.py
3 c.php
если вы хотите удалить b.py из буфера
:2bw
если вы хотите удалить/закрыть все из буферов
:1,3bw
Для тех, кто использует 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
Я не думаю, что есть один способ сделать это, но вы можете сделать :enew
или :ls
, чтобы перечислить ваши буферы и обменять их на другой, используя :b [number]
.
Как только у вас есть другой буфер в окне :bd #
, вы удалите предыдущий буфер в окне, и поскольку текущий буфер все еще существует, окно не будет закрыто.
Я использовал:
:bp<bar>sp<bar>bn<bar>bd<CR>
Но я нашел определенные случаи, когда он закрыл мое окно.
Недавно я заметил, что всегда использую это, когда я работаю над проектом, и мне нужно быстро открыть мой .tmux.conf
.zshrc
, прежде чем вернуться к работе.
Для этого использования мне лучше:
C-6
:bd#
, чтобы удалить предыдущий буфер (я отобразил его следующим образом: nnoremap <leader>d :bd#<CR>
)Это позволяет мне управлять буфером, к которому я возвращаюсь, и чувствует себя более естественным.
Would
:enew
делай, что хочешь? он будет редактировать новый, неназванный буфер в текущем окне, оставляя существующий файл открытым в любых других окнах.
Моим любимым решением для этого является 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).
Вот очень читаемая функция 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
Чтобы закрыть окно, используйте :hid[e]
. Работает, если вам удалось разделить область просмотра или открыть несколько файлов. Вы не можете скрыть последний буфер на дисплее.
1 Еще один совет, который помог мне: используйте :e ./path/to/file.work
, чтобы открыть файл в видовом экране, не разбивая его.
P.S. Через два дня в vim мне все еще трудно найти точные команды помощи. Надеюсь, это поможет кому-то еще работать, пока они действительно не получат время, чтобы понять vim.
Если вы похожи на меня и пришли сюда, пытаясь сделать обратное, закройте окно, не закрывая буфер, вы можете сделать это с помощью:
:close
используйте ": bd" в качестве команды.