Как вызвать функцию vim из map и «:split»

#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>
  

Во втором случае экранирование не требуется, но имя файла не должно содержать новую строку (это не повредит, просто выдаст ошибку).

Еще кое-что, что следует учитывать:

  1. Используйте nnoremap , это позволит вам, например, обмениваться значениями ; и : без изменения карт, а также предотвратит порчу вашей карты плагинами, если они не переопределят <Tab> отображение ( <C-i> это то же самое, что <Tab> ). Здесь используется принудительный обычный режим, потому что в других режимах это приведет к неожиданным результатам.
  2. Экранирующие аргументы: fnameescape(resolve("~/some/file")) , это предотвратит ошибки для имен файлов с пробелами.
  3. Вы можете написать <C-r> , где @Austin Taylor предложил написать необработанный управляющий код. Мне не нравится, когда что-либо из них находится внутри файла, потому что это сделает различия недоступными для просмотра в терминале.

Ответ №2:

 map <C-I> :split ^R=resolve("~/some/file")<cr><cr>
  

Если вы вводите это .vimrc , вы вводите C-v C-r , чтобы ввести ^R символ.

Комментарии:

1. Спасибо! Я забыл, что ^ R — это «insert» для командного режима.