Vim:let和set有什么区别?

在vim编辑器中setset什么区别?

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

另外,我有兴趣听到它的历史背景。

:set用于设置选项:let用于赋值给一个variables

它发生的一个选项的价值链接到一个&&option-name构造然后performance非常类似于“普通”variables)的前面的&option-name 。 所以,以下是等价的:

 :set tw=40 :let &tw=40 

但是,例如,用全局variablesfoo( :let g:foo=50 )赋值50不能用:set命令实现(因为g:foo是一个variables而不是一个选项)。

有些选项是布尔类似的。 设置这些时,不需要任何值(例如:set noic:set ic )。

Set是专门用于选项的用户友好界面

例如

 :verbose set 

显示所有有效的选项。

 :set tw=40 

将作为set textwidth=40的简写

 :set wrap& 

将设置选项wrap默认

 :set nowrap 

将取消选项

 :set wrap! 

切换选项

最重要的是,

:set 制表符号来获取制表符完成!

以上几点可以(容易)用let来实现。

扩展了人们写的东西:let ,我注意到它可以用来把一个variables的值赋给一个选项,这个东西:set不能。 例如,这个函数使用let将全局variablesorig_tw中的值orig_tw textwidth选项:

 " 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> 

这很简单。
正如人们所说的那样是因为select,而且因为限制而更好地工作。 还set了所有版本的vi用来设置其选项的历史命令。 大多数(所有?)其他版本的vi都没有。

但是可能最重要的是这个set适用于所有版本的vim ,当你编译vim时, let命令可以被省略。 标准的tinysmall构build这样做。

如果它失踪let你的错误:
E319: Sorry, the command is not available in this version

注意: ifendif没有在vim.tiny实现,但是在这种情况下,这些命令不会给出错误,而是两个命令之间的所有内容都会被忽略INCLUDING else

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

:let另一方面可以做到几乎所有的事情:set可以做的,再加上更多。 它可以分配一个值

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

另一个主要区别是:let是一个expression式 ,这意味着你可以做string连接(如上面的注册示例)和算术运算(例如let &tw = 40 + 60 )。 这也意味着如果它是一个string,你必须引用该值。 :set另一方面:set逐字读取值。

使用起来更简单:set尽pipe:set了选项,但也可以做大部分的工作,下面是使用sehe示例的一些比较(“n / a”表示无法使用:let

  • :verbose set与不适用(不要以为有另一种方式列出所有选项)
  • :set tw=40 vs :let &tw = 40 (是的,你也可以用同样的速记)
  • :set wrap& vs不适用
  • :set nowrap vs :let &wrap = 0 (对于布尔选项,0是假,1是真)
  • :set wrap! vs :let &wrap = !&wrap

再举几个例子

  • 打印一个选项的值:set formatoptions? vs :echo &formatoptionslet不打印值,不像set
  • 同时分配给多个选项:

     :set et sw=4 sts=4 

    VS

     :let [&et, &sw, &sts] = [0, 4, 4] 
  • 设置全局选项: setglobal et vs let &g:et = 1

  • 设置本地选项: setlocal et vs let &l:et = 1

请参阅:h :set:h :let更多的细节


TL;博士

:set只适用于选项,但语法更简单。 :let不仅可以使用选项,还可以使用variables,寄存器和环境variables。 不同于:set:let的右边是一个expression式。