:setfunciona apenas com opções e a resposta de sehe mostra alguns bons exemplos de uso.
:letpor outro lado, pode fazer quase tudo o que :setpode 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. :setpor outro lado, lê o valor literalmente.
É mais fácil usar as :setopções, mesmo que :lettambé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=40vs :let &tw = 40(sim, você também pode usar a mesma abreviação let)
:set wrap& vs n / a
:set nowrapvs :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( letao 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 etvslet &g:et = 1
- definir opção local:
setlocal etvslet &l:et = 1
Veja :h :sete :h :letpara mais detalhes
tl; dr
:setsó funciona com opções, mas a sintaxe é muito mais simples. :letfunciona 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 sete:help lete ler o manual?