カスタムg:clipboardを使用すると、 `p`は常に同じ行に貼り付けられます

Aug 20 2020

バックグラウンド

私はwaylandとneovimを使用しており、外部テキストを貼り付けると、各行^Mの最後に追加されます。これは既知の「バグ」です(https://github.com/neovim/neovim/issues/10223)そして回避策があります:sedを使用して^M:をトリミングします

let g:clipboard = {
            \   'name': 'WL-Clipboard with ^M Trim',
            \   'copy': {
            \      '+': 'wl-copy --foreground --type text/plain',
            \      '*': 'wl-copy --foreground --type text/plain --primary',
            \    },
            \   'paste': {
            \      '+': {-> systemlist('wl-paste --no-newline | sed -e "s/\r$//"')}, \ '*': {-> systemlist('wl-paste --no-newline --primary | sed -e "s/\r$//"')},
            \   },
            \   'cache_enabled': 1,
            \ }

が設定さwl-pasteれてg:clipboardいない場合、Neovimはデフォルトで私のシステムに設定されます。

問題

回避策が整っていると、neovimは改行に行ごとのコピーを貼り付けません。

  • 期待される動作:行に移動->を押すY->別の行の途中に移動->を押すp->コピーされた行が新しい行に貼り付けられます。これは、no g:clipboardが設定されている場合に発生します。

  • 観察された動作:行に移動->を押すY->別の行の中央に移動->を押すp->コピーされた行が現在の行に貼り付けられます。これは、g:clipboardが設定されたときに起こることです。

ウェイランドクリップボードの内容を観察すると、(wl-paste --no-newline | cat -A)は同じです。両方ともLF文字で終わります。

質問:

どうしてこれなの?neovimは、新しい行への貼り付けを区別するために何をしg:clipboardますか?また、カスタムを設定したときに、neovimが新しい行に貼り付けないのはなぜですか?

回答

3 Matt Aug 20 2020 at 01:40

デフォルトでsystemlist()は、最後の改行は保持されません(つまり、結果のリストから最後の「空の文字列」アイテムが削除されます)。そのため、Neovimは、クリップボードのコンテンツが「line」ではなく「char」タイプであると考えています。

したがって、代わりに次のことを行う必要があります(:h systemlist()NeovimのバージョンはVimのバージョンとは異なることに注意してください)。

{-> systemlist('wl-paste...', '', 1)}

別のオプションとして、NeovimのGUIバージョンを排他的に使用している場合は、プラットフォームに依存しない方法で(Qt、Gtkなどを介して)提供できるGUIフロントエンドアプリケーションにRPCリクエストを送信することをお勧めします。 。)。

たとえば、nvim-qtには、GuiClipboard()機能を提供する標準の「nvim_gui_shim」プラグインが付属しています。したがって、実行するだけで、すでにそれらと呼び出しが:call GuiClipboard()ある「カスタム」が自動的にセットアップされます。g:clipboardrpcrequest()rpcnotify()

ただし、プレーンコンソールのnvimでは機能しないことに加えて、別の厄介な問題を発見しました。少なくともnvim-qtでは、UIが入力され、完全に準備されている必要があります。そのため、Neovimの起動時にセットアップするのは不便かもしれません。もちろん、g:clipboard代わりに独自のRPC呼び出しを提供することもできます(注:RPCパラメーターはGUIフロントエンドごとに異なる場合があります。また、一部のアプリケーションでは、そのような要求をまったく実装しないことを選択する場合があります)。

さらに別のオプションは、クリップボードへのアクセスを自分で実装することです。これは、外部の依存関係なしでこれを行うことができる私自身のNeovimクリップボードプロバイダーです。ただし、これまでのところ、実装したのはXlibバージョンのみであるため、Waylandのネイティブモジュールはありません。