Vim: Qual è la differenza tra let e set?


145

Qual è la differenza tra lete setnell'editor vim?

Mi sono sempre chiesto perché esistano entrambi?

Inoltre, sarei interessato a sentire il suo background storico.


15
Hai provato :help seted :help lete leggere il manuale?
hochl,

5
sì, l'ho fatto, ma ancora non capisco perché set debba esistere, perché facciamo le stesse cose.
Dave Halter,

1
@DavidHalter: letnon fa le stesse cose. Ci sono cose con le setquali non puoi raggiungere che sono possibili let, vedi la mia risposta.
René Nyffenegger,

4
Nessuno ha setlocalancora menzionato ... sono equivalenti alle &l:*variabili.
Chris Morgan,

1
@VictorZamanian: per impostazioni booleane, è probabilmente più facile semplicemente set noico set ic. Per quanto ne so, setè anche compatibile con il viquale let, come presumo , non lo è.
René Nyffenegger,

Risposte:


144

:setserve per impostare le opzioni , :letper assegnare un valore a una variabile .

Succede che il valore di un'opzione sia collegato al nome dell'opzione anteposta da a &(il &option-namecostrutto si comporta quindi in modo molto simile alle variabili "ordinarie"). Quindi, i seguenti sono equivalenti:

:set  tw=40
:let &tw=40

Ad esempio, l'assegnazione di 50 alla variabile globale foo ( :let g:foo=50) non può essere ottenuta con un :setcomando (perché g: foo è una variabile e non un'opzione).

Alcune opzioni sono come booleane. Quando si impostano questi, non è necessario alcun valore (come in :set noice il contrario :set ic).


22

Set è un'interfaccia più user-friendly specializzata in opzioni

Per esempio

:verbose set

per visualizzare tutte le opzioni in vigore.

:set tw=40

Funzionerà come una scorciatoia per set textwidth=40

:set wrap&

Imposta il valore predefinito per l'opzionewrap

:set nowrap

Disattiverà l'opzione

:set wrap!

Attiva o disattiva l'opzione

Più importante,

:setTab # per ottenere il completamento della scheda!

Pochi dei precedenti possono (facilmente) essere raggiunti con let.


re :set nowrap:, options.txt (: help set-option) dice:: se [t] {opzione} Attiva / disattiva opzione: imposta, accendi. Opzione numerica: mostra valore. Opzione stringa: mostra valore. Questo non è d'accordo con quello che hai qui, quando dici "imposterà il valore predefinito per l'opzione". ??
Vista ellittica il

@Ellipticalview Sono un po 'confuso. Stai citando parti della documentazione. Se leggi tutto, scoprirai che è d'accordo con tutti i miei casi. [Nota: le noopzioni -prefixed possono essere confuse. Inoltre nota option&ha un finale &che si può avere perso].
sehe

12

:setFunziona solo con le opzioni e la risposta di sehe mostra alcuni buoni esempi di utilizzo.

:letd'altra parte può fare quasi tutto ciò che :setpuò fare, oltre a più. Può assegnare un valore a

  • una variabile, ad es let vi = 'vim'
  • un'opzione, ad es let &tw = 40
  • un registro, ad es let @a = $HOME . '/vimfiles'
  • una variabile d'ambiente, ad es let $NOTHING = 'NOTHING'

Un'altra grande differenza è che il lato destro di :letè un'espressione , il che significa che puoi fare cose come la concatenazione di stringhe (come visto nel mio esempio di registro sopra) e le operazioni aritmetiche (ad es let &tw = 40 + 60.). Questo significa anche che devi citare il valore se è una stringa. :setd'altra parte legge il valore alla lettera.

È più facile da usare :setcon le opzioni anche se :letpuò fare anche la maggior parte, Ecco alcuni paragoni usando gli esempi di sehe ("n / a" non significa alcun modo di farlo :let)

  • :verbose set vs n / a (non pensare che ci sia un altro modo per elencare tutte le opzioni)
  • :set tw=40vs :let &tw = 40(sì, puoi usare anche la stessa scorciatoia in let)
  • :set wrap& vs n / a
  • :set nowrapvs :let &wrap = 0(per le opzioni booleane, 0 è falso e 1 è vero)
  • :set wrap! vs :let &wrap = !&wrap

Qualche altro esempio

  • stampa il valore di un'opzione: :set formatoptions?vs :echo &formatoptions( letnon stampa i valori, a differenza set)
  • assegnando a più opzioni contemporaneamente:

    :set et sw=4 sts=4 
    

    vs

    :let [&et, &sw, &sts] = [0, 4, 4]
    
  • imposta l'opzione globale: setglobal etvslet &g:et = 1

  • imposta l'opzione locale: setlocal etvslet &l:et = 1

Vedi :h :sete :h :letper maggiori dettagli


tl; dr

:setFunziona solo con le opzioni ma la sintassi è molto più semplice. :letfunziona non solo con opzioni ma anche con variabili, registri e variabili d'ambiente. Diversamente :set, il lato destro di :letè un'espressione.


10

Espandendo ciò di cui le persone hanno scritto :let, ho notato che può essere usato per assegnare un valore in una variabile a un'opzione, qualcosa :setnon può fare. Ad esempio, questa funzione utilizza letper assegnare il valore della variabile globale orig_twalla textwidthopzione:

" 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>

Riepilogo: let consente di assegnare una variabile a un'opzione: let &textwidth = g:orig_twe viceversa.
Serge Stroobandt,

2

È molto semplice.
Come la gente ha detto setè per le opzioni e funziona meglio a causa della limitazione. Inoltre setè il comando storico che tutte le versioni viutilizzano per impostare le loro opzioni. La maggior parte (tutte?) Le altre versioni di vinon hanno let.

Ma forse il più importante è che setfunziona su tutte le versioni di vim, il letcomando può essere omesso durante la compilazione vim. Lo standard tinye le smallbuild fanno questo.

Se manca, letti dà l'errore:
E319: Sorry, the command is not available in this version

Nota: ife endifnon sono implementati né in vim.tinyma in questo caso i comandi non danno un errore, invece tutto tra i due comandi viene ignorato COMPRESO else.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.