[count] <Cx>に先行ゼロを強制する方法を教えてください。


8

環境

vifmはファイルマネージャーとして使用します(これはここではトピック外ですが、読み続けます)。これにより、vimバッファー内のファイル名を編集できます。

私がイライラしていることに気付いた1つの問題は、先頭にゼロを付け続けたい番号付きファイルです(例:)movie0001.webm。vimで適切にフォーマットすることができません。

質問

私はvim含むバッファがあります:

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

そして、カーソルmは最初の行のから始まります。次に、VGすべてにマークを付けて、次の69<C-x>ように変換します。

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

しかし、私は実際にこれに到達したいと思います:

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

私が試したこと

先頭にゼロが付いている数値の問題は、数値がvimとして扱われるoctalためnrformats、空の文字列に変更しました。

:set nrformats=

それでも、それは助けにはなりませんでした。:h nrformats何も役に立たずに探し回ってみました。


3
:subsitute+の仕事のように聞こえるprintf
muru

回答:


6

これは、次の2つの比較的簡単な手順で実行できます。

  1. で行を減らす ctrl-x
  2. 変更された行で置換を実行して、先行ゼロを追加します。 '[,']s/\d\@<!\d\>/0\0/

これを頻繁に行う必要があると思われる場合は、それをコマンド/関数に変えることができます。

別の方法は、muruが述べたようにしてsubstitute+ を使用するprintfことです。これにより、置き換えられた数字の文字列長を保持できます。

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

これは再利用可能なコマンドに変えることもできます:

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

:'<,'>Decr 69ビジュアルラインを69減らすために実行できるもの。


私はまだ学んでviscriptいますlen(submatch(0))が、素晴らしいトリックです。それをmy vimrcに追加し、Incrコマンドも追加しました。
2016年

7

私は間違いで行くと思いますが:s+ printf複雑な交換のために、私はから始める場合、あなたが望む効果を得ることができる00、としていset nrformats-=octal。あれは:

  1. ビジュアルブロック内の番号を選択します。

    ここに画像の説明を入力してください

    追加したことに注意してくださいmov76.webm-実際の例のリストには10​​個のファイルがありません。

  2. ゼロで置き換え、同じ領域をもう一度選択します。 r0gv

    ここに画像の説明を入力してください

  3. 使用g<c-a>

    ここに画像の説明を入力してください

なければset nrformats-=octal、あなたが参照してくださいよ010011など


あなた0のsは目のように見えます。気味悪い。
romainl 2016年

おっと、それはの間違いでしたmov76.webm、私は悪いディレクトリを使用しました。質問を編集しました。アンディフォントのイェイ。
2016年

@grochmalこれはUbuntu Monoフォントです。:D
muru

@romainlそして今私はそれを見ることができません。
muru
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.