Vim: Какая разница между let и set? - PullRequest
131 голосов
/ 03 апреля 2012

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

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

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

Ответы [ 5 ]

131 голосов
/ 03 апреля 2012

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

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

:set  tw=40
:let &tw=40

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

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

20 голосов
/ 03 апреля 2012

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

Например,

:verbose set

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

:set tw=40

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

:set wrap&

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

:set nowrap

Отключает параметр

:set wrap!

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

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

:set Tab # для получения завершения табуляции!

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

8 голосов
/ 04 марта 2013

Расширяя то, что люди написали о :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>
7 голосов
/ 05 сентября 2017

:set работает только с опциями, а ответ sehe демонстрирует несколько хороших примеров использования.

:let, с другой стороны, может делать почти все, что может :set, плюс больше Может присвоить значение

  • переменная, например let vi = 'vim'
  • вариант, например, let &tw = 40
  • регистр, например let @a = $HOME . '/vimfiles'
  • переменная окружения, например, let $NOTHING = 'NOTHING'

Другое существенное отличие состоит в том, что правая часть :let является выражением , что означает, что вы можете выполнять такие вещи, как конкатенация строк (как показано в моем примере регистра выше) и арифметические операции (например, * 1027). *). Это также означает, что вы должны заключить в кавычки значение, если оно является строкой. :set, с другой стороны, дословно читает значение.

Проще использовать :set с опциями, хотя :let также может делать большую часть этого. Вот некоторые сравнения с использованием примеров sehe («н / п» означает, что это невозможно сделать с помощью :let)

  • :verbose set против н / д (не думайте, что есть другой способ перечислить все варианты)
  • :set tw=40 против :let &tw = 40 (да, вы можете использовать те же сокращения в let тоже)
  • :set wrap& против н / д
  • :set nowrap против :let &wrap = 0 (для логических опций 0 равно false, а 1 - true)
  • :set wrap! против :let &wrap = !&wrap

Еще несколько примеров

  • вывести значение опции: :set formatoptions? против :echo &formatoptions (let не печатает значения, в отличие от set)
  • назначение нескольким параметрам одновременно:

    :set et sw=4 sts=4 
    

    против

    :let [&et, &sw, &sts] = [0, 4, 4]
    
  • установить глобальную опцию: setglobal et против let &g:et = 1

  • установить локальную опцию: setlocal et против let &l:et = 1

Подробнее см. :h :set и :h :let


ТЛ; др

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

1 голос
/ 26 июня 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...