:set
funciona apenas com opções e a resposta de sehe mostra alguns bons exemplos de uso.
:let
por outro lado, pode fazer quase tudo o que :set
pode fazer, além de mais. Pode atribuir um valor a
- uma variável, por exemplo
let vi = 'vim'
- uma opção, por exemplo
let &tw = 40
- um registro, por exemplo
let @a = $HOME . '/vimfiles'
- uma variável de ambiente, por exemplo
let $NOTHING = 'NOTHING'
Outra grande diferença é que o lado direito de :let
é uma expressão , o que significa que você pode fazer coisas como concatenação de strings (como visto no meu exemplo de registro acima) e operações aritméticas (por exemplo let &tw = 40 + 60
). Isso também significa que você deve citar o valor se for uma string. :set
por outro lado, lê o valor literalmente.
É mais fácil usar as :set
opções, mesmo que :let
também seja possível. Aqui estão algumas comparações usando os exemplos de sehe ("n / a" significa que não há como fazê-lo :let
)
:verbose set
vs n / a (não pense que há outra maneira de listar todas as opções)
:set tw=40
vs :let &tw = 40
(sim, você também pode usar a mesma abreviação let
)
:set wrap&
vs n / a
:set nowrap
vs :let &wrap = 0
(para opções booleanas, 0 é falso e 1 é verdadeiro)
:set wrap!
vs :let &wrap = !&wrap
Mais alguns exemplos
- imprime o valor de uma opção:
:set formatoptions?
vs :echo &formatoptions
( let
ao contrário, não imprime valores set
)
atribuindo a várias opções ao mesmo tempo:
:set et sw=4 sts=4
vs
:let [&et, &sw, &sts] = [0, 4, 4]
definir opção global: setglobal et
vslet &g:et = 1
- definir opção local:
setlocal et
vslet &l:et = 1
Veja :h :set
e :h :let
para mais detalhes
tl; dr
:set
só funciona com opções, mas a sintaxe é muito mais simples. :let
funciona não apenas com opções, mas também com variáveis, registradores e variáveis de ambiente. Ao contrário :set
, o lado direito de :let
é uma expressão.
:help set
e:help let
e ler o manual?