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