選択範囲をテキストとしてvimで貼り付けないでください!


10

私は何年にもわたって(30以上)VIとVIMを使用しており(xtermsでは、独自のウィンドウではないgvim)、マウスの中央ボタンを選択として使用してvimに与えるvim コマンドの巨大なライブラリがあります

たとえば、私はしばしば次のようなことをします...

 vi {many_hundreds_of_files}
   paste vim commands using mouse - one paste per file.

選択範囲には、テストの置き換え、フォーマット、行の移動などを行うための多くのVIMコマンドが含まれ、通常、選択範囲の最後に:wおよび:next VIMコマンドで終了します。したがって、vimは次のファイルに再度貼り付ける準備ができています。これにより、特別なスクリプト(perlインプレース編集など)を実行する必要なく、非常に複雑な方法で膨大な数のファイルを更新できます。

これらのvimコマンドペーストの一部は、200行以上の長さです(画面上にポップアップするテキストファイルに保存され、「copy-all」!これらは、再フォーマットしている何千ものファイルのセットに多くの変更を加えます。しかし、特定のファイルセットのみで、日常のvim作業では使用できませんEG:テキスト/データファイルの一括再フォーマット。

問題...

私の最後のシステムパッチ(Fedora 25)の間に、vimはマウスの選択をvimコマンドではなくテキストとして貼り付けます。それを止めることができないようです!

別のシステム(Fedora 24)でも問題なく動作します。

テキストとして貼り付けたい場合は、貼り付ける前に挿入モードに入ります!挿入モードではないときに、VIMが選択範囲をテキストとして自動的に貼り付けたくありません。これはセキュリティ機能として意図されていたと理解していますが、私にとってそれは主要なユーザビリティの問題です。

これを行わないマシン(特に "kmous"のterminfoエントリ)から、terminfoエントリ(xterm-256color)を遡って試してみました。vim ":set mouse ="設定(nullです!)も確認しました。xterm(疑わしい)なのか、VIMで変更された(可能性が高い)ものなのかはわかりません。変更ログとgoogleは役に立ちませんでした。

しかし、私に古い行動をとらせるものは何もないようです。


別の同じ問題を持つユーザー、あまり詳しく、無解が見つかりunix.stackexchange.com/questions/346293/...
アンソニー・

1
私はそれがvim変更である可能性が高いのではないかと思います:何かがキーボードから入力されたか、マウスボタンから貼り付けられてvimいるxtermことを知るにはどうすればよいですか?私はそのようなメカニズムを知りません。一方、xtermそれが実行中であることを知っているvimので、貼り付けをi<esc> で囲むことができます。(a)別の種類の端末ウィンドウで(b)vim別の名前ののコピーを試してください。これは、問題の原因を絞り込むのに役立ちます。
フィリポス2017年

@philipposに同意します。多分vimあなたの貼り付け方法を乗っ取る以外の何か。たぶんあなたのマシンにsshやtelnetして、その方法で貼り付けてみてください。Windowsボックスがある場合は、puttyを使用してFedora25マシンにSSH接続し、その方法で貼り付けます。
ジムU

直接の関連はありませんが、Windowsのgvimは長年このように動作していました。gvimをインストールすると、gvim.exe(graphical-vim)とcommand-lineの2つの実行可能ファイルが取得されますvim.exe。「iTextの」gvim.exeにし、あなたが得る貼り付けitext。vim.exeに貼り付けると、text
Jim U

1
@Philipposそのメカニズムは括弧でくくることができます。Vimがそれをどのようにサポートするか、おそらくpastetoggleオプションを知りませんか?
Gilles 'SO-邪悪なことをやめなさい'

回答:


12

たくさんのWebページを調べたところ、多くは機能していないように思われるヒントがいくつかありましたが、問題の原因と解決策につながるヒント(貼り付けの周りの余分なテキスト)を見つけました。

vimには、特定の端末を認識するときに使用する「偽の」termcapエントリがいくつか組み込まれているようです(この場合は間違っていませんが、場合によっては間違ってしまいます)。

vimのTermcap設定は、通常の ":set all"設定リストに表示されないため、多数追加されています。それらを表示するには、「:set termcap」を使用する必要があります。特定の「非標準」termcap設定は「t_BE」です(vim ":help t_BE"を参照)。組み込みヘルプ「xterm-bracketed-paste」は、この内部からvimへのtermcap設定を説明しています。

基本的にこの設定が定義されている場合(この場合はtermcap / terminfoではなくVimによって)、vimは起動時にxtermに送信し、ユーザーが外部ソースから貼り付けたテキストの周囲に特別なコードを追加するように指示します。vimがこれらを検出すると、自動的に挿入モードだけでなく、テキストをフォーマットしないように「貼り付けモード」も設定します。

後者(貼り付けモード)はとても便利だと思います!前者は私にすべての問題を与えているものです。

ブルートフォースソリューションは、これを ".vimrc"に追加することにより、ブラケット貼り付けを無効にします。

:set t_BE=

代替ソリューション...

ブラケット貼り付けを完全に無効にする代わりに、コマンドまたは通常モードで、(マウスからの)端末貼り付けの開始シーケンスが表示されたときにvimがアクションを実行するのを停止します。

:nmap <PasteStart>  <NOP>
:nmap <PasteEnd>    <NOP>
:cmap <PasteStart>  <NOP>
:cmap <PasteEnd>    <NOP>

これを使用すると、挿入モードのときにテキストを貼り付けても、vimはすでにインデントされている可能性が高いテキストをフォーマット(インデント)しようとしません。

これは、貼り付けモードの切り替え(F2にマップ)を使用して「showbreak」と「listchars」(折り返された行、タブ、改行なしスペースを表示する)を無効にするため、貼り付けモードを切り替える必要がなくなったことを意味しません。行末の余分なスペース)。他の場所に貼り付けるためにマウスを選択するときは、vimをそのモードにする必要があります。

ソリューションに関するコメントや提案は大歓迎です。


これはCygwin Vmでも機能するように見えますが、残念ながらVS Vimの問題は解決していません
James Robinson

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