Vim как изменить размер табуляции

Процесс смены Komodo IDE на VIM я начал с изучения всевозможных туториалов и хау ту, однако, что удивительно, ни в одном из них мне не удалось встретить человече...

Процесс смены Komodo IDE на VIM я начал с изучения всевозможных туториалов и хау ту, однако, что удивительно, ни в одном из них мне не удалось встретить человеческого описания процесса настройки отступов. В одних предлагали регулировать ширину отступа с помощью опции tabstop, в других — с помощью softtabstop, в третьих — выставлять и то и другое и shiftwidth в придачу. После нескольких часов экспериментов с настройками я понял, что единственный способ не только заставить все работать, но и понять, почему оно работает — читать документацию. Своими «открытиями» я и хочу с вами поделиться.

Начну с описания опций, которые могут использоваться при настройке отступов.

tabstop (по умолчанию 8) — количество пробелов, которыми символ табуляции отображается в тексте. Оказывает влияние как на уже существующие табуляции, так и на новые. В случае изменения значения, «на лету» применяется к тексту.

softtabstop (0) — количество пробелов, которыми символ табуляции отображается при добавлении. Несмотря на то, что при нажатии на Tab вы получите ожидаемый результат (добавляется новый символ табуляции), фактически в отступе могут использоваться как табуляция так и пробелы. Например, при установленных tabstop равной 8 и softtabstop равной 4, троекратное нажатие Tab приведет к добавлению отступа шириной 12 пробелов, однако сформирован он будет из одного символа табуляции и 4 пробелов.

shiftwidth (8) — по умолчанию используется для регулирование ширины отступов в пробелах, добавляемых командами >> и <<. Если значение опции не равно tabstop, как и в случае с softtabstop, отступ может состоять как из символов табуляций так и из пробелов. При включении опции — smarttab, оказывает дополнительное влияние.

smarttab (выключена) — в случае включения этой опции, нажатие Tab в начале строки (если быть точнее, до первого непробельного символа в строке) приведет к добавлению отступа, ширина которого соответствует shiftwidth (независимо от значений в tabstop и softtabstop). Нажатие на Backspace удалит отступ, а не только один символ, что очень полезно при включенной expandtab. Напомню: опция оказывает влияние только на отступы в начале строки, в остальных местах используются значения из tabstop и softtabstop.

expandtab (выключена) — в режиме вставки заменяет символ табуляции на соответствующее количество пробелов. Так же влияет на отступы, добавляемые командами >> и <<.

Вооружившись полученными знаниями, очень просто настроить требуемое поведение отступов. Популярная практика у разработчиков: пробелы вместо табуляции, ширина отступа — 4 пробела. Настройка в данном случае будет выглядеть следующим образом:
set tabstop=4
set shiftwidth=4
set smarttab
set expandtab

На десерт я оставил описание двух life changing опций для тех, кто использует VIM в качестве редактора для разработки:

autoindent (выключена) — копирует отступы с текущей строки при добавлении новой.

smartindent (выключена) — делает то же, что и autoindent плюс автоматически выставляет отступы в «нужных» местах. В частности, отступ ставится после строки, которая заканчивается символом {, перед строкой, которая заканчивается символом }, удаляется перед символом #, если он следует первым в строке и т.д. (подробнее help ‘smartindent’).

Вот, собственно, и все.

Мой конфигурационный файл в части отступов выглядит следующим образом:
set tabstop=4
set shiftwidth=4
set smarttab
set expandtab
set smartindent

Буду благодарен за любые уточнения или дополнения.

Vim is one of the most popular terminal-based text editors for decades.

But no matter how long you have been using Vim, there are always more tips and tricks that you did not know about.

This one is about setting up indentation width in Vim to 2 spaces or 4 spaces. This is particularly helpful if you are a programmer, a Python one especially.

In your vimrc file (located at ~/.vimrc), add the following line to automatically use 2 spaces instead of tab in Vim.

set autoindent expandtab tabstop=2 shiftwidth=2

Don’t worry. I’ll go through it in detail.

Set automatic indentation

Imagine you are writing a line of code and the next line of code needs to be indented, you press the Enter key to go to the next line but the indentation is not applied automatically.

This can be very annoying. To automatically indent lines, add the following line to your ‘vimrc’.

set autoindent

Once you have this saved in your ‘vimrc’, it will enable automatic indentation in your vim session no matter the programming or scripting language that you use.

Use spaces for indenting

If you want to use spaces for indenting your code, add the following lines to your ‘.vimrc’ file.

set expandtab
set tabstop=<NUM OF SPACES>
set shiftwidth=<NUM OF SPACES>
  • The first line enables expandtab option in Vim. This option makes sure that spaces are used for indenting lines, even when you press the ‘Tab’ key.
  • The second option tabstop takes a numerical value. Let’s say I typed set tabstop=2, this will insert 2 spaces for a line indent.
  • Finally, the third option, shiftwidth manages the indentation when you use the ‘>>’ or ‘<<‘ operators to add or remove indentation to an already existing line/block of code.

I would suggest using 2 or 4 for tabstop and shiftwidth values.

I also recommend that you use the same values for tabstop and shiftwidth. Using different values might mess up your indentation.

Here is what indented code looks like in Vim:

Code indented using 4 spaces in Vim

💡

In rare cases, if you need to use the tab character, pressing the ‘Tab’ key will not work with expandtab enabled. To use the tab character, use the ‘Ctrl + V’ key combination and then type the tab character.

Vice versa: Use tabs for indentation

Serving to people standing on both sides of ‘tabs vs spaces’, let’s now look at how you can use a tab character for indenting instead of spaces.

Add the following lines to your ‘vimrc’:

set noexpandtab
set tabstop=4
set shiftwidth=4

The only difference in these 3 lines for your vimrc to use tabs instead of spaces is the usage of noexpandtab instead of expandtab. The noexpandtab option prevents the conversion of tabs to spaces.

Conclusion

All the above works for new files. To convert tabs to spaces in the currently opened file in Vim, enter the Normal mode by pressing Esc key. Now use the retab command by pressing the ‘:’ (colon) character and Vim will convert the existing tabs to spaces.

The war of tabs vs spaces aside, this tutorial aims at helping you set the indentation to whatever your preference might be.

If you are interested in learning more than just the Vim Basics, use this program by Jovica Ilic.

Mastering Vim Quickly — Jovica Ilic

Exiting Mastering Vim Quickly From WTF to OMG in no time

Jovica Ilic

Team LHB

Team LHB indicates the effort of a single or multiple members of the core Linux Handbook team.

В процессе написания программного кода для улучшения читабельности используются отступы. Но, в некоторых языках программирования отступы используются для синтаксического выделения блоков код. Так например, в Python для формирования отступа используются 4 пробельных символа, которые в случае замены символом табуляции не будут восприняты интерпритатором, как отступ выделяющий блок.

Vim предлагает довольно гибкий контроль над отступами и табуляцией.

Настройки по умолчанию

set tabstop=8 softtabstop=0 shiftwidth=8 noexpandtab 

Параметры и их описание

tabstop — Определяет ширину символа табуляции.

softtabstop — Количество пробелов добавляемое при нажатии клавиши tab. Например, если tabstop = 4, а softtabstop = 2, то при нажатии клавиши tab вставиться 2 пробела, если нажать еще раз, то вместо 4 пробелов вставиться один символ табуляции, и так далее. Если softtabstop = tabstop, то будут вставляется символы табуляции.

shiftwidth — Количество пробелов на которое изменяется ширина отступа, при использовании команд изменения отступа << и >>

expandtab — Опция заменяющая,при вставке, символы табуляции на количество пробелов указанных в tabstop

Если вы предпочитает работать с табуляциями, то хорошей идеей будет использовать tabstop == softtabstop. Это уменьшит вероятность того, что ваши отступы превратятся в смесь пробелов и табуляций.

Если же вы предпочитаете работать c пробелами, то желательно использовать softtabstop == shiftwidth. Это позволит получить одинаковое количество пробелов при нажатии клавиши tab в режиме вставки и при использовании команд управления отступами в обычном и визуальном режимах.

Сниппет Stab

Этот сниппет позволяет назначать одинаковое значение для tabstop, softtabstop и shiftwidth:

" Set tabstop, softtabstop and shiftwidth to the same value 
command! -nargs=* Stab call Stab() 
function! Stab() 
 let l:tabstop = 1 * input('set tabstop = softtabstop = shiftwidth = ') 
 if l:tabstop > 0 
  let &l:sts = l:tabstop 
  let &l:ts = l:tabstop 
  let &l:sw = l:tabstop 
 endif 
 call SummarizeTabs() 
endfunction 

function! SummarizeTabs() 
 try 
  echohl ModeMsg 
  echon 'tabstop='.&l:ts 
  echon ' shiftwidth='.&l:sw 
  echon ' softtabstop='.&l:sts 
  if &l:et 
   echon ' expandtab' 
  else 
   echon ' noexpandtab' 
  endif 
  finally 
  echohl None 
 endtry 
endfunction 

Для вызова этого сниппета, войдите в обычный режим (нажмите клавишу Esc) и выполните команду:

:Stab 

После нажатия Enter, мы увидим:

set tabstop = softtabstop = shiftwidth = 

Теперь можно ввести значение которое мы хотим назначить этим параметрам.

Замена табуляции на пробелы

Включение или выключение опции expandtab не оказывает влияния на уже существующие отступы в которых используются символы пробелов и табуляции. То есть, все символы табуляции, так и останутся символами табуляции. Если мы хотим преобразовать их в пробелы, то нам необходимо использовать команду :retab.

Например:

:set expandtab
:retab 

После этого vim заменит все символы табуляции на установленное количество пробелов.

Для проведения обратного преобразования необходимо выполнить следующие команды:

:set noexpandtab 
:retab! 

Манипуляции со строками в обычном режиме

В обычном режиме (normal-mode) для управления отступами можно использовать команды << и >>. Они вызывают сдвиг строки на количество символов указанное в shiftwidth. Можно указать количество строк которые необходимо сдвинуть.

Например:

:5>> 

Добавит отступы у 5 строк на количество символов указанное в shiftwidth.

:4<< 

Уменьшит отступы у 4 строк на количество символов указанное в shiftwidth.

Манипуляции со строками в визуальном режиме

В визуальном режиме (visual-mode) для управления отступами используются команды < и >. Они вызывают сдвиг выделенного блока на количество символов указанное в shiftwidth.

Если перед командами < и > указать число, то это число будет множителем для сдвига.

Например:

:4>

Сдвинет выделенный блок в вправо на shiftwidth x 4 символов.

:3< 

Соответственно, сдвинет влево на shiftwidth x 3 количество символов.

Автоотступ

Отступами можно пользоваться для визуального выделения блоков. Для этого требуется в начале каждой строки ввести необходимое количество символов табуляции или пробелов.

Опция autoindent позволяет вставлять отступы автоматически.

:set autoindent 

или

:set ai 

Каждая новая строка вводится с тем же отступом, что и предыдущая.

Для лучшего контроля за отступами существует опция smartindent, которая в отличает от autoindent умеет ставить дополнительные отступы при открытии блока и убирать отступы в закрытии блока.

За основу взять скринкаст Tabs and Spaces с VimCasts.org

Похожие по тематике посты:

Понравилась статья? Поделить с друзьями:
  • Visual studio code как изменить кодировку файла
  • Vilcus vast error
  • Visual studio 2010 error window
  • Viessmann ошибка f02 как исправить
  • Visual prolog predicates syntax error