vim 函数中的移动命令

vim 函数中的移动命令

我想要显示当前行所属的 C 函数。我不想使用任何插件,因为我在多个操作系统上工作,这些操作系统具有不同的机器功能和配置。我尝试过大多数插件,但由于这样或那样的原因,它们都没有用。我必须编写一些非常基本和最小的插件,并且它与极其基本的 vim 功能兼容。

当前解决方案:

我从同事那里复制了一个 vim 函数,它本质上是搜索正则表达式,匹配函数名称的开头。它在屏幕底部显示名称几秒钟,然后消失

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

我相信你想要这个

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

normal命令[[k在正常模式下执行,将光标移动到函数定义处。然后打印光标所在的行。

光标位置恢复到原来使用getpos()setpos()运行的位置。

答案2

对于任何搜索的人来说,另一种方法可能是使用执行和规范:

function! MoveCursorDown()
    execute "norm j"
endfunction

相关内容