5

次のようなファイルがあります。

1 148 1  4
2 333 1  3
3 534 2  3
4 772 g  7
5 921 p  2

1 行目から 5 行目までと 1 列目から 7 列目までのテキストをヤンクしたい:

1 148 1  
2 333 1  
3 534 2  
4 772 g  
5 921 p   

vimコマンドラインからそれを行うことはできますか? 入力すると

:1,5ya a

行全体がレジスタ「a」にヤンクされ、特定の列だけが必要です。

ありがとう。

4

5 に答える 5

2

ここでは、次の助けを借りて、コマンドラインで任意のコマンドを実行できます:normal

:execute "normal! 1G^\<C-v>6l5j\"ay"

これは、ブロック単位のセレクションを構築し、ヤンクして a を登録します。は表記法を文字通り挿入する代わりに使用できるようにするために使用されます:execute\<C-v>また、ハードコーディングされた制限を変数に置き換えることもできます。

于 2013-02-15T20:31:41.097 に答える
1

vim コマンドラインから簡単な方法でそれを行うことはできません。 :yは行ごとのコマンドです。行全体にのみ影響します。探しているものはblockwiseと見なされます。ブロック単位のコマンドには、ビジュアル モードが含まれます。したがって、あなたができる最善のことは次のとおりです。

  1. CTRL-V でビジュアル モードを開始します。
  2. 必要なテキストを強調表示します。
  3. "ay強調表示されたテキストを register にヤンクしますa
于 2013-02-15T20:13:15.997 に答える
0

私はするだろう

C-vG2wy

そして完了します(ドキュメントの先頭から で開始しますgg

もちろん、レジスタaに入れたい場合は、次を追加し"aます。

C-vG2w"ay

于 2013-02-15T21:56:59.260 に答える
0

一般的ではありませんが、これでうまくいくはずです:

:1,5y|put|-4,.s/\(.\{7\}\).*/\1/|-4,.d a

5 行をヤンクし、配置 (コピー) し、必要な列の後のすべてを削除し、それらをバッファーに削除します。

于 2013-02-15T20:10:32.167 に答える
0

スクリプトにより適した別のアプローチ:

:let @a = join(map(getline(1, 5), 'matchstr(v:val, ".*\\%<9v")'), "\n")

行を List ( ) として取得しgetline()、最初の 7 つの仮想列を特別な/\%<v正規表現アトムで照合し、それ (join()文字列として ed) を register に割り当てます@a

于 2013-02-15T20:37:35.503 に答える