web-dev-qa-db-ja.com

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

私はVIとVIMを何年も(30以上)(xtermsでは、独自のウィンドウではなくgvimで)使用していて、vimの巨大なライブラリがありますcommandsマウスの中ボタンを選択として使用して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選択範囲が挿入モードでないときにテキストをASテキストとして自動的に貼り付けたくない。これはセキュリティ機能として意図されたものだと理解しているが、私にとってそれは主要なユーザビリティの問題である。

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

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

10
anthony

多くの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をそのモードにする必要があります。

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

12
anthony