vim:绑定leader密钥以打开.vimrc在不同的路径中



我的.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命令,因此回车符(以及冒号(是不必要的。

此外,作为一个挑剔的问题,

  1. "exec"函数不需要括号,

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

考虑到所有这些,我将把它简化为

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

最新更新