Vim 维姆:什么';let和set的区别是什么?
vim编辑器中的Vim 维姆:什么';let和set的区别是什么?,vim,Vim,vim编辑器中的let和set之间有什么区别 我一直想知道为什么他们都存在 另外,我还想听听它的历史背景。Set是一个更加用户友好的界面,专门用于选项 例如 显示所有有效的选项 :set tw=40 将用作set textwidth=40 :set wrap& 将为选项wrap :set nowrap 将取消该选项 :set wrap! 将切换该选项 :set wrap! 最重要的是 :设置Tab#以完成制表 使用let:set用于设置选项,:let用于为变量赋值 一个选项的值
let
和set
之间有什么区别
我一直想知道为什么他们都存在
另外,我还想听听它的历史背景。Set是一个更加用户友好的界面,专门用于选项 例如 显示所有有效的选项
:set tw=40
将用作set textwidth=40
:set wrap&
将为选项wrap
:set nowrap
将取消该选项
:set wrap!
将切换该选项
:set wrap!
最重要的是
:设置
Tab#以完成制表
使用
let
:set
用于设置选项,:let
用于为变量赋值
一个选项的值恰好链接到由&
前缀的选项名称(然后&选项名称
构造的行为与“普通”变量非常相似)。因此,以下是等效的:
:set tw=40
:let &tw=40
但是,例如,无法使用:set
命令将50分配给全局变量foo(:让g:foo=50
),因为g:foo是一个变量而不是一个选项
有些选项类似于布尔值。当设置这些值时,不需要任何值(如:set noic
和相反的:set ic
)。扩展人们所写的: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>
“切换自动换行
“默认值为72,但可由其他vimrc文件中的tw设置覆盖
设g:orig_tw=72
函数切换自动换行模式()
如果&textwidth==0
“必须使用let而不是在此处设置,以使g:orig_tw
“正确评估
let&textwidth=g:orig_tw
echo“tw上的自动包裹模式=”&文本宽度
其他的
设g:orig_tw=&textwidth
设置textwidth=0
echo“自动换行模式关闭tw=”&文本宽度
恩迪夫
端功能
noremap_A:调用切换_自动换行_模式()
非常简单。
正如人们所说的,set
用于选项,由于其局限性,效果更好。另外,set
是所有版本的vi
用于设置选项的历史命令。大多数(所有?)其他版本的vi
没有let
但最重要的可能是set
适用于所有版本的vim
,编译vim
时可以省略let
命令。标准的tiny
和small
构建可以做到这一点
如果缺少让给出错误:
E319:抱歉,该命令在此版本中不可用
注意:if
和endif
在vim.tiny
中都没有实现,但是在这种情况下,命令不会给出错误,而是跳过两个命令之间的所有内容,包括else
:set
仅适用于选项,并展示了一些良好的使用示例
另一方面,:let
可以做:set
可以做的几乎所有事情,还有更多。它可以为
- 变量,例如
let vi='vim'
- 一个选项,例如
let&tw=40
- 寄存器,例如,
let@a=$HOME'/vimfiles'
- 环境变量,例如,
let$NOTHING='NOTHING'
另一个主要区别是:let
的右侧是一个表达式,这意味着您可以执行诸如字符串串联(如上面的寄存器示例所示)和算术运算(例如let&tw=40+60
)之类的操作。这也意味着如果值是字符串,则必须引用该值<代码>:另一方面,set
逐字读取值
使用:设置带有选项的:即使:let
也可以完成大部分操作,但使用以下比较(“n/a”表示无法使用:let
)
:详细设置
与不适用(不要认为有其他方法列出所有选项)
:设置tw=40
vs:let&tw=40
(是的,您也可以在let
中使用相同的速记)
:设置换行和
与不适用
:立即设置RAP
vs:let&wrap=0
(对于布尔选项,0为假,1为真)
:设置换行代码>vs:让&包装=&包装
再举几个例子
- 打印选项的值:
:设置格式选项?
vs:echo&formatoptions
(让
不打印值,不像设置
)
- 同时指定给多个选项:
:set et sw=4 sts=4
vs
- 设置全局选项:
setglobal et
vslet&g:et=1
- 设置本地选项:
setlocal et
vslet&l:et=1
有关详细信息,请参见:h:set
和:h:let
tl;博士
:set
仅适用于选项,但语法要简单得多<代码>:让
不仅处理选项,还处理变量、寄存器和环境变量。与:set
不同,:let
的右侧是一个表达式。您是否尝试过:help set
和:help let
并阅读手册?是的,我这样做了,但我仍然不明白为什么set必须存在,因为let做同样的事情。@DavidHalter:let
不做同样的事情。有些事情你用set
无法实现,但用let
可以实现,请看我的答案。还没有人提到setlocal
。。。它们是等价的
:let [&et, &sw, &sts] = [0, 4, 4]