Vim 维姆:什么';let和set的区别是什么?

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用于为变量赋值 一个选项的值

vim编辑器中的
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
    vs
    let&g:et=1

  • 设置本地选项:
    setlocal et
    vs
    let&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]