1

Я хочу отобразить функцию 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. То есть сделать следующее:

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

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

1 ответ1

3

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .