Bagaimana saya memaksa [menghitung] <Cx> untuk meninggalkan angka nol di depan?

8

Konteks

Saya menggunakan vifmsebagai manajer file saya (itu di luar topik di sini, saya tahu, tetapi terus membaca) yang memungkinkan saya untuk mengedit nama file di dalam vimbuffer.

Salah satu masalah yang membuat saya jengkel adalah file bernomor tempat saya ingin tetap memimpin nol (mis movie0001.webm.). Saya tidak bisa mendapatkan vim untuk memformatnya dengan benar.

Pertanyaan

Saya memiliki vimbuffer yang berisi:

mov70.webm
mov71.webm
mov72.webm
mov73.webm
mov74.webm
mov75.webm
mov76.webm
mov77.webm
mov78.webm
mov79.webm

Dan kursor saya dimulai pada mbaris pertama. Saya kemudian lakukan VGuntuk menandai semuanya dan 69<C-x>mengubahnya menjadi:

mov1.webm
mov2.webm
mov3.webm
mov4.webm
mov5.webm
mov6.webm
mov7.webm
mov8.webm
mov9.webm
mov10.webm

Tapi saya benar-benar ingin mencapai ini sebagai gantinya:

mov01.webm
mov02.webm
mov03.webm
mov04.webm
mov05.webm
mov06.webm
mov07.webm
mov08.webm
mov09.webm
mov10.webm

Apa yang saya coba

Masalah dengan angka-angka dengan nol di depan adalah yang vimakan memperlakukan mereka sebagai octal, oleh karena itu saya berubah nrformatsmenjadi string kosong:

:set nrformats=

Namun, itu tidak membantu. Saya telah mencari-cari :h nrformatstanpa menemukan sesuatu yang bermanfaat.

grochmal
sumber
3
Kedengarannya lebih seperti pekerjaan untuk :subsitute+printf
muru

Jawaban:

6

Ini dapat dilakukan dalam dua langkah yang relatif sederhana:

  1. Mengurangi garis dengan ctrl-x
  2. Jalankan subtitusi pada baris yang diubah untuk menambahkan nol di depan: '[,']s/\d\@<!\d\>/0\0/

Anda bisa mengubahnya menjadi perintah / fungsi jika Anda pikir Anda harus sering melakukannya.

Cara lain adalah melakukan seperti yang disebutkan muru dan menggunakan substitute+ printf, yang dapat mempertahankan panjang string dari digit yang diganti:

'<,'>s/\d\+/\=printf('%0*d', len(submatch(0)), submatch(0) - 69)

Ini juga bisa diubah menjadi perintah yang dapat digunakan kembali:

command! -nargs=1 -range Decr <line1>,<line2>s/\d\+/\=printf('%0*d', len(submatch(0)), submatch(0) - <args>)

Yang bisa Anda jalankan dengan :'<,'>Decr 69mengurangi garis visual sebanyak 69.

Tommy A
sumber
Saya masih belajar viscripttetapi len(submatch(0))merupakan trik yang bagus. Menambahkannya ke saya vimrc, dan juga menambahkan Incrperintah.
grochmal
7

Meskipun saya pasti akan menggunakan :s+ printfuntuk penggantian kompleks, saya bisa mendapatkan efek yang Anda inginkan jika saya mulai dari 00, dan sudah set nrformats-=octal. Itu adalah:

  1. Pilih angka dalam blok visual:

    masukkan deskripsi gambar di sini

    Perhatikan bahwa saya telah menambahkan mov76.webm- Anda sebenarnya tidak memiliki sepuluh file dalam daftar contoh Anda.

  2. Ganti dengan nol dan pilih wilayah yang sama lagi: r0gv

    masukkan deskripsi gambar di sini

  3. Gunakan g<c-a>:

    masukkan deskripsi gambar di sini

Tanpa set nrformats-=octal, Anda akan melihat 010, 011dll

muru
sumber
Anda 0lihat seperti mata. Mengerikan.
romainl
Ooops, itu kesalahan dengan mov76.webm, saya menggunakan direktori yang buruk. Saya mengedit pertanyaan. Yay, untuk font andale .
grochmal
@ grochmal Itulah font Ubuntu Mono. : D
muru
@romainl dan sekarang saya tidak bisa mengabaikannya.
muru