Vim: Was ist der Unterschied zwischen let und set?

144

Was ist der Unterschied zwischen letund setim vim-Editor?

Ich habe mich immer gefragt, warum beide existieren.

Ich würde mich auch für den historischen Hintergrund interessieren.

Dave Halter
quelle
15
Haben Sie versucht , :help setund :help letund das Handbuch zu lesen?
hochl
5
Ja, das habe ich getan, aber ich verstehe immer noch nicht, warum Set existieren muss, weil let die gleichen Dinge tut.
Dave Halter
1
@ DavidHalter: letmacht nicht die gleichen Dinge. Es gibt Dinge, mit denen Sie nichts erreichen setkönnen let, siehe meine Antwort.
René Nyffenegger
4
setlocalNoch hat niemand erwähnt ... sie entsprechen &l:*Variablen.
Chris Morgan
1
@ VictorZamanian: Für boolesche Einstellungen ist es wohl einfacher, einfach set noicoder set ic. Soweit ich weiß, setist auch kompatibel, viwas let, wie ich annehme , nicht ist.
René Nyffenegger

Antworten:

143

:setdient zum Einstellen von Optionen , :letzum Zuweisen eines Werts zu einer Variablen .

Es kommt vor, dass der Wert für eine Option mit dem Namen der Option verknüpft ist, der ein vorangestellt ist &(das &option-nameKonstrukt verhält sich dann sehr ähnlich zu "normalen" Variablen). Folgendes ist also äquivalent:

:set  tw=40
:let &tw=40

Zum Beispiel kann die Zuweisung von 50 zur globalen Variablen foo ( :let g:foo=50) nicht mit einem :setBefehl erreicht werden (da g: foo eine Variable und keine Option ist).

Einige Optionen sind boolesch. Wenn Sie diese einstellen, wird kein Wert benötigt (wie in :set noicund umgekehrt :set ic).

René Nyffenegger
quelle
22

Set ist eine benutzerfreundlichere Oberfläche, die auf Optionen spezialisiert ist

Z.B

:verbose set

um alle gültigen Optionen anzuzeigen.

:set tw=40

Wird als Abkürzung für arbeiten set textwidth=40

:set wrap&

Legt den Standardwert für die Option festwrap

:set nowrap

Deaktiviert die Option

:set wrap!

Wird schalten Sie die Option

Am wichtigsten,

:setTab # um die Tab-Vervollständigung zu erhalten!

Nur wenige der oben genannten können (leicht) erreicht werden let.

sehe sehen
quelle
re : :set nowrap, options.txt (: help set-option) sagt :: se [t] {option} Option umschalten: setzen, einschalten. Zahlenoption: Wert anzeigen. String-Option: Wert anzeigen. Dies stimmt nicht mit dem überein, was Sie hier haben, wenn Sie sagen, dass der Standardwert für den Optionsumbruch festgelegt wird. ??
Elliptische Ansicht
@ Ellipticalview Ich bin ein bisschen verwirrt. Sie zitieren Teile der Dokumentation. Wenn Sie das Ganze lesen, werden Sie feststellen, dass es mit allen meinen Fällen übereinstimmt. [Hinweis: Die noOptionen mit Präfix können verwirrend sein. Beachten Sie auch, dass option&ein Trailing &, das Sie möglicherweise verpasst haben.]
sehe den
12

:setfunktioniert nur mit Optionen, und die Antwort von sehe zeigt einige gute Anwendungsbeispiele.

:letAuf der anderen Seite kann fast alles, was :setkann, und noch mehr. Es kann einen Wert zuweisen

  • eine Variable, z let vi = 'vim'
  • eine Option, z let &tw = 40
  • ein Register, z let @a = $HOME . '/vimfiles'
  • eine Umgebungsvariable, z let $NOTHING = 'NOTHING'

Ein weiterer wesentlicher Unterschied besteht darin, dass die rechte Seite von :letein Ausdruck ist , was bedeutet, dass Sie Dinge wie die Verkettung von Zeichenfolgen (wie in meinem obigen Registerbeispiel gezeigt) und arithmetische Operationen (z let &tw = 40 + 60. B. ) ausführen können . Dies bedeutet auch, dass Sie den Wert in Anführungszeichen setzen müssen, wenn es sich um eine Zeichenfolge handelt. :setliest dagegen den Wert wörtlich.

Es ist einfacher, :setmit Optionen zu arbeiten, obwohl :letauch das meiste davon möglich ist. Hier einige Vergleiche anhand der Beispiele von sehe ("n / a" bedeutet, dass dies nicht möglich ist :let).

  • :verbose set vs n / a (glaube nicht, dass es eine andere Möglichkeit gibt, alle Optionen aufzulisten)
  • :set tw=40vs :let &tw = 40(ja, Sie können die gleiche Kurzschrift letauch verwenden)
  • :set wrap& vs n / a
  • :set nowrapvs :let &wrap = 0(für boolesche Optionen ist 0 falsch und 1 ist wahr)
  • :set wrap! vs. :let &wrap = !&wrap

Noch ein paar Beispiele

  • Drucken Sie den Wert einer Option: :set formatoptions?vs :echo &formatoptions( letdruckt im Gegensatz zu nicht Werte set)
  • Zuweisen zu mehreren Optionen gleichzeitig:

    :set et sw=4 sts=4 
    

    vs.

    :let [&et, &sw, &sts] = [0, 4, 4]
    
  • globale Option setzen: setglobal etvs.let &g:et = 1

  • lokale Option einstellen: setlocal etvs.let &l:et = 1

Siehe :h :setund :h :letfür weitere Details


tl; dr

:setfunktioniert nur mit Optionen, aber die Syntax ist viel einfacher. :letfunktioniert nicht nur mit Optionen, sondern auch mit Variablen, Registern und Umgebungsvariablen. Im Gegensatz dazu :setist die rechte Seite von :letein Ausdruck.

doubleDown
quelle
10

Aufbauend auf was die Leute geschrieben haben , über :let, ich habe bemerkt , dass es verwendet werden kann , einen Wert in einer Variablen zu einer Option zuweisen, etwas :settun kann , nicht. Mit dieser Funktion wird beispielsweise der Option letder Wert in der globalen Variablen zugewiesen :orig_twtextwidth

" 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
quelle
Zusammenfassung: let Ermöglicht das Zuweisen einer Variablen zu einer Option: let &textwidth = g:orig_twund umgekehrt.
Serge Stroobandt
2

Es ist sehr einfach.
Wie die Leute gesagt haben, setist für Optionen und funktioniert aufgrund der Einschränkung besser. Dies setist auch der historische Befehl, mit dem alle Versionen viihre Optionen festlegen. Die meisten (alle?) Anderen Versionen vihaben keine let.

Am wichtigsten ist jedoch möglicherweise, dass der Befehl beim Kompilieren setbei allen Versionen von weggelassen werden kann . Der Standard und die Builds tun dies.vimletvimtinysmall

Wenn es fehlt, erhalten letSie den Fehler:
E319: Sorry, the command is not available in this version

Hinweis: ifund endifwerden auch nicht implementiert, vim.tinyaber in diesem Fall geben die Befehle keinen Fehler aus, stattdessen wird alles zwischen den beiden Befehlen INKLUSIVE übersprungen else.

user3710044
quelle