В чем разница между 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!
Будет ли переключить опцию
Самое главное,
:set
Tab # чтобы получить завершение табуляции!
Мало что из вышеперечисленного можно (легко) достичь с помощью let
.
:set nowrap
options.txt (: help set-option) говорит:: se [t] {option} Переключить параметр: установить, включить. Вариант числа: показать значение. Строковый вариант: показать значение. Это не согласуется с тем, что у вас здесь, когда вы говорите «установит значение по умолчанию для переноса опций». ??
no
-префиксом могут сбивать с толку. Также в заметке option&
есть трейлинг, &
который вы могли пропустить.]
:set
работает только с параметрами, и в этом ответе приведены несколько хороших примеров использования.
:let
с другой стороны, может делать почти все, что :set
умеет, плюс многое другое. Он может присвоить значение
let vi = 'vim'
let &tw = 40
let @a = $HOME . '/vimfiles'
let $NOTHING = 'NOTHING'
Еще одно важное отличие состоит в том, что правая часть :let
- это выражение , что означает, что вы можете делать такие вещи, как конкатенация строк (как показано в моем примере с регистром выше) и арифметические операции (например let &tw = 40 + 60
). Это также означает, что вы должны заключить значение в кавычки, если это строка. :set
с другой стороны, читает значение дословно.
С :set
опциями проще использовать , хотя он :let
также может делать большую часть из них. Вот некоторые сравнения с использованием примеров sehe («н / д» означает, что это невозможно сделать :let
)
:verbose set
vs n / a (не думаю, что есть другой способ перечислить все варианты):set tw=40
vs :let &tw = 40
(да, вы также можете использовать то же сокращение let
):set wrap&
против н / д:set nowrap
vs :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 et
vslet &g:et = 1
setlocal et
vslet &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
и прочитать руководство?