Tab Vs Space preferences в Vim
Vim является очень любезны, когда дело доходит до вкладки против. пространство предпочтения. Как я понимаю, то tabstop настройка указывает ширину символа табуляции. Элемент shiftwidth установка указывает, сколько столбцов для увеличения / уменьшения при использовании и >> команды, в то время как softtabstop установка влияет на количество пробелов, которые будут вставлены при нажатии кнопки Tab клавиша в режиме вставки. Если expandtab включен, клавиша tab вставляет softtabstop количество пробелов. Тогда как с expandtab выключить, нажав Tab клавиша вставляет наименьшее возможное количество символов табуляции + пробел, которое соответствует softtabstop. (Пожалуйста, поправьте меня, если я ошибаюсь.)
это заставляет меня задаться вопросом: есть ли практический случай, когда вы не хотите shiftwidth == tabstop && tabstop == softtabstop? Я не могу придумать ни одного. Насколько мне известно, было бы наиболее удобно, если бы я мог установить все 3 из них на одно и то же значение в одном задании. например. звоню:
:set stab=4
что было бы эквивалентно запуску:
:set tabstop=4 softtabstop=4 shiftwidth=4
может кто-нибудь подскажет, как это можно сделать?
обновление
Спасибо за ответы так далеко от слишком много php,Хоббс и kaiser.se. вместо того, чтобы отвечать на каждый в отдельности, я обновляю вопрос здесь.
Softtabstop с переключенным expandtab выкл
я сказал выше, что при выключенном expandtab, нажатие клавиши Tab вставляет наименьшее возможное количество символов tab+space, которое соответствует softtabstop. Я поддерживаю это, но думаю, что мне нужно объяснить, что я имел в виду. Я попытаюсь сделать это на нескольких примерах. Чтобы следовать дальше, бегите :set list так что вы можете видеть символы табуляции.
tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab
в режиме вставки нажатие клавиши Tab вставляет 2 пробела. Нажмите клавишу tab на секунду время, и вместо того, чтобы вставлять еще два символа пробела (в общей сложности 4 символа пробела), он заменяет предыдущие 2 пробела одним символом табуляции. Tabstop имеет значение 4, поэтому один символ вкладки имеет ту же ширину, что и 4 пробела.
tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab
в режиме вставки нажатие клавиши Tab вставляет символ табуляции 1 и 2 места. Символ табуляции имеет ширину 4, поэтому общая ширина составляет 6, и это достигается с помощью 3 символов. Повторное нажатие клавиши tab вставляет два символа табуляции и удаляет два пробела, которые были вставлены ранее. Общая ширина-12, и это достигается с помощью 3-х символов.
в обоих этих примерах Vim вставляет минимально возможное количество символов табуляции + пробела, которое соответствует softtabstop.
если я работаю с отключенным expandtab, я не вижу, что мне нужен дополнительный гранулированный контроль, который можно достичь, установив softtabstop на другое значение от tabstop. Это все равно будет полезно для меня, чтобы иметь возможность установить tabstop,softtabstop и shiftwidth к тому же значению с помощью одной команды.
делает ли expandtab softtabstop избыточным?
tabstop=4 softtabstop=0 shiftwidth=4 expandtab
в режиме вставки нажатие клавиши tab вставляет 4 пробела. Нажатие клавиши delete удаляет один пробел - так что вам придется отступить 4 раза, если вы случайно нажмете клавишу tab.
tabstop=4 softtabstop=4 shiftwidth=4 expandtab
в режиме вставки нажатие клавиши tab вставляет 4 пробела. Нажатие клавиши backspace удаляет 4 пробела.
если я работаю с expandtab включено, я бы предпочел удалить ключ, чтобы удалить то же количество пробелов, что и вставка клавиши tab. Поэтому и в этом случае я чувствую, что было бы полезно иметь возможность присвоить одно и то же значение tabstop,softtabstop и shiftwidth одновременно.
ярлык все равно будет полезен
здорово, что Vim обеспечивает такую гибкость, но я не вижу, что мне это нужно. Я просто хочу иметь возможность выбирать ширину вкладки, и является ли это "жесткая" вкладка (с использованием символа вкладки) или "мягкая" вкладка (состоящая из пробелов). Переключение между жесткими и мягкими вкладками достаточно легко (:set expandtab!), но я хотел бы, чтобы было более просто установить ширину вкладки, без необходимости возиться с 3 различными параметрами.
так что мое предложение что-то вроде :set stab=4 по-прежнему звучит хорошо для меня.
7 ответов:
создание
stabопция в Vim сама по себе не будет легкой, но я поднял эту команду/функцию, которую вы можете бросить в свой.vimrc(или плагин файл, если ты супер-организованной). Используйте:Stabи вам будет предложено ввести уровень отступа и использовать лиexpandtab. Если вы нажмете enter, не давая ему новый уровень отступа, он просто напечатает текущие настройки." put all this in your .vimrc or a plugin file command! -nargs=* Stab call Stab() function! Stab() let l:tabstop = 1 * input('set shiftwidth=') if l:tabstop > 0 " do we want expandtab as well? let l:expandtab = confirm('set expandtab?', "&Yes\n&No\n&Cancel") if l:expandtab == 3 " abort? return endif let &l:sts = l:tabstop let &l:ts = l:tabstop let &l:sw = l:tabstop if l:expandtab == 1 setlocal expandtab else setlocal noexpandtab endif endif " show the selected options try echohl ModeMsg echon 'set tabstop=' echohl Question echon &l:ts echohl ModeMsg echon ' shiftwidth=' echohl Question echon &l:sw echohl ModeMsg echon ' sts=' echohl Question echon &l:sts . ' ' . (&l:et ? ' ' : 'no') echohl ModeMsg echon 'expandtab' finally echohl None endtry endfunction
Это моя первая попытка написать 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 баллов за этот ответ, и теперь я наполовину решил его сам. Не уверен, что могу принять свой собственный ответ...
вы можете в режиме редактирования также использовать Ctrl-T отступ и Ctrl-D для деиндентирования на следующий уровень отступа, заданный
shiftwidthнезависимо отtabstop,softtabstopилиexpandtabнастройки. Vim автоматически добавит / удалит пробелы или вкладки, чтобы привести вас к правой колонке.если вы используете эти команды для управления отступами вместо Tab/ Backspace вам не нужно беспокоиться о том, что все эти настройки вкладки подходят друг к другу и всегда добирайтесь до правильного уровня отступа.
если
expandtabустанавливается тогда (как слишком много php указывает),softtabstopстановится излишним. Единственная причина, по которой вы можете установитьshiftwidthиначеtabstopможно было бы удовлетворить странная привычка; например, вы используете четыре-пространство отступов, но вы предпочитаете tab вставить восемь пробелов.если
expandtabне установлен, тогда все становится более размытым. Если вы хотите, чтобы ваш код выглядел одинаково сcatи не-Vim редакторы, как это происходит в vim, тоtabstopвсегда должно быть установлено на 8; в в этом случае вы бы установилиsofttabstopиshiftwidthоба до вашего предпочтительного уровня отступа. Если вы предпочитаете, чтобы каждая "физическая вкладка" в файле представляла один уровень отступа, вы должны установитьtabstopиshiftwidthдо вашего предпочтительного уровня отступа и оставитьsofttabstopпри нуле (установка его равнымtabstopэквивалентны за исключением того, что если вы изменитеtabstopон выйдет из синхронизации, в то время как ноль просто означает "игнорировать это, пожалуйста").
понимание
softtabstopиexpandtabне так - такstabвариант, который вы предлагаете, не будет очень полезен.
expandtab- когда вы хотите использовать пробелы вместо табуляции для все. Если вы установитеexpandtab, затем Vim игнорирует и используетtabstopиshiftwidthчтобы выяснить, сколько пробелов для вставки.
softtabstopтолько для того, когда вы хотите использовать mix of вкладки и пробелы, что позволяет выполнять отступы с точным управлением (2 или 4 пробела), сохраняя ширину вкладки на более высоком значении (обычно 8), чтобы текст отображался в других приложениях. Установкаsofttabstop=tabstopничего не делает, потому что Vim всегда будет использовать вкладки для отступов.обновление: как kaizer.se указал, если вы используете
expandtab, тогда вам все равно нужно установитьsofttabstopЕсли вы хотите, чтобы Vim возвращал несколько пространств, как если бы они были табуляция.
вы так часто меняете настройки белого пространства, что вам действительно нужна функция для управления этим? Если вы много возитесь с tabstop, а также устанавливаете expandtab, у вас, вероятно, будет беспорядок с течением времени, когда вы меняете файлы с разными значениями, переданными в
stab. Сегодня я использую:call stab (4), утром:call stab (2)а на прошлой неделе это было:call stab (8). Похоже, даже если вы его напишете, вы скоро перестанете его использовать.если вы планируете всегда передавать одно и то же значение для удара, почему бы и нет просто измените свои глобальные настройки? В vim:
:e $MYVIMRCи добавить следующее:
set tabstop=4 set shiftwidth=4 "tabs are 4 spaces wide (default = 8) set expandtab "Convert tabs to spacesвот как мой .vimrc установки.
один полезный параметр
softtabstop=-1который установит его в значениеshiftwidth.
Вы также можете установитьshiftwidth0, в этом случаеtabstopзначение будет использоваться.
Comments