vimscript:为什么'\ S * \%> 66c。* / \ =替换...'=〜'\ a \ +'返回true

时间:2015-12-18 21:24:22

标签: regex vim mapping

这是一个映射

map <silent> <2-LeftMouse> lB"gyE  
:if @g=~'ss\d\d\d\.png'  
  :call writefile([@g], "/home/g/xv.vss", "a")  
:elseif @g=~'http'  
  :call writefile([@g], "/home/g/dil.lo", "a")  
:elseif @g=~'_\d\+'  
  :let @/='^'.@g.'$'  
  :norm nzz  
:elseif @g=~'\a\+'  
  :vim /^\cg/ /mnt/1/dict/webster/all.txt  
:else  
  :norm 0y$:@"  
:endif  

这是“g

的内容
\S*\%>66c.*/\=substitute(submatch(0),'

以下是映射运行时生成的消息

E303: Unable to open swap file for "=substitute(submatch(0),'/", recovery impossible  
Cannot open file "=substitute(submatch(0),'/"  
"all.txt" 530590 lines --0%--  

显然vim认为"g的内容相当于\a\+,因为它正式打开了all.txt,并尝试在其中找到匹配(韦伯斯特字典)到@g和该文件的唯一途径是通过上述测试。

有人可以向我解释为什么会这样做,或另外一种解释?

1 个答案:

答案 0 :(得分:1)

=~检查模式是否匹配。它不会为您添加锚点,因此如果字符串的任何部分匹配,则字符串计为匹配。

如果您只想接受字母字符,请使用'^\a\+$'代替\a\+