vim编辑器中let
和set
之间有什么区别?
我一直想知道为什么它们都存在?
另外,我有兴趣听听它的历史背景。
答案 0 :(得分:130)
:set
用于设置选项,:let
用于为变量分配值。
选项的值与&
前缀的选项名称相关联(&option-name
构造的行为与“普通”变量非常相似)。因此,以下内容是等效的:
:set tw=40
:let &tw=40
但是,例如,使用:let g:foo=50
命令无法实现为全局变量foo(:set
)分配50(因为g:foo是变量而不是选项)。
有些选项是布尔值的。设置这些值时,不需要任何值(如:set noic
和相反的:set ic
)。
答案 1 :(得分:20)
Set是一个更加用户友好的界面,专门用于选项
E.g。
:verbose set
显示有效的所有选项。
:set tw=40
将作为set textwidth=40
:set wrap&
将为选项wrap
:set nowrap
将取消选项
:set wrap!
将切换选项
最重要的是,
:set
标签#以获取标签页!
使用let
可以(轻松)实现以上几项。
答案 2 :(得分:8)
扩展了人们对:let
所写的内容,我注意到它可用于将变量中的值分配给选项,:set
无法做到。例如,此函数使用let
将全局变量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>
答案 3 :(得分:7)
:set
仅适用于选项,而sehe's answer则展示了一些不错的用法示例。
:let
几乎可以完成:set
可以执行的所有操作,以及更多内容。它可以为
let vi = 'vim'
let &tw = 40
let @a = $HOME . '/vimfiles'
let $NOTHING = 'NOTHING'
另一个主要区别是:let
的右侧是表达式,这意味着您可以执行字符串连接(如上面的寄存器示例中所示)和算术运算(例如let &tw = 40 + 60
)。这也意味着如果它是一个字符串,你必须引用该值。另一方面,:set
逐字读取值。
使用:set
选项更方便,即使:let
也可以执行大部分选项,以下是使用sehe's examples(&#34; n / a& #34;表示无法使用:let
)
:verbose set
vs n / a(不要认为这是列出所有选项的另一种方式):set tw=40
vs :let &tw = 40
(是的,您也可以在let
使用相同的速记):set wrap&
vs n / a :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
vs let &g:et = 1
setlocal et
vs let &l:et = 1
有关详细信息,请参阅:h :set
和:h :let
:set
仅适用于选项,但语法更简单。 :let
不仅适用于选项,还适用于变量,寄存器和环境变量。与:set
不同,:let
的右侧是表达式。
答案 4 :(得分:1)
非常简单
正如人们所说的那样,set
是有选择权的,并且由于这种限制而更好地运作。此外,set
是vi
的所有版本用于设置其选项的历史命令。大多数(所有?)其他版本的vi
都没有let
。
但可能最重要的是set
适用于vim
的所有版本,编译let
时可以省略vim
命令。标准tiny
和small
版本执行此操作。
如果遗失let
,则会出现错误:
E319: Sorry, the command is not available in this version
注意:if
和endif
未在vim.tiny
中实现,但在这种情况下,命令不会出错,而是跳过两个命令之间的所有内容,包括{{1} }}