Команда перемещения внутри функций vim
Я хочу отобразить функцию C, к которой принадлежит текущая строка. Я не хочу использовать какой-либо плагин, потому что я работаю на нескольких операционных системах с различными возможностями и конфигурациями машины. Я пробовал большинство плагинов, и это не работает по той или иной причине. Я должен написать что-то очень простое и минимальное, и которое работает с чрезвычайно основными функциями vim.
Текущее решение:
Я скопировал функцию vim от коллеги, которая по сути ищет reg-ex, совпадающий с началом имени функции. Он показывает имя в нижней части экрана в течение нескольких секунд и уходит
fun! ShowFuncName()
let lnum = line(".")
let col = col(".")
echohl ModeMsg
echo getline(search("^[^ \t#/]\\{2}.*[^:]\s*$", 'bW'))
echohl None
call search("\\%" . lnum . "l" . "\\%" . col . "c")
endfun
проблема
Проблема в том, что эта штука не работает с ярлыками. Если в строке между определением функции и текущей строкой присутствует метка, сценарий показывает имя метки вместо имени функции.
В противном случае скрипт работает, потому что в нашей кодовой базе существует жесткое и быстрое правило всегда начинать определение функции со столбца 1, а фигурные скобки - со второй строки и далее.
Предлагаемое исправление
Вместо поиска регулярных выражений, почему бы не использовать клавиши перемещения vim. То есть сделать следующее:
- Сохранить текущую строку №, столбец №
- Перейдите назад с помощью кнопок перемещения [[], чтобы перейти к определению функции
- Линия чуть выше этого будет иметь функцию C. (это строго соблюдается в правилах кодирования)
- напечатать строку
- Перейти к строке №, столбцу №, сохраненному на шаге № 1.
Я не знаю, как сделать шаг 2. упомянутый выше.
2 ответа
Я верю, что ты этого хочешь
function! ShowFuncName()
let cursor_pos = getpos('.')
echohl ModeMsg
normal! [[k
echo getline('.')
echohl None
call setpos('.', cursor_pos)
endfunction
normal
команда выполняется [[k
в обычном режиме перемещая курсор к определению функции. Затем он печатает строку, на которой находится курсор.
Положение курсора восстанавливается до той позиции, в которой оно было изначально getpos()
а также setpos()
функции.
Для тех, кто ищет, другой способ может использовать выполнение и норму:
function! MoveCursorDown()
execute "norm j"
endfunction