Команда перемещения внутри функций vim

944
thequark

Я хочу отобразить функцию C, к которой принадлежит текущая строка. Я не хочу использовать какой-либо плагин, потому что я работаю на нескольких операционных системах с различными возможностями машины и конфигурациями. Я пробовал большинство плагинов, и это не сработало по той или иной причине. Я должен написать что-то очень простое и минимальное, и которое работает с чрезвычайно основными функциями vim.

Текущее решение:

Я скопировал функцию vim от коллеги, которая, по сути, ищет reg-ex, совпадающий с началом имени функции. Он показывает имя в нижней части экрана в течение нескольких секунд и уходит

fun! ShowFuncName() let lnum = line(".") let col = col(".") echohl ModeMsg echo getline(search("^[^ \t#/]\\.*[^:]\s*$", 'bW')) echohl None call search("\\%" . lnum . "l" . "\\%" . col . "c") endfun 

проблема

Проблема в том, что эта штука не работает с ярлыками. Если в строке между определением функции и текущей строкой присутствует метка, сценарий показывает имя метки вместо имени функции.

В противном случае скрипт работает, потому что в нашей кодовой базе существует жесткое и быстрое правило всегда начинать определение функции со столбца 1, а фигурные скобки - со второй строки и далее.

Предлагаемое исправление

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

  1. Сохранить текущую строку №, столбец №
  2. Перейдите назад с помощью кнопок перемещения [[], чтобы перейти к определению функции
  3. Линия чуть выше этого будет иметь функцию C. (это строго соблюдается в правилах кодирования)
  4. напечатать строку
  5. Перейти к строке №, столбцу №, сохраненному на шаге № 1.

Я не знаю, как сделать шаг 2. упомянутый выше.

1
Вопрос: почему вы не можете просто использовать `[[`, чтобы найти определение функции, а затем нажать ``чтобы вернуться туда, где изначально был курсор? FDinoff 10 лет назад 1
Я делаю эти точные шаги вручную каждый раз. Я хочу автоматизировать эти шаги thequark 10 лет назад 0

1 ответ на вопрос

3
FDinoff

Я верю, что ты этого хочешь

function! ShowFuncName() let cursor_pos = getpos('.') echohl ModeMsg normal! [[k echo getline('.') echohl None call setpos('.', cursor_pos) endfunction 

Команда normalвыполняется [[kв обычном режиме, перемещая курсор к определению функции. Затем он печатает строку, на которой находится курсор.

Положение курсора восстанавливается в положение, в котором оно изначально использовалось, getpos()и setpos()функции.

Спасибо, это работает нормально, за исключением случая, когда я передвинул свои клавиши со стрелками перед вызовом функции. В этих ситуациях функция повторяет мою команду движения, не показывая ничего внизу. Шаги: 1. Переместите две строки вниз с помощью клавиш со стрелками или j. 2. Вызовите ShowFuncName (). Я ожидаю, что имя функции будет напечатано, но оно повторяет движение, выполненное на шаге 1. Если я нажимаю клавишу Esc после шага 1, сценарий работает должным образом thequark 10 лет назад 0