我在vim中编写搜索/替换功能并遇到问题。它应该在选定行的可视模式下工作。
这有效:
let b:CON="'<,'>s:[^\t ]:a:e"
vnoremap r :<C-u>execute b:CON
但这不是(它应该在第一个字母后加上&#39; a&#39;)
let b:CON="'<,'>s:\([^\t ]\):\1a:e"
vnoremap r :<C-u>execute b:CON
所以在这里我刚刚在正则表达式中添加了一个组。但它现在什么也没做。这有什么不对?如果我输入相同的命令或通过地图直接调用它同样的命令。 execute un会逃避字符串中的某些字符吗?我认为不应该这样 额外的问题:是否有其他好的方法来执行&#34;多行上的命令,除了我在这里使用的(C-u)。
答案 0 :(得分:2)
第一个只是偶然的。例如,由于vim在双引号字符串中解释转义序列,因此您在b:CON
而不是\t
中嵌入了实际的制表符。第二个解释\(
为实际(
,\1
转为^A
(<c-a>
)
你只需双重逃避斜线。
let b:CON="'<,'>s:[^\\t ]:a:e"
let b:CON="'<,'>s:\\([^\\t ]\\):\\1a:e"
或使用单引号字符串并转义单引号。 (两个单引号等于并转义单引号。)
let b:CON='''<,''>s:[^\t ]:a:e'
let b:CON='''<,''>s:\([^\t ]\):\1a:e'
另一种重写第二种方法的方法是使用&
,因为它代表整场比赛
let b:CON="'<,'>s:[^\\t ]:&a:e"
或者
let b:CON='''<,''>s:[^\t ]:&a:e'
查看:help literal-string
单引号字符串和:help expr-string
双引号字符串。