Ответы:
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.
: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). ,
let:let &{option name}=value