2016-03-25 16 views
2

"paste" -mode'a metin eklemek için vim işlevini yazdım. Ekleme modundan ayrılırsam, komut dosyası aynı zamanda yapıştırma modundan çıkar (nopaste). Bu yüzden autocommand InsertLeave kullandım.
Sorun, "set paste" komutunun yalnızca fonksiyonu ilk defa çağırdığımdır. Bir kez daha aramak istersem vim'i yeniden başlatmam gerek.vim işlevi yalnızca ilk kez düzgün çalışıyor

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> 

ben yanlış yaptım:

Bu vim fonksiyonudur?

cevap

5

VimScript'in nasıl çalıştığını yanlış anlıyorsunuz. Her satır ( on .vimrc, bir eklenti, bir sözdizimi dosyası olsun), başlangıç ​​: gerekli olmayan eski bir komuttur.

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

Temelde başka eski komutu sonra ne kadar normal modu taklit (:normal) çağıran bir ex komutu (:exec) diyoruz: Yani bu yazarken? 'u başka bir ex komutunu (:set) aramak ve yürütmek için anahtar kodlarını kullanmak. Niye ya? Sadece doğrudan nihai ex komutunu kullanabilirsiniz: Bu aynı zamanda oto komutu oluyor

set paste 

. Ayrıca, 'un, işlevinizi her aradığınızda otomatik bir komut oluşturduğuna dikkat etmeniz önemlidir. Ekstra komutlarınızı kaldırmak ve işlevinin otomatik komutunu işlevin dışına taşımak için basit bir düzeltme daha sonra yalnızca bir kez oluşturulur. yürütme sonra başka olay dinleyicisi üzerinde oluşturulan ve üzerinde olan olmadan olayı tetiklenir her zaman (gerçekleşecek.

function Paste_from_clipboard() 
    set paste 
    startinsert 
endfunction 

autocmd InsertLeave * set nopaste 

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

Kontrol pastetoggle seçeneği için :h pt. Bu bir alternatif olabilir ne yaptığınızı

+0

Çok teşekkürler! VimScript'in nasıl çalıştığını gerçekten yanlış anladım. – mamiu

İlgili konular