#vim
#vim
Вопрос:
Я хотел бы сопоставить ключ с помощью «map» из моего файла vimrc следующим образом:
map <C-I> :split ~/some/file
Эта команда на самом деле работает нормально.
Мой вопрос: как мне вызвать функцию vim (в данном случае, «resolve ()») для этого пути к файлу из строки map / split. Это не работает, но, надеюсь, вы поняли суть:
map <C-I> :split =resolve("~/some/file")
Возможно, он использует call()? Я, очевидно, запутался в скриптах vim в целом. Спасибо за вашу помощь!
Ответ №1:
Есть два дополнительных способа сделать это, которые будут работать вне сопоставления и безопаснее, чем использование <C-r>
(POSIX допускает имена файлов с любым байтом, кроме x00
, включая управляющие коды):
nnoremap <C-i> :execute "split" fnameescape(resolve("~/some/file"))<CR>
nnoremap <C-i> :split `=resolve("~/some/file")`<CR>
Во втором случае экранирование не требуется, но имя файла не должно содержать новую строку (это не повредит, просто выдаст ошибку).
Еще кое-что, что следует учитывать:
- Используйте
nnoremap
, это позволит вам, например, обмениваться значениями;
и:
без изменения карт, а также предотвратит порчу вашей карты плагинами, если они не переопределят<Tab>
отображение (<C-i>
это то же самое, что<Tab>
). Здесь используется принудительный обычный режим, потому что в других режимах это приведет к неожиданным результатам. - Экранирующие аргументы:
fnameescape(resolve("~/some/file"))
, это предотвратит ошибки для имен файлов с пробелами. - Вы можете написать
<C-r>
, где @Austin Taylor предложил написать необработанный управляющий код. Мне не нравится, когда что-либо из них находится внутри файла, потому что это сделает различия недоступными для просмотра в терминале.
Ответ №2:
map <C-I> :split ^R=resolve("~/some/file")<cr><cr>
Если вы вводите это .vimrc
, вы вводите C-v C-r
, чтобы ввести ^R
символ.
Комментарии:
1. Спасибо! Я забыл, что ^ R — это «insert» для командного режима.