2

「貼り付け」モードでテキストを挿入する関数をvimで作成しました。挿入モードを終了すると、スクリプトも貼り付けモードを終了します (nopaste を設定)。したがって、自動コマンド InsertLeave を使用しました。
問題は、「set paste」コマンドが関数を最初に呼び出したときにのみ機能することです。もう一度呼び出したい場合は、vim を再起動する必要があります。

これはvim関数です:

function Paste_from_clipboard()
    execute "normal! :set paste\<CR>\<Esc>o"
    execute "startinsert"
    autocmd InsertLeave * execute "normal! :set nopaste\<CR>"
endfunction

map <Leader>p :call Paste_from_clipboard()<CR>

私は何を間違えましたか?

4

1 に答える 1

6

VimScript の仕組みを誤解していると思います。すべての行 (.vimrc、プラグイン、構文ファイルなど) は単なる ex コマンドであり、開始:は必要ありません。したがって、これを書くとき:

execute "normal! :set paste\<CR>\<Esc>o"

あなたは基本的に、通常モードをシミュレートする:exec別の ex コマンド ( ) を呼び出す ex コマンド ( ) を呼び出していますか? :normalさらに別のexコマンド(:set)を呼び出し、キーコードを使用して実行します。なんで?最後の ex コマンドを直接使用できます。

set paste

これは auto コマンドでも発生しています。また、関数を呼び出すたびに自動コマンドを再作成していることに注意することも重要です。簡単な修正は、余分なコマンドを削除し、自動コマンドを関数の外に移動して、一度だけ作成されるようにすることです。その後、イベントがトリガーされるたびに実行が行われます (別のイベントリスナーが何度も作成されることはありません)。

function Paste_from_clipboard()
    set paste
    startinsert
endfunction

autocmd InsertLeave * set nopaste

map <Leader>p :call Paste_from_clipboard()<CR>

オプションの:h pt を確認してください 。pastetoggleそれはあなたがしていることの代わりになるかもしれません。

于 2016-03-26T00:59:30.910 に答える