В чем разница между letи setв редакторе vim?
Мне всегда было интересно, почему они оба существуют?
Кроме того, мне было бы интересно услышать его историческую подоплеку.
В чем разница между letи setв редакторе vim?
Мне всегда было интересно, почему они оба существуют?
Кроме того, мне было бы интересно услышать его историческую подоплеку.
letне делает то же самое. Есть вещи, которых нельзя достичь, но с setкоторыми можно добиться let, см. Мой ответ.
setlocalЕще никто не упомянул ... они эквивалентны &l:*переменным.
set noicили set ic. Насколько я знаю, setтоже совместим с viкоторым let, как я полагаю , нет.
Ответы:
:setпредназначен для настройки параметров , :letдля присвоения значения переменной .
Бывает, что значение параметра связано с именем параметра, перед которым стоит a &( &option-nameконструкция тогда ведет себя очень похоже на «обычные» переменные). Итак, следующие эквиваленты:
:set tw=40
:let &tw=40
Но, например, присвоение 50 глобальной переменной foo ( :let g:foo=50) не может быть достигнуто с помощью :setкоманды (потому что g: foo - это переменная, а не опция).
Некоторые параметры похожи на логические. При их установке значение не требуется (как :set noicи наоборот :set ic).
Set - это более удобный интерфейс, специализированный для опций
Например
:verbose set
для отображения всех действующих параметров.
:set tw=40
Будет работать как сокращение для set textwidth=40
:set wrap&
Устанавливает значение по умолчанию для опцииwrap
:set nowrap
Отключит опцию
:set wrap!
Будет ли переключить опцию
Самое главное,
:setTab # чтобы получить завершение табуляции!
Мало что из вышеперечисленного можно (легко) достичь с помощью let.
:set nowrapoptions.txt (: help set-option) говорит:: se [t] {option} Переключить параметр: установить, включить. Вариант числа: показать значение. Строковый вариант: показать значение. Это не согласуется с тем, что у вас здесь, когда вы говорите «установит значение по умолчанию для переноса опций». ??
no-префиксом могут сбивать с толку. Также в заметке option&есть трейлинг, &который вы могли пропустить.]
:setработает только с параметрами, и в этом ответе приведены несколько хороших примеров использования.
:letс другой стороны, может делать почти все, что :setумеет, плюс многое другое. Он может присвоить значение
let vi = 'vim'let &tw = 40let @a = $HOME . '/vimfiles'let $NOTHING = 'NOTHING'Еще одно важное отличие состоит в том, что правая часть :let- это выражение , что означает, что вы можете делать такие вещи, как конкатенация строк (как показано в моем примере с регистром выше) и арифметические операции (например let &tw = 40 + 60). Это также означает, что вы должны заключить значение в кавычки, если это строка. :setс другой стороны, читает значение дословно.
С :setопциями проще использовать , хотя он :letтакже может делать большую часть из них. Вот некоторые сравнения с использованием примеров sehe («н / д» означает, что это невозможно сделать :let)
:verbose set vs n / a (не думаю, что есть другой способ перечислить все варианты):set tw=40vs :let &tw = 40(да, вы также можете использовать то же сокращение let):set wrap& против н / д:set nowrapvs :let &wrap = 0(для логических параметров 0 - ложь, а 1 - истина):set wrap! против :let &wrap = !&wrapЕще несколько примеров
:set formatoptions?vs :echo &formatoptions( letне печатает значения, в отличие от set)одновременное назначение нескольким параметрам:
:set et sw=4 sts=4
против
:let [&et, &sw, &sts] = [0, 4, 4]
установить глобальную опцию: setglobal etvslet &g:et = 1
setlocal etvslet &l:et = 1Смотрите :h :setи :h :letдля более подробной информации
:setработает только с опциями, но синтаксис намного проще. :letработает не только с параметрами, но и с переменными, регистрами и переменными среды. В отличие от этого :set, правая часть :let- это выражение.
Расширяя то, о чем люди писали :let, я заметил, что его можно использовать для присвоения значения переменной параметру, чего :setнельзя сделать. Например, эта функция используется letдля присвоения значения в глобальной переменной orig_twк textwidthопции:
" 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>
let позволяет назначать переменную опции: let &textwidth = g:orig_twи наоборот.
Все очень просто.
Как говорили люди, setэто варианты и работает лучше из-за ограничений. Также setесть историческая команда, которую все версии viиспользуют для установки своих опций. У большинства (всех?) Других версий viнет let.
Но, возможно, наиболее важным является то, что setработает во всех версиях vim, letкоманду можно опустить при компиляции vim. Стандарт tinyи smallсборки делают это.
Если он отсутствует, letвы получите ошибку:
E319: Sorry, the command is not available in this version
Примечание: ifи endifне реализованы, vim.tinyно в этом случае команды не выдают ошибку, вместо этого все между двумя командами пропускается, ВКЛЮЧАЯ else.
:help setи:help letи прочитать руководство?