Vim:let和set有什么区别?

Dav*_*ter 137 vim

vim编辑器之间let和之间的区别是什么set

我一直想知道为什么它们都存在?

此外,我有兴趣听听它的历史背景.

Ren*_*ger 135

:set用于设置选项,:let用于为变量赋值.

碰巧,选项的值链接到a前面的选项名称&(该&option-name构造的行为与"普通"变量非常相似).所以,以下是等价的:

:set  tw=40
:let &tw=40
Run Code Online (Sandbox Code Playgroud)

但是,例如,:let g:foo=50使用:set命令无法为全局变量foo()分配50 (因为g:foo是变量而不是选项).

有些选项是布尔值的.设置这些时,不需要任何值(如同:set noic和相反:set ic).


seh*_*ehe 20

Set是一个更加用户友好的界面,专门用于选项

例如

:verbose set
Run Code Online (Sandbox Code Playgroud)

显示所有有效的选项.

:set tw=40
Run Code Online (Sandbox Code Playgroud)

将作为速记 set textwidth=40

:set wrap&
Run Code Online (Sandbox Code Playgroud)

将设置选项的默认wrap

:set nowrap
Run Code Online (Sandbox Code Playgroud)

将取消选项

:set wrap!
Run Code Online (Sandbox Code Playgroud)

切换选项

最重要的是,

:setTab #获取标签!

以上几点可以(轻松)实现let.


Wil*_*ash 9

扩展了人们所写的内容:let,我注意到它可以用来将一个变量中的值赋给一个选项,这:set是不可能做到的.例如,该功能使用let在全局变量赋值orig_twtextwidth选项:

" Toggle Autowrap
" Default of 72 but can be overridden by tw settings in other vimrc files
let g:orig_tw = 72
function Toggle_autowrap_mode()
    if &textwidth == 0
        " Must use let instead of set here in order for g:orig_tw to be
        " evaluated properly
        let &textwidth = g:orig_tw
        echo "Autowrap mode on tw=" . &textwidth
    else
        let g:orig_tw = &textwidth
        set textwidth=0
        echo "Autowrap mode off tw=" . &textwidth
    endif
endfunction

noremap _A :call Toggle_autowrap_mode()<CR>
Run Code Online (Sandbox Code Playgroud)


dou*_*own 9

:set只适用于选项,而sehe的答案展示了一些很好的用法示例.

:let另一方面,几乎可以做任何:set可以做的事情,还有更多.它可以赋值给

  • 变量,例如 let vi = 'vim'
  • 一个选项,例如 let &tw = 40
  • 寄存器,例如 let @a = $HOME . '/vimfiles'
  • 环境变量,例如 let $NOTHING = 'NOTHING'

另一个主要区别是右侧:let表达式,这意味着您可以执行字符串连接(如上面的寄存器示例中所示)和算术运算(例如let &tw = 40 + 60)之类的操作.这也意味着如果它是一个字符串,你必须引用该值.:set另一方面,逐字读取值.

使用:set选项更容易,即使也:let可以使用大多数选项,以下是使用sehe示例的一些比较("n/a"表示无法使用它:let)

  • :verbose set vs n/a(不要认为还有另一种列出所有选项的方法)
  • :set tw=40vs :let &tw = 40(是的,你也可以使用相同的速记let)
  • :set wrap& vs n/a
  • :set nowrapvs :let &wrap = 0(对于布尔选项,0为假,1为真)
  • :set wrap! VS :let &wrap = !&wrap

还有一些例子

请参阅:h :set:h :let了解更多详情


TL;博士

:set仅适用于选项,但语法更简单.:let不仅适用于选项,还适用于变量,寄存器和环境变量.不同的是:set,右手边:let是一个表达.