Vim:let和set有什么区别?


144

letsetvim编辑器之间有什么区别?

我一直想知道为什么两者都存在?

另外,我想听听它的历史背景。


15
你尝试:help set:help let并阅读手册?
hochl 2012年

5
是的,我这样做了,但是我仍然不知道为什么必须存在set,因为let做同样的事情。
Dave Halter'4

1
@DavidHalter:let不做相同的事情。有些事情你无法实现与set那些可能的let,看到我的回答。
勒内Nyffenegger

4
还没有人提到setlocal……它们等同于&l:*变量。
克里斯·摩根

1
@VictorZamanian:对于布尔设置,可以说just set noic或更加容易set ic。据我所知,set还兼容vilet因为我以为,是不是。
勒内Nyffenegger

Answers:


143

:set用于设置选项:let变量赋值

碰巧一个选项的值被链接到一个由前缀的选项名称&&option-name然后,构造的行为与“普通”变量非常相似)。因此,以下等效:

:set  tw=40
:let &tw=40

但是,例如,:let g:foo=50使用:set命令无法为全局变量foo()分配50 (因为g:foo是变量而不是选项)。

一些选项是布尔型的。设置这些值时,不需要任何值(:set noic与相对:set ic)。


22

Set是一个更加用户友好的界面,专门用于选项

例如

:verbose set

显示所有有效的选项。

:set tw=40

将用作 set textwidth=40

:set wrap&

将设置选项的默认wrap

:set nowrap

将取消设置选项

:set wrap!

切换选项

最重要的是,

:setTab #完成制表符!

使用可以(轻松)达到上述目的let


re::set nowrap,options.txt(:help set-option)说::se [t] {option}切换选项:设置,将其打开。数字选项:显示值。字符串选项:显示值。当您说“将为选项换行设置默认值”时,这与此处的内容不同。??
椭圆视图

@Ellipticalview我有点困惑。您在引用文档的某些部分。如果您阅读全部内容,将会发现它与我所有的情况都一致。[注意:no-prefixed选项可能会造成混淆。另请注意,可能有您遗漏option&的尾随&。]
sehe

12

: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=40vs :let &tw = 40(是的,您也可以使用相同的速记let
  • :set wrap& vs不适用
  • :set nowrapvs :let &wrap = 0(对于布尔选项,0为false,1为true)
  • :set wrap!:let &wrap = !&wrap

其他一些例子

  • 打印选项的值::set formatoptions?vs :echo &formatoptionslet不打印值,不像set
  • 同时分配给多个选项:

    :set et sw=4 sts=4 
    

    :let [&et, &sw, &sts] = [0, 4, 4]
    
  • 设置全局选项:setglobal etvslet &g:et = 1

  • 设置本地选项:setlocal etvslet &l:et = 1

请参阅:h :set:h :let以获取更多详细信息


tl; dr

:set仅与选项一起使用,但是语法要简单得多。:let不仅适用于选项,还适用于变量,寄存器和环境变量。与不同:set,的右侧:let是一个表达式。


10

在扩展人们所写内容的同时:let,我注意到它可以用于将变量中的值分配给选项,而这是:set做不到的。例如,该功能使用let在全局变量赋值orig_twtextwidth选项:

" 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反之亦然。
Serge Stroobandt,2014年

2

非常简单
正如人们所说的那样,它set是一种选择,由于存在局限性,效果更好。这set也是所有版本都vi用来设置其选项的历史命令。大多数(全部?)其他的版本vi没有let

但是可能最重要的是,它set适用于的所有版本vim,在let编译时可以省略该命令vim。标准tinysmall构建可以做到这一点。

如果丢失let,则会出现错误:
E319: Sorry, the command is not available in this version

注意:ifendif都不会实现,vim.tiny但是在这种情况下,命令不会给出错误,而是跳过了两个命令之间的所有内容,包括INCLUDING else

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.