我的.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;我试图定义没有正确扩展。
答案 0 :(得分:1)
.
完成,而不是+
,后者执行强制转换为数字和加法。但是:execute
需要多个参数(它是空格分隔的),所以你实际上并不需要这个。:noremap
;它使映射不受重映射和递归的影响。:help map-modes
),所以只为正常模式定义它。:exec[ute
是一个Ex命令,因此对于正常模式映射,您需要 first 进入命令行模式。所以:exec 'edit'
代替exec ':edit'
。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命令,因此不需要回车(以及冒号)。
另外,作为挑剔,
&#34; exec&#34;不需要括号。功能,和
请改用nnoremap
以避免递归映射。
考虑到所有这些因素,我会将其简化为
:nnoremap <Leader>v :exec "e ".g:vimrc_path<cr>