Вкладка 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.