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 по-прежнему звучит хорошо для меня.

732   7  

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.
Вы также можете установить shiftwidth 0, в этом случае tabstop значение будет использоваться.

Comments

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