2016-03-25 9 views
2

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

は私が間違って何をしたのですか?

答えて

5

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

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

あなたは基本的に別の元 コマンドその後、何に通常モードをシミュレート(:normal)を呼び出すExコマンド(:exec)を呼び出している:だから、これを書いたときに? にもう1つのexコマンド(:set)を呼び出し、キーコードを使用して実行します。どうして? あなただけの直接最終Exコマンドを使用することができます。

set paste 

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

function Paste_from_clipboard() 
    set paste 
    startinsert 
endfunction 

autocmd InsertLeave * set nopaste 

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

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

+0

ありがとう!私はVimScriptの動作を誤解していました。 – mamiu

関連する問題