Редактировать : Решение, очень похожее на следующее, было опубликовано как AutoTag vim script . Обратите внимание, что сценарию требуется vim с поддержкой Python , однако.
Мое решение вместо этого использует awk, поэтому оно должно работать на многих других системах.
au FileType {c,cpp} au BufWritePost <buffer> silent ! [ -e tags ] &&
\ ( awk -F'\t' '$2\!="%:gs/'/'\''/"{print}' tags ; ctags -f- '%:gs/'/'\''/' )
\ | sort -t$'\t' -k1,1 -o tags.new && mv tags.new tags
Обратите внимание, что вы можете написать это таким образом в скрипте, иначе он должен идти в одной строке.
Там много чего происходит:
Эта автоматическая команда срабатывает, когда обнаружено, что файл является C или C ++, и добавляет в свою очередь локальную буферную автоматическую команду, которая запускается событием BufWritePost
.
Он использует заполнитель %
, который заменяется именем файла буфера во время выполнения, вместе с модификатором :gs
, используемым для кавычек в имени файла (превращая любые встроенные одинарные кавычки в escape-escape -quote кавычка).
Таким образом он запускает команду оболочки, которая проверяет, существует ли файл tags
, и в этом случае его содержимое печатается, за исключением строк, которые относятся к только что сохраненному файлу, при этом ctags
вызывается для только что сохраненный файл, и затем результат sort
редактируется и возвращается на место.
Разработчик Caveat: предполагается, что все находится в одном и том же каталоге и является текущим каталогом локального буфера. Я не задумывался о путанице на пути.