let
和set
vim编辑器之间有什么区别?
我一直想知道为什么两者都存在?
另外,我想听听它的历史背景。
let
不做相同的事情。有些事情你无法实现与set
那些可能的let
,看到我的回答。
setlocal
……它们等同于&l:*
变量。
set noic
或更加容易set ic
。据我所知,set
还兼容vi
它let
,因为我以为,是不是。
let
和set
vim编辑器之间有什么区别?
我一直想知道为什么两者都存在?
另外,我想听听它的历史背景。
let
不做相同的事情。有些事情你无法实现与set
那些可能的let
,看到我的回答。
setlocal
……它们等同于&l:*
变量。
set noic
或更加容易set ic
。据我所知,set
还兼容vi
它let
,因为我以为,是不是。
Answers:
Set是一个更加用户友好的界面,专门用于选项
例如
:verbose set
显示所有有效的选项。
:set tw=40
将用作 set textwidth=40
:set wrap&
将设置选项的默认值wrap
:set nowrap
将取消设置选项
:set wrap!
将切换选项
最重要的是,
:set
Tab #完成制表符!
使用可以(轻松)达到上述目的let
。
:set nowrap
,options.txt(:help set-option)说::se [t] {option}切换选项:设置,将其打开。数字选项:显示值。字符串选项:显示值。当您说“将为选项换行设置默认值”时,这与此处的内容不同。??
no
-prefixed选项可能会造成混淆。另请注意,可能有您遗漏option&
的尾随&
。]
: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不适用(不要以其他方式列出所有选项):set tw=40
vs :let &tw = 40
(是的,您也可以使用相同的速记let
):set wrap&
vs不适用:set nowrap
vs :let &wrap = 0
(对于布尔选项,0为false,1为true):set wrap!
与 :let &wrap = !&wrap
其他一些例子
:set formatoptions?
vs :echo &formatoptions
(let
不打印值,不像set
)同时分配给多个选项:
:set et sw=4 sts=4
与
:let [&et, &sw, &sts] = [0, 4, 4]
设置全局选项:setglobal et
vslet &g:et = 1
setlocal et
vslet &l:et = 1
请参阅:h :set
和:h :let
以获取更多详细信息
:set
仅与选项一起使用,但是语法要简单得多。:let
不仅适用于选项,还适用于变量,寄存器和环境变量。与不同:set
,的右侧:let
是一个表达式。
在扩展人们所写内容的同时: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>
let
允许将变量分配给选项:let &textwidth = g:orig_tw
反之亦然。
非常简单
正如人们所说的那样,它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
但是在这种情况下,命令不会给出错误,而是跳过了两个命令之间的所有内容,包括INCLUDING else
。
:help set
和:help let
并阅读手册?