Открыть файл с тегом: и перейти к последней редактируемой позиции

При использовании ctags с Vim можно открыть файл как:

:tag <filename>

Это возможно, если файл tags был сгенерирован с использованием флага --extras=+qf, как в этом фрагменте кода:

$ find . -name "*.c" | xargs ctags-universal --extras=+qf -L -

Это создает строку в файле тегов, такую ​​​​как эта:

JPEGImageDecoder.cpp Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp  1;"   F

Эта запись содержит 4 элемента: {имя тега, путь к файлу, номер строки, тип тега}. Всякий раз, когда Vim открывает тег, он переходит к строке номер 1, несмотря на то, что я настроил Vim так, чтобы он запоминал последнюю отредактированную позицию файла и возвращался к ней при чтении буфера.

if has("autocmd")
  au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
endif

Есть ли способ открыть файл с помощью :tag <filename> и установить курсор в последнюю отредактированную позицию?


person Diego Pino    schedule 19.01.2020    source источник
comment
Встроенные функции winsaveview и winrestview могут сохранять и восстанавливать позицию курсора.   -  person MAGA    schedule 19.01.2020


Ответы (2)


Не точная копия, но см. эту тему.

Я не уверен, что вы могли бы сделать это с помощью команды :tag. Рассмотрите возможность создания собственной команды :Tag, которая выполняет это, например:

autocmd BufWinLeave * mkview
command -nargs=? Tag :tag <args> | loadview

По сути это копипаста из вышеупомянутого треда. Убедитесь, что вы также видите :mksession; это еще мощнее.

person Hari Amoor    schedule 19.01.2020

Я понял это.

В Vim :help tags-file-format показывает информацию о формате записи ctags:

The lines in the tags file must have one of these three formats:

1.  {tagname}           {TAB} {tagfile} {TAB} {tagaddress}
2.  {tagfile}:{tagname} {TAB} {tagfile} {TAB} {tagaddress}
3.  {tagname}           {TAB} {tagfile} {TAB} {tagaddress} {term} {field} ..

Где-то ниже о {tagaddress} говорится следующее:

{tagaddress}    The Ex command that positions the cursor on the tag.  It can
                be any Ex command, although restrictions apply (see
                tag-security).  Posix only allows line numbers and search
                commands, which are mostly used.

В большинстве случаев этот {tagaddress} является номером строки или регулярным выражением, но должна быть возможность использовать другие механизмы Vim для позиционирования курсора. Если я заменю 1 на '" (последняя отредактированная позиция), это сработает.

Итак, в основном мне нужно создать файл тегов, который для проиндексированных имен файлов заменяет 1 по умолчанию на '". В идеале это должен быть аргумент в exuberant-ctags или universal-ctags, но в основном я сделал это, постобработав файл тегов с помощью sed:

# Replace 1 for "' (first line for last edited line).
sed -ri "s/1;\"\s+F$/'\";\"\tF/" .tags
person Diego Pino    schedule 19.01.2020