Какая разница между let и set в редакторе vim?
Я всегда задавался вопросом, почему они оба существуют?
Кроме того, мне было бы интересно услышать его исторический фон.
Какая разница между let и set в редакторе vim?
Я всегда задавался вопросом, почему они оба существуют?
Кроме того, мне было бы интересно услышать его исторический фон.
:set предназначен для установки параметров :let для назначения значения переменной.
Бывает так, что значение для опции связано с именем опции, предшествующей & (конструкция &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.
Расширяя то, что люди писали о :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>
Это очень просто.
Как сказали люди 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, но в этом случае команды не выдают ошибку, вместо этого все между двумя командами пропускается INCLUDING else.
:set работает только с параметрами, а отдать ответ демонстрирует несколько хороших примеров использования.
:let, с другой стороны, может делать почти все, что может сделать :set, и многое другое. Он может назначить значение
let vi = 'vim'let &tw = 40let @a = $HOME . '/vimfiles'let $NOTHING = 'NOTHING'Другое существенное отличие состоит в том, что правая часть :let является выражением, означающим, что вы можете делать такие вещи, как объединение строк (как показано в моем примере с регистром выше) и арифметические операции (например, let &tw = 40 + 60). Это также означает, что вам нужно указать значение, если оно является строкой. :set с другой стороны читает значение дословно.
Легче использовать :set с параметрами, даже если :let также может выполнять большую часть этого процесса. Ниже приведено сравнение с примерами ( "n/a" означает, что это невозможно сделать с помощью :let)
:verbose set vs n/a (не думайте, что есть другой способ перечислить все параметры):set tw=40 vs :let &tw = 40 (да, вы можете использовать ту же стенографию в let):set wrap& vs n/a:set nowrap vs :let &wrap = 0 (для логических опций 0 - false, а 1 - true):set wrap! vs :let &wrap = !&wrapЕще несколько примеров
:set formatoptions? vs :echo &formatoptions (let не печатает значения, в отличие от set)одновременное назначение нескольких параметров:
:set et sw=4 sts=4
vs
:let [&et, &sw, &sts] = [0, 4, 4]
установить глобальную опцию: setglobal et vs let &g:et = 1
setlocal et vs let &l:et = 1Подробнее см. :h :set и :h :let
:set работает только с параметрами, но синтаксис намного проще. :let работает не только с параметрами, но и с переменными, регистрами и переменными среды. В отличие от :set, правая часть :let является выражением.