使用字符串连接设置 Vim 选项

7
我喜欢在我的 .vimrc 文件中进行以下操作:
if has('nvim')
  let g:base_data_folder = $HOME . '/.nvim'
else
  let g:base_data_folder = $HOME . '/.vim'
endif

set backupdir = g:base_data_folder . '/backup'

不幸的是,最后一行无法正常工作,启动 Vim / NeoVim 时会出现错误。
有什么想法可以让这个工作起来吗?


不是真的,因为这个问题可以通过在条件块内设置选项来解决。 - weilbith
我不理解你的评论。如果你标记的答案是你的解决方案,那么它是重复的。标记的答案几乎包含了另一个问题的标题。请解释一下你的评论想要表达什么意思。 - Doktor OSwaldo
我明白,这正是问题“将vim设置用作变量”的第一部分。当然,在技术意义上虽然是同一个问题,但问题本身却是相当不同和合法的。这就是为什么SO不删除重复内容而是链接它们的原因(也是为什么该问题是完全有效的,并且不应该因为是重复的而收到负分)。是的,当然了,被标记的线程有一个奇怪的关于简单条件的副标题,但那不是问题的本质。否则,这将成为一个关于if的工作原理的问题……不管怎样,谢谢你的解释。 - Doktor OSwaldo
好的。对此我感到抱歉。很高兴我们澄清了这个问题。 - weilbith
显示剩余2条评论
1个回答

14

设置使用特殊语法。您设置的值实际上不是表达式。这使它们受益于不需要引号或转义,但在与编程表达式一起使用时,它们的灵活性较低。

避免这种情况的一种常见方法是对其他类型的Vim语法使用execute命令(:help :execute ):

exe 'set backupdir = ' . g:base_data_folder . '/backup'

话虽如此,对于设置,有一个专门的语法(:help :let-&),我建议使用它:

let &backupdir = g:base_data_folder . '/backup'

基本上,这允许将设置视为某种“变量”。我建议你阅读关于“let”的所有文档,以更好地了解它的工作原理,以及其他特殊情况。


使用let而不是set选项是否存在已知的副作用? - weilbith
不完全是这样。它们具有完全相同的效果。只是当你有静态值时,使用 set 更容易/更易读(简单语法,可以使用 setlocalset <option>! 等),而 let 语法允许你使用动态值。 - Andrew Radev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接