直接执行的命令可以正常工作。但是当它映射到某个键时,它会报告语法错误。
当我执行以下执行命令时,它会按预期工作
:silent execute "normal! ^:s/ ".expand("<cWORD>")." //g\<cr>"
但是当我将其映射到某个关键点时
:nnoremap ,g :silent execute "normal! ^:s/ ".expand("<cWORD>")." //g\<cr>"
然后,当我调用映射时,它会出现以下错误:
E114: Missing quote: " //g\
E15: Invalid expression: "normal! ^:s/ ".expand("<cWORD>")." //g\
答案 0 :(得分:2)
这是一个转义的问题。 <cr>
是按字面意义解释的(前面的反斜杠在这里无济于事),因此Vim尚未看到最后的"
,并抱怨缺少引号。将<
转换为<lt>
是这里的解决方案。
此外,您还希望<cr>
由:execute
解释(它在双引号内,并以反斜杠开头),但是现在谁在结论整个:execute "...."
?需要另一个<cr>
:
:nnoremap ,g :silent execute "normal! ^:s/ ".expand("<cWORD>")." //g\<lt>cr>"<cr>
但是,我认为整个方法太麻烦了;很少从:normal
进入Ex模式是一个好主意。
因此,您需要^
才能获得该行中的 first 单词;您可以直接从正常模式开始直接执行此操作:
:nnoremap ,g ^:execute "s/ ".expand("<cWORD>")." //g"<cr>
有了这个,您只需要通过:execute
进行一轮插值。看起来好多了,对吧?!