Vim:let和set有什么区别?

时间:2012-04-03 09:07:21

标签: vim

vim编辑器中letset之间有什么区别?

我一直想知道为什么它们都存在?

另外,我有兴趣听听它的历史背景。

5 个答案:

答案 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 &formatoptionslet不打印值,与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

TL;博士

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

答案 4 :(得分:1)

非常简单 正如人们所说的那样,set是有选择权的,并且由于这种限制而更好地运作。此外,setvi的所有版本用于设置其选项的历史命令。大多数(所有?)其他版本的vi都没有let

但可能最重要的是set适用于vim的所有版本,编译let时可以省略vim命令。标准tinysmall版本执行此操作。

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

注意:ifendif未在vim.tiny中实现,但在这种情况下,命令不会出错,而是跳过两个命令之间的所有内容,包括{{1} }}