Vim: Яка різниця між let та set?


145

Яка різниця між редактором vim letта setв ньому?

Мені завжди було цікаво, чому вони існують?

Також мені було б цікаво почути його історичну основу.


15
Чи пробували ви :help setі :help letта прочитати керівництво?
hochl

5
так, я це зробив, але я все ще не розумію, чому набір повинен існувати, тому що нехай робить те саме.
Дейв Холтер

1
@DavidHalter: letне робить те саме. Є речі , які ви не можете досягти з set, які можливі з let, см моєї відповіді.
Рене Ніффенеггер

4
Ніхто ще не згадував setlocal... вони еквівалентні &l:*змінним.
Кріс Морган

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

Відповіді:


144

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

Буває так, що значення для опції пов'язане з назвою опції, заздалегідь заданим &( &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&є &
крок,

12

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

:letз іншого боку, можна зробити майже все, що :setможна зробити, плюс більше. Він може призначити значення

  • змінна, наприклад let vi = 'vim'
  • варіант, наприклад let &tw = 40
  • реєстр, наприклад let @a = $HOME . '/vimfiles'
  • змінна середовище, наприклад let $NOTHING = 'NOTHING'

Інша основна відмінність полягає в тому, що права сторона :let- це вираз , тобто ви можете робити такі речі, як конкатенація рядків (як це показано в моєму прикладі реєстру вище) та арифметичні операції (наприклад let &tw = 40 + 60). Це також означає, що ви повинні навести значення, якщо це рядок. :setз іншого боку, читає значення дослівно.

Простіше використовувати :setз параметрами, хоча :letце також можна зробити більшу частину, Ось декілька порівнянь із використанням прикладів sehe ("n / a" означає, що це не можна зробити :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для отримання додаткової інформації


тл; д-р

: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і навпаки.
Серж Стротобандт

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.