Вкладка Vs Профілі в Vim


87

Вім дуже поступливий, коли справа доходить до вкладки Vs. просторові уподобання. Як я розумію, tabstopпараметр вказує ширину символу табуляції. У shiftwidthпараметр визначає , скільки стовпців для збільшення / зменшення при використанні <<і >>команди, в той час як softtabstopнастройка впливає на кількість прогалин , які будуть вставлені при натисканні Tabклавіші в режимі вставки. Якщо expandtabувімкнено, клавіша табуляції вставляє softtabstopкількість пробілів. Тоді як при expandtabвимкненому, натискання Tabклавіші вставляє найменшу можливу кількість символів табуляції та пробілу, що відповідає softtabstop. (Будь ласка, виправте мене, якщо я помиляюся.)

Цей останній момент змушує мене задуматися: чи є практичний випадок, коли ви не хотіли б shiftwidth == tabstop && tabstop == softtabstop? Я не можу придумати жодного. Що стосується мене, то було б найзручніше, якби я міг встановити для всіх 3-х однакове значення в одному присвоєнні. наприклад дзвінок:

:set stab=4

що було б еквівалентно запуску:

:set tabstop=4 softtabstop=4 shiftwidth=4 

Хтось може підказати, як це можна зробити?


ОНОВЛЕННЯ

Дякую за відповіді поки що не надто багато php , hobbs та kaiser.se . Замість того, щоб відповідати кожному окремо, я оновлюю питання тут.

Softtabstop з вимкненою функцією розширення

Вище я сказав, що при вимкненому розширенні tab, натискання клавіші Tab вставляє найменшу можливу кількість символів табуляції та пробілу, що відповідає softtabstop. Я стою за цим, але думаю, що мені потрібно пояснити, що я мав на увазі. Я спробую зробити це на кількох прикладах. Щоб продовжити, запустіть :set listтак, щоб ви могли бачити символи табуляції.

tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab

У режимі вставки натисканням клавіші табуляції вставляються 2 пробіли. Натисніть клавішу табуляції вдруге, і замість того, щоб вставити ще два пробіли (загалом 4 пробіли), він замінює попередні 2 пробіли одним символом табуляції. Tabstop встановлено на 4, тому один символ табуляції має однакову ширину, як 4 пробіли.

tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab

У режимі вставки натисканням клавіші табуляції вставляється 1 символ табуляції та 2 пробіли. Символ табуляції має ширину 4, отже загальна ширина дорівнює 6, і це досягається за допомогою 3 символів. Друге натискання клавіші табуляції вставляє два символи табуляції та видаляє два пробіли, які були вставлені раніше. Загальна ширина - 12, і це досягається за допомогою 3 символів.

В обох цих прикладах Vim вставляє мінімально можливу кількість символів табуляції та пробілу, яка відповідає softtabstop.

Якщо я працюю з розширеною вкладкою вимкнено, я не бачу, що хочу додаткового детального контролю, якого можна досягти, встановивши для softtabstop значення, відмінне від tabstop. Це все одно буде корисно для мене , щоб бути в змозі встановити tabstop, softtabstopі shiftwidthдо того ж значенням за допомогою однієї команди.

Чи розширювальна вкладка робить softtabstop зайвим?

tabstop=4 softtabstop=0 shiftwidth=4 expandtab

У режимі вставки натисканням клавіші табуляції вставляється 4 пробіли. Натискання клавіші видалення призводить до видалення єдиного пробілу - тому вам доведеться повернутись 4 рази назад, якщо ви випадково натиснете клавішу табуляції.

tabstop=4 softtabstop=4 shiftwidth=4 expandtab

У режимі вставки натисканням клавіші табуляції вставляється 4 пробіли. Натисканням клавіші зворотного простору видаляються 4 пробіли.

Якщо я працюю з expandtabувімкненим, я віддаю перевагу клавіші видалення, щоб видалити ту ж кількість пробілів, що і вставки клавіші табуляції. Так що в цьому випадку теж, я вважаю , що було б корисно , щоб мати можливість привласнити однакове значення tabstop, softtabstopі shiftwidthодночасно.

Ярлик все одно буде корисним

Чудово, що Vim надає таку гнучкість, але я не бачу, щоб я це потребував. Я просто хочу мати можливість вибрати ширину вкладки, а також "жорстку" вкладку (з використанням символу табуляції) або "м'яку" вкладку (складається з пробілів). Перемикання між жорсткою та м'якою вкладками досить легко ( :set expandtab!), але я хотів би, щоб було простіше встановити ширину вкладки, не маючи при цьому возитися з 3 різними параметрами.

Тож пропонована мною пропозиція щодо чогось подібного :set stab=4мені все ще звучить добре.


Здається, у вас тут два різні запитання, можливо, вам слід розділити своє питання на два.
Грег Хьюгілл,

Ти маєш рацію! Я переніс друге запитання на власну тему.
nelstrom

1
Це здається швидше RFE, ніж питанням. Таким чином, ви, мабуть, повинні запропонувати спільноті VIM: vim.org/community.php - або просто написати патч. Окрім цього, VIM має розширений механізм макросів, що дозволяє визначати нові операції, тому дуже ймовірно, що ви можете просто створити макрос, який робить те, що ви хочете.
kdgregory

@nelstrom Щодо вашого запитання is there a practical case where you wouldn't want shiftwidth == tabstop && tabstop == softtabstop?використовується власний вихідний код Vim set shiftwidth=4 tabstop=8 noexpandtab. Так, типово хочеться shiftwidth == softtabstop, але це не залежить від того, яке значення tabstopмає.
jamessan

Відповіді:


56

Створити stabпараметр у самому Vim було б непросто, але я підбив цю команду / функцію, яку ви можете залишити у своєму .vimrc(або файлі плагіна, якщо ви суперорганізовані). Використовуйте, :Stabі вам буде запропоновано вказати рівень відступу та використовувати чи ні expandtab. Якщо натиснути Enter, не надавши йому новий рівень відступу, він просто надрукує поточні налаштування.

"помістіть все це у файл .vimrc або файл плагіна
команда! -nargs = * Stab виклик Stab ()
функція! Удар ()
  нехай l: tabstop = 1 * вхід ('set shiftwidth =')

  якщо l: tabstop> 0
    "ми хочемо також розширити вкладку?
    нехай l: expandtab = підтвердити ('встановити expandtab?', "& Так \ n & Ні \ n & Скасувати")
    якщо l: expandtab == 3
      "перервати?
      повернення
    endif

    let & l: sts = l: tabstop
    let & l: ts = l: tabstop
    let & l: sw = l: tabstop

    якщо l: expandtab == 1
      setlocal розширити вкладку
    ще
      setlocal noexpandtab
    endif
  endif

  "показати вибрані параметри
  спробуй
    echohl ModeMsg
    echon 'set tabstop ='
    echohl питання
    echon & l: ts
    echohl ModeMsg
    echon 'shiftwidth ='
    echohl питання
    echon & l: sw
    echohl ModeMsg
    echon 'sts ='
    echohl питання
    echon & l: sts. ''. (& l: et? '': 'ні')
    echohl ModeMsg
    echon 'expandtab'
  нарешті
    echohl Жодного
  кінцева спроба
кінцева функція

3
Дякую за сценарій! Це робить більше, ніж я просив - я вважаю, що вважаю за краще не використовувати розширення - але я можу легко налаштувати його на свій смак. Ви надали мені невеликий курс збоїв у Vimscript, тому я дуже вдячний. Нагорода за 100 балів - ваша!
nelstrom

9

Це моя перша спроба написати VimScript, але тут йдеться:

function! Stab(value)
    let &shiftwidth  = a:value
    let &softtabstop = a:value
    let &tabstop     = a:value
endfunc

Якщо я поміщу це у свій файл .vimrc, я можу викликати його, запустивши :call Stab(X), де X - бажана ширина вкладки. Наразі це адекватне рішення, але якщо хтось може запропонувати спосіб полегшити дзвінок, я буду вдячний.

Я також створив функцію, яка швидко узагальнює поточні налаштування, які я відобразив на ctrl-Tab:

nmap <C-Tab> :call TabParams()<CR>
function! TabParams()
    echo "tabstop:     ".&tabstop
    echo "shiftwidth:  ".&shiftwidth
    echo "softtabstop: ".&softtabstop
endfunc

Що ж, я підготував 100 балів за цю відповідь, і зараз я вже наполовину вирішив це сам. Не впевнений, чи можу я прийняти власну відповідь ...


+1 так, але якщо це те, що ви дійсно хочете, це все одно нормальна відповідь.
DaveParillo

2
Можливо, ви захочете використовувати let & l: shiftwidth тощо для встановлення локальних версій.
SystemParadox

7

Ви можете в режимі редагування також використовувати Ctrl-Tдля відступу та Ctrl-Dвідступу до наступного рівня відступу, встановленого shiftwidth, незалежно від tabstop, softtabstopабо expandtabналаштувань. Vim автоматично додасть / видалить пробіли або вкладки, щоб перейти до потрібного стовпця.

Якщо ви використовуєте ці команди для керування відступами замість Tab/, Backspaceвам не доведеться турбуватися про те, щоб усі ці налаштування вкладки збігалися, і завжди доходити до правильного рівня відступу.


3

Якщо expandtabвстановлено, тоді (як зазначає занадто багато php), softtabstopстає зайвим. Єдиною причиною, яку ви можете встановити shiftwidthінакше, tabstopбуло б задовольнити дивну звичку; наприклад, ви використовуєте відступи з чотирма пробілами, але волієте tabвставляти вісім пробілів.

Якщо значення expandtabне встановлено, тоді все стає нечіткішим. Якщо ви хочете, щоб ваш код виглядав так само в catредакторах та не vim, як у vim, тоді tabstopзавжди має бути встановлено 8; в цьому випадку ви встановите softtabstopі shiftwidthобидва, і бажаний рівень відступу. Якщо замість цього ви віддаєте перевагу , щоб кожен «фізична вкладка» в файлі є один рівень відступу, ви повинні встановити tabstopі shiftwidthна ваш кращий рівень відступів і відпустку softtabstopв нулі (вважаючи його рівним tabstopеквівалентно за винятком того, що якщо ви зміните tabstopце рассинхронизации, тоді як нуль просто означає "ігноруйте це, будь ласка").


3
Я вважаю, що це неправильно, тому що лише якщо softtabstopвстановлено правильне значення, backspace видалить відстань з відступом, як якщо б це була вкладка. що є обов’язковим для розумного використання.
u0b34a0f6ae

2

Ваше розуміння softtabstopта expandtabпомилка - тому stabзапропонований вами варіант буде не надто корисним.

expandtabпризначено для того, коли ви хочете використовувати пробіли замість вкладок для всього . Якщо ви встановите expandtab, тоді Vim ігнорує softtabstopпараметр і використовує tabstopі, shiftwidthщоб визначити, скільки пробілів вставити.

softtabstopпризначений лише для випадків, коли ви хочете використовувати комбінацію вкладок та пробілів, що дозволяє вам робити відступи з точним контролем (2 або 4 пробіли), зберігаючи ширину вкладок на вищому значенні (зазвичай 8), щоб текст з’являвся в інших програмах . Встановлення softtabstop=tabstopнічого не дає, бо Vim завжди використовуватиме вкладки для відступу.

Оновлення: Як зазначив kaizer.se , якщо ви використовуєте expandtab, вам все одно потрібно встановити, softtabstopякщо ви хочете, щоб Vim повертав назад кілька просторів, як якщо б вони були вкладкою.


Хоча ви маєте рацію tabstopі softtabstopстаєте однією змінною занадто багато, коли extpandtabвстановлено, я думаю, ви не праві в пріоритеті. Просто спробуйте: встановіть ts=8 sts=4 etі натисніть вкладку; курсор буде в стовпчику п’ять, і буде вставлено чотири пробіли, як якщо б ви встановили ts=4 sts=0 et.
hobbs

5
Я вважаю, що це неправильно, тому що лише якщо softtabstopвстановлено правильне значення, backspace видалить відстань з відступом, як якщо б це була вкладка. що є обов’язковим для розумного використання.
u0b34a0f6ae

2

Ви так часто змінюєте параметри пробілу, що вам дійсно потрібна функція для управління цим? Якщо ви багато возитесь із tabstop, а також налаштовуєте expandtab, можливо, з часом у вас буде безлад, коли ви змінюєте файли з різними значеннями, переданими в stab. Сьогодні я використовую :call stab (4), завтра це :call stab (2)і минулого тижня це було:call stab (8) . Здається, навіть якщо ви напишете його, незабаром ви перестанете ним користуватися.

Якщо ви плануєте завжди передавати одне і те ж значення для колоння, чому б просто не відредагувати ваші загальні налаштування? In vim:

:e $MYVIMRC

та додайте наступне:

set tabstop=4
set shiftwidth=4  "tabs are 4 spaces wide (default = 8)
set expandtab     "Convert tabs to spaces

Ось як налаштовується мій .vimrc.


1

Один корисний варіант - softtabstop=-1встановити для нього значення shiftwidth.
Ви також можете встановити shiftwidthзначення 0, і в цьому випадку tabstopбуде використано значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.