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


151

В чем разница между letи setв редакторе vim?

Мне всегда было интересно, почему они оба существуют?

Кроме того, мне было бы интересно услышать его историческую подоплеку.


15
Пробовали ли вы :help setи :help letи прочитать руководство?
hochl 03

5
да, я сделал это, но я до сих пор не понимаю, почему должен существовать set, потому что let делает то же самое.
Дэйв Холтер,

1
@DavidHalter: letне делает то же самое. Есть вещи, которых нельзя достичь, но с setкоторыми можно добиться let, см. Мой ответ.
René Nyffenegger

4
setlocalЕще никто не упомянул ... они эквивалентны &l:*переменным.
Крис Морган

1
@VictorZamanian: для логических настроек, возможно, проще просто set noicили set ic. Насколько я знаю, setтоже совместим с viкоторым let, как я полагаю , нет.
Рене Ниффенеггер

Ответы:


152

:setпредназначен для настройки параметров , :letдля присвоения значения переменной .

Бывает, что значение параметра связано с именем параметра, перед которым стоит a &( &option-nameконструкция тогда ведет себя очень похоже на «обычные» переменные). Итак, следующие эквиваленты:

:set  tw=40
:let &tw=40

Но, например, присвоение 50 глобальной переменной foo ( :let g:foo=50) не может быть достигнуто с помощью :setкоманды (потому что g: foo - это переменная, а не опция).

Некоторые параметры похожи на логические. При их установке значение не требуется (как :set noicи наоборот :set ic).


22

Set - это более удобный интерфейс, специализированный для опций

Например

:verbose set

для отображения всех действующих параметров.

:set tw=40

Будет работать как сокращение для set textwidth=40

:set wrap&

Устанавливает значение по умолчанию для опцииwrap

:set nowrap

Отключит опцию

:set wrap!

Будет ли переключить опцию

Самое главное,

:setTab # чтобы получить завершение табуляции!

Мало что из вышеперечисленного можно (легко) достичь с помощью let.


re:, :set nowrapoptions.txt (: help set-option) говорит:: se [t] {option} Переключить параметр: установить, включить. Вариант числа: показать значение. Строковый вариант: показать значение. Это не согласуется с тем, что у вас здесь, когда вы говорите «установит значение по умолчанию для переноса опций». ??
Эллиптический вид

@Ellipticalview Я немного запутался. Вы цитируете часть документации. Если вы прочитаете все, то обнаружите, что оно соответствует всем моим случаям. [Примечание: параметры с no-префиксом могут сбивать с толку. Также в заметке option&есть трейлинг, &который вы могли пропустить.]
см

13

: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=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для более подробной информации


tl; dr

:setработает только с опциями, но синтаксис намного проще. :letработает не только с параметрами, но и с переменными, регистрами и переменными среды. В отличие от этого :set, правая часть :let- это выражение.


10

Расширяя то, о чем люди писали :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и наоборот.
Serge Stroobandt

2

Все очень просто.
Как говорили люди, 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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.