Настройки Tab Vs Space в Vim - PullRequest
       14

Настройки Tab Vs Space в Vim

86 голосов
/ 13 октября 2009

Vim очень любезен, когда дело доходит до вкладки Vs. космические предпочтения. Насколько я понимаю, настройка tabstop указывает ширину символа табуляции. Параметр shiftwidth указывает, сколько столбцов будет увеличиваться / уменьшаться при использовании команд << </kbd> и >> , тогда как параметр softtabstop влияет на количество пробела, которое будет вставлено, когда Вы нажимаете клавишу Tab в режиме вставки. Если expandtab включено, клавиша табуляции вставляет softtabstop количество пробелов. В то время как при выключенном expandtab нажатие клавиши Tab вводит наименьшее возможное количество символов табуляции + пробела, соответствующее softtabstop. (Пожалуйста, поправьте меня, если я ошибаюсь.)

Этот последний пункт заставляет меня задуматься: есть ли практический случай, когда вы не хотели бы shiftwidth == tabstop && tabstop == softtabstop? Я не могу думать об одном. Насколько мне известно, было бы наиболее удобно, если бы я мог установить все 3 из них на одно и то же значение в одном назначении. например вызов:

:set stab=4

что будет эквивалентно выполнению:

:set tabstop=4 softtabstop=4 shiftwidth=4 

Кто-нибудь может подсказать, как это можно сделать?


UPDATE

Спасибо за ответы, которые так далеко от слишком много php , hobbs и kaiser.se . Вместо того, чтобы отвечать на каждый вопрос в отдельности, я обновляю вопрос здесь.

Softtabstop с отключенным расширением

Я уже говорил выше, что при отключенной функции расширения вкладки нажатие клавиши 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 на одно и то же значение с помощью одной команды.

Делает ли expandtab избыточной softtabstop?

tabstop=4 softtabstop=0 shiftwidth=4 expandtab

В режиме вставки нажатие клавиши табуляции вставляет 4 пробела. Нажатие клавиши удаления удаляет один пробел, поэтому вам придется вернуться на 4 раза, если вы случайно нажали клавишу Tab.

tabstop=4 softtabstop=4 shiftwidth=4 expandtab

В режиме вставки нажатие клавиши табуляции вставляет 4 пробела. Нажатие клавиши Backspace удаляет 4 пробела.

Если я работаю с включенным expandtab, я бы предпочел, чтобы клавиша удаления удаляла столько же пробелов, сколько вставляется клавиша табуляции. Поэтому и в этом случае мне кажется, что было бы полезно иметь возможность назначать одно и то же значение одновременно tabstop, softtabstop и shiftwidth.

Ярлык все равно будет полезен

Здорово, что Vim обеспечивает такую ​​гибкость, но я не вижу в этом необходимости. Я просто хочу иметь возможность выбрать ширину вкладки, и является ли она «жесткой» вкладкой (используя символ табуляции) или «мягкой» вкладкой (состоящей из пробелов). Переключение между жесткими и мягкими вкладками достаточно простое (:set expandtab!), но мне бы хотелось, чтобы было проще установить ширину вкладки, не прибегая к манипулированию с 3 различными параметрами.

Так что мое предложение о чем-то вроде :set stab=4 все еще звучит хорошо для меня.

Ответы [ 7 ]

55 голосов
/ 23 октября 2009

Создать опцию 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
9 голосов
/ 20 октября 2009

Это моя первая попытка написания 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-балльную награду за этот ответ, и теперь я наполовину решил ее сам. Не уверен, смогу ли я принять свой собственный ответ ...

7 голосов
/ 22 октября 2009

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

Если вы используете эти команды для управления отступом вместо Tab / Backspace , вам не нужно беспокоиться о том, что все эти настройки вкладок подходят друг к другу, и всегда получите правильный уровень отступа .

3 голосов
/ 15 октября 2009

Если установлено expandtab, то (как указывает слишком много php), softtabstop становится избыточным. Единственная причина, по которой вы могли бы установить shiftwidth в отличие от tabstop, заключается в удовлетворении странной привычки; Например, вы используете отступы в четыре пробела, но предпочитаете tab , чтобы вставить восемь пробелов.

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

2 голосов
/ 21 октября 2009

Вы меняете настройки пробелов так часто, что вам действительно нужна функция для управления этим? Если вы много работаете с 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.

2 голосов
/ 14 октября 2009

Ваше понимание softtabstop и expandtab неверно - поэтому предложенная вами опция stab не будет очень полезной.

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

softtabstop только для случаев, когда вы хотите использовать mix табуляции и пробелов, что позволяет вам делать точный контроль (2 или 4 пробела), сохраняя при этом ширина вкладки при более высоком значении (обычно 8), чтобы текст появлялся в других приложениях. Установка softtabstop=tabstop ничего не делает, потому что Vim всегда будет использовать вкладки для отступа.

Обновление: Как указывало kaizer.se , если вы используете expandtab, вам все равно нужно установить softtabstop, если вы хотите, чтобы Vim возвратил несколько пробелов как будто они вкладка.

1 голос
/ 02 марта 2018

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

...