Відповіді:
Ви можете використовувати :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
), але всі вкладки всередині рядків можуть бути змінені (наприклад, у програмі 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
може бути катастрофічно з такими мовами, як пітон.
Спробуйте скористатися:
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
.