19

:set pasteクリップボードから物を貼り付けるとき、それらは通常 (常に) 複数行であり、それらの場合 (およびそれらの場合のみ)、トリガーされたいと思います。見た!)。

の問題:set pasteは、 でうまく動作しないことですがset smartindent、カーソルが正しいインデントではなく、新しい行の先頭にジャンプする原因となります。したがって、このインスタンスに対してのみ有効にしたいと思います。

私は Mac を使用しており、Vim を使用して Debian マシンに sshing しているため、cmd+を使用して挿入モードで貼り付けていますv

4

5 に答える 5

7

私は mac を使用していませんが、ここに接頭辞があると思います: <D-v>cmd-v を意味するはずです。挿入モードの場合:

:imap <D-v> ^O:set paste<Enter>^R+^O:set nopaste<Enter>

または実際には、これを行うだけです:

:imap <D-V> ^O"+p

^O と ^R は、文字通りの control-O と control-R であり、^V^O (control-v control-o) と ^V^R (control-v control-r) で入力できます。挿入モードで Control-O を使用すると、1 つのコマンドを実行してから挿入モードに戻ることができます。ここでは、クリップボード レジスタから挿入するために使用できます。

これは、別のキーにマップしてテストしたときにうまくいったので、すべて設定されているはずです。

挿入モードでないときは何もマップする必要はありません。あなたはただ使うことができます"+p

于 2010-03-31T18:53:19.153 に答える
3

私の .vimrc には次のものがあります。

inoremap <S-Insert> <ESC>:setl paste<CR>gi<C-R>+<ESC>:setl nopaste<CR>gi

gi現在のバッファで最後に挿入モードが停止されたのと同じ位置で挿入モードを開始することです。

アップデート:

Jefromi がより良い解決策を投稿しました。ちょっといじってみた

inoremap <S-Insert> <ESC>"+p`]a

クリップボードのテキストを挿入し、その直後にカーソルを置きます。

于 2010-04-01T05:58:40.793 に答える
1

必要なときにのみ有効にする必要があるという点で、あなたは正しいです'paste'。インデントに影響を与えるだけではありません。ドキュメントで影響を与えるすべてを読むことができます。使いやすくするのに非常に便利な関連オプション'paste''pastetoggle'です。

X-forwarding と、マウスの動作を適切に通信できる端末を使用している場合は、'mouse'オプションを利用することもできます。を使用:set mouse=aすると、Vim はマウスの動作を認識するため、中ボタンのマウス クリックで複数行の貼り付けを受け取ったときに自動インデントを実行しません。

"+マウス機能がなくても、Vim はクリップボードまたは選択レジスタ (および"*それぞれ)から手動で貼り付けるときに同じことを行うため、X 転送が役立ちます。

于 2010-03-31T18:54:43.680 に答える
0

これは Vim スクリプトで解決できるはずです。(私は Vim スクリプトが嫌いなので、自分で解決するにはもっと深刻な問題が発生する必要があります。) iTerm2 の「ゆっくり貼り付ける」モードを使用しても、デフォルトでは、貼り付けるデータを 16 バイトのチャンクに分割し、 0.125 秒ごとに送信します。したがって、「キーストローク」の 16 バイトのチャンクをプログラムで検出し、それに対して何かを行うことができるはずです。

擬似コードでは次のようになります。

if too_fast_too_be_human():
    set('pastemode', True)
else
    set('pastemode', False)

# where either
def too_fast_too_be_human
    char_threshold = 16
    return len(input_buffer) > char_threshold

# or
def too_fast_too_be_human
    static byte_times = []
    char_threshold = 16
    time_threshold = 0.125
    byte_times.append(now())
    while(len(byte_times) > char_threshold):
        byte_times.unshift()
    return (byte_times[-1] - byte_times[0]) < time_threshold

それには弱点がありますが、ほとんどの場合に機能します。

于 2016-12-27T19:31:32.660 に答える