Одна книга, еще не предложенная но очень важная, "Компоновщики и Загрузчики" John Levine. Если Вы не будете использовать внешний ассемблер, Вам будет нужен способ произвести объектный файл, который может быть связан в Вашу заключительную программу. Даже при использовании внешнего ассемблера необходимо будет, вероятно, понять перемещения и как целый процесс загрузки программы работает для создания рабочего инструмента. Эта книга собирает много случайных сведений вокруг этого процесса для различных систем, включая Win32 и Linux.
В дополнение к ответу Бликстора вам нужно немного хорошенько подумать о дизайне скрипта. Я бы рекомендовал разделить дизайн таким образом, чтобы автокоманда использовала команду Windows «start» или что-то подобное для запуска внешнего сценария в фоновом режиме : таким образом предотвращая перерыв в работе Vim во время создания файла тега.
Этот сценарий может затем сгенерировать файл тегов, используя другое имя файла (то есть не «теги»: ctags -R -o newtags.
) и, когда ctags завершен, удалить тегов
и переименуйте newtags
в tags
. Это предотвратит то, что файл тегов будет недоступен в Vim во время генерации.
Идея:
Используйте автокоманды Vim (: help autocommand), чтобы запускать скрипт каждый раз, когда буфер сохраняется с помощью события BufWritePost.
Этот скрипт запускает генерацию ctags и содержит некоторую дополнительную небольшую логику, чтобы не запускаться, пока он уже запущен (или запускаться не чаще, чем каждые 10 минут и т. д.).
Изменить:
Здесь заранее запрашивалось нечто подобное, см. Vim auto-generate ctags
Эта логика работает в большинстве случаев: при открытии нового файла в vim перейдите в каталог этого файла и сгенерируйте там файл тегов, если он еще не существует. При сохранении измененного буфера сгенерируйте файл тегов в каталоге сохраняемого файла:
function! GenerateTagsFile()
if (!filereadable("tags"))
exec ":!start /min ctags -R --c++-kinds=+p --fields=+iaS --extra=+q --sort=foldcase ."
endif
endfunction
" Always change to directory of the buffer currently in focus.
autocmd! bufenter *.* :cd %:p:h
autocmd! bufread *.* :cd %:p:h
" Generate tags on opening an existing file.
autocmd! bufreadpost *.cpp :call GenerateTagsFile()
autocmd! bufreadpost *.c :call GenerateTagsFile()
autocmd! bufreadpost *.h :call GenerateTagsFile()
" Generate tags on save. Note that this regenerates tags for all files in current folder.
autocmd! bufwritepost *.cpp :call GenerateTagsFile()
autocmd! bufwritepost *.c :call GenerateTagsFile()
autocmd! bufwritepost *.h :call GenerateTagsFile()