vim:在当前文件的源注释中设置修复跳转标记

时间:2018-06-22 09:37:21

标签: vim

我是 VIM 的重度用户,但我错过了一件事…

  

comment中的(大)当前打开文件的不同部分上设置修复跳转标记

我期望的是

  1. 在评论中设置标记,例如:// vim: marker(x)
  2. 通过以下方式跳转到标记:'x

使用'x跳至功能p_structDEF_MqC的示例(使用tcl代码)

proc p_func_arg_name_DEF_MqC {key value} {                                                                         
  set cmd "N"
  regexp {^(\w)#(.*)} $value dummy cmd value                                                                       
  set ::ARG_DEFAULT(k,$key) $cmd                                                                                   
  set ::ARG_DEFAULT(v,$key) $value                                                                                 
}

proc p_arg_name_DEF_MqC {key value} {
  func_arg_name_DEF_${::LANG}_MqC $key $value                                                                      
}           

## vim: marker(x)        
proc p_structDEF_MqC {name} {                                                                                      
  global xCLASS xPREFIX
  set prefix  [string range $name 0 end-1]                                                                         
  if {$prefix ne "Mq"} {
    lappend xPREFIX   "$prefix"                                                                                    
  }       
  lappend xCLASS    "${prefix}C"                                                                                   
}             

proc p_enumDEF_MqC {name argv} {                                                                                   
}               

proc p_typeDEF_MqC {VAR VALUE} {                                                                                   
}               

proc p_fupuDEF_MqC {name ret argv} {
}             

2 个答案:

答案 0 :(得分:2)

您可以创建一个自动命令来扫描文件中的那些标记, 并使用setpos()创建它们。您可以像 您想要在脚本中进行分析,即分析下一行 并确定标记应在的位置。这是一个简单的 单个命令中的实现,该命令在 下一行的第一个字符:

au BufRead * g/vim: marker([a-z])/call setpos(
                      \ "'".matchstr(getline('.'), '(\zs\w'),
                      \ [0, getpos('.')[1]+1, 1, 0] )

此答案主要基于:autocmd:g。你应该 检查(:h :au:h :g的帮助文件。一个 当某个事件发生时,autocommand运行指定的命令 匹配特定模式的文件会发生这种情况。因此,更多帮助 供您阅读的主题:

  • autocmd-events
  • autocmd-patterns

您可以使用该模式将其限制为某些文件。

然后,我们有:g命令来搜索匹配的行 模式并执行命令。搜索是您修改的地方 您在寻找哪些标志。根据您的评论,假设 例如,您要使:之后的空格为可选。然后 将您的正则表达式更新为:

vim: *marker([a-z])

根据需要进行修改。

该命令位于setpos()的中央(再次搜索帮助 为此...无论如何,我的意思是在帮助中)。它需要 两个参数,一个是设置的,另一个是设置的 至。我们想设置一个标记,所以我们需要给它一个表达式 例如"'a"来设置标记a。找出哪个字母是 应该应用的标记,我们使用:

matchstr(getline('.', '(\zs\w')

在这里我们搜索第一个括号之后的第一个字母 (带有(\zs\w)在当前行的文本中,通过 getline()。搜索所有这些功能的帮助。这是 如果用引号连接起来,则用"'" . {expr}构成"'x" 这封信是x

然后输入第二个参数,如果必须是类似于以下内容的数组 getpos()返回。再次搜索帮助。但是我们是 对其进行修改,以在下一个开始处设置标记 线。因此,我们仅使用getpos()返回的订单项, 这是第二项,并添加1。

[{buffer}, {line}, {col}, {virtual-offset}]
[0, getpos('.')[1]+1, 1, 0]

答案 1 :(得分:0)

基于先前答案的工作解决方案:

au BufRead *.c silent! g/vim: \*Marker(\[a-z])/call setpos(
  \ "'".matchstr(getline('.'), '(\zs\w'),
  \ [0, getpos('.')[1]+1, 1, 0] )

→感谢@sidyll的帮助。