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).
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.
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>
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.
:help set
e:help let
e ler o manual?let
não faz as mesmas coisas. Há coisas com as quais você não pode alcançar eset
que são possíveislet
, veja minha resposta.setlocal
ainda ... eles são equivalentes a&l:*
variáveis.set noic
ouset ic
. Tanto quanto sei,set
também é compatível com ovi
quelet
, como presumo , não é.Respostas:
:set
é para definir opções ,:let
para 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-name
construção então se comporta de maneira muito semelhante às variáveis "comuns"). Portanto, o seguinte é equivalente:Mas, por exemplo, atribuir 50 à variável global foo (
:let g:foo=50
) não pode ser alcançado com um:set
comando (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 noic
e o oposto:set ic
).fonte
Set é uma interface mais amigável, especializada para opções
Por exemplo
para exibir todas as opções em vigor.
Funcionará como uma abreviação de
set textwidth=40
Irá definir o valor padrão para a opção
wrap
Anulará a opção
Irá alternar a opção
Mais importante,
Poucos dos itens acima podem (facilmente) ser alcançados com
let
.fonte
: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'. ??no
opções pré - fixadas podem ser confusas. Observe também queoption&
há um rastro&
que você pode ter perdido.]: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 alet vi = 'vim'
let &tw = 40
let @a = $HOME . '/vimfiles'
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 exemplolet &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çãolet
):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
:set formatoptions?
vs:echo &formatoptions
(let
ao contrário, não imprime valoresset
)atribuindo a várias opções ao mesmo tempo:
vs
definir opção global:
setglobal et
vslet &g:et = 1
setlocal et
vslet &l:et = 1
Veja
:h :set
e:h :let
para mais detalhestl; 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.fonte
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:set
não pode ser feito. Por exemplo, esta função usalet
para atribuir o valor na variável globalorig_tw
àtextwidth
opção:fonte
let
permite atribuir uma variável a uma opção:let &textwidth = g:orig_tw
e vice-versa.É muito simples.
Como as pessoas disseram
set
é para opções e funciona melhor por causa da limitação. Tambémset
é o comando histórico que todas as versõesvi
usam para definir suas opções. A maioria (todas?) Das outras versõesvi
do não possuilet
.Mas possivelmente o mais importante é que,
set
em todas as versões dovim
, olet
comando pode ser omitido quando você compilavim
. O padrãotiny
e assmall
compilações fazem isso.Se estiver faltando,
let
você receberá o erro:E319: Sorry, the command is not available in this version
Nota:
if
eendif
não são implementados,vim.tiny
mas, neste caso, os comandos não emitem um erro; em vez disso, tudo entre os dois comandos é ignorado INCLUDINGelse
.fonte