Câu trả lời:
Bạn có thể sử dụng :retab
lệnh. Từ
:help :retab
Thay thế tất cả các chuỗi khoảng trắng chứa a
<Tab>
bằng các chuỗi khoảng trắng mới bằng cách sử dụng giá trị tabstop mới đã cho. Nếu bạn không chỉ định kích thước tabstop mới hoặc bằng 0, Vim sử dụng giá trị hiện tại là'tabstop'
. [...] Với'expandtab'
bật, Vim thay thế tất cả các tab bằng số lượng khoảng trống thích hợp.
Lưu ý rằng lệnh chấp nhận một phạm vi, vì vậy bạn có thể thực hiện lựa chọn trực quan và sau đó chỉ :retab
các dòng được chọn.
:retab
Tuy nhiên, bạn có thể sử dụng , như đã nêu, điều này sẽ thay đổi tất cả các tab thành khoảng trắng, không chỉ các tab ở đầu dòng
Vì vậy, đây (nơi ⇥
là một nhân vật tab):
if :; do
⇥echo "⇥hello"
end
được thay đổi thành ( ␣
ký tự không gian):
if :; do
␣␣echo "␣␣hello"
end
Điều này có thể tạo ra các tác dụng phụ không mong muốn trong một số trường hợp và nó thậm chí còn gây ra nhiều vấn đề hơn khi thay đổi không gian thành các tab!
Vì vậy, tôi đã viết một hàm nhỏ để chỉ thay đổi các tab / dấu cách ở đầu dòng:
" :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
Với phiên bản này, bạn phải chỉ định thủ công expandtab
trong lệnh gọi hàm (nghĩa là :call Retab(1)
thay đổi tab thành khoảng trắng), nhưng bạn cũng có thể sửa đổi nó để lấy giá trị hiện tại của &expandtab
(như đã làm với &tabstop
) giống như :retab
vậy. (Tôi tình cờ thích chỉ định nó bằng tay).
a
trong if a:expandtab
bình?
set expandtab
trong .vimrc của mình và sau đó autocmd BufWritePre * :call Retab(&expandtab)
- thụt lề sẽ được thay đổi thành các tab, thay vì dấu cách.
Vim cung cấp !retab
lệnh sẽ thay thế tất cả các chuỗi <Tab>
bằng các chuỗi khoảng trắng mới bằng cách sử dụng :set tabstop=2
giá trị tabstop (ví dụ ) mới được cung cấp, nhưng tất cả các tab bên trong chuỗi có thể được sửa đổi (ví dụ: trong chương trình C, bạn nên sử dụng \t
để tránh điều này)!
Vì vậy, thay vào đó, bạn có thể thay đổi tất cả các tab thành khoảng trắng bằng lệnh sau:
:%s/\t/ /g
hoặc theo đề xuất của @Shahbaz :
:%s/^\t\+/ g
Vì vậy, chỉ các tab được sử dụng trong thụt lề được chuyển đổi.
Giải trình:
%
đại diện cho toàn bộ bộ đệm / tệp ( :help :%
)s
là viết tắt của thay thế ( :help sub-replace-special
)\t
hoặc ^I
viết tắt của tab
- sử dụng nhiều khoảng trống bạn cần cho mỗi tabg
- là viết tắt của toàn cầu và nó sẽ chuyển đổi nhiều lần xuất hiện của các tab trong cùng một dòngSau đó, để sửa lỗi thụt lề của toàn bộ tệp, bạn có thể thử : gg=G. Kiểm tra: Tái thụt mã thụt lề xấu để biết thêm chi tiết.
Để sử dụng khoảng trắng theo mặc định thay vì các tab, bạn cần thêm các cài đặt sau vào .vimrc
tệp của mình :
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 >>)
Giải pháp thay thế là sử dụng tidy
Liên quan:
%s/^\t\+/ g
như vậy để chỉ các tab được sử dụng trong thụt lề được chuyển đổi. Ngoài ra, gg=G
có thể là thảm họa với các ngôn ngữ như python.
Hãy thử sử dụng:
expand -t 4 input_filename output_filename
expand
là một công cụ dòng lệnh để chuyển đổi các tab thành khoảng trắng, mà bạn có thể chạy từ shell hoặc với :!expand
.
Đó là trong POSIX vì vậy nó sẽ có sẵn trên hầu hết các hệ thống. unexpand
Nhân tiện, sẽ làm ngược lại.
expand
gì
:%!expand -t 4
bên trong vim. Tốt hơn nữa, bạn cũng có thể sử dụng tùy chọn độ rộng ca hiện tại: :exe '%!expand -t ' . &shiftwidth
Để hoàn thiện, =
cũng có thể được sử dụng để sửa các vết lõm, sau khi bạn đã chỉ định rằng các tab được thay thế bằng dấu cách. Trong chế độ bình thường, bạn có thể làm như vậy bằng cách gõ :set expandtab
. Sau đó =
có thể được sử dụng theo hai cách:
=
sẽ sửa các vết lõm của các khối mã được chọn.gg=G
sẽ sửa toàn bộ tệp, trong đó gg
di chuyển con trỏ đến đầu tệp, sau đó =
được áp dụng và G
di chuyển con trỏ đến cuối tệp.Tham khảo: liên kết
:h vim-faq
và tìm kiếm/tab characters
. Thẻ ghi nhớ khó là:h faq-14.16
.