グローバルコマンドで一致した各行の数を取得して使用する方法


8

彼の(非常に良い)本「Pratical Vim」で、Drew Neilは、「TODO」という単語を含むすべての行をレジスターに収集して、後者を使用する方法を示しています。

そのためには、単にグローバルコマンドを使用します:g/TODO/yank A(大文字Aは名前付きレジスタへの行の発生を許可しますa)。

私はそれはかなりクールなトリックだと思いますが、私はそれを改善する必要があります:それは内容の前に行の番号を挿入しようとしています。解決策は、行番号を取得して、前に述べたコマンドの最後の部分でそれを使用することだと思います。問題は、この行番号を取得する方法がわからないことです。

だから私の質問は、グローバルコマンドでどのようにして一致した行の番号を取得でき、この番号をどのように使用できるのですか?

ここで明確にするのは例です。このファイルを考えてみましょう:

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  }

入力:g/TODO/yank Aしてレジスターの内容をファイルに入れると、次のようになります。

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

私が入手したいのは:

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

ボーナスヤンクにも行のインデントが含まれています。グローバルコマンドから直接削除できれば非常に便利です。

回答:


7

それを行う1つの方法:

  1. レジスタをクリアします。

    :let @a=''
    
  2. その中に検索結果を追加します:

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

再:ボーナスは、グローバルコマンドでインデントを削除します:

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

1
それがまさに私が探していたものです!getpos()getline()コマンドを知りませんでした。また、ボーナスの質問に答えると、ダンシングクッキーに値します;)
スタトックス

クッキー、イェイ:)
VanLaser

1
@statoxこれをブックマーク::help function-list。これは非常に便利なリファレンスです。また、「実用的なVim」について言及した場合は+1。:)
lcd047

@ lcd047:わあ、ありがとう!! 以前にこのヘルプエントリを知っていればよかったのですが、ここにこのリストがあるととても嬉しいです。Vimのドキュメントは本当に素晴らしいです!また、私はvimがかなり新しく、現時点では「実用的なVim」が私の聖書です:)
statox

@Laserは、a通常モードでレジスタを空にする最も簡単な方法は、空のマクロを記録するqaqことです。おそらく、ソリューションよりもエレガントではありませんが、動作します;)また、あなたのソリューションはvimscriptで使用できますが、私の。
statox
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.