Vim: удаление буферов, редактирование несуществующих файлов - PullRequest
3 голосов
/ 13 января 2012

Часто, когда я редактирую в Vim, я в конечном итоге восстанавливаю сеанс Vim, который ссылается на некоторые файлы в каталоге, который был перемещен. Проблема возникает после того, как я использую :n, чтобы открыть все файлы, расположенные в новом каталоге. Теперь, когда я использую :b <buffer-name> для переключения в буфер, редактирующий конкретный файл, расположенный в новом каталоге, возникает неоднозначность: два буфера открываются для файлов с одинаковым именем, и один из этих файлов не существует. Поэтому я вынужден использовать :ls, вручную искать индексы буферов, которые редактируют несуществующие файлы, и вызывать :bw для каждого из них. Есть ли какая-нибудь простая команда, которая автоматически уничтожит буферы, редактирующие несуществующие файлы для меня?

Кроме того, после ручного удаления поврежденных буферов в индексах между последовательными буферами возникают резкие разрывы, что затрудняет переключение между буферами с использованием :<n>b. Есть ли команда, которая переиндексирует буферы для меня так, чтобы набор индексов находился в некотором непрерывном диапазоне?

Спасибо за вашу помощь!

Ответы [ 3 ]

3 голосов
/ 13 января 2012

Попробуйте следующую команду:

function s:WipeBuffersWithoutFiles()
    let bufs=filter(range(1, bufnr('$')), 'bufexists(v:val) && '.
                                          \'empty(getbufvar(v:val, "&buftype")) && '.
                                          \'!filereadable(bufname(v:val))')
    if !empty(bufs)
        execute 'bwipeout' join(bufs)
    endif
endfunction
command BWnex call s:WipeBuffersWithoutFiles()

Использование:

:BWnex<CR>

Обратите внимание на некоторые уловки:

  • filter(range(1, bufnr('$')), 'bufexists(v:val)') представит вам списоквсе буферы (номера буферов), которые в данный момент есть в vim.
  • empty(getbufvar(v:val, '&buftype')) проверяет, должен ли буфер иметь файл.Есть несколько плагинов, открывающих буферы, которые никогда не должны быть представлены в файловой системе: например, буфер со списком открытых в данный момент буферов, испускаемых плагинами, такими как minibufexplorer.Эти буферы всегда имеют &buftype, установленную на что-то вроде nofile, обычные буферы имеют пустой тип buf. * ​​1016 *
3 голосов
/ 13 января 2012

Разве буферы не должны быть уникальными?

После этой последовательности команд:

:e .bashrc
:e .profile
:e .bashrc
:e .profile
:e .bashrc
:e .profile
:e .bashrc
:e .profile
:e .bashrc

У меня все еще есть только два буфера, как показано :buffers или :ls: .bashrc и .profile.Даже если я использую несколько окон и вкладок.

Вы путаете "буферы" с "окнами"?

1 голос
/ 13 января 2012

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

Когда мои буферы загромождаются, я обычно закрываю окно. Затем у меня есть команда из моей оболочки, которая запускает все извлеченные файлы из моего управления исходным кодом - 90% времени это файлы, которые меня интересуют.

Я обычно на Cygwin Bash. И запустить

gvim `p4list` `svnopened`

Функции p4list и svnopened приведены ниже:

function p4list() {
  export tempscript=`mktemp`
  echo "#!bash" > $tempscript
  p4 opened $@ | sed -e 's/#.*//g' | sed -e 's/$/ \\/g' | sed -e '1~300s/^/\
\
p4 where /' >> $tempscript
  chmod +x $tempscript
  $tempscript | sed -e 's/.* //g' | sed -e 's/

// g '| sed -e 's / \ /// g' rm $ tempscript }

function svnopened() {
    svn st $@ | grep "^\M" | sed -e 's/^.\{8\}//'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...