Vim: Qual é a diferença entre let e set?

144

Qual é a diferença entre lete setno editor vim?

Eu sempre me perguntei por que os dois existem?

Além disso, eu estaria interessado em ouvir seu histórico.

Dave Halter
fonte
15
Você tentou :help sete :help lete ler o manual?
hochl
5
sim, eu fiz isso, mas ainda não entendo por que o conjunto precisa existir, porque let faz as mesmas coisas.
Dave Halter
1
@ DavidHalter: letnão faz as mesmas coisas. Há coisas com as quais você não pode alcançar e setque são possíveis let, veja minha resposta.
René Nyffenegger 3/04
4
Ninguém mencionou setlocalainda ... eles são equivalentes a &l:*variáveis.
31812 Chris Morgan
1
@VictorZamanian: para configurações booleanas, é sem dúvida mais fácil apenas set noicou set ic. Tanto quanto sei, settambém é compatível com o vique let, como presumo , não é.
René Nyffenegger

Respostas:

143

:seté para definir opções , :letpara atribuir um valor a uma variável .

Ocorre que o valor de uma opção está vinculado ao nome da opção precedida por a &(a &option-nameconstrução então se comporta de maneira muito semelhante às variáveis ​​"comuns"). Portanto, o seguinte é equivalente:

:set  tw=40
:let &tw=40

Mas, por exemplo, atribuir 50 à variável global foo ( :let g:foo=50) não pode ser alcançado com um :setcomando (porque g: foo é uma variável e não uma opção).

Algumas opções são como booleanas. Ao defini-los, nenhum valor é necessário (como em :set noice o oposto :set ic).

René Nyffenegger
fonte
22

Set é uma interface mais amigável, especializada para opções

Por exemplo

:verbose set

para exibir todas as opções em vigor.

:set tw=40

Funcionará como uma abreviação de set textwidth=40

:set wrap&

Irá definir o valor padrão para a opçãowrap

:set nowrap

Anulará a opção

:set wrap!

Irá alternar a opção

Mais importante,

:setTab # para obter a conclusão da guia!

Poucos dos itens acima podem (facilmente) ser alcançados com let.

ver
fonte
re :set nowrap:, options.txt (: help set-option) diz:: se [t] {option} Alternar opção: definir, ativar. Opção de número: mostra o valor. Opção de sequência: show value. Isso não está de acordo com o que você tem aqui, quando diz 'definirá o valor padrão para quebra de opção'. ??
Elliptical view
@ Ellipticalview Estou um pouco confuso. Você está citando partes da documentação. Se você ler a coisa toda, verá que concorda com todos os meus casos. [Nota: as noopções pré - fixadas podem ser confusas. Observe também que option&há um rastro &que você pode ter perdido.]
veja
12

: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.

apostar
fonte
10

Expandindo sobre o que as pessoas escreveram :let, notei que ele pode ser usado para atribuir um valor em uma variável a uma opção, algo :setnão pode ser feito. Por exemplo, esta função usa letpara atribuir o valor na variável global orig_twà textwidthopção:

" 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>
Will Fiveash
fonte
Resumo: let permite atribuir uma variável a uma opção: let &textwidth = g:orig_twe vice-versa.
Serge Stroobandt
2

É muito simples.
Como as pessoas disseram seté para opções e funciona melhor por causa da limitação. Também seté o comando histórico que todas as versões viusam para definir suas opções. A maioria (todas?) Das outras versões vido não possui let.

Mas possivelmente o mais importante é que, setem todas as versões do vim, o letcomando pode ser omitido quando você compila vim. O padrão tinye as smallcompilações fazem isso.

Se estiver faltando, letvocê receberá o erro:
E319: Sorry, the command is not available in this version

Nota: ife endifnão são implementados, vim.tinymas, neste caso, os comandos não emitem um erro; em vez disso, tudo entre os dois comandos é ignorado INCLUDING else.

user3710044
fonte