Vimscript:检查子字符串时出错

Vimscript:检查子字符串时出错

我目前正在尝试将一个函数绑定在一起,根据当前文件路径执行某些操作,每当我用自动命令缓冲区输入

在我的 .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

相关内容