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

29

Nie znam zbyt wiele teorii stojącej za Vimem. Wygląda na to, że mamy setjakieś zmienne i letinne zmienne. Jaka jest różnica i kiedy jedno jest wymagane w stosunku do drugiego?

Ponadto, solaryzowany kolor kolorów vim mówi, let g:blabla...jakie jest znaczenie g:w tym przypadku?

Anthony
źródło

Odpowiedzi:

35

letprzypisuje wartość do zmiennej i setprzypisuje wartość do jednej z wewnętrznych opcji Vima.

Na przykład byś użył

:let mystring='Hello!'

aby zadeklarować nową zmienną, ale użyłbyś jej

:set tabstop=4

lub

:set expandtab

ustawić jedną z opcji Vima.

Zobacz także: :help let, :help set.

g:oznacza po prostu zmienną globalną. Istnieje kilka takich „zmiennych nazw” - z :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.
Klamka
źródło
8
Zauważ, że możesz ustawić wewnętrzne opcje vima za letpomocąlet &{option name}=value
EvergreenTree
11

:setsłuży do opcji wewnętrznych i obsługuje typy opcji. Pozwala np. Na odwracanie opcji boolowskich (np. :set invpaste) Dodawanie i usuwanie ustawień z listy (np :set dictionary-=/tmp/myfile.).

:let, z drugiej strony, pozwala na dostęp do wielu zmiennych rzeczy w vimie, w tym zmiennych regularnych, opcji, rejestrów itp., a ustawiana wartość jest wynikiem oceny wyrażenia, a nie prostej wartości jak z :set, co oznacza :letdaje dostęp do matematyki, manipulacji ciągami i funkcji.

Na przykład możesz :let &dictionary=/tmp/myfileustawić opcję 'dictionary'na /tmp/myfile(modyfikując w ten sposób tę samą opcję pokazaną powyżej w :setprzykładzie)

Możesz ustawić zmienną globalną za pomocą :let g:myvar=42. Prefiks, o który pytałeś, określa zakres. Odpowiedź Doorknob bardzo dobrze obejmuje zakres.

Możesz :let @a="Some text"zmienić zawartość rejestru a, aby zawierał Some text, który możesz później wkleić "apna przykład.

Możesz :let $PATH = $PATH . ":/home/me/bin"dołączyć własny katalog bin do PATHzmiennej środowiskowej, która jest przekazywana do wszelkich zewnętrznych poleceń wykonywanych przez Vima (działa to dla każdej zmiennej środowiskowej).

Chociaż letma pewne dość potężne możliwości (np. :let $MYFILE = @%Ustawianie zmiennej środowiskowej do nazwy pliku bieżącego bufora), nie wie, że ustawienie to ma wartość logiczną, więc nie zapewnia miłego dostępu ani sprawdzania błędów, jak to :setrobi.

Ostatecznie chodzi o użycie najlepszego narzędzia do pracy. Jeśli chcesz po prostu zmodyfikować opcję, :setto twoje narzędzie. Jeśli chcesz przenosić informacje między rejestrami, opcjami, zmiennymi lub oprzeć swoją wartość na wyniku wyrażenia, :letto Twoje narzędzie.

Chociaż wyraźnie spytałeś o Vima, należy zwrócić uwagę na to, że :setjest bardziej powszechny w rodzinach vi / Vim, gdzie :letjest mniej powszechny (na przykład nvi nie ma letpolecenia, a viemu nie zapewnia dostępu do rejestrów przez let) .

John O'M.
źródło