Yapıştır seçeneğini ayarlayın, ancak yalnızca bir ekleme için


16

Vim 'paste'seçeneğini ayarlamak, bazı metin eklemek ve önceki değerine geri dönmek için hızlı bir yol istiyorum 'paste'.

Tipik bir kullanım durumu, otomatik girintiler gibi etkin olabilecek herhangi bir ekleme modu yeniden yazımına bakılmaksızın ve Vim'in durumunu değiştirmeden OS panosu içeriğini tam anlamıyla ekler. Başka bir kullanım durumu, bir OS makro özelliğinin Vim'e tuş vuruşlarını enjekte etmesine ve bunların değişmez metin olarak yorumlanmasına izin vermek olacaktır.

Bu, açıkça diğer seçeneklere genelleme yapar - genel fikir, bazı seçenekleri ayarlamaktır, ancak yalnızca ekleme modu aracılığıyla bir seyahat süresi boyunca.

Temelde ben bunu _iyapan bir makroya bir anahtar dizisi (demek ) bağlamak istiyorum

:set paste
i…<Esc>
:set nopaste

Burada i…<Esc>, ekleme moduna geçme ( ikomutta olduğu gibi ) ve komut moduna geri döndükten sonra makroyu devam ettirme, ancak 'paste'önceden etkinse hala aktif olmak istiyorum. Bunu nasıl yapabilirim?

Not: İşletim sistemi panosunun içeriği "*kayıt defterine eşlenir . Bu işe yaradığında, 'paste'seçenek çok yararlı değildir. Bu soru için motive edici senaryo, "*kayıt desteği için koşulların karşılanmadığı zamanlardır - Vim bu +xterm_clipboardözellikle derlenmemiştir veya Ekran veya SSH gibi bir terminalde ortam X sunucusundan izole eden bir terminalde çalışmaktadır.


1
Sorunu beğendim (orada birçok kez bulundum). Ancak, yapıştırmak +veya *kaydolmak daha kolay değil mi?
yo '

@yo ' Sadece çalıştıklarında . Bu, Vim'i kullanmam için çoğu zaman böyle değildir.
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


15

Bunu deneyin:

function! Paste_Func()
    let s:inPaste = &paste
    if !s:inPaste
        set paste
    endif

    echom s:inPaste
    augroup paste_callback
        autocmd!
        autocmd InsertLeave <buffer> call Paste_End()
    augroup END

    startinsert
endfunction

function! Paste_End()
    augroup paste_callback
        autocmd!
    augroup END
    augroup! paste_callback

    if !s:inPaste
        set nopaste
    endif
endfunction

map _i :call Paste_Func()<cr>

Geçerli yapıştırma durumunuzu inPaste değişkeninde saklar ve henüz ayarlanmamışsa yapıştırma özelliğini ayarlar. Ardından, ekleme modundan çıktığınızda otomatik bir cmd ayarlar ve sizi ekleme moduna geçirir.

Ekleme modundan çıktığınızda, önce autocmd'yi kaldıran autocmd'yi çalıştırır (böylece ekleme modundan başka bir şekilde ayrıldığınızda çalışmaz) ve son olarak yapıştırma modunda değilseniz nopaste'yi ayarlar.

Ayrıca, bir terminalde vim kullanıyorsanız , modu otomatik olarak yapıştırıp yapıştıramayacağınızı ve ayarlayıp ayarlamadığınızı tespit etmek için birkaç terminal öykünücüsü tarafından sağlanan parantez yapıştırma modu özelliğini kullanan vim-bracketed-paste'e göz atmak isteyebilirsiniz .

Düzenle: komut dosyasını düzeltti


Bu doğru yolda gözüküyor (özellikle, normal dünya komutları tarafından bir yerleştirme dizisini nasıl "destekleyeceğime dair hiçbir fikrim yoktu). Teşekkürler. Ancak, oldukça doğru değil ve sorunun nerede olduğunu görmüyorum: sonra , daha önce açık olsa bile _i, pasteseçenek kapalı.
Gilles 'SO- kötü olmayı bırak'

Haklısın! Bunu test ettiğimden eminim, ama bir şeyi değiştirmeliydim. Komut dosyasını gönderide güncelledim, şimdi sizin için çalışıp çalışmadığına bakın.
Chad

4

bunun dışında 'paste'önceden aktif olsaydı hala aktif olmak istiyorum.

'paste'olabildiğince kısa bir süre aktif olmalıdır. Çok sayıda işlevselliği (haritalar dahil) devre dışı bırakır, çünkü tek amacı yapıştırılan metni yanlış yorumlamaktan kaçınmaktır. Bu nedenle, belirtilen şartın gerçekten gerekli olmaması gerektiğini düşünüyorum.

Bununla birlikte, ayarlamaya gerek kalmadan yapıştırmak oldukça kolaydır 'paste'. Gvim çalıştırıyorsanız veya +xterm_clipboardkonsol vim'iniz varsa "+p, OS panosundan yapıştırmak için kullanabilirsiniz .

Yapıştırma sırasında otomatik girinti sorunu sadece iki senaryoda gerçekleşir. Ekleme modundayken ( <C-r>+) veya fareyle orta tıklatarak yapıştırma yaparken bir kaydın içeriğini ekleme .

Ekleme modundayken bir kaydın içeriğini eklemek yerine, kayıttan normal modda yapıştırmak yeniden biçimlendirme sorununu önleyecektir.

Yapıştırmayı fareyle orta tıklatmak istiyorsanız 'mouse', terminal yerine Vim'in orta tıklamayı işlemesine izin verme seçeneğini kullanın. Vim daha sonra, gelen metni yazılıyor olarak yorumlamak yerine içeriği tam anlamıyla ekler.


2
Bunların hiçbiri sorumu yanıtlamıyor. Bir sebeple açık şartlar koydum! Genellikle 'paste'önceden aktif değildir, ancak bunu düşünmek istemiyorum. Genellikle X panomuza veya fareye erişimi olmayan bir Vim'de çalışıyorum, ya da Vim derlemem bu özelliğe sahip olmadığından xterm_clipboardveya örneğin şu anda bir ekrana bağlı olan bir Ekran oturumunda çalıştığım için X terminali.
Gilles 'SO- kötü olmayı bırak'

@Gilles O zaman nasıl yapıştıracağınızı açıklayabilir misiniz? Bu eylemi yapmak istediğiniz şeyle kapatabilecek bir yanıt verebilmek için bu ilgili bilgilerdir.
jamessan

1
Temel kullanım durumum farenin orta düğmesine veya Shift + Insert tuşlarına yapıştırmaktır. Bu gerçekten alakalı değil: sorunun özü, bir seçenek ayarlamak, ekleme moduna geçmek (ile i, bunu nasıl parametrelendirmeyi sormuyorum) ve ekleme modundan döndükten sonra seçeneğin değerini geri yüklemek.
Gilles 'SO- kötü olmayı bırak'

1
@Gilles Bu yorumda belirtildiği gibi sorunuzun özü benim için orijinal sorunuzdan çok daha açık. Teşekkürler.
jamessan

1
O alakalı değil @Gilles size , ama gelecek ziyaretçiler alakalı olabilir. Bu yüzden ister söz kendisinde koyabilirsiniz ( "Ben kullanabilir biliyorum "*pya "+ppanolara yapıştırmak, ama sistemin macun yeteneklerini kullanmak için wan't") ve daha sonra bu yanıt gereksizdir. Yoksa yapmıyorsunuz ve bence bu cevabın burada bir yeri var.
yo '

4

Şahsen, tam da bu nedenle yoTim Pope'in mükemmel vim-engelsiz eklentisinin tuş takımını kullanıyorum . Belgelerinden:

Yalnız yerleştirmenin tipik kullanım durumu çok israf olduğundan, 'yapıştırma' için bir geçiş sağlanmamıştır: İki kez değiştirirsiniz, ancak yalnızca bir kez yapıştırırsınız (YOPO). Bunun yerine, çağırmak için veya tuşuna basın yoveya önceden ayarlanmış 'yapıştırın'. Ekleme modundan çıkıldığında otomatik olarak 'nopaste' ayarlanır.yO|o||O|

Bu sorunuz için yan uygulamayı yüklemek için overkill olabilir, ama çok diğer yararlı keybinding hazinesi (daha bilgi sağlar bulmak README ).


1

Linux veya Mac'teki Vim 8+ ile, artık terminal braketli macunu destekliyorsa, terminalin yerel macununu (örn ctrl+shift+V. Gnome'da, cmd+VMac'te orta fare düğmesi ) kullanabilirsiniz. iEkle Modu için basmayın .

Otomatik panoya eklemeden boşlukları ve sekmeleri koruyarak işletim sistemi panonuzun içeriğini yapıştırır. Eski eşdeğerdir var :set paste, i, ctrl+shift+V, esc, :set nopasteyöntemin.

Hatta gerek yok +clipboardya +xterm_clipboardvim artık özellikleri yüklenmiş. Bu özelliğe "köşeli hamur" denir. Daha fazla ayrıntı için bkz. Https://stackoverflow.com/questions/2514445/turning-off-auto-indent-when-pasting-text-into-vim/56781763#56781763

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.