Tái thụt mã xấu thụt lề


39

Tôi thích tính năng thụt lề thông minh của Vim, nó cho phép tôi tạo các khối mã được thụt lề tốt.

Tôi thường xuyên sao chép / dán mã vào bộ đệm, nhưng mã đó thường được định dạng kém.

Điều lý tưởng là "xử lý lại" mã thông qua hệ thống thụt lề thông minh.

Là một điều như vậy có thể?

Ví dụ: làm thế nào bạn sẽ 'sửa' mã sau đây (trích xuất từ ​​một khối lớn hơn - Tôi không muốn sửa từng dòng một cách thủ công ...):

    else 
                {
                        m[c] = 5;
                Finished = true;
std::cout<<"(ID,R,E)"<<"-->"<<"("<<g[c]<<","<<r[c]<<","<<E1 <<")"<< std::endl;
std::cout << "\n"<<"finish-->" << r[c] << "\t" <<"E1-->"<< E1 <<"\n" ;
                }
        }

1
Bạn đang nói về việc dán mã ban đầu được thụt lề kém hoặc mã thụt lề đúng cách sẽ thay đổi khi bạn dán mã vào Vim?
jamessan 4/2/2015

Các mã dán được thụt lề kém để bắt đầu với. Hãy để tôi đưa vào một ví dụ ....
rolfl 4/215

Câu trả lời:


48

Tôi làm điều này một trong hai cách.

Dán điều chỉnh thụt lề

Đầu tiên, nếu mã trong bộ đệm được định dạng, nhưng ở một mức độ thụt khác, tôi sử dụng ]pthay vì p, để dán mã như hiện tại, nhưng với sự thụt lề được dịch chuyển sao cho dòng đầu tiên được dán có cùng độ sâu với dòng I 'm trên.

Nguồn EG được sao chép vào bộ đệm

while (1) {
    dostuff();
}

Kết quả EG của việc dán nó với ]p

int myfunc() {
    int i = 5; /* Cursor on this line before paste */
    while (1) {
        dostuff();
    }
 }

vim đặt trong khi ở cùng mức thụt đầu dòng như int i. Điều này là nhanh chóng, nhưng chỉ hoạt động nếu mã được sao chép được thụt lề chính xác trong chính nó.

Định dạng lại sau khi dán

Các =nhà điều hành trong định dạng lại vim mã dựa trên các quy tắc định dạng cấu hình. Đối với các đoạn dán ngắn, tôi sẽ chuyển sang chế độ trực quan v, chọn các dòng tôi vừa dán và sau đó nhấn =để định dạng lại chúng.

Đối với các loại bột nhão lớn hơn, tôi tận dụng thực tế là con trỏ đi đến dòng được dán đầu tiên và vim nói một cái gì đó như "84 dòng nữa". Sau đó tôi có thể nhập 84==để chỉnh lại 84 dòng đó (tất nhiên, thay thế 84 bằng số dòng bạn thực sự dán).

Tài liệu tham khảo

:help ]p để điều chỉnh thụt lề

:help =bìa ={motion}, [count]=={Visual}=để lọc thông qua tùy chỉnh hoặc được xây dựng trong quy tắc thụt lề


6
Bạn có thể chọn độc đáo mã bạn đã dán trong chế độ trực quan bằng cách sử dụng `[v`]
craigp

1
@Badger Chỉ cần làm rõ, đó là backtick-ngoặc-v-backtick-ngoặc?
phatskat

1
yup .. textarea
hoảng hốt

Toán tử = trong vim định dạng lại mã dựa trên các quy tắc định dạng được định cấu hình tôi sẽ cung cấp +100 nếu có thể. Tôi có thể có những ngày tiết kiệm.
Wossname

1
Tôi sử dụng <control + R> "để dán, để tôi không phải rời khỏi chế độ chèn.] P tương đương với <control + R>" là gì?
A --- B

15

Các =lệnh có thể được sử dụng để reindent.

Giống như hầu hết các lệnh chế độ thông thường, nó có thể được áp dụng cho một chuyển động, vì vậy bạn có thể giới thiệu lại mã vừa dán =']. Điều này nhắc lại từ vị trí con trỏ hiện tại đến ']dấu, đó là dòng cuối cùng của dán.

= cũng có thể được sử dụng từ chế độ trực quan.

Một lệnh hữu ích khác là ]p, dán ở mức thụt lề tương tự như dòng hiện tại. Điều này có thể giúp dán văn bản thụt lề đúng cách, mặc dù ở độ sâu thụt lề khác, phù hợp với văn bản xung quanh.


7

Sử dụng =ap (mnemonic là 'định dạng một đoạn') sẽ có vim cố gắng tự động định dạng đoạn hiện tại.

Nếu bạn muốn chú ý cẩn thận đến những gì bạn có khả năng định dạng lại, bạn có thể thấy nó an toàn hơn và nhanh hơn để sử dụng vapđể chọn trực quan đoạn hiện tại (cung cấp cho bạn một dấu hiệu trực quan về những gì đang được định dạng lại), tiếp theo =. Tôi thấy điều này hữu ích trong các tệp mà tôi biết rằng vim sẽ định dạng lại không chính xác và tôi không muốn định dạng sai các dòng khác.


4

Để giới thiệu lại một tệp đã có trong bộ đệm, hãy sử dụng gg=G: Xem Sửa lỗi thụt lề

Để giới thiệu lại một phần của tệp, nhiều giới hạn khác nhau có thể được áp dụng cho =bộ lọc (ví dụ: ==chỉ sửa lỗi dòng hiện tại).

Để giữ cho vết lõm không thay đổi khi dán văn bản bạn có thể :set pastetrước khi dán văn bản vào bộ đệm, điều này sẽ ngăn vim tự động thụt lề văn bản mà bạn vừa dán. Sau khi dán công cụ, bạn có thể quay lại sử dụng set :nopastekhi hoàn tất. Xem vimdoc tại đây .

Nếu bạn thấy mình thường xuyên dán nội dung, bạn nên sử dụng mẹo này trên VimWiki và thiết lập khóa để chuyển đổi "chế độ dán" bằng cách thêm các dòng này vào .vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

Sau đó, bạn có thể nhấn <F2>để chuyển đổi chế độ dán. vim sẽ hiển thị các từ "PASTE" trong dòng trạng thái khi chế độ dán được kích hoạt.


2
Câu hỏi này không phải là về việc dán mã với thụt lề, mà là về việc sửa mã thụt lề kém.
rolfl

4
Tôi không thấy bình luận bạn đăng. Tuy nhiên, bạn vẫn có thể sử dụng gg=Gđể giới thiệu lại toàn bộ tệp.
Bhargav Bhat

@rolfl Đó là nơi tôi thường bắt đầu trong những trường hợp như vậy : gg=G, sau đó nhìn vào những phần vimbị sai.
muru

Nếu bạn muốn kiểm soát nhiều hơn (hoặc giảm rắc rối lặp đi lặp lại), hãy xem xét thêm lệnh tự động để gọi một công cụ định dạng mã như astylekhi bạn lưu bộ đệm. Xem câu hỏi này trên SO để biết chi tiết.
Bhargav Bhat

2

Để tự động thụt lại toàn bộ khối của khối được đặt trong ngoặc hoặc đặt dấu ngoặc, đặt con trỏ của bạn trên cùng một dòng trong đó là dấu ngoặc và thử =%. Để thay đổi độ rộng ca của bạn, sử dụng ví dụ :set sw=2.

Nếu điều này sẽ không làm việc như mong đợi, để giảm thụt lề bằng tay ( outdent ), hãy thử <%và lặp lại với .(nếu cần thiết). Sử dụng >%cho ngược lại.

Vì thế:

else
       {
         // some code
       }

trở thành:

else
{
  // some code
}

Đối với mã cụ thể, để tự động thụt lại một dòng hoặc một vài dòng, hãy thử:

  • == để thụt lại dòng hiện tại
  • 5== để thụt lại 5 dòng

Để tăng / giảm thụt lề thủ công cho một dòng hoặc một vài dòng, hãy thử:

  • << để loại bỏ dòng hiện tại bằng không gian băng thông
  • 5<< để loại bỏ 5 dòng theo không gian băng thông
  • >> để thụt dòng hiện tại bằng không gian băng thông
  • 5>> để thụt lề 5 dòng bằng không gian băng thông
  • . lặp lại nếu cần thiết

Bạn cũng có thể thực hiện thụt lề trong chế độ trực quan ( v) bằng cách chọn văn bản và nhấn =(tự động thụt lề), <(thụt lề) hoặc >(thụt lề).

Một mẹo khác là sửa lỗi thụt lề của toàn bộ tệp bằng cách : gg=G.

Nếu bạn có các tab thay vì dấu cách, hãy sử dụng: :retabsẽ thay thế tất cả các Tab bằng dấu cách (Xem: Cách thay thế các tab bằng dấu cách? ).


Đối với các phương thức bên ngoài, bạn có thể thử:

  • pythonTidy để định dạng lại mã Python, vd:

    :%!pythonTidy
    

Liên quan:


1

Gần đây tôi đã cài đặt vim-pasta ( https://github.com/sickill/vim-pasta ) và điều đó dường như cải thiện việc thụt mã khi tôi dán. README cũng có một số thảo luận tốt về các chiến lược dán mã khác nhau.


1

Đã có rất nhiều điều được đề cập trong các câu trả lời hiện có. Tôi chỉ muốn thêm một ánh xạ mà tôi sử dụng rất thường xuyên để thụt lề.

nnoremap <Leader>i  mzgg=G`z

Tôi đã thấy một số vimrc với ánh xạ này ===.

Dù bằng cách nào thì đây là một ánh xạ tuyệt vời để có và tôi sử dụng nó hầu như mọi lúc, đặc biệt là khi dán mã được sao chép từ một nơi khác.

Hoặc thậm chí tốt hơn là đặt cái này vào autocmdđể Vim thụt nó ngay trước khi bạn ghi các thay đổi vào đĩa.

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.