我正在对文件进行一些 vim 的降价编辑。我正在尝试将其转换为带有代码突出显示等的降价。
- Arithmetic operators:`+,−,*, /`
- Constants: `e`, `pi`
- Functions: (abs x), (max x y... ), (ceiling x) (expt x y), (exp x),
(cos x), ...
我只想使用视觉模式选择以下内容中参数中的内容(包括参数((因此它们将被逗号不相交(:
(abs x), (max x y... ), (ceiling x) (expt x y), (exp x),
(cos x), ...
然后S`
用反引号包围每段文本。我怎样才能做到这一点,而不选择每一个,然后重复做S`
?
我怎么能做到这一点而不选择每一个,然后重复做 S'?
这实际上是在 Vim 中效果最好的方法。在宏的帮助下:
互动版:
/(.{-})<CR>
qqysa)`nnq
@q
@@
@@
。直到你全部完成并绕到你开始的地方。
非交互式"只是做它"版本:
:set nows<CR>
gg
/(.{-})<CR>
qqqqqysa)`nn@qq@q
之后你可能想回到:set ns
。
当然,如果您知道没有嵌套括号,那么最简单的答案是使用:s
,就像其他回答者建议的那样。
使用宏的解释进行编辑:
qqqqq...@qq@q
是一个循环。以下是它的工作原理:
qq
后跟q
清除q
寄存器。这在以后会很重要。qq
开始宏录制。ysa)
用`
包围括号。nn
进入下一场比赛。我们必须这样做两次,因为环绕声跳到括号之前,n
将再次匹配相同的括号。@q
调用q
宏。它是空的,所以这什么也不做...现在。但是,请进一步阅读...q
停止宏录制,并将其存储到q
寄存器中。- 现在
q
不再为空,我们可以用@q
.但是,在执行过程中,q
仍然不会为空,因此当我们到达宏中在录制过程中什么都不做时,宏将重新启动,从而为我们提供一个原始但有效的递归循环。 - 当循环中的某些内容中断时,循环会停止:例如,无法进入下一场比赛。通常,您只需更改所有匹配项,以便不再保留匹配项;但是,此宏所做的编辑不会使匹配失败,因此我们必须依靠
:set nows
来确保我们不会继续无限地向所有括号添加反引号。
经过一番思考,您实际上可以重写模式,以便不需要:set nows
(和额外的n
(:
/`@<!(.{-})<CR>
qqqqqysa)`n@qq@q
这匹配了一对括号,前面没有反引号,所以在所有匹配都处理完后,没有匹配n
,自然会打破循环。
如果有人认为这很复杂...请注意,大多数编辑器都无法做到这一点(因为这考虑了适当的括号嵌套,而我还没有看到具有足够强大的搜索替换功能以使其能够完成的编辑器(。
使用全局命令(假设"S"来自 surround.vim(:
:global/(/normal f(ysab`
(这会影响整个文件,并且一次只能执行一个更改。重复@:
(
使用宏:
qqf(ysab`q
重复@q
,然后@@
或与替代品:
:substitute/([^)]+)/`&`/g