web-dev-qa-db-ja.com

Windows上のBashのvimで「クリップボードにコピー」する方法

以前は"+yを使用してテキストをシステムのクリップボードにコピーしていましたが、WindowsのBashのvimでは機能しません。

16
nbystndr

"* yも" + y(...)も機能しないため、代替方法は次のとおりです。

これを.vimrcに追加し、~/.vimbufferというファイルを作成します

" copy (write) highlighted text to .vimbuffer
vmap <C-c> y:new ~/.vimbuffer<CR>VGp:x<CR> \| :!cat ~/.vimbuffer \| clip.exe <CR><CR>
" paste from buffer
map <C-v> :r ~/.vimbuffer<CR>

Visualまたはvisual-blockを使用してテキストをハイライトし、ctrl-cを押します。通常の方法を使用して端末の外にコピーしたテキストを貼り付けるか、通常モードまたはビジュアルモードでctrl-vを使用してvimペインにコピーしたテキストを貼り付けます。

Ctrl-cは選択したテキストをヤンクし、~/.vimbufferを選択したテキストで上書きし、UNIXコマンドを実行して~/.vimbufferからclip.exe.にデータをパイプアウトします

さらなる改善(コマンドのサイレント化など)は大歓迎です!

編集:コマンドは、行全体だけでなく、任意の長さの文字列をコピーできるようになりました。古いコマンド:

vmap <C-c> :w! ~/.vimbuffer \| !cat ~/.vimbuffer \| clip.exe <CR><CR>

20
davidanderle

Windows 10のBashでvim内からクリップボードにコピーするには、Shiftを押しながらカーソルをテキストの上にドラッグします。 enterを押します

enterを押す前に、選択は次のようになります。

Selection should look like this before pressing ENTER

[〜#〜] edit [〜#〜]:これは、画面に一度に収まるテキストでのみ機能します。多くの「画面」にまたがるテキストのブロックをコピーするために使用することはできません

8
ifconfig

Xサーバーをセットアップしたくない場合、このメソッドを使用すると、Windowsに付属のclip.exeプログラムを使用して、選択したテキストをクリップボードにコピーできます。

以下のコードスニペットは、 .vimrc ファイルに配置できます。

最初に、現在選択されているテキストを文字列として返すヘルパー関数を作成します。この関数を使用して、強調表示されたテキストをclip.exeにパイプできます。

func! GetSelectedText()
    normal gv"xy
    let result = getreg("x")
    return result
endfunc

system関数を使用すると、ネイティブプログラムを呼び出してパラメーターをパイプで渡すことができます。以下のスニペットは、2つのキーマッピングを設定します。最初の行は許可します Ctrl+C テキストのコピーに使用され、2番目の Ctrl+X テキストを切り取るため:

noremap <C-C> :call system('clip.exe', GetSelectedText())<CR>
noremap <C-X> :call system('clip.exe', GetSelectedText())<CR>gvx

.vimrcファイルへの変更を保存したら、準備完了です。

複数のシステムで.vimrcを使用する場合、clip.exeが実際に存在するかどうかを確認するために、これらのマッピングをifステートメントでラップすることをお勧めします。

if !has("clipboard") && executable("clip.exe")
    noremap <C-C> :call system('clip.exe', GetSelectedText())<CR>
    noremap <C-X> :call system('clip.exe', GetSelectedText())<CR>gvx
endif

上記により、Vimはシステムクリップボードに直接アクセスできる場合、これらのキーバインドを無視することもできます。

次のように、vimがクリップボードにアクセスできる場合にキーバインドを追加することもできます。

if has("clipboard")
    vnoremap <C-X> "+x
    vnoremap <S-Del> "+x

    vnoremap <C-C> "+y
    vnoremap <C-Insert> "+y

    map <C-V>       "+gP
    map <S-Insert>      "+gP

    cmap <C-V>      <C-R>+
    cmap <S-Insert>     <C-R>+
endif

WindowsでVimをネイティブで使用している場合、またはLinuxシステムでvim-gtkを使用している場合に便利です。

5
Top Cat

行全体をコピーするだけの場合は、Vimの機能を使用して、ファイルの内容を外部プログラムにパイプできます。だからできる

:w !clip.exe

clip.exeにパイプする。 2から10などの特定の行が必要な場合は、:2,10w !clip.exeを実行できます。

Vimの外部コマンドへのバッファーのパイプ を参照してください

1
Mitchell P

上記の情報を組み合わせることで、キーバインドを使用せずに、任意のレジスタからクリップボードに単純なテキストをコピーすることができます(場合によってはより便利なこともあります)。たとえば、最後にヤンクしたテキストをWindowsのクリップボードにコピーする場合は、次のコマンドを入力します(入力を開始します)。

:call system('clip.exe', '

今すぐ押す Ctrl+r、その後にレジスタ +。指定されたレジスタからテキストを貼り付けます。次に、一重引用符と括弧を閉じます。コマンドは次のようになります。

:call system('clip.exe', 'a text from 0 register')

押す Enter、完了!

0
Pavel Sapehin

WSLにバンドルされているvimを使用する場合は、vim自体が提供するクリップボードのみを使用できます。つまり、vim内でのみコピーと貼り付けができます。

または、あなたは試すことができます:

  1. VcXsrv をインストールして実行します。
  2. export DISPLAY=localhost:0 WSL Bashで。
  3. Vim-gtkまたはvim-gnome(または他のGUIアプリ)を実行し、LinuxとWindowsでクリップボードを試してください。
0
reker