Cara mendapatkan dan menggunakan nomor setiap baris yang cocok dalam perintah global

8

Dalam bukunya (sangat baik) bukunya "Pratical Vim" Drew Neil menunjukkan bagaimana mengumpulkan semua baris yang mengandung kata "TODO" ke dalam register untuk menggunakannya kemudian.

Untuk melakukannya dia cukup menggunakan perintah global: :g/TODO/yank A(Modal Amemungkinkan terjadi baris ke register bernama a).

Saya pikir itu trik yang sangat keren tapi saya harus memperbaikinya: Saya mencoba memasukkan jumlah baris sebelum kontennya. Saya pikir solusinya adalah dengan mendapatkan nomor baris dan menggunakannya di bagian terakhir dari perintah yang saya sebutkan sebelumnya. Masalahnya adalah saya tidak tahu cara mendapatkan nomor baris ini.

Jadi pertanyaan saya adalah: Bagaimana dalam perintah global saya bisa mendapatkan nomor dari baris yang cocok dan bagaimana saya bisa menggunakan nomor ini?

Untuk lebih jelasnya di sini adalah contoh. Mari pertimbangkan file ini:

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  }

Ketika saya mengetik :g/TODO/yank Adan saya memasukkan konten register ke dalam file, saya mendapatkan:

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

Yang ingin saya dapatkan adalah:

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

Bonus yank juga termasuk lekukan garis, akan sangat keren jika saya bisa menghapusnya langsung dari perintah global.

statox
sumber

Jawaban:

7

Salah satu cara untuk melakukannya:

  1. kosongkan register:

    :let @a=''
    
  2. tambahkan hasil pencarian di dalamnya:

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

Re: BONUS menghapus indentasi dalam perintah global:

    :g/TODO/let @A = getpos('.')[1] . ' ' . substitute(getline('.'), '^\s*', '', '') . "\n"
VanLaser
sumber
1
Terima kasih, itulah tepatnya yang saya cari! Saya tidak tahu getpos()dan getline()perintah. Juga saat Anda menjawab pertanyaan bonus, Anda layak mendapatkan kue menari ;)
statox
Cookie, yay :)
VanLaser
1
@statox Bookmark ini: :help function-list. Ini referensi yang sangat berguna. Juga, +1 untuk penyebutan "Praktis Vim". :)
lcd047
@ lcd047: Wow terima kasih !! Saya berharap saya tahu entri bantuan ini sebelumnya, itu sangat bagus untuk memiliki daftar ini di sini. Dokumentasi Vim benar-benar luar biasa! Juga yay saya cukup baru untuk vim dan "Praktis Vim" adalah Alkitab saya saat ini :)
statox
@ Laser juga cara tercepat untuk mengosongkan aregister dalam mode normal adalah untuk merekam makro kosong dengan qaqmungkin itu kurang elegan daripada solusi Anda tetapi bekerja;) Juga solusi Anda dapat digunakan dalam vimscript sedangkan saya tidak berpikir itu mungkin dengan Milikku.
statox