vim:绑定引导键以在不同的路径中打开.vimrc

时间:2016-11-02 22:17:16

标签: vim

我的.vimrc位于不同的路径中,我从主~/.vimrc获取(因此我可以在Windows上共享相同的设置,在Windows上使用bash等)。

我试图在问题的.vimrc中写一些内容,这会成为编辑所述.vimrc的热键,而无需对路径进行硬编码。

我现在拥有的是:

let g:vimrc_path = expand('<sfile>')
:map <Leader>v exec(":e " + g:vimrc_path + "<CR>")

但这似乎没有做任何事情。我已经确认g:vimrc_path是正确的值,并且<Leader>v最终会通过回显消息来调用,但我并没有把我的头围绕在为什么变量I& #39;我试图定义没有正确扩展。

2 个答案:

答案 0 :(得分:1)

  • 字符串连接由.完成,而不是+,后者执行强制转换为数字和加法。但是:execute需要多个参数(它是空格分隔的),所以你实际上并不需要这个。
  • You should use :noremap;它使映射不受重映射和递归的影响。
  • 另外,我怀疑你需要视觉和操作员待定模式(:help map-modes),所以只为正常模式定义它。
  • :exec[ute是一个Ex命令,因此对于正常模式映射,您需要 first 进入命令行模式。所以:exec 'edit'代替exec ':edit'
  • 此外,这不是一个功能(虽然Vim 8现在也有execute()),所以括号是多余的。
  • <silent>避免打印整个命令(无论如何,你都会注意到vimrc文件的加载);它是可选的。
  • fnameescape()确保也处理病理路径名称;可能没有必要在这里。
let g:vimrc_path = expand('<sfile>')
nnoremap <silent> <Leader>v :execute 'edit' fnameescape(g:vimrc_path)<CR>

替代

由于脚本路径是静态的,您可以将变量插值从运行时(映射执行)移动到映射定义,并删除变量:

execute 'nnoremap <Leader>v :edit' fnameescape(expand('<sfile>')) . '<CR>'

答案 1 :(得分:0)

vimscript中的字符串与.而不是+连接在一起。例如:

:echo "Hello"." world!"

将回显

  

Hello world!

如果您要输入

:echo "Hello" + " world!"

vim会回应

  

0

这是因为+运算符表示数字,因此vim会尝试将这些字符串转换为数字。如果你要跑

:echo "3" + "1"

vim会回应&#34; 4&#34;。

基本上,你只需要改变

:map <Leader>v exec(":e " + g:vimrc_path + "<CR>")

:map <Leader>v exec(":e ".g:vimrc_path."<CR>")

您可能没有看到的另一个问题是"<CR>"评估文字文本"<CR>",因此它只会弄乱您的功能。如果你想要一个文字回车,你需要一个反斜杠。 然而,你绝对不想这样做!说真的,试一试看看。

您可以看到问题。它查找文件名末尾有文字回车的文件!虽然有一个非常简单的解决方案。完全删除"\<cr>"。由于:exec默认运行ex命令,因此不需要回车(以及冒号)。

另外,作为挑剔,

  1. &#34; exec&#34;不需要括号。功能,和

  2. 请改用nnoremap以避免递归映射。

  3. 考虑到所有这些因素,我会将其简化为

    :nnoremap <Leader>v :exec "e ".g:vimrc_path<cr>