Cách nhận và sử dụng số lượng của mỗi dòng khớp trong lệnh toàn cầu


8

Trong cuốn sách (rất hay) của mình "Pratical Vim", Drew Neil chỉ ra cách thu thập tất cả các dòng có chứa từ "TODO" vào một sổ đăng ký để sử dụng chúng sau này.

Để làm như vậy, anh ta chỉ cần sử dụng một lệnh toàn cầu: :g/TODO/yank A(Vốn Acho phép xảy ra các dòng đến thanh ghi có tên a).

Tôi nghĩ đó là một mẹo khá hay nhưng tôi cần cải thiện nó: Tôi đang cố gắng chèn số dòng trước nội dung của nó. Tôi nghĩ rằng giải pháp sẽ là lấy số dòng và sử dụng nó trong phần cuối của lệnh tôi đã đề cập trước đó. Vấn đề là tôi không biết làm thế nào để có được số dòng này.

Vì vậy, câu hỏi của tôi là: Làm thế nào trong một lệnh toàn cầu tôi có thể có được số dòng phù hợp và làm thế nào tôi có thể sử dụng số này?

Chỉ cần rõ ràng ở đây là một ví dụ. Hãy xem xét tệp này:

1  //TODO: Hey this is a todo
2  int main(void){
3      //TODO: and this is another one
4      printf("Hello world");
5
6      return 0;
7  }

Khi tôi gõ :g/TODO/yank Avà tôi đặt nội dung của thanh ghi vào một tệp tôi nhận được:

//TODO: Hey this is a todo
    //TODO: and this is another one

Những gì tôi muốn nhận được là:

1 //TODO: Hey this is a todo
3    //TODO: and this is another one

Phần thưởng cho yank cũng bao gồm việc thụt dòng, sẽ rất tuyệt nếu tôi có thể loại bỏ nó trực tiếp khỏi lệnh toàn cầu.

Câu trả lời:


7

Một cách để làm điều đó:

  1. xóa sổ đăng ký:

    :let @a=''
    
  2. chắp thêm kết quả tìm kiếm trong đó:

    :g/TODO/let @A = getpos('.')[1] . ' ' . getline('.') . "\n"
    

Re: THƯỞNG loại bỏ thụt lề trong lệnh toàn cầu:

    :g/TODO/let @A = getpos('.')[1] . ' ' . substitute(getline('.'), '^\s*', '', '') . "\n"

1
Cảm ơn đó chính xác là những gì tôi đang tìm kiếm! Tôi không biết getpos()getline()ra lệnh. Ngoài ra, khi bạn trả lời câu hỏi phần thưởng, bạn xứng đáng có một chiếc bánh quy nhảy múa ;)
statox

Một cookie, yay :)
VanLaser

1
@statox Đánh dấu trang này : :help function-list. Đây là một tài liệu tham khảo rất hữu ích. Ngoài ra, +1 cho đề cập đến "Vim thực tế". :)
lcd047

@ lcd047: Wow cảm ơn !! Tôi ước tôi biết mục trợ giúp này trước đây, thật tuyệt khi có danh sách này ở đây. Tài liệu Vim thực sự tuyệt vời! Ngoài ra, tôi khá mới với vim và "Vim thực tế" là Kinh thánh của tôi vào lúc này :)
statox

@Laser cũng là cách nhanh nhất để làm trống thanh aghi ở chế độ bình thường là ghi lại một macro trống với qaqcó thể nó kém thanh lịch hơn giải pháp của bạn nhưng nó hoạt động;) Ngoài ra, giải pháp của bạn có thể được sử dụng trong một vimscript trong khi tôi không nghĩ là có thể của tôi
statox
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.