我的.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
最终是通过在回显消息中进行子化来调用的,但我并没有理解为什么我试图定义的变量没有正确扩展。
- 字符串串联是用
.
完成的,而不是用+
完成的,后者执行对数字和加法的强制。但是:execute
需要多个参数(用空格分隔(,所以这里实际上不需要这个参数 - 您应该使用
:noremap
;它使映射不受重映射和递归的影响 - 此外,我怀疑您是否需要视觉和操作员挂起模式(
:help map-modes
(,所以只为正常模式定义它 :exec[ute
是一个Ex命令,因此对于正常模式映射,您需要首先进入命令行模式。所以:exec 'edit'
而不是exec ':edit'
- 此外,这不是一个函数(尽管Vim8现在也有
execute()
(,所以括号是多余的 <silent>
避免了打印整个命令(无论如何,您都会注意到vimrc文件的加载(;它是可选的- CCD_ 17确保病理路径名称也被处理;这里可能没有必要
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>'
vimscript中的字符串与.
连接,而不是与+
连接。例如:
:echo "Hello"." world!"
将回声
你好,世界!
如果您要键入
:echo "Hello" + " world!"
vim将回声
0
这是因为+
运算符对于数字仅为,因此vim尝试将这些字符串强制转换为数字。如果你要运行
:echo "3" + "1"
vim会回显"4"。
所以基本上,你只需要改变
:map <Leader>v exec(":e " + g:vimrc_path + "<CR>")
至
:map <Leader>v exec(":e ".g:vimrc_path."<CR>")
您可能没有看到的另一个问题是,"<CR>"
的计算结果为文本"<CR>"
,因此它只会打乱您的函数。如果你想要一个文字回车,你需要一个反斜杠然而,你绝对不想这么做!说真的,试试看。
你可以看到这个问题。它会查找一个在文件名末尾有文字回车的文件!不过,有一个非常简单的解决方案。完全卸下"<cr>"
。由于默认情况下:exec
运行ex命令,因此回车符(以及冒号(是不必要的。
此外,作为一个挑剔的问题,
"exec"函数不需要括号,
请改用
nnoremap
以避免递归映射。
考虑到所有这些,我将把它简化为
:nnoremap <Leader>v :exec "e ".g:vimrc_path<cr>