Vim:let和set有什么区别?
在vim编辑器中set
和set
什么区别?
我一直想知道他们为什么都存在?
另外,我有兴趣听到它的历史背景。
: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
命令可以被省略。 标准的tiny
和small
构build这样做。
如果它失踪let
你的错误:
E319: Sorry, the command is not available in this version
注意: if
和endif
没有在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 &formatoptions
(let
不打印值,不像set
) -
同时分配给多个选项:
:set et sw=4 sts=4
VS
:let [&et, &sw, &sts] = [0, 4, 4]
-
设置全局选项:
setglobal et
vslet &g:et = 1
- 设置本地选项:
setlocal et
vslet &l:et = 1
请参阅:h :set
和:h :let
更多的细节
TL;博士
:set
只适用于选项,但语法更简单。 :let
不仅可以使用选项,还可以使用variables,寄存器和环境variables。 不同于:set
, :let
的右边是一个expression式。