Можно ли конвертировать вкладки в пробелы, сохраняя выравнивание текста?
Простая замена работает только тогда, когда нет ведущих символов.
Можно ли конвертировать вкладки в пробелы, сохраняя выравнивание текста?
Простая замена работает только тогда, когда нет ведущих символов.
Ответы:
Вы можете использовать :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.