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



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



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



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

574   5  
vim

5 ответов:

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

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

:set  tw=40
:let &tw=40

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

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

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

например.

:verbose set

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

:set tw=40

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

:set wrap&

будет установить по умолчанию значение параметра wrap

:set nowrap

отключит параметр

:set wrap!

будет toggle параметр

самое главное

:setTab #, чтобы получить автодополнение!

немногие из вышеперечисленного могут (легко) быть достигнуты с let.

расширение на то, что люди писали о :let, Я заметил, что его можно использовать для присвоения значения переменной параметру, что-то :set не могу. Например, эта функция использует let присвоить значение глобальной переменной orig_tw до :

" 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 работает только с опционами, и посмотреть тут демонстрирует некоторые хорошие примеры использования.

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

  • переменной, например,let vi = 'vim'
  • опции, например,let &tw = 40
  • регистр, например,let @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 дополнительные подробности


tl; dr

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

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

Comments

    Ничего не найдено.