我目前正在尝试将一个函数绑定在一起,根据当前文件路径执行某些操作,每当我用自动命令缓冲区输入
在我的 .vimrc 中
autocmd BufEnter * call SayLocation()
在我的 .vimrc 中
fun SayLocation()
let str = expand("%p:~")
if str =~ "~/dir1"
echo "I am in dir 1!"
elseif str =~ "~/dir2"
echo "I am in dir 2!"
else
echo "I am somewhere else"
endif
endf
但是,更改缓冲区会产生以下错误
第 3 行:
E33:没有先前的替代正则表达式
第 7 行:
E33:没有先前的替代正则表达式
我在别处
看来我运行的子字符串比较器 =~ 是错误的。有什么线索吗?
答案1
你需要逃脱人物~
:
if str =~ '\~/dir1'
已经:help E33
很好的解释了这个问题:
E33 没有先前的替代正则表达式
当在模式中使用 '~' 字符时,它将被替换为 ":substitute" 命令中先前使用的模式。如果尚未使用此类命令,则此操作会失败。请参阅 |/~|。使用 ":s/pat/%/" 时也会发生这种情况,其中 "%" 代表前一个替换字符串。
额外的批评
- 你可能想要锚匹配到开头:
str =~ '^\~/dir1'
。可能还会在末尾断言路径分隔符:str =~ '^\~dir1/
,否则~/dir10/file
也会算作在 里面dir1
! - 匹配
=~
运算符(如文字==
比较)遵循'ignorecase'
设置。因此,建议通过 或 使比较独立于该选项的当前=~#
值=~?
。 - 除非您需要使用特殊的键符号,否则最好使用单引号
'string'
,因为反斜杠在那里没有特殊含义并且不需要转义(再次)。 - 您应该将您的包裹
:autocmd
在:augroup
;如果没有它,每次重新加载~/.vimrc
都会添加另一次运行:
augroup SayLocation
autocmd! " Clear existing
autocmd BufEnter * ...
augroup END