2013-06-03 41 views
74

Tôi đã sao chép một số mã từ Internet có thụt lề 2 dấu cách và tôi muốn thay đổi nó thành thụt lề 4 dấu cách. Tôi tự hỏi nếu có một thói quen vim ngắn để hoàn thành nhiệm vụ mà không cần phải viết kịch bản vim? Đây là cách tôi đang làm việc đó với một tập tin HTML:Thay đổi thụt lề 2 dấu cách thành 4 dấu cách trong vim

  • Ghi macro
  • Chuyển đến đầu dòng
  • trực quan chọn tất cả các khoảng trắng cho đến sự xuất hiện đầu tiên của "<"
  • Yank và dán tất cả các khoảng trắng (về cơ bản sẽ tăng gấp đôi chúng)
  • Replay vĩ mô đến cuối của tập tin

Nói tóm lại 01.

cạm bẫy:

vĩ mô không cho một dòng trống hoặc một dòng mà không bắt đầu bằng "<". Và tôi không biết cách mở rộng giải pháp này thành tệp không phải HTML.

Trả lời

142

Một cách tổng quát của việc thay đổi thụt lề là bằng cách thay đổi tabstop:

Dán tập tin của bạn vào một bộ đệm trống , sau đó:

:set ts=2 sts=2 noet 
:retab! 

này thay đổi mỗi 2 không gian để một nhân vật TAB, sau đó:

:set ts=4 sts=4 et 
:retab 

Điều này thay đổi mọi TAB thành 4 dấu cách.

Lợi thế của phương pháp này là bạn cũng có thể sử dụng nó theo cách khác, để chuyển đổi từ 4 đến 2 khoảng trống chẳng hạn.

+0

Một chút phức tạp, nhưng là một cách tốt đẹp để giải quyết vấn đề. –

+0

Thật tuyệt vời! – 0xc0de

+10

@ XavierT.I thực sự nghĩ câu trả lời này khá dễ hiểu. Và có thể nó sẽ rõ ràng hơn nếu tên lệnh ngắn được thay thế bằng tên đầy đủ của chúng: 'ts': =' tabstop', 'sts': =' softtabstop' và '[no] et': =' [no] expandtab '. – YaOzI

46

Có thể với :set shiftwidth=4gg=G.

+0

Lưu ý rằng nếu cách này không hiệu quả, bạn có thể bật chế độ có ảnh hưởng khác đến thụt đầu dòng. –

+6

Chà. Tôi không biết về 'gg = G'. Cảm ơn bạn. –

+1

Mặc dù câu hỏi không phải là về một giải pháp chung, xin lưu ý rằng điều này không hoạt động luôn, đặc biệt với mã python. – 0xc0de

2

tôi đã sử dụng biểu thức chính quy này (nó tăng gấp đôi số lượng chỗ hàng đầu):

%s;^\(\s\+\);\=repeat(' ', len(submatch(0))*2);g 
+0

cảm ơn bạn! Đây là những gì tôi đang tìm kiếm. –

+0

không '% s/\ s \ +/&& /' làm điều tương tự? Btw, tôi nghĩ cờ 'g' là không cần thiết (cho một, sẽ chỉ có 1 kết hợp với'^pattern' trong mỗi dòng, không?) – doubleDown

+0

Cảm ơn bạn đã chỉ ra '&'. Tôi có một chút chỉnh sửa đối với của bạn chủ yếu là do bạn quên '^' '% s/^ \ s \ +/&&/g' gần hơn. – cforbish

1

tương tự (nhưng hơi đơn giản) để trả lời cforbish của, regex này sẽ lặp lại trong các không gian hàng đầu

:%s/^\(\+\)/\1\1 

Hoặc bạn có thể sử dụng regex khác này để chuyển đổi 2-không gian thành 4-không gian, bảo quản đơn không gian (và tiền lẻ nói chung)

:%s/^\(\( \)\+\)/\1\1 

Đó là,

  • 1 không gian ⇢ 1 không gian
  • 2 không gian ⇢ 4 chỗ
  • 3 chỗ ⇢ 5 ô trống
  • 4 chỗ ⇢ 8 gian
23

Những gì tôi làm là rất giống với esneider và cách tiếp cận cforbish của, nhưng một chút nhanh hơn để gõ:

:%s/^\s*/&& 

Đơn giản chỉ cần thay thế không gian (khoảng trắng hoặc tab) với hai lần không gian càng nhiều lãnh đạo hàng đầu (& là subst với biểu thức phù hợp).

+2

Điều này rất tiện lợi vì nó hoạt động với lựa chọn trực quan (V), chỉ cần thả '%'. –

+0

Tôi thích điều này cũng như b/c nó không gây rối với bất kỳ liên kết hướng dẫn sử dụng của bảng tôi có trong ý kiến ​​vv – stephenmm

+0

@TrevorRobinson Hai câu trả lời hàng đầu cũng làm việc trên phạm vi. –

-1

Đây là một câu hỏi rất cũ, tuy nhiên tất cả các câu trả lời là ... sai ... Vim có một cách rất dễ dàng để reindent toàn bộ tập tin. Tôi học được điều này sau khi viết chức năng riêng của tôi để làm điều đó, vì vậy tôi ở lại trên thuyền vô minh cùng;)

loại

gg=G 

này giả định rằng bạn đã tabstop bạn thiết lập để những gì bạn thích, (như vậy cho OP nó sẽ là ts = 4)

tôi học được điều này từ http://vim.wikia.com/wiki/Fix_indentation, mà đề cập

Trong chế độ bình thường, gõ gg = G sẽ reindent toàn bộ tập tin. Đây là trường hợp đặc biệt; = là toán tử. Cũng giống như d hoặc y, nó sẽ hoạt động trên bất kỳ văn bản nào mà bạn di chuyển qua bằng lệnh chuyển động con trỏ. Trong trường hợp này, gg định vị con trỏ trên dòng đầu tiên, sau đó = G re-indents từ vị trí con trỏ hiện tại đến cuối bộ đệm.

+2

1. Nếu bạn cuộn xuống tất cả các cách ở phía dưới, bạn sẽ thấy câu trả lời đề cập đến gg = G. 2. Nó không phải lúc nào cũng hiệu quả. –

Các vấn đề liên quan