суббота, 4 декабря 2010 г.

Vim: Табуляция и пробелы

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


Ремесло программиста. Практика написания хорошего кода | Питер Гудлиф | Code Craft: The Practice of Writing Excellent CodeРемесло программиста. Практика написания хорошего кода | Питер Гудлиф | Code Craft: The Practice of Writing Excellent Code
Совершенный код. Мастер-класс | С. Макконнелл | Code CompleteСовершенный код. Мастер-класс | С. Макконнелл | Code Complete
Hacking Vim: A Cookbook to Get the Most out of the Latest Vim Editor: From Personalizing Vim to Productivity Optimizations: Recipes to Make Life Easier for Experienced Vim Users | Kim Schulz Hacking Vim: A Cookbook to Get the Most out of the Latest Vim Editor: From Personalizing Vim to Productivity Optimizations: Recipes to Make Life Easier for Experienced Vim Users | Kim Schulz

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

4 комментария:

Ольга комментирует...

Подскажите чем аргументируется выбор пробелов или табуляции?
Очень многие категорично высказываются, надо так, но не аргументируют свой выбор.

alex комментирует...

Если не брать в расчёт python, то сугубо личное предпочтение или, если используется и соблюдается, codestyle в котором почти всегда жёстко оговариваются отступы (пробелы или табуляция).

Я предпочитаю табуляцию, визуально отображаемую как 4 пробела.

Анонимный комментирует...

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

alex комментирует...

Не обязательно, у всех более-менее продвинутых текстовых редакторов используемых для кодинга есть возможность настраивать параметры табуляции в соответствии с coding standards проекта/организации или личных предпочтений.