【问题标题】:Highlight arguments in function body in vim在 vim 中突出显示函数体中的参数
【发布时间】:2012-03-10 01:25:12
【问题描述】:

一些可以从 IDE 中借用的东西。所以想法是在函数体内突出显示函数参数(可能还有作用域变量名)。这是某些 C 的默认行为:

好吧,如果我将光标放在func 内,我希望看到参数foobar 突出显示以更好地遵循算法逻辑。请注意,func2 中名称相似的 foo 不会突出显示。不过这种奢侈可以省略……

使用局部作用域的变量,我也希望局部初始化的变量高亮:

终于再次彰显奢华:

写这个不是那么简单。我用 C 来给出一个总体思路。真的,我可以更好地使用它来进行 Scheme/Clojure 编程:

这应该可以识别 letloopfordoseq 绑定。

我的 vimscript-fu 没那么强;我怀疑我们需要

  • 解析(非正则表达式?)光标下函数定义的参数。当然,这将是特定于语言的。我的首要任务是 Clojure。
  • 定义语法区域以仅覆盖给定的函数/范围
  • 提供所需的语法匹配

作为一个函数,它可以映射到一个键(如果资源非常密集)或CursorMoved,如果不是那么慢。

好的,现在。有没有人写过/发现过这样的东西? vimscript 大师们对如何真正开始编写这样的脚本有什么想法吗?

对于轻微的题外话和错误的格式,我们深表歉意。随意编辑/格式化。或投票关闭。

【问题讨论】:

  • 超酷的话题。这个亮点确实提高了算法的可读性。有什么消息吗?
  • C/C++/Obj-C 完全可行。我知道可以使用 Python/Clang 来获取当前光标的范围以及当前函数的签名。来源:eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang。用这个写个vim插件应该不难。
  • 由于发布代码图像而不是文本,我差点对您投反对票……但后来我读到了这个问题。 ;)
  • 这实际上在 vim 中非常重要。最大的问题是它不对语言进行语义解析,因此很难知道什么是“函数的参数列表”,尤其是在与语言无关的情况下。同上,仅将亮点范围限定为函数。在 ide 中它微不足道,因为它们通常在内存中拥有完整的 AST,但同时,编写 ide 无法与 vim 语法文件相提并论......
  • @MattBriggs:好吧。 Libclang 被提出,它可以用于使用 Vim-Python 绑定的 C/C++。对于 LISP,AST 解析更容易。 :) 没错,我们必须依赖特定于语言的脚本,但这只是我们必须忍受的……

标签: clojure vim


【解决方案1】:

这比听起来要困难得多,而且就目前的 vimscript API 而言,这是不可能的,因为您不仅需要解析文件;如果你想让它正常工作,你需要增量地解析文件。这就是为什么常规语法文件仅限于您可以使用正则表达式执行的操作 - 当您更改几个字符时,vim 可以找出语法突出显示中发生的更改,而无需重做整个文件。

vim 语法高亮器仅限于处理正则表达式,但如果您下定决心这样做,您可以在 vimscript 中滚动您自己的解析器,并让它生成一个缓冲区本地语法,该语法通过以下方式引用文件中的标记行和列,在正则表达式中使用 \%l 和 \%c 原子。每次更改后都必须重新运行。不幸的是,没有“文件已更改”的自动命令,但有 CursorHold 自动命令,它会在您空闲一段可配置的持续时间时运行。

【讨论】:

  • 我同意……这有点疯狂。但是那里有 python/ruby/scheme 绑定。这些语言有 3rd 方库。也许我应该强调不必完全成为 VimL。
【解决方案2】:

可以在here 找到一个可能的解决方案。不是最好的方法,因为它会突出显示整个文件中的每一次出现,并且您每次都必须给出命令(可能第二个可以避免,不知道第一个)。不过还是看看吧。

【讨论】:

  • 自动做事不够。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 2011-05-29
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多