В чем разница между let и set?

29

Я не знаю много теории Vim. Похоже, что мы setнекоторые переменные и letдругие переменные. Какая разница, и когда один требуется над другим?

Кроме того, соляризованная vim colorscheme говорит о let g:blabla...том, каково значение g:в этом случае?

Энтони
источник

Ответы:

35

letприсваивает значение переменной и setприсваивает значение одному из внутренних параметров Vim.

Например, вы бы использовали

:let mystring='Hello!'

объявить новую переменную, но вы бы использовали

:set tabstop=4

или

:set expandtab

установить один из вариантов Vim.

Смотрите также: :help let, :help set.

g:просто означает глобальную переменную. Существует несколько таких «пространств имен переменных» :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.
Дверная ручка
источник
8
Обратите внимание, что вы можете установить внутренние параметры vim, используя let:let &{option name}=value
EvergreenTree
11

:setиспользуется для внутренних опций и обрабатывает типы опций. Это позволяет такие вещи, как инвертирование логических опций (например :set invpaste), добавление и удаление настроек из списка (например :set dictionary-=/tmp/myfile).

:letс другой стороны, разрешает доступ к множеству изменяемых вещей в vim, включая обычные переменные, опции, регистры и т. д., и устанавливаемое значение является результатом вычисления выражения, а не простого значения, такого как with :set, что означает :letдает вам доступ к математике, работе со строками и функциям.

Например, вы можете :let &dictionary=/tmp/myfileустановить опцию 'dictionary'на /tmp/myfile(таким образом модифицируя ту же опцию, показанную выше в :setпримере)

Вы можете установить глобальную переменную с помощью :let g:myvar=42. Префикс, о котором вы спрашивали, обеспечивает область действия. Ответ Doorknob очень хорошо охватывает область видимости.

Вы можете :let @a="Some text"изменить содержимое регистра a на содержимое Some text, которое вы позже можете вставить, "apнапример.

Вы можете :let $PATH = $PATH . ":/home/me/bin"добавить свой собственный каталог bin в PATHпеременную окружения, которая передается любым внешним командам, выполняемым Vim (это работает для любой переменной окружения).

Хотя он letобладает некоторыми довольно мощными способностями (например, :let $MYFILE = @%для установки переменной окружения в имени файла текущего буфера), он не знает, что параметр является логическим, поэтому он не предлагает приятного доступа или проверки ошибок, как это :setделает.

В конце концов, речь идет об использовании лучшего инструмента для работы. Если вы хотите просто изменить опцию, :setэто ваш инструмент. Если вы хотите перемещать информацию между регистрами, опциями, переменными или основывать свое значение на результате выражения, тогда :letэто ваш инструмент.

Хотя вы явно задали вопрос о Vim, следует обратить внимание еще на то, что :setон более распространен в семействах vi / Vim, где :letвстречается реже (например, nvi не имеет letкоманды, а viemu не предоставляет доступ к регистрам через let). ,

Джон О'М.
источник