В процессе написания программного кода для улучшения читабельности используются отступы. Но, в некоторых языках программирования отступы используются для синтаксического выделения блоков код. Так например, в Python для формирования отступа используются 4 пробельных символа, которые в случае замены символом табуляции не будут восприняты интерпритатором, как отступ выделяющий блок.
Vim предлагает довольно гибкий контроль над отступами и табуляцией.
Настройки по умолчанию
set tabstop=8 softtabstop=0 shiftwidth=8 noexpandtab
Параметры и их описание
tabstop - Определяет ширину символа табуляции.
softtabstop - Количество пробелов добавляемое при нажатии клавиши . Например, если tabstop = 4, а softtabstop = 2, то при нажатии клавиши вставиться 2 пробела, если нажать еще раз, то вместо 4 пробелов вставиться один символ табуляции, и так далее. Если softtabstop = tabstop, то будут вставляется символы табуляции.
shiftwidth - Количество пробелов на которое изменяется ширина отступа, при использовании команд изменения отступа << и >>
expandtab - Опция заменяющая,при вставке, символы табуляции на количество пробелов указанных в tabstop
Если вы предпочитает работать с табуляциями, то хорошей идеей будет использовать tabstop == softtabstop. Это уменьшит вероятность того, что ваши отступы превратятся в смесь пробелов и табуляций.
Если же вы предпочитаете работать c пробелами, то желательно использовать softtabstop == shiftwidth. Это позволит получить одинаковое количество пробелов при нажатии клавиши в режиме вставки и при использовании команд управления отступами в обычном и визуальном режимах.
Сниппет 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
Для вызова этого сниппета, войдите в обычный режим (нажмите клавишу
) и выполните команду::Stab
После нажатия
, мы увидим: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 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 |
4 комментария:
Подскажите чем аргументируется выбор пробелов или табуляции?
Очень многие категорично высказываются, надо так, но не аргументируют свой выбор.
Если не брать в расчёт python, то сугубо личное предпочтение или, если используется и соблюдается, codestyle в котором почти всегда жёстко оговариваются отступы (пробелы или табуляция).
Я предпочитаю табуляцию, визуально отображаемую как 4 пробела.
В разных редакторах табы рисуются по разному, а в зависимости от настроек - разной длины. Для того, чтоб другие люди видели такое же красивое форматирование целесообразно использовать пробелы
Не обязательно, у всех более-менее продвинутых текстовых редакторов используемых для кодинга есть возможность настраивать параметры табуляции в соответствии с coding standards проекта/организации или личных предпочтений.
Отправить комментарий