Làm cách nào tôi buộc [tính] <Cx> rời khỏi các số 0 đứng đầu?


8

Bối cảnh

Tôi sử dụng vifmlàm trình quản lý tệp của mình (tôi không biết chủ đề ở đây, nhưng tôi vẫn tiếp tục đọc) cho phép tôi chỉnh sửa tên tệp trong vimbộ đệm.

Một vấn đề tôi thấy khó chịu là các tệp được đánh số mà tôi muốn giữ các số 0 đứng đầu (ví dụ movie0001.webm). Tôi không thể lấy vim để định dạng chúng đúng cách.

Câu hỏi

Tôi có một vimbộ đệm chứa:

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

Và con trỏ của tôi bắt đầu ở mdòng đầu tiên. Sau đó tôi làm VGđể đánh dấu mọi thứ và 69<C-x>biến nó thành:

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

Nhưng tôi thực sự muốn đạt được điều này thay vào đó:

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

Những gì tôi đã cố gắng

Vấn đề với các số có số 0 đứng đầu là vimsẽ xử lý chúng như octalvậy, do đó tôi đã thay đổi nrformatsthành một chuỗi trống:

:set nrformats=

Tuy nhiên, điều đó không giúp được gì. Tôi đã tìm kiếm xung quanh trong :h nrformatsmà không tìm thấy bất cứ điều gì hữu ích.


3
Nghe có vẻ giống như một công việc cho :subsitute+printf
muru

Câu trả lời:


6

Điều này có thể được thực hiện trong hai bước tương đối đơn giản:

  1. Giảm các dòng với ctrl-x
  2. Chạy một nhóm thế trên các dòng đã thay đổi để thêm các số 0 đứng đầu: '[,']s/\d\@<!\d\>/0\0/

Bạn có thể biến nó thành một lệnh / chức năng nếu bạn nghĩ rằng bạn sẽ cần phải làm điều này thường xuyên.

Một cách khác là làm như muru đã đề cập và sử dụng substitute+ printf, có thể duy trì độ dài chuỗi của các chữ số được thay thế:

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

Điều này cũng có thể được biến thành một lệnh tái sử dụng:

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

Mà bạn có thể chạy với :'<,'>Decr 69để giảm các dòng hình ảnh bằng 69.


Tôi vẫn đang học viscriptnhưng len(submatch(0))là một mẹo hay. Đã thêm nó vào của tôi vimrc, và cũng thêm một Incrlệnh.
grochmal

7

Mặc dù tôi chắc chắn sẽ sử dụng :s+ printfcho các thay thế phức tạp, tôi có thể đạt được hiệu quả mà bạn mong muốn nếu tôi bắt đầu 00và có set nrformats-=octal. Đó là:

  1. Chọn các số trong một khối trực quan:

    nhập mô tả hình ảnh ở đây

    Lưu ý rằng tôi đã thêm mov76.webm- bạn thực sự không có mười tệp trong danh sách ví dụ của mình.

  2. Thay thế bằng số không và chọn lại cùng một vùng: r0gv

    nhập mô tả hình ảnh ở đây

  3. Sử dụng g<c-a>:

    nhập mô tả hình ảnh ở đây

Nếu không set nrformats-=octal, bạn sẽ thấy 010, 011vv


0Nhìn của bạn giống như đôi mắt. Rùng mình.
romainl

Ooops, đó là một sai lầm với mov76.webm, tôi đã sử dụng một thư mục xấu. Tôi chỉnh sửa câu hỏi. Yay, cho phông chữ andale .
hóa dầu

@grochmal Đó là phông chữ Ubuntu Mono. : D
muru

@romainl và bây giờ tôi không thể xem được.
muru
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.