Was ist der Unterschied zwischen let und set?

29

Ich weiß nicht viel über die Theorie hinter Vim. Es sieht so aus, als ob wir seteinige Variablen und letandere Variablen. Was ist der Unterschied und wann wird eins über dem anderen benötigt?

Auch sagt das solarisierte Vim-Farbschema, let g:blabla...was die Bedeutung g:in diesem Fall ist?

Anthony
quelle

Antworten:

35

letWeist einer Variablen einen Wert zu und setweist einer der internen Optionen von Vim einen Wert zu.

Zum Beispiel würden Sie verwenden

:let mystring='Hello!'

um eine neue Variable zu deklarieren, würden Sie aber verwenden

:set tabstop=4

oder

:set expandtab

um eine der Optionen von Vim einzustellen.

Siehe auch: :help let, :help set.

g:bezeichnet einfach eine globale Variable. Es gibt mehrere dieser "variablen Namespaces" :help internal-variables:

        (nothing) In a function: local to a function; otherwise: global
|buffer-variable|    b:   Local to the current buffer.
|window-variable|    w:   Local to the current window.
|tabpage-variable|   t:   Local to the current tab page.
|global-variable|    g:   Global.
|local-variable|     l:   Local to a function.
|script-variable|    s:   Local to a |:source|'ed Vim script.
|function-argument|  a:   Function argument (only inside a function).
|vim-variable|       v:   Global, predefined by Vim.
Türknauf
quelle
8
Beachten Sie, dass Sie die internen Optionen letvon vim mitlet &{option name}=value
EvergreenTree
11

:setwird für interne Optionen verwendet und behandelt die Arten der Option. Es erlaubt Dinge wie die Umkehrung von booleschen Optionen (zB :set invpaste), Einstellungen zu einer Liste hinzuzufügen oder daraus zu entfernen (zB :set dictionary-=/tmp/myfile).

:letErmöglicht andererseits den Zugriff auf eine Vielzahl von veränderbaren Dingen in vim, einschließlich regulärer Variablen, Optionen, Register usw., und der festgelegte Wert ist das Ergebnis der Auswertung eines Ausdrucks anstelle eines einfachen Werts wie mit :set, was bedeutet :letErmöglicht den Zugriff auf Mathematik, Zeichenfolgenmanipulation und Funktionen.

Beispielsweise können Sie :let &dictionary=/tmp/myfiledie Option 'dictionary'auf setzen /tmp/myfile(und damit die oben im :setBeispiel gezeigte Option ändern ).

Mit können Sie eine globale Variable setzen :let g:myvar=42. Das Präfix, nach dem Sie gefragt haben, gibt den Umfang an. Die Antwort von Doorknob deckt das Scoping sehr gut ab.

Sie können :let @a="Some text"den Inhalt des Registers a ändern, um ihn zu enthalten Some text, mit dem Sie ihn beispielsweise später einfügen können "ap.

Sie können ein :let $PATH = $PATH . ":/home/me/bin"eigenes bin-Verzeichnis an die PATHUmgebungsvariable anhängen , das an alle von Vim ausgeführten externen Befehle übergeben wird (dies funktioniert für jede Umgebungsvariable).

Obwohl letes einige ziemlich mächtige Fähigkeiten hat (wie :let $MYFILE = @%das Setzen einer Umgebungsvariablen auf den Dateinamen des aktuellen Puffers), weiß es nicht, dass eine Einstellung ein Boolescher Wert ist, so dass es keine netten Zugriffe oder Fehlerprüfungen :setbietet , wie dies der Fall ist.

Am Ende geht es darum, das beste Werkzeug für den Job zu verwenden. Wenn Sie einfach eine Option ändern möchten, :setist dies Ihr Werkzeug. Wenn Sie Informationen zwischen Registern, Optionen, Variablen verschieben oder Ihren Wert auf dem Ergebnis eines Ausdrucks aufbauen möchten, :letist dies Ihr Werkzeug.

Obwohl Sie explizit nach Vim gefragt haben, ist eine andere Sache zu beachten, die :setin den vi / Vim-Familien, in denen :letes weniger häufig vorkommt, häufiger vorkommt (z. B. hat letnvi keinen Befehl und viemu bietet keinen Zugriff auf Register über let). .

John O'M.
quelle