Vimscript: ошибка при проверке подстроки
В настоящее время я пытаюсь связать воедино функцию, чтобы сделать что-то в зависимости от текущего пути к файлу, запускается всякий раз, когда я меняю текущий буфер с помощью autocmd BufEnter
По моему.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