Можно ли конвертировать вкладки в пробелы, сохраняя выравнивание текста?
Простая замена работает только тогда, когда нет ведущих символов.
Можно ли конвертировать вкладки в пробелы, сохраняя выравнивание текста?
Простая замена работает только тогда, когда нет ведущих символов.
Ответы:
Вы можете использовать :retab
команду. Из
:help :retab
Замените все последовательности пробелов, содержащих a,
<Tab>
новыми строками пробелов, используя новое заданное значение табуляции. Если вы не указали новый размер табуляции или он равен нулю, Vim использует текущее значение'tabstop'
. [...] При'expandtab'
включении Vim заменяет все вкладки соответствующим количеством пробелов.
Обратите внимание, что команда принимает диапазон, поэтому вы можете сделать визуальный выбор, а затем только :retab
выделенные строки.
Вы можете использовать :retab
, как указано, однако, это изменит все вкладки на пробелы, а не только вкладки в начале строки
Так вот (где ⇥
находится символ табуляции):
if :; do
⇥echo "⇥hello"
end
изменяется на (где ␣
символ пробела):
if :; do
␣␣echo "␣␣hello"
end
Это может привести к неожиданным побочным эффектам в некоторых сценариях, и это еще больше проблема при переходе пробелов на вкладки!
Итак, я написал небольшую функцию для изменения только табуляции / пробелов в начале строки:
" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
let l:spaces = repeat(' ', &tabstop)
" Replace tabs with spaces
if a:expandtab
silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
" Replace spaces with tabs
else
silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
endif
endfun
В этой версии вы должны вручную указывать expandtab
в вызове функции (т. :call Retab(1)
Е. Менять табуляцию на пробелы), но вы также можете изменить ее так, чтобы она принимала текущее значение &expandtab
(как это уже было с &tabstop
), как это :retab
делается. (Я предпочитаю указать это вручную).
a
в if a:expandtab
среднем?
set expandtab
.vimrc, а затем autocmd BufWritePre * :call Retab(&expandtab)
- отступ будет заменен на табуляцию, а не на пробел.
Vim предоставляет !retab
команду, которая заменит все последовательности <Tab>
новыми строками пробела, используя новое заданное :set tabstop=2
значение tabstop (например ), но все вкладки внутри строк могут быть изменены (например, в программе на C, вы должны использовать, \t
чтобы избежать этого)!
Таким образом, в качестве альтернативы вы можете изменить все вкладки на пробелы, используя следующую команду:
:%s/\t/ /g
или как предложено @Shahbaz :
:%s/^\t\+/ g
Таким образом, конвертируются только вкладки, используемые в отступе.
Объяснение:
%
представляет весь буфер / файл ( :help :%
)s
обозначает замену ( :help sub-replace-special
)\t
или ^I
обозначает вкладку
- используйте столько пробелов, сколько вам нужно на одной вкладкеg
- обозначает глобальный, и он будет преобразовывать несколько вкладок в одной строкеЗатем , чтобы исправить отступы весь файл, вы можете попробовать: gg=G. Проверьте: перезаписать плохо с отступом код для более подробной информации.
Чтобы использовать пробелы по умолчанию вместо вкладок, вам необходимо добавить следующие параметры в ваш .vimrc
файл:
set tabstop=2 " (ts) width (in spaces) that a <tab> is displayed as
set expandtab " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2 " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)
Альтернативное решение заключается в использовании tidy
Связанный:
%s/^\t\+/ g
так, чтобы конвертировались только вкладки, используемые в отступе. Кроме того, gg=G
может быть катастрофическим с такими языками, как Python.
Попробуйте использовать:
expand -t 4 input_filename output_filename
expand
это инструмент командной строки для преобразования вкладок в пробелы, которые вы можете запустить из оболочки или с помощью :!expand
.
Он находится в POSIX, поэтому он должен быть доступен на большинстве систем. unexpand
сделаем наоборот, кстати.
expand
?
:%!expand -t 4
внутри Vim. Более того, вы также можете использовать текущий параметр ширины смещения: :exe '%!expand -t ' . &shiftwidth
Для полноты =
можно также использовать для исправления отступов после того, как вы указали, что вкладки заменяются пробелами. В обычном режиме вы можете сделать это, набрав :set expandtab
. Тогда =
может быть использовано двумя способами:
=
исправляет отступы выбранных блоков кода.gg=G
исправляет весь файл, где gg
перемещает курсор в начало файла, затем =
применяется и G
перемещает курсор в конец файла.Ссылка: ссылка
:h vim-faq
и искать/tab characters
. Трудно запомнить тег:h faq-14.16
.