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).
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)
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.
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>
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.
:help set
und:help let
und das Handbuch zu lesen?let
macht nicht die gleichen Dinge. Es gibt Dinge, mit denen Sie nichts erreichenset
könnenlet
, siehe meine Antwort.setlocal
Noch hat niemand erwähnt ... sie entsprechen&l:*
Variablen.set noic
oderset ic
. Soweit ich weiß,set
ist auch kompatibel,vi
waslet
, wie ich annehme , nicht ist.Antworten:
:set
dient zum Einstellen von Optionen ,:let
zum 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-name
Konstrukt verhält sich dann sehr ähnlich zu "normalen" Variablen). Folgendes ist also äquivalent:Zum Beispiel kann die Zuweisung von 50 zur globalen Variablen foo (
:let g:foo=50
) nicht mit einem:set
Befehl 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 noic
und umgekehrt:set ic
).quelle
Set ist eine benutzerfreundlichere Oberfläche, die auf Optionen spezialisiert ist
Z.B
um alle gültigen Optionen anzuzeigen.
Wird als Abkürzung für arbeiten
set textwidth=40
Legt den Standardwert für die Option fest
wrap
Deaktiviert die Option
Wird schalten Sie die Option
Am wichtigsten,
Nur wenige der oben genannten können (leicht) erreicht werden
let
.quelle
: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. ??no
Optionen mit Präfix können verwirrend sein. Beachten Sie auch, dassoption&
ein Trailing&
, das Sie möglicherweise verpasst haben.]:set
funktioniert nur mit Optionen, und die Antwort von sehe zeigt einige gute Anwendungsbeispiele.:let
Auf der anderen Seite kann fast alles, was:set
kann, und noch mehr. Es kann einen Wert zuweisenlet vi = 'vim'
let &tw = 40
let @a = $HOME . '/vimfiles'
let $NOTHING = 'NOTHING'
Ein weiterer wesentlicher Unterschied besteht darin, dass die rechte Seite von
:let
ein Ausdruck ist , was bedeutet, dass Sie Dinge wie die Verkettung von Zeichenfolgen (wie in meinem obigen Registerbeispiel gezeigt) und arithmetische Operationen (zlet &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.:set
liest dagegen den Wert wörtlich.Es ist einfacher,
:set
mit Optionen zu arbeiten, obwohl:let
auch 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=40
vs:let &tw = 40
(ja, Sie können die gleiche Kurzschriftlet
auch verwenden):set wrap&
vs n / a:set nowrap
vs:let &wrap = 0
(für boolesche Optionen ist 0 falsch und 1 ist wahr):set wrap!
vs.:let &wrap = !&wrap
Noch ein paar Beispiele
:set formatoptions?
vs:echo &formatoptions
(let
druckt im Gegensatz zu nicht Werteset
)Zuweisen zu mehreren Optionen gleichzeitig:
vs.
globale Option setzen:
setglobal et
vs.let &g:et = 1
setlocal et
vs.let &l:et = 1
Siehe
:h :set
und:h :let
für weitere Detailstl; dr
:set
funktioniert nur mit Optionen, aber die Syntax ist viel einfacher.:let
funktioniert nicht nur mit Optionen, sondern auch mit Variablen, Registern und Umgebungsvariablen. Im Gegensatz dazu:set
ist die rechte Seite von:let
ein Ausdruck.quelle
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:set
tun kann , nicht. Mit dieser Funktion wird beispielsweise der Optionlet
der Wert in der globalen Variablen zugewiesen :orig_tw
textwidth
quelle
let
Ermöglicht das Zuweisen einer Variablen zu einer Option:let &textwidth = g:orig_tw
und umgekehrt.Es ist sehr einfach.
Wie die Leute gesagt haben,
set
ist für Optionen und funktioniert aufgrund der Einschränkung besser. Diesset
ist auch der historische Befehl, mit dem alle Versionenvi
ihre Optionen festlegen. Die meisten (alle?) Anderen Versionenvi
haben keinelet
.Am wichtigsten ist jedoch möglicherweise, dass der Befehl beim Kompilieren
set
bei allen Versionen von weggelassen werden kann . Der Standard und die Builds tun dies.vim
let
vim
tiny
small
Wenn es fehlt, erhalten
let
Sie den Fehler:E319: Sorry, the command is not available in this version
Hinweis:
if
undendif
werden auch nicht implementiert,vim.tiny
aber in diesem Fall geben die Befehle keinen Fehler aus, stattdessen wird alles zwischen den beiden Befehlen INKLUSIVE übersprungenelse
.quelle