Откройте файл с помощью: tag и перейдите к последней отредактированной позиции - PullRequest
0 голосов
/ 19 января 2020

При использовании 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 для запоминания последней отредактированной позиции файла и возврата go к ней при чтении буфера.

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

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

Ответы [ 2 ]

0 голосов
/ 19 января 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
0 голосов
/ 19 января 2020

Не точный дубликат, но посмотрите эту ветку .

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

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

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

...