Làm cách nào để sửa lỗi thụt lề của toàn bộ tệp trong Vi?


625

Trong Vim, lệnh sửa lỗi thụt dòng của tất cả các dòng là gì?

Thường thì tôi sẽ sao chép và dán mã vào một thiết bị đầu cuối từ xa và làm cho toàn bộ sự việc bị rối tung. Tôi muốn khắc phục điều này trong một cú trượt ngã.


Tương tự: Tái thụt mã thụt lề kém tại Vi SE
kenorb

8
Phòng bệnh hơn chữa bệnh. Trong tinh thần đó nhận xét này. Thực hiện ": set paste" trước khi vào chế độ chèn và dán mã từ thiết bị đầu cuối từ xa.
Dự án Chthonic

Câu trả lời:


1215

=, lệnh thụt lề có thể có chuyển động. Vì vậy, ggđể bắt đầu tập tin, =thụt lề, Gđến cuối tập tin , gg=G.


39
Tôi sẽ không bao giờ có thể hủy bỏ 1G quý giá của mình =) Một trong những mục yêu thích của tôi là =% đứng trên khung mở. Nó sửa các vết lõm của toàn bộ khối.
PEZ

2
: 0 <return> không tệ lắm nhưng gg rất hay. (vâng, tôi đã học ed trước)
Erik Olson

8
Tôi có thể thụt lề toàn bộ tệp mà không cần rời khỏi dòng hiện tại không?
Fábio Perez

86
@ Fábio: ''(hai trích dẫn đơn) đưa bạn trở lại nơi bạn đã ở nên gg=G''nên thụt lề sau đó quay trở lại.
Nemo157

@ArchimedesTrajano Mac OS stock stock vim rất cũ, tôi khuyên dùng phiên bản của HomeBrew; nó mới hơn nhiều. Tôi đã có một số vấn đề gây phiền nhiễu với vim của Mac. Ngoài ra, tôi nghe nói rằng bạn không nên lộn xộn với cái tích hợp sẵn, vì vậy đừng cố gắng tự cập nhật nó trừ khi bạn rất cẩn thận.
AlexMA

126

Trước khi dán vào thiết bị đầu cuối, hãy thử :set pastevà sau đó :set nopastesau khi bạn hoàn thành. Điều này sẽ tắt tính năng tự động thụt lề, ngắt dòng và các tính năng khác đang làm rối quá trình dán của bạn.

chỉnh sửa: Ngoài ra, tôi nên chỉ ra rằng một kết quả tốt hơn nhiều so với =thụt lề thường có thể thu được bằng cách sử dụng một chương trình bên ngoài. Ví dụ, tôi chạy :%!perltidymọi lúc. astyle, cindentvv cũng có thể được sử dụng. Và, tất nhiên, bạn có thể ánh xạ các phím đó thành một nét chính và ánh xạ các phím khác nhau vào cùng một tổ hợp phím tùy thuộc vào loại tệp.


5
Bạn có thể đặt equalprgtùy chọn trong ftplugin để sử dụng bộ lọc ngoài để =thụt lề, thay vì gắn phím tùy chỉnh.
Josh Lee

Cũng có một tùy chọn khóa phím quá khứ, ví dụ. : đặt pt \ p để lật giữa các chế độ
michael

Lưu ý: trong vimconfig của grml, khóa pastetoggle được ánh xạ tới F11
Thomas

Tôi sử dụng formatpgmvới gọn gàng và astyle và sau đó gq. Dưới đây là một số ví dụ từ tôi .vimrc: au FileType xml set fp=tidy\ -q\ -i\ -xmlau FileType java set fp=/usr/local/bin/astyle\ --mode=java\ --indent=tab
Raffi Khatchadourian

vừa tải xuống perltidy sau khi đọc nó, nó tốt hơn nhiều so với thụt lề tự động vim mặc định
Joey Ciechanowicz

29

Nếu bạn muốn giới thiệu lại khối bạn đang ở mà không cần phải gõ bất kỳ hợp âm nào, bạn có thể làm:

[[=]]

1
Xin lỗi để làm sống lại điều này, nhưng ý nghĩa của hợp âm là gì? Coords?
John P

7
"Hợp âm" ở đây đề cập đến các lệnh được phát ra bằng cách giữ một phím trong khi nhấn phím khác, tương tự như hợp âm nhạc là một vài nốt nhạc phát ra cùng một lúc. Vì vậy, G là shift + g, ^] là ctrl +], v.v. Chúng mất nhiều thời gian để gõ hơn các ràng buộc phím đơn.
Ralph Giles

Bạn cũng có thể sử dụng =aBmà sẽ không di chuyển con trỏ cả.
amin

7
Trên bàn phím Bắc Âu, [[=]]yêu cầu 5 hợp âm :(
k4kuz0

29

Bậc thầy của tất cả các lệnh là

gg=G

Điều này thụt lề toàn bộ tập tin!

Và dưới đây là một số lệnh đơn giản và thanh lịch được sử dụng để thụt dòng nhanh chóng trong Vim hoặc gVim.

Để thụt lề tất cả các dòng bên dưới dòng hiện tại

=G

Để thụt dòng hiện tại

==

Để thụt ndòng dưới dòng hiện tại

n==

Ví dụ: để thụt 4 dòng bên dưới dòng hiện tại

4==

Để thụt lề một khối mã, đi đến một trong các dấu ngoặc nhọn và sử dụng lệnh

=%

17

Bạn có thể sử dụng ứng dụng / tiện ích gọn gàng để thụt lề các tệp HTML & XML và nó hoạt động khá tốt trong việc thụt các tệp đó.

Yêu cầu một tệp XML

:!tidy -mi -xml %

Yêu cầu một tệp HTML

:!tidy -mi -html %

16

nhấn thoát và sau đó gõ nhanh kết hợp bên dưới:

gg=G

28
Tôi gõ chậm, bạn sẽ không tin những gì xảy ra tiếp theo.
k0pernikus

Tôi chỉ đưa ra câu trả lời và bình luận một upvote vì đó là vô giá! lol @ k0pernikus
gglass

12

1G=G. Điều đó sẽ thụt lề tất cả các dòng trong tập tin. 1Gđưa bạn dòng đầu tiên, =sẽ bắt đầu tự động thụt lề và cuối cùng Gsẽ đưa bạn dòng cuối cùng trong tệp.


Hoặc thậm chí1gg=G
Biggybi

1G = G đã sửa nó cho tôi. Tuyệt vời!
Natus đã vẽ

8

:set pastelà bạn của bạn, tôi sử dụng putty và cuối cùng sao chép mã giữa các cửa sổ. Trước khi tôi được bật :set paste(và :set nopaste) sao chép / dán đã cho tôi phù hợp với chính lý do đó.


1
Vâng, tôi cũng đang sử dụng putty. : thiết lập dán là tuyệt vời
mmcdole

7

Trong Vim, sử dụng :insert. Điều này sẽ giữ tất cả các định dạng của bạn và không làm tự động. Để biết thêm thông tin help :insert.


7

nếu bạn không muốn sử dụng :set paste, nhấp chuột giữa set nopaste, bạn cũng có thể dán nội dung của bảng tạm:

"*p
"+p

Bằng cách đó bạn không phải rời khỏi chế độ bình thường. nếu bạn phải dán +hoặc *phụ thuộc vào cách bạn chọn văn bản, hãy xem :help quoteplus.


4

vim-autoformat định dạng các tệp nguồn của bạn bằng các chương trình bên ngoài dành riêng cho ngôn ngữ của bạn, ví dụ: đá quý "rbeautify" cho các tệp Ruby, gói npm "js-beautify" cho JavaScript.


3

Đối với các tệp C ++ phức tạp, vim không phải lúc nào cũng có định dạng đúng khi sử dụng =lệnh bộ lọc của vim . Vì vậy, đối với một tình huống như vậy, tốt hơn là sử dụng một trình định dạng C ++ bên ngoài như astyle (hoặc không tin cậy ), vd:

:%!astyle

Hàm '=' của Vim sử dụng trình định dạng bên trong của nó theo mặc định (điều này không phải lúc nào cũng đúng) nhưng người ta cũng có thể đặt nó sử dụng một trình định dạng bên ngoài, như astyle, bằng cách thiết lập nó một cách thích hợp như được thảo luận trong câu hỏi này .



1

Bạn có thể tạo một bản đồ để làm điều này cho bạn.

Cái này sẽ tự động thụt vào toàn bộ tệp và vẫn giữ con trỏ của bạn ở vị trí bạn đang ở:

nmap <leader>ai mzgg=G`z

0

Đối với vi Editor, sử dụng: chèn. Điều này sẽ giữ tất cả định dạng của bạn và không chèn tự động thụt lề. Sau khi thực hiện nhấn thoát để xem tệp được định dạng thực tế nếu không bạn sẽ thấy một số ký tự rác. như ^ tôi ví dụ:

public static void main(String[] args) {
^I
^I System.out.println("Some Garbage printed upon using :insert"); 
}

0

Chỉ cần chuyển đến chế độ trực quan trong vim và chọn từ lên xuống dòng sau khi chọn chỉ cần nhấn =, Tất cả các dòng được chọn sẽ được thụt lề.


Tôi sẽ tránh điều này. Chế độ trực quan dành cho khi bạn không chắc chắn về chuyển động của mình, nếu bạn biết cách chụp một tập hợp các ký tự thì sẽ không có thêm bước nào để rơi vào chế độ trực quan. Tại sao ggvG=khi bạn có thể gg=G. Điểm quan trọng trong việc làm cho chuyển động có thể nhìn thấy là gì? Điều đó đi cho tất cả các hành động mà có chuyển động.
alexte
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.