从脚本搜索/替换(从字符串变量执行搜索命令)

时间:2015-05-15 17:21:09

标签: regex vim

我在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)。

1 个答案:

答案 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双引号字符串。