vim editor, навигация по исходному коду с использованием файла журнала - PullRequest
2 голосов
/ 07 июля 2011

Этот вопрос может быть очень абстрактным, поэтому прошу прощения заранее.

У меня есть файл журнала, который содержит строки, которые подчиняются определенному шаблону (имя файла, строка, функция, оператор трассировки). Например

file1.cpp, 12, function1, "we are in function 1"
file2.cpp, 104, add, "add function"
another_file.cpp, 300, function2, "This is a trace"

Мне бы хотелось, чтобы редактор vim разделился на два окна. В одном окне есть файл журнала, и каждый раз, когда я перемещаю курсор на строку трассировки, другое окно открывает реальный файл в правильной строке кода.

Например, в верхнем окне мой курсор находится на линии

file2.cpp, 104, add, "add function"

и второе (vim разделяется на два окна) окно открывает файл file2.cpp в строке 104 (в центре второго окна).

Есть ли возможность использовать структурированный файл (файл журнала) в качестве «навигатора» для исходного кода? Если да, как мы можем сделать это в VIM? Если нет, давайте сделаем это! (но я бы не хотел изобретать велосипед :-))

Ответы [ 3 ]

5 голосов
/ 07 июля 2011

То, что вы описываете, называется окном быстрого исправления в Vim. Возможно, вы знакомы с ним по результатам команды :make. Вы можете открыть окно быстрого исправления, используя :cfile. Формат определяется переменной errorformat. Для получения более подробной информации обратитесь к справке Vim.

Для вашего примера (имя файла, строка, функция, оператор трассировки) вы можете сделать:

:set errorformat=%f\\\,\\\ %l\\\,\\\ %m
:cfile log.txt

Беспристрастные тройные обратные слэши предназначены для обхода escape-последовательностей в команде :set. Формат переводится как %f\,\ %l\,\ %m.

Кроме того, вы можете вывести свой журнал в формате gcc. В этом случае по умолчанию errorformat сможет его проанализировать, и все, что вам нужно будет сделать, это открыть его с помощью команды :cfile.

После загрузки вы можете просмотреть журнал, используя :clist или :copen.

2 голосов
/ 07 июля 2011

Это нетривиальное упражнение, но оно, безусловно, может быть выполнено.

Вам понадобится autocmd для вызова функции для определенных операций (в частности, когда курсор перемещается), что-то вроде этого:

autocmd CursorMoved mylogfile.txt call LogFileUpdate()

Вы также можете использовать CursorMovedI и другие, но я оставлю это в качестве упражнения для вас ... см .:

:help autocommand-events

В функции вывыполнить «магию».Это не проверено и не имеет проверки ошибок;Он предназначен для того, чтобы дать вам что-то, с чем можно поиграть и создать свой сценарий.

function! LogFileUpdate()
    " Make sure the cursor stays put
    let saved_view = winsaveview()

    " This is a slightly lazy way of making a consistent split: you could do something
    " clever here, working out whether there is a split at present and re-using it:

    " Close all other windows
    only

    " Get the current line into a variable
    let current_line = getline('.')
    " Split on commas:
    let parts = split(current_line, ',')

    " Get the filename and line number (removing leading and trailing spaces)
    let filename = substitute(parts[0],'^\s*\(.*\)\s*$','\1','')
    let number_str = substitute(parts[1],'^\s*\(.*\)\s*$','\1','')

    " Open the file at the required line number
    exe 'sp +'.number_str filename
    " Set the file type (doesn't seem to happen automatically in a CursorMoved autocmd)
    filetype detect

    " Switch back to the log file window
    wincmd w

    " Restore the cursor to its original position
    call winrestview(saved_view)
endfunction
0 голосов
/ 07 июля 2011

Обычный способ навигации по исходному коду с помощью Vim заключается в использовании ctags

См .:

ctags - это внешняя программа, которая генерирует список идентификаторов для переменных, функций,etc, и Vim затем использует этот список для перехода к определению функции.

Чтобы сгенерировать файл tag, вам просто нужно запустить ctags -R *.cpp,*.hpp в каталоге вашего проекта.Он будет индексировать каждый файл cpp и hpp рекурсивно.

Как только ваш файл тега будет правильно сгенерирован и в пути тега для Vim, вы можете «перейти» к идентификатору с помощью CTRL + ] когда ваш курсор находится на «имя_функции».ctags учитывает количество аргументов, но я думаю, что, используя только имя, оно должно работать.

Затем вы можете вернуться к вашему файлу журнала с помощью CTRL + T или CTRL + o .

Это не будет работать точно так, как вы хотите, но вы сможете быстро переходить назад и вперед между файлами журналаи ваш код.

Вы также можете искать в StackOverflow для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...