Vim: Jaka jest różnica między let i set?

145

Jaka jest różnica między letiw setedytorze vim?

Zawsze się zastanawiałem, dlaczego oba istnieją?

Chciałbym również poznać jego tło historyczne.

Dave Halter
źródło
15
Próbowałaś :help seti :help leti czytać podręcznik?
hochl
5
Tak, zrobiłem to, ale nadal nie rozumiem, dlaczego zestaw ma istnieć, bo zróbmy to samo.
Dave Halter
1
@DavidHalter: letnie robi tego samego. Są rzeczy, których nie możesz osiągnąć, a setktóre są możliwe let, zobacz moją odpowiedź.
René Nyffenegger
4
Nikt setlocaljeszcze nie wspomniał ... są one równoważne &l:*zmiennym.
Chris Morgan,
1
@VictorZamanian: w przypadku ustawień logicznych prawdopodobnie łatwiej jest po prostu set noiclub set ic. O ile wiem, setjest również kompatybilny z viktórym let, jak zakładam , nie jest.
René Nyffenegger

Odpowiedzi:

144

:setsłuży do ustawiania opcji , :letdo przypisywania wartości do zmiennej .

Zdarza się, że wartość opcji jest powiązana z nazwą opcji poprzedzoną a &( &option-namekonstrukcja zachowuje się wtedy bardzo podobnie do „zwykłych” zmiennych). Tak więc następujące są równoważne:

:set  tw=40
:let &tw=40

Ale na przykład przypisanie 50 do zmiennej globalnej foo ( :let g:foo=50) nie może zostać osiągnięte za pomocą :setpolecenia (ponieważ g: foo jest zmienną, a nie opcją).

Niektóre opcje są typu boolowskiego. Przy ich ustawianiu nie jest wymagana żadna wartość (jak :set noici odwrotnie :set ic).

René Nyffenegger
źródło
22

Zestaw jest bardziej przyjaznym dla użytkownika interfejsem, specjalizującym się w opcjach

Na przykład

:verbose set

aby wyświetlić wszystkie obowiązujące opcje.

:set tw=40

Będzie działać jako skrót dla set textwidth=40

:set wrap&

Ustawi domyślną wartość opcjiwrap

:set nowrap

Wyłącza opcję

:set wrap!

Będzie włączyć opcję

Najważniejsze,

:setTab # aby zakończyć zakładkę!

Niewiele z powyższych można (łatwo) osiągnąć za pomocą let.

sehe
źródło
re :set nowrap:, options.txt (: help set-option) mówi:: se [t] {opcja} Przełącz opcję: ustaw, włącz. Opcja liczbowa: pokaż wartość. Opcja ciągu: pokaż wartość. Nie zgadza się to z tym, co masz tutaj, kiedy mówisz „ustawi domyślną wartość zawijania opcji”. ??
Widok eliptyczny
@Ellipticalview Jestem trochę zdezorientowany. Cytujesz fragmenty dokumentacji. Jeśli przeczytasz całość, przekonasz się, że zgadza się ze wszystkimi moimi przypadkami. [Uwaga: noopcje -prefixed mogą być mylące. Należy również pamiętać, option&kończy się przecinkiem &, że może być pominięte].
sehe
12

:setdziała tylko z opcjami, a odpowiedź przedstawia kilka dobrych przykładów użycia.

:letz drugiej strony może zrobić prawie wszystko, co :setmoże, a także więcej. Może przypisać wartość

  • zmienna, np let vi = 'vim'
  • opcja np let &tw = 40
  • rejestr, np let @a = $HOME . '/vimfiles'
  • zmienna środowiskowa, np let $NOTHING = 'NOTHING'

Inną ważną różnicą jest to, że prawa strona :letjest wyrażeniem , co oznacza, że ​​możesz robić takie rzeczy, jak konkatenacja ciągów (jak widać w moim przykładzie rejestru powyżej) i operacje arytmetyczne (np let &tw = 40 + 60.). Oznacza to również, że musisz zacytować wartość, jeśli jest to ciąg. :setz drugiej strony czyta wartość dosłownie.

Jest łatwiejszy w użyciu :setz opcjami, mimo że :letmoże to również zrobić w większości. Oto kilka porównań z użyciem przykładów („nie dotyczy” oznacza, że ​​nie da się tego zrobić :let)

  • :verbose set vs nie dotyczy (nie myśl, że istnieje inny sposób na wyświetlenie wszystkich opcji)
  • :set tw=40vs :let &tw = 40(tak, możesz też użyć tego samego skrótu let)
  • :set wrap& vs n / a
  • :set nowrapvs :let &wrap = 0(dla opcji logicznych, 0 to fałsz, a 1 to prawda)
  • :set wrap! vs :let &wrap = !&wrap

Jeszcze kilka przykładów

  • wypisuje wartość opcji: :set formatoptions?vs :echo &formatoptions( letnie wypisuje wartości, w przeciwieństwie do set)
  • przypisywanie do wielu opcji w tym samym czasie:

    :set et sw=4 sts=4 
    

    vs

    :let [&et, &sw, &sts] = [0, 4, 4]
    
  • ustaw opcję globalną: setglobal etvslet &g:et = 1

  • ustaw opcję lokalną: setlocal etvslet &l:et = 1

Zobacz :h :seti :h :letpo więcej szczegółów


tl; dr

:setdziała tylko z opcjami, ale składnia jest znacznie prostsza. :letdziała nie tylko z opcjami, ale także ze zmiennymi, rejestrami i zmiennymi środowiskowymi. W przeciwieństwie do tego :set, po prawej stronie :letjest wyrażenie.

doubleDown
źródło
10

Rozwijając to, o czym pisali ludzie :let, zauważyłem, że można go użyć do przypisania wartości zmiennej do opcji, czego :setnie można zrobić. Na przykład ta funkcja używa letdo przypisania wartości zmiennej globalnej orig_twdo textwidthopcji:

" 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
źródło
Podsumowanie: let umożliwia przypisanie zmiennej do opcji let &textwidth = g:orig_twi odwrotnie.
Serge Stroobandt
2

To jest bardzo proste.
Jak powiedzieli ludzie, setdotyczy opcji i działa lepiej z powodu ograniczeń. setJest również poleceniem historycznym, które wszystkie wersje viużywają do ustawiania swoich opcji. Większość (wszystkich?) Innych wersji vinie ma let.

Ale prawdopodobnie najważniejsze jest to, że setdziała na wszystkich wersjach vim, letpolecenie można pominąć podczas kompilacji vim. Standard tinyi smallkompilacje to robią.

Jeśli go brakuje let, wyświetla błąd:
E319: Sorry, the command is not available in this version

Uwaga: ifi endifnie są również zaimplementowane w, vim.tinyale w tym przypadku polecenia nie powodują błędu, zamiast tego wszystko między dwoma poleceniami jest pomijane, WŁĄCZAJĄC else.

user3710044
źródło