Câu hỏi này gần giống với this question ngoại trừ việc tôi phải đi đến ba khoảng trắng (hướng dẫn mã hóa công ty) thay vì bốn và giải pháp được chấp nhận sẽ chỉ tăng gấp đôi mẫu phù hợp. Đây là nỗ lực đầu tiên của tôi:Làm cách nào để định dạng lại tệp nguồn để chuyển từ 2 khoảng trống đến 3?
:%s/^\(\s\s\)\+/\1 /gc
Nhưng điều này không hiệu quả vì bốn dấu cách được thay thế bằng ba dấu cách. Vì vậy, tôi nghĩ rằng những gì tôi cần là một số cách để đếm số lần mẫu khớp với dấu "+" và sử dụng số đó để tạo mặt khác của sự thay thế nhưng tôi cảm thấy chức năng này có lẽ không có sẵn trong regex của Vim (Hãy để tôi biết nếu bạn nghĩ rằng nó có thể là có thể).
Tôi cũng đã cố gắng làm việc thay thế bằng tay bằng cách thay thế indents lớn nhất đầu tiên và sau đó là thụt lề nhỏ hơn tiếp theo cho đến khi tôi đã nhận nó tất cả các chuyển đổi nhưng điều này thật khó để theo dõi các không gian:
:%s/^ \(\S\)/ \1/gc
tôi có thể gửi nó thông qua Perl vì nó có vẻ như Perl có thể có khả năng làm điều đó với Extended Patterns của nó. Nhưng tôi không thể làm cho nó hoạt động với phiên bản Perl của tôi. Đây là nỗ lực của tôi với cố gắng để đếm của:
:%!perl -pe 'm<(?{ $cnt = 0 })(a(?{ local $cnt = $cnt + 1; }))*aaaa(?{ $res = $cnt })>x; print $res'
phương sách cuối cùng của tôi sẽ viết một kịch bản Perl để làm việc chuyển đổi nhưng tôi đã hy vọng cho một giải pháp tổng quát hơn trong Vim để tôi có thể tái sử dụng các ý tưởng giải quyết các vấn đề khác trong tương lai.
Có thể;) – Amadan
Cảm ơn Amadan, được đánh dấu là câu trả lời đúng. Tôi tự hỏi liệu có ai đó có thể cho tôi xem giải pháp có thể trông như thế nào nếu nó được gửi qua Perl regex cũng như tôi có thể có dịp cần làm điều đó trong một tập lệnh không? – stephenmm
Liên quan: [Re-indenting badly indented code] (http://vi.stackexchange.com/q/236/467) tại Vim SE – kenorb