ヤンクしたテキストをVimコマンドラインに貼り付ける方法


回答:


1157

はい。ヒットCtrl- Rその後"。ヤンクしたものにリテラル制御文字がある場合は、Ctrl- RCtrl- O、を使用します"

ここでは、レジスタを使用して何ができるかについて説明します。レジスターでできることは並外れており、レジスターの使い方を知ったら、それなしでは生きられません。

レジスタは基本的に文字列の格納場所です。Vimにはさまざまな方法で機能する多くのレジスタがあります。

  • 0(ヤンクレジスタ:レジスタyを指定せずに通常モードで使用すると、ヤンクテキストがそこに移動し、デフォルトのレジスタにも送信されます)、
  • 19(シフトレジスタの削除、cまたはなどのコマンドを使用すると、削除されたdものはレジスタ1に移動し、レジスタ1にあったものはレジスタ2に移動するなど
  • "(デフォルトのレジスタ、名前なしレジスタとも呼ばれます。これは"Ctrl- R、、"
  • az自分で使用するためにto を使用します(Ato Zは、対応するレジスターへの追加用です)。
  • _/dev/null(Unix)またはNUL(Windows)のように動作しますが、書き込むことはできますが破棄され、そこから読み取るときは常に空です)、
  • - (小さな削除レジスタ)、
  • /(検索パターンレジスタ、あなたが持つテキストを探したときに更新され/?*または#例えば、あなたはまた、動的に検索パターンを変更するには、それに書き込むことができます)、
  • :Qまたはを介して最後のVimLタイプコマンドを保存:、読み取り専用)、
  • +および*(システムクリップボードレジスタ、それらに書き込んでクリップボードを設定し、そこからクリップボードの内容を読み取ることができます)

:help registers完全なリファレンスについては、を参照してください。

いつでも、を使用:registersしてすべてのレジスタの内容を表示できます。このコマンドの同義語と省略形は:display:reg:diです。

挿入モードまたはコマンドラインモードでは、Ctrl- Rレジスタ名に加えて、このレジスタの内容を挿入します。それらを文字どおりに挿入したい場合(自動インデントなし0x08、バックスペースなどの制御文字の変換なし)、Ctrl- RCtrl- O、レジスタ名を使用できます。詳細については:help i_CTRL-R、以下の段落を参照してください。

しかし、次のこともできます(そして、私はおそらくレジスタの多くの使用法を忘れていました)。

  • 通常モードでを押し":pます。vimで使用した最後のコマンドがバッファーに貼り付けられます。
    分解しましょう:"次のヤンク、削除、または貼り付け操作中に使用するレジスタを選択できるノーマルモードコマンドです。したがって":、コロンレジスタを選択します(最後のコマンドを格納します)。次にp、あなたがすでに知っているコマンドで、レジスターの内容を貼り付けます。

    cf. :help ":help quote_:

  • VimLファイル(たとえば.vimrc)を編集していて、今すぐ連続する2、3行を実行したいとしますyj:@"Enter
    ここでは、yj現在の行と次の行をヤンクします(これはjが行単位の動きだからですが、これはこの回答の範囲外です)、デフォルトレジスタ(名前なしレジスタとも呼ばれます)に入れます。次に、:@Exコマンドは、引数として指定されたレジスタに保存されているExコマンドを再生"し、名前のないレジスタを参照する方法です。関連するこの回答の上部も参照してください。

    "ここで使用されている(レジスタ名)を、"ノーマルモードコマンドである前の例のと混同しないでください。

    cf. :help :@そして:help quote_quote

  • 挿入モードで最後の検索パターンをファイルに挿入するか、コマンドラインにCtrl- R、を使用して挿入します/

    cf. :help quote_/help i_CTRL-R

    当然の結果:検索パターンを維持するが、代替の追加:/ Ctrl- 、。R/ \|alternative

  • ビジュアルモードで行の真ん中にある2つの単語を選択し、でヤンクしましたy。これらは名前のないレジスターにあります。次に、現在の場所のすぐ下に、次の2つの単語を含む新しい行を開きます:pu。これはの省略形です:put "。この:putコマンドは、多くのExコマンドと同様に、行単位でのみ機能します。

    cf. :help :put

    あなたも行っている可能性::call setreg('"', @", 'V')それからpsetreg関数は、二番目の引数の内容で初期化(および名前を持つ変数としてレジスタを使用することができ、名前を(文字列として)最初の引数として指定されたレジスタを設定VIMLのレジスタ名である)、及び行ごとに3番目の引数で指定されたモードに変換します。文字ごとに何もせず、ブロックごとにリテラルにします。@xxV^V

    cf. :help setreg()。逆の機能があるgetreg()getregtype()

  • qa... qでマクロを記録した:echo @a場合は、入力した内容が示され、@aマクロが再生されます(おそらく、そのマクロを知っていて、繰り返しのタスクを回避するために非常に役立ちます)。

    cf. :help qhelp @

    前の例の結果:8goクリップボードにある場合@+、クリップボードの内容をマクロとして再生し、ファイルの8番目のバイトに移動します。実際、これはほとんどすべてのレジスタで機能します。最後に挿入された文字列がdd挿入モードだった場合、@..レジスタには最後に挿入された文字列が含まれているため)行が削除されます。(Vimのドキュメントは、それは、レジスタと述べているので、この点で間違っている#%:.だけで動作しますpP:putおよびCtrl- R)。

    cf. :help @

    :@(レジスターからVimコマンドを再生するコマンド)と@(レジスターから通常モードのコマンドを再生する通常モードコマンド)を混同しないでください。

    注目すべき例外は@:です。コマンドレジスタには最初のコロンも含まれず、最後のキャリッジリターンも含まれていません。ただし、通常モードで@:は、レジスターを通常モードで再生しようとせずに、Exコマンドとして解釈して、期待どおりに動作します。したがって、最後のコマンドがであった:e場合、レジスターにはファイルeが含まれていますが@:、ファイルを再ロードしますが、単語の終わりには移動しません。

    cf. :help @:

  • 実行する前に、通常モードで何をするかを示します@='dd' Enter=キーを押すとすぐに、Vimは式の評価に切り替わります。式を入力してを押すと、VimはEnterそれを計算し、結果はレジスターの内容として機能します。もちろん、レジスタ=は読み取り専用で、ワンショットです。使い始めるたびに、新しい表現を入力する必要があります。

    cf. :help quote_=

    結果:コマンドを編集していて、コマンドラインに現在のバッファーの一部の行を挿入する必要があることに気付いた場合は、Esc!を押さないでください。Ctrl-を使用しR =getline(58) Enterます。その後、コマンドライン編集に戻りますが、58行目の内容が挿入されています。

  • 検索パターンを手動で定義します。 :let @/ = 'foo'

    cf. :help :let

    これを行うと、/パターンでエスケープする必要がないことに注意してください。ただし、一重引用符はすべて二重にする必要があります。

  • 始まるすべての行をコピーしfoo、その後含むすべての行bar、これらのコマンドをクリップボードに、チェーン:qaq(リセットして内部の空のマクロを格納するレジスタ)を、、、。:g/^foo/y A:g/bar/y A:let @+ = @a

    大文字のレジスタ名を使用すると、レジスタが追加モードで機能します

    より良い方法として、でQ再マッピングされていない場合はmswin.vim、でExモードを開始しQ、実際には「Exコマンド」と呼ぶ方がよい「コロンコマンド」をチェーンし、と入力して通常モードに戻りますvisual

    cf. :help :g:help :y:help Q

  • ダブルスペースファイル::g/^/put _。これは、ブラックホールレジスタの内容(読み取り時には空ですが、書き込み可能で、のように動作します/dev/null)を各行の後に行ごとに配置します(すべての行に始まりがあるため!)。

  • foo各行の前にを含む行を追加します:g/^/-put ='foo'。これは、式レジスタの賢い使い方です。ここで-、はの同義語です.-1(cf. :help :range)。:put行の後にテキストを置くので、前のテキストに作用するように明示的に指示する必要があります。

  • バッファ全体をシステムクリップボードにコピーします:%y+

    cf. :help :range%一部)および:help :y

  • マクロをmisrecordedしている場合は、次のように入力することができます:let @a=' Ctrl- R =replace(@a,"'","''",'g') Enter 'それをして編集。これにより、register aに格納されているマクロの内容が変更されます。ここでは、式レジスタを使用してそれを行う方法を示します。

  • 行った場合はdddduu元に戻すために行うことがあります。ではp、あなたは最後の削除された行を得ることができます。しかし、実際には、からまでのレジスタ@1を使用して、最大9つの削除を回復することもできます@9

    さらに良いことに、あなたがしなければ"1P、その後、.通常モードで再生されます"2P、というように。

    cf. :help .そして:help quote_number

  • 挿入モードで現在の日付を挿入する場合:Ctrl- R=strftime('%y%m%d')Enter

    cf. :help strftime()

もう一度、混乱を招く可能性のあるもの:

  • :@ レジスタの内容をvimscriptとして解釈し、それをソースにするコマンドラインコマンドです。
  • @ レジスタの内容を通常モードのキーストロークとして解釈する通常モードのコマンド(:レジスタを使用する場合を除き、最初のコロンなしで最後に再生されたコマンドが含まれます。この場合、コロンも再入力したかのようにコマンドを再生し、最終的なリターンキー)。

  • " 通常モードのコマンドで、ヤンク、貼り付け、削除、修正などのレジスタを選択できます。

  • " は有効なレジスタ名(デフォルト、または名前のないレジスタ)でもあるため、レジスタ名を必要とするコマンドの引数として渡すことができます

205
「答えと質問の長さの比率が100/1」というバッジはありませんか?:)
Benoit

8
すばらしい答えですが、1400を抜いた約900ワードです。:)

19
この回答により、vimの使い方が変わりました。ありがとうBenoit
P. Myer Nore

11
すべてのレジスタとその内容をリストする:regを忘れないでください
eugenevd

3
vimの最近のバージョンでは、1行未満の削除は、番号付きレジスタではなく「小さな削除レジスタ」に移動します。参考文献:Vi and VimVi and VimReddit
Christian Long

48

使用できるシステムクリップボードである何かを貼り付けるには、SHIFT-を使用しますINS

これはWindowsで動作しますが、Linuxでも動作すると思います。


7
うん、Linuxでも動作します。VimとGVimの両方でGNOMEの下でテストされています。
Teoulas、2011年

3
これは実際にはペーストボードをキーボード入力としてVimに送るので、通常モードでペーストすると:!rm -rf /<cr>、それが実行されます。代わりにレジスタを使用してください!
lericson 2012

4
@lericsonこれは、システムキーボードにある何かに役立つと答えていませんでしたか?私は反対票を理解していません。そしてあなたの例では、真剣に?あなたは本当にそれをクリップボードに持っていますか?そして、あなたはタイピングshift-insがより簡単だとは思わないctrl-R+*?もちろん、これはgvimを使用している場合です。あなたが別のマシンに接続されたターミナルにいて、クリップボードから何かを貼り付けたい場合、あなたはより良い何かを知っていますかshift-ins?そのような状況ではレジスターが機能しないためです。コメントやその他のことを行う前に考えてください(反対投票など)。
skeept

それは誤った情報であり、私はその判断に基づいて行動したと思います。
lericson 2013

1
うまくいきません。コマンドラインに「<S-Insert>」を追加するだけです。おそらく何かが足りない。(Ubuntu 19.04 / 2:8.1.0320-1ubuntu3.1)。
Max Waterman

39

「ヤンクしたテキストをVimコマンドラインに貼り付けたいのですが。」

上位投票の回答は非常に完全ですが、私はコマンド履歴を編集することを好みます。

通常モードでは、次のように入力しますq:。これにより、通常のvimコマンドで編集および検索できる最近のコマンドのリストが表示されます。一番下の空のコマンドラインから始めます。

記事が要求する正確なことについては、ヤンクした行(または何でもヤンクしたもの)をコマンドラインに貼り付け、テキストをヤンクしてからq:p(コマンド履歴編集モードにしてから、ヤンクしたテキストを新しいコマンドに(p)utしてください)行。自由に編集しenterて実行します。

コマンド履歴モードを終了するには、これは逆です。コマンド履歴の通常モードで、次のように入力します::q+enter


1
既存のコマンドを既に変更していて、 'q:'を押さなかった場合は、Ctrl + Fを押すと、コマンド履歴を編集する機能が表示されます。
クレイ

14

システムクリップボードからVimコマンドライン(「コマンドモード」)に何かを貼り付けるには、Ctrl+にR続けてを使用し+ます。私にとって、少なくともUbuntuではShift+ Insは機能しません。

PSは:なぜ私はわからないCtrl+ Rが続く*と、理論的に同じである、Ctrl+がR続い+常に動作するようには思えません。私はその+バージョンを検索して発見しましたが、少なくとも私のボックスでは、常に機能しているようです。


2
Ctrl-r +とCtrl-r *の違いは、前者は通常のクリップボードですが、Linuxでは、最後に選択されたテキストを表す「プライマリ」と呼ばれる2番目のタイプのクリップボードがあります(そこから中ボタンのマウスペースト)。 。ただし、これはWindowsまたはMACでは使用できません
Matias Thayer

13

ヤンクレジスタがマクロバッファと同じであることにも注意する必要があります。つまり、コマンド全体(貼り付けたスニペットを含む)をドキュメントに書き"bybレジスターにヤンクして、で実行することができ@bます。


1

同様の問題がありました。選択したテキストがコマンドで終わるようにしたかったのですが、それを貼り付けることには依存していませんでした。マッピングを記述しようとしていたコマンドは次のとおりです。

:call VimuxRunCommand("python")

このプラグインのドキュメントは、文字列リテラルの使用のみを示しています。二重引用符を含むテキストを選択しようとすると、次のように機能しなくなります。

vnoremap y:call VimuxRunCommand("<c-r>"")<cr>

これを回避するには、次を使用してマクロの内容を参照します@

vnoremap y:call VimuxRunCommand(@")<cr>

名前のないレジスタの内容を渡し、二重引用符と複数行のエッジケースで動作します。


あなたの最後の例には "..おそらくVimuxRunCommand(" @ ")が欠けていると思います
kd8azz

それは@vimuxコマンドにキャラクターを送ります。考える@以下の二重引用符をエスケープとして、それはレジスタとしての代わりに、通常の文字として扱われています。のvnoremap私が定義したので、それが選択されたテキストをヤンクし、その後隣接ペインの実行インタプリタに送る、vimuxコマンドにそれを貼り付け、ビジュアルモードでアクティブです。スクリプトを操作して、キーストロークを数回使ってスクリプトの一部をテストするのに最適です。
Conrad.Dean、2015年

1

OS X

Mac OS XでVimを使用している場合、残念ながら古いバージョンが付属しており、クリップボードオプションには対応していません。幸い、Homebrewはこの問題を簡単に解決できます。

Vimをインストールします。

brew install vim --with-lua --with-override-system-vi

VimのGUIバージョンをインストールします。

brew install macvim --with-lua --with-override-system-vi

端末を再起動して有効にします。


次の行を追加します ~/.vimrc
set clipboard=unnamed

これで、Vimで行をコピーしyyてシステム全体に貼り付けることができます。


1

コンテキストについては、この情報は、デフォルトのオプションを使用した、Linux Mintでの、プラグインなしの.vimrc Vim 7.4の動作なしの、すぐに使用できる状態から取得されます。

いつでもマウスでテキストを選択するVか(またはv、「または」を使用して「*レジスターに選択を配置」し、Shift+ Ctrl+を使用してコマンドラインに貼り付けることができます。v

タイピングCtrl+をrコマンドラインでは、レジスタ名のプロンプトが発生します。したがって、入力:CTRL-r*すると、コンテンツレジスタ*がコマンドラインに配置されます。「*」だけでなく、任意のレジスタを貼り付けます。:help c_CTRL-R

さらに、マウスの中央ボタンがコマンドラインに貼り付けられます。

見る :help->quote-plusX Windowが選択を処理する方法の説明については、をして。そのままの状態のVim(ここでも、Linux MintのVim 7.4)でも、マウスの左ボタンで行った選択は、マウスの中央ボタンを使用してコマンドラインに貼り付けることができます。

さらに、マウスの中央ボタンは、Vimで選択されたテキストを他の多くのX Windowアプリケーションに貼り付けます。GUIのアプリケーション(FirefoxやThunderbirdなど)でも、コマンドラインにテキストを貼り付けることができます。 。

追加情報については:help-> x11-selectionを参照してください。

tl; dr

最初に:CTRL-rアプローチを試してから、他に必要な場合はShift+ Ctrl+ vまたはマウスの中央ボタンを使用してください。

混乱する可能性があることは認められています。


0
  1. "[a-z]y:テキストを[az]レジスタにコピーします

  2. :!編集コマンドに移動するために使用します

  3. Ctrl+ R:コピーしたものを貼り付けるには、レジスタIDに従います。

CentOS 7に使用されていました。


「CentOS 7に使用されていました」の意味 ?
Peter Mortensen

0

2つの値が2つの異なるレジスター(例えば、register aとregister b)にヤンクされている場合は、単に変数cを設定して、それに対して操作を実行できます。

たとえば:set c = str2float(@a) + str2float(@b)cどこにでもコンテンツを貼り付けることができます。

例えば、INSERTモードの一方で、CTRL + Rその後、入力=表現レジスタに入力し、ちょうど入力するc等号の後にして、ENTERを押します。これで、合計abレジスタ。

これらすべてをマクロに記録して繰り返すことができます!

このstr2float関数は、浮動小数点数で作業している場合に使用され、そうでない場合は整数を取得します。

これが慣用的であるかどうかはわかりませんが、2つの数値を続けて追加し、さらに500行繰り返す必要がある私の場合にはうまくいきました。

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