Вкладка Vs Space в Vim
Vim очень удобен, когда речь идет о вкладке Vs. космических предпочтений. Как я понимаю, параметр tabstop
указывает ширину символа табуляции. Параметр shiftwidth
указывает, сколько столбцов нужно увеличивать/уменьшать при использовании команд << и >>, тогда как параметр softtabstop
влияет на количество вставленных пробелов, когда вы нажимаете клавишу Tab в режиме вставки, Если expandtab
включен, клавиша табуляции вставляет softtabstop
количество пробелов. Если при выключенном expandtab
нажатие клавиши Tab вставляет наименьшее возможное количество символов табуляции + пробел, которые соответствуют softtabstop
. (Пожалуйста, поправьте меня, если я ошибаюсь.)
Этот последний момент заставляет задуматься: есть ли практический случай, когда вы не хотели бы shiftwidth == tabstop && tabstop == softtabstop
? Я не могу думать об этом. Насколько мне известно, было бы очень удобно, если бы я мог установить все три из них на одно значение в одном назначении. например вызов:
:set stab=4
который будет эквивалентен запуску:
:set tabstop=4 softtabstop=4 shiftwidth=4
Кто-нибудь может предложить, как это можно сделать?
UPDATE
Спасибо за ответы до сих пор от слишком много php, hobbs и kaiser.se. Вместо ответа на каждый вопрос, я обновляю вопрос здесь.
Softtabstop с отключенным expandtab
Я сказал выше, что с отключением expandtab нажатие клавиши 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 вставляет минимально возможное количество символов tab + пробела, которое соответствует softtabstop.
Если я работаю с отключением expandtab, я не вижу, что хочу получить дополнительный гранулярный контроль, который может быть достигнут путем установки softtabstop в другое значение из tabstop. Мне все же было бы полезно установить tabstop
, softtabstop
и shiftwidth
на одно значение с помощью одной команды.
Разве expandtab делает softtabstop избыточным?
tabstop=4 softtabstop=0 shiftwidth=4 expandtab
В режиме вставки нажатие клавиши вкладок вставляет 4 пробела. Нажатие клавиши "Удалить" удаляет одно пробел, поэтому вам нужно выполнить обратное прохождение 4 раза, если случайно нажмете клавишу вкладки.
tabstop=4 softtabstop=4 shiftwidth=4 expandtab
В режиме вставки нажатие клавиши вкладок вставляет 4 пробела. Нажатие клавиши backspace удаляет 4 пробела.
Если я работаю с expandtab
включен, я бы предпочел, чтобы клавиша удаления удаляла ту же сумму пробелов, что и вкладка. Поэтому в этом случае я также чувствую, что было бы полезно иметь возможность одновременно назначать те же значения tabstop
, softtabstop
и shiftwidth
.
Ярлык будет полезен
Замечательно, что Vim обеспечивает такую гибкость, но я не вижу, что мне это нужно. Я просто хочу иметь возможность выбирать ширину вкладки и является ли она "жесткой" вкладкой (с использованием символа табуляции) или "мягкой" вкладкой (состоящей из пробелов). Переключение между жесткими и мягкими вкладками достаточно просто (:set expandtab!
), но мне жаль, что было бы проще установить ширину вкладки, не выполняя три разных параметра.
Итак, мое предлагаемое предложение для чего-то вроде :set stab=4
все еще звучит хорошо для меня.
Ответы
Ответ 1
Создание опции 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
Ответ 2
Это моя первая попытка написать 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 баллов за этот ответ, и теперь я решил половину сам. Не уверен, могу ли я принять свой собственный ответ...
Ответ 3
В режиме редактирования вы также можете использовать Ctrl-T для отступа и Ctrl-D для указания на следующий уровень отступов, заданный shiftwidth
, независимо от параметров tabstop
, softtabstop
или expandtab
. Vim автоматически добавит/удалит пробелы или вкладки, чтобы привести вас в нужный столбец.
Если вы используете эти команды для управления отступом вместо Tab/Backspace, вам не нужно беспокоиться обо всех этих настройках вкладки, связанных друг с другом, и всегда получать правильный уровень отступов.
Ответ 4
Если expandtab
установлено тогда (поскольку слишком много php указывает), softtabstop
становится излишним. Единственная причина, по которой вы могли бы установить shiftwidth
иначе, чем tabstop
, - это удовлетворить нечетную привычку; например, вы используете четырехмерные отступы, но предпочитаете tab вставлять восемь пробелов.
Если expandtab
не задано, все становится более бесполезным. Если вы хотите, чтобы ваш код выглядел одинаково с редакторами cat
и non-vim, как в vim, тогда tabstop
всегда должен быть установлен в 8; в этом случае вы установили softtabstop
и shiftwidth
как на ваш предпочтительный уровень отступа. Если вы предпочитаете, чтобы каждая "физическая вкладка" в файле представляла один уровень отступа, вы должны были установить tabstop
и shiftwidth
на свой предпочтительный уровень отступа и оставить softtabstop
в нуле (установка равным tabstop
эквивалентна за исключением того, что если вы измените tabstop
, он выйдет из синхронизации, а нуль просто означает "игнорировать это, пожалуйста" ).
Ответ 5
Ваше понимание softtabstop
и expandtab
неверно - поэтому параметр stab
, который вы предлагаете, не будет очень полезен.
expandtab
предназначен для тех случаев, когда вы хотите использовать пробелы вместо вкладок для всего. Если вы установите expandtab
, то Vim игнорирует параметр softtabstop
и использует tabstop
и shiftwidth
для определения количества вставленных пробелов.
softtabstop
предназначен только для тех случаев, когда вы хотите использовать сочетание вкладок и пробелов, позволяя отступы с точным контролем (2 или 4 пробела), сохраняя ширину табуляции с более высоким значением (обычно 8), чтобы текст отображался в других приложениях. Установка softtabstop=tabstop
не выполняет ничего, потому что Vim всегда будет использовать вкладки для отступов.
Обновление: Как kaizer.se указал, что если вы используете expandtab
, вам все равно нужно установить softtabstop
если вы хотите, чтобы Vim переместил несколько пространств, как если бы они были вкладкой.
Ответ 6
Вы меняете свои настройки пробела так часто, что вам действительно нужна функция для управления этим? Если вы много возитесь с tabstop и также устанавливаете expandtab, вы, вероятно, со временем будете беспорядочно менять файлы с разными значениями, переданными в stab
. Сегодня я использую :call stab (4)
, завтра это :call stab (2)
, а на прошлой неделе это было :call stab (8)
. Похоже, что даже если вы его напишете, вы скоро перестанете его использовать.
Если вы планируете всегда передавать одно и то же значение в stab, почему бы просто не изменить глобальные настройки? В vim:
:e $MYVIMRC
и добавьте следующее:
set tabstop=4
set shiftwidth=4 "tabs are 4 spaces wide (default = 8)
set expandtab "Convert tabs to spaces
Вот как настроен мой .vimrc.