Vimはラインの範囲をヤンクします


83

私はC#開発者であり、利用可能なツールに関する知識を拡大することを最近決定しました。私が学ぶことにした最初のツールはVi / Vimです。これまでのところすべてが順調に進んでいますが、答えが見つからないように思われる質問がいくつかあります。

  1. ある範囲の行をヤンクしたいとしましょう。いろいろな方法があることは知っていますが、行番号でやりたいと思います。代替コマンドの動作に似ていると思いました81,91y。これを行う方法はありますか?

  2. g通常モードのコマンドについて少し混乱しています。それは無数のことをしているようで、gコマンドがそのコアで何をしているのか本当に判断できません。それがモーションコマンドなのか、それとも通常モードで実行された他のコマンドの一種の「キャッチオール」なのか混乱しています。誰かがこれを説明するgか、コマンドの良い説明を与えるリファレンスを私に指摘できますか?


1
vim(1)のコマンド「:help」について知っていますか?
スティーブエマーソン2010年

はい、しかし私はすべての参考文献でそれを見つけることができませんでした。通常モードからやろうと思っていたのですが、hometoastはコマンドモードからやらなければいけないことを教えてくれました。gコマンドの場合、他のコマンドから期待するように、ヘルプがすべてを結び付けているわけではないことがわかりました。
jnadro52 2010年

3
余談ですが、質問ごとに1つの投稿をしたいと思うかもしれません。
ダナ

1
私は将来そうします。私は最初の質問にもっと関心があり、最初の質問を入力しているときにもう1つの質問について考えました。
jnadro52 2010年

回答:


139

ヤンクライン81-91

:81,91y<enter>

指がキー:,キーを見つけたくない場合は、これも機能します(81行目に移動し、11行をヤンクします)

81gg11yy 

私の唯一の用途は gです5gg。5行目に移動します。 22gg:22行目。jimboが言ったように、それは実際には他のいくつかのコマンドの修飾子にすぎません。

完全を期すために、(http://vim.wikia.com/wiki/Power_of_g)はgコマンドモードでどのように機能するかを説明しています。


2
大文字を使用すると、バリエーションも提供されます。 gg最初の行にG移動し、最後の行に移動します。また、5G5マークスはすなわち、(マクロのために良い)も行番号の代わりに使用することができますラインに行く: :'a,52y
NVRAM

1
Shiftキーを恐れていない場合81G11Yは、さらに「短く」なります。
イェンス2012

1
通常モードの方法の欠点は、「場所」を失うことです。おそらくmx前後にできますが'x、コマンドモードのバージョンははるかに簡潔になります。うーん... @ Astaからの回答を見たので、すぐにこれを書きました。
エリックスミス

1
@WilliamRossこれは実際には、vimで使用するために行をバッファーに入れますが、CTRL + Vでメモ帳に貼り付けることができるシステムのクリップボードである必要はありません。関連する質問を参照してください:viからさまざまなアプリケーションにテキストをコピーして貼り付ける方法
hometoast 2018

1
私が最初の解決策を探した理由は、行を数えたり、頭の中で引き算をしたりしないようにするためだったので、これは私を楽しませます。
ポールパーカー

22

't'を使用して、現在の行を現在のカーソル位置にコピーすることもできます。

:81,91t.<enter>

これにより、カーソルが置かれている行の下に行81〜91が貼り付けられます。

これは、VIMの優れたリソースであるhttp://vimcasts.orgから学びました。


t.ここではどういう意味ですか?
CivFan 2018年

2
私の理解tでは、t病気またはtoと考えることができ.、現在の行のアドレスです。
アスタ

1
@CivFanの同義語:copy
D. BenKnoble19年

11

また、vimの相対行番号オプションを使用するのも好きです。つまり、次のように入力するだけです。

:-10,-7ya a

テキストを名前付きバッファにヤンクします。

注意Aを指定すると、ヤンクしている内容がバッファaの現在の内容に追加されます。

同様のコマンドを使用して、テキストのブロックをコピーしたり、テキストのブロックを移動したりすることもできることを忘れないでください。

:-10,-7co .

つまり、4行のテキストを現在の行の10行上から下にコピーします。

:-10,-7mo .

つまり、4行のテキストを10行上から現在の行の下に移動します。


8

Gそれはカウント値を伴っていた場合、コマンドは、特定の行番号になります。81G81行目になります。

yコマンドは次のように、運動と組み合わせることができますG。したがって、91行目まですべてをヤンクするには、を使用できますy91G

一緒にあなたは得る:

81Gy91G

行81に移動し、行91に移動しながらヤンクします。


1
これに何度も賛成できたらいいのにと思います。私を助けたのは、これを使ってレジスター(私の場合はレジスター+、つまりクリップボード)にヤンクすること81G"+y91G
でした

1
@mgarey行範囲構文を使用してレジスタに直接ヤンクする方法はありませんか?81,91yそしてどういうわけかレジスタをターゲットにしますか?
ディプロサウルス2018

1
@diplosaurusおそらく、しかし私は知りません。それがまだそこにないか、ここSOにない場合、それはvi.stackexchange.comで尋ねることができる質問のように聞こえます。興味があります。私はVimの専門家ではありません。
mgarey 2018

2
@mgareyグーグル検索で創造的にならなければならなかったが、私はここでそれを見つけた:stackoverflow.com/questions/16225366/…:81,91y +
ディプロサウルス2018

@diplosaurus:81,91y +は機能しません。:81,91y aたとえば、他のレジスタでは機能しますが、+レジスタが気に入らないようです。これは間違いなく他の人のために機能しますか?
ojunk

4

gそれ自体では何もしません。これは、ソートに関係のないコマンドの束を保持するいくつかのメタコマンドの1つです。

z そのようなさらに別のコマンドです。


ありがとうございました。さまざまな目的で使用されていることを理解しました。これらのツールを習得しようとするときは、コマンドを抽象化できるものに関連付けて、適切に使用する方法を思い出せるようにします。gコマンドは、正しく使用するために覚えておく必要があるものの1つにすぎないようです。
jnadro52 2010年

2

Vimは次の:help indexように説明しgています:

|g|             g{char}            extended commands, see |g| below

下にスクロール(または:help g)してリストを表示します。


1
私は:helpに精通していましたが、:help(コマンド)には精通していませんでした。それは将来非常に役立つでしょう。よろしくお願いします。
jnadro52 2010年

2

最善の解決策は、vを押して「ビジュアルモード」に入ることです。行を選択した後、yを押してそれらをコピーします。次に、pを押してコピーした行を貼り付けます。


同意しませんが、bcビジュアルモードだけが非常に遅い場合があります。
D.ベンKnoble

1

加えて、:91,96y a(ヤンクたyレジスタに)ライン96を介して91をa、(と貼り付け"ap)、ヤンク線がすることができる付加に登録します。

:91,96y A

つまり、Aレジスタを大文字にするaと、上書きではなくレジスタへの追加操作が発生します。レジスターの大文字化は常にこのように機能します。たとえば:let @A=';';レジスターにaを追加しますa

プラス(+)またはマイナス(-)を使用すると、現在のカーソル位置を基準にして行が参照されます。

:-10,+10y b

yつまり、現在のカーソル位置の周囲に21行をyank()して、それらをレジスタに配置しますb

入力がないことは、実際には現在のカーソル位置も表します。つまり、次のようになります。

:-5,y a

上記の5行から現在のカーソル位置までのテキストを名前付きバッファaにヤンクします。

:,+5y a

現在のカーソル位置の後の5行をバッファにヤンクしますa

注:バッファaにマクロがある場合、ヤンクレジスタとマクロレジスタは実際には同じものであるため、前のヤンクによって上書きされただけです。そのため、偶然にも、マクロを貼り付けて編集し、ヤンクしてレジスタに戻すことができます。私は個人的に左手で届いた文字をヤンクに、右手で届いた文字をマクロに使用しています。

テキストのブロックを移動すると、次のようになります。

:+10,+13m.

これは、現在のカーソルの10行前に配置された4行を、現在の行の下に移動することを意味します。

補遺

私は以前、モーションが提供された場所と同義であると混同ya:91,95ya aていya{motion}ました91,95。これは正しくなく、の「a」yaは完全に不要です。私の弁護では、help yankそれyaがの可能性のある別名であることを伝えていませんyank


1
:yaはの省略形な:yankので、すべての行をヤンクすることについてどう思うかわかりません。しかし、散在する情報の一部を
要約

私も見るまでそう思いました:help yank。何の別名がありませんyaのためにyank。確かに、aは「すべて」を表すのではなく、技術的には「a」を表します。それでも私には「すべて」と言いたいのですが、それは私にとってより理にかなっているからです。
ポールパーカー

2
:[range]y[ank] [x] Yank [range] lines [into register x]の角括弧はy[ank][ank]がオプションであることを示します。:y:ya、および:yanのために暗黙的に別名である:yank
D.ベンKnoble

私は訂正されたままです:)aは必要ありません。反映するように回答を編集します。
ポールパーカー

1
あなたの補遺は素晴らしいですが、私はあなた:yaが通常のコマンドではなくexコマンドを使用するあなたの最初の行を参照していましたy
D. BenKnoble19年

0

長い間Vi / Vimユーザーとして、私は行番号(または「ラインマーカー」)代わりに「マーク」使用する傾向があります。これは次のように機能しmます。「マーク」文字です。次に、任意の文字を使用してマークを識別/名前を付けます。マークの序文に戻るには、名前付きマークの前に一重引用符('a)を付けます。これらのマークは範囲として使用できます。例:

File:
    <line 1>
    <line 2>
    <line 3>
    <line 4>
    <line 5>

コマンドモードでカーソルを2行目に移動し、と入力しますma。4行目までスクロールし、と入力しmbます。マークaからマークbにヤンキーするには、次のように入力します。

    :'a,'byank

マークaからマークbに削除するには、次のように入力します。

    :'a,'bdel

マークaからマークbまで検索し「ine」を「ink」に置き換えるには:

    :'a,'bs/ine/ink/g

マークaからマークbをコピーして、現在の位置の下に貼り付けるには(「ドット」は常にカーソルが現在置かれている行を参照します)。

    :'a,'bco . 

コードの行を、マークaからマークbの間で、1つのタブを右にシフトします(反対側のシェブロンを使用して<、左に移動します)。

    :'a,'b> 

コマンドモードでは、入力'aするだけでマークに戻ることができ、マークされた行に戻ることができますa。入力''すると、前の位置に戻ります(残念ながら、前の位置のみが記憶され、2つ戻ることはありません)。

行番号を知らなくても、名前付きバッファへのヤンク、行のコピー、削除、コードの一部のみの検索と置換などを行うことができます。


0

行番号81から91までの行をヤンクするには:

アプローチ1: 81gg11yy

悪くはありませんが、ヤンクする行数を見つけるために少し計算する必要があります

アプローチ2:81ggそれからshift+vそして91ggそれからy

これは簡単なので、あなたは明白なこと、つまりどの行番号からどの行番号にヤンクしたいかを知る必要があるだけです。

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