web-dev-qa-db-ja.com

太ったテキストをVimのコマンドラインに貼り付けるにはどうすればいいですか?

ヤンクテキストをVimのコマンドラインに貼り付けたいのですが。出来ますか?

560
dan

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

レジスタを使用して何ができるかを説明します。レジスタを使用してできることは並外れたものであり、レジスタの使用方法がわかれば、レジスタなしでは生きられません。

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

  • 0(yank register:レジスタを指定せずにyを通常モードで使用すると、ヤンクされたテキストがそこに移動し、デフォルトのレジスタにも移動します)
  • 1から9cdなどのコマンドを使用すると、削除されたものはレジスタ1に移動し、レジスタ1にあったものは削除されますレジスタ2、etc。)、
  • "(デフォルトのレジスタ、名前のないレジスタとも呼ばれます。これは " 入って来る Ctrl-R、 ")、
  • aからzは、独自に使用します(大文字のAからZは、対応するレジスタに追加するためのものです)。
  • _/dev/null(Unix)またはNUL(Windows)のように動作しますが、書き込むことはできますが、破棄され、読み取ると常に空になります)
  • -(小さな削除レジスタ)、
  • /(検索パターンレジスタ、たとえば/?*、または#でテキストを検索したときに更新されます。検索パターンを動的に変更する)、
  • :(最後のVimL入力コマンドをQまたは:経由で保存、読み取り専用)、
  • +および*(システムクリップボードレジスタ、それらに書き込みを行ってクリップボードを設定し、クリップボードの内容を読み取ることができます)

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

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

挿入モードまたはコマンドラインモードでは、 Ctrl-R レジスタ名に加えて、このレジスタの内容を挿入します。文字列をそのまま挿入する場合(自動インデントなし、0x08などの制御文字のバックスペースへの変換なしなど)を使用できます。 Ctrl-R、 Ctrl-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でそれらをヤンクしました。それらは名前のないレジスタにあります。ここで、あなたがいる場所のすぐ下に、:puという2つの単語を含む新しい行を開きます。これは:put "の短縮形です。 :putコマンドは、多くのExコマンドと同様に、行単位でのみ機能します。

    cf. :help :put

    次のこともできます::call setreg('"', @", 'V')その後psetreg関数は、名前が最初の引数として(文字列として)与えられるレジスタを設定し、2番目の引数の内容で初期化します(そして、名前として変数としてレジスタを使用できます@xここで、xはVimLのレジスタ名です)、3番目の引数で指定されたモードに変換します。Vは行単位、文字単位はリテラル^Vはブロック単位で指定されます。

    cf. :help setreg()。逆関数はgetreg()getregtype()です。

  • qa...qでマクロを記録した場合、:echo @aは入力した内容を通知し、@aはマクロを再生します(おそらく、 1つは、反復タスクを回避するために非常に便利です)

    cf. :help qhelp @

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

    cf. :help @

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

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

    cf. :help @:

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

    cf. :help quote_=

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

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

    cf. :help :let

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

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

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

    Qmswin.vimによって再マップされていない場合、Qを使用してExモードを開始し、実際には「Exコマンド」と呼ばれる「コロンコマンド」をチェーンし、通常に戻ります。 visualと入力してモードにします。

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

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

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

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

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

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

  • ddddを実行した場合、元に戻すにはuuを実行できます。 pを使用すると、最後に削除された行を取得できます。しかし、実際には、@1から@9までのレジスタを使用して、最大9個の削除を回復することもできます。

    さらに良いことに、"1Pを実行すると、通常モードの."2Pを再生します。

    cf. :help .および:help quote_number

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

    cf. :help strftime()

もう一度、混乱する可能性があるもの:

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

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

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

あなたが使うことができるシステムクリップボードである何かを貼り付けるために SHIFT - INS

Windowsでも動作しますが、Linuxでも動作します。

45
skeept

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

トップ投票の回答は非常に完成していますが、コマンド履歴を編集することをお勧めします。

通常モードでは、q:と入力します。これは最近のコマンドのリストを与え、通常のvimコマンドで編集や検索ができます。一番下の空白のコマンドラインから始めます。

正確なことをするために、コマンドラインにヤンクした行(またはヤンクしたもの)を貼り付けて、テキストをヤンクしてから、次のように入力します。q:pコマンドラインです。 enter 実行する。

コマンド履歴モードから抜け出すには、その逆です。コマンド履歴の通常モードでは、次のように入力します。:qenter

35
Wandspiegel

システムのクリップボードからvimのコマンドラインに何かを貼り付けるには( "command mode")、 Ctrl+R に続く +。私にとっては、少なくともUbuntuでは、 Shift+Ins 動かない。

シモンズ:なぜかわからない Ctrl+R に続く *これは理論的には同じです。 Ctrl+R に続く + いつもうまくいかないようです。私は検索して発見した + バージョンとそれは、少なくとも私の箱では、常に動作するようです。

14
Proto

また、ヤンクレジスタがマクロバッファと同じであることも注目に値します。言い換えれば、あなたは単にあなたの文章全体(あなたのペーストされたスニペットを含む)を書き出し、それから"byをそれをbレジスタにヤンクさせ、そしてそれを@bで実行することができます。

13
naught101

この質問はかなり古くからありますが、何度も見られてきたので人気があるようです - 後世のためにここに置きます。文脈のために、この情報はデフォルトのオプションでlinux mintの箱から出してすぐに使える、プラグインなし、.vimrc vim 7.4の動作から来ています。

あなたはいつでもマウスで(またはVまたはvを使って "* register"に選択を置くことで)テキストを選択し、それをSHIFT-CTL-vでコマンドラインに貼り付けることができます。

コマンドラインでCTL-rを入力すると、レジスタ名の入力を要求されます。 CTL-r *と入力すると、コンテンツレジスタ*がコマンドラインに配置されます。 "*だけでなく、任意のレジスタを貼り付けます。help c_CTRL-Rを参照してください。

さらに、マウスの中央ボタンがコマンドラインに貼り付けられます。 x11が選択をどのように扱うかについては、help-> quote-plusを参照してください。普通の、すぐに使えるvimでも(やはり、linux mintのvim 7.4でも)、マウスの左ボタンで行った選択は、マウスの中央ボタンでコマンドラインに貼り付けることができます。

さらに、マウスの中央ボタンで、vimで選択したテキストを他の多くのx11アプリケーション、例えばgui(Firefox、Thunderbirdなど)にも貼り付けることができ、テキストを他のアプリケーションから選択した場所でテキストを貼り付けることもできます。

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

tl; dr

最初に:CTL-rアプローチを試してみてください。それ以外に何か必要な場合はSHIFT-CTL-vまたはマウスの中ボタンを使ってください。

それは混乱を招く可能性があると認められています。

1
wmmso

私は同様の問題を抱えていました。選択したテキストをコマンドで終わらせたいのですが、貼り付けることに頼らないでください。ここで、マッピングを記述しようとしていたコマンドを次に示します。

:call VimuxRunCommand("python")

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

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

これを回避するには、@を使用してマクロの内容を参照するだけです。

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

無名レジスタの内容をに渡し、私の二重引用符と複数行のエッジケースで機能します。

1
Conrad.Dean

OSX

あなたがMAC OSXでvimを使っているなら、残念ながらそれはより古いバージョンで来て、そしてクリップボードオプションに従わなかった。幸いなことに、自作は簡単にこの問題を解決することができます。

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

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

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

  2. コマンドを編集するには:!goを使用します。

  3. CTRL+Rは、コピーしたものを貼り付けるために登録IDをたどります。

それはCentOS7に使用されていました。

0
yang