1 - Nếu bạn có không gian và muốn các tab.
Đầu tiên, bạn cần quyết định có bao nhiêu khoảng trống sẽ có một tab. Điều đó nói rằng, giả sử bạn có các dòng có 4 khoảng trắng hàng đầu hoặc 8 ... Hơn bạn nhận ra rằng bạn có thể muốn một tab là 4 khoảng trắng. Bây giờ với thông tin đó, bạn làm:
:set ts=4
:set noet
:%retab!
Có một vấn đề ở đây! Chuỗi lệnh này sẽ tìm kiếm tất cả văn bản của bạn, không chỉ khoảng trắng ở đầu dòng. Điều đó có nghĩa là một chuỗi như: "Hey,␣this␣␣␣␣is␣4␣spaces"
sẽ trở thành "Hey,␣this⇥is␣4␣spaces"
, nhưng nó không! đó là một tab!.
Để giải quyết vấn đề nhỏ này, tôi khuyên bạn nên search
thay vì retab
.
:%s/^\(^I*\)␣␣␣␣/\1^I/g
Tìm kiếm này sẽ tìm trong toàn bộ tệp cho bất kỳ dòng nào bắt đầu bằng bất kỳ số lượng tab nào, theo sau là 4 khoảng trắng và thay thế nó cho bất kỳ số lượng tab nào nó tìm thấy cộng với một dòng.
Thật không may, điều này sẽ không chạy ngay lập tức!
Lúc đầu, tập tin sẽ có các dòng bắt đầu bằng dấu cách. Sau đó, tìm kiếm sẽ chỉ chuyển đổi 4 khoảng trắng đầu tiên thành một tab và để ...
Bạn cần lặp lại lệnh. Bao nhiêu lần? Cho đến khi bạn nhận được một pattern not found
. Tôi không thể nghĩ ra cách nào để tự động hóa quy trình này. Nhưng nếu bạn làm:
`10@:`
Bạn có thể đã hoàn thành. Lệnh này lặp lại lần tìm kiếm / thay thế cuối cùng trong 10 lần. Nó không có khả năng chương trình của bạn sẽ có rất nhiều thụt lề. Nếu có, chỉ cần lặp lại một lần nữa @@
.
Bây giờ, chỉ để hoàn thành câu trả lời. Tôi biết bạn đã yêu cầu ngược lại, nhưng bạn không bao giờ biết khi nào bạn cần hoàn tác mọi thứ.
2 - Bạn có các tab và muốn có khoảng trắng.
Đầu tiên, quyết định có bao nhiêu khoảng trống bạn muốn các tab của bạn được chuyển đổi thành. Hãy nói rằng bạn muốn mỗi tab là 2 dấu cách. Sau đó, bạn làm:
:set ts=2
:set et
:%retab!
Điều này sẽ có cùng một vấn đề với chuỗi. Nhưng vì phong cách lập trình tốt hơn của nó để không sử dụng các tab cứng bên trong chuỗi, bạn thực sự đang làm một điều tốt ở đây. Nếu bạn thực sự cần một tab bên trong một chuỗi, sử dụng \t
.
sed "s/ +/`echo -e '\t'`/g" < input.py > output.py
) xuất hiện để chuyển đổi tất cả các khoảng trắng, không chỉ các khoảng trắng hàng đầu. Trong ví dụ thứ hai (sed "s/^ +/`echo -e '\t'`/g" < input.py > output.py
) nó chỉ thay thế khoảng trắng đầu tiên trên mỗi dòng bằng một tab và để lại phần còn lại của chúng.