Seçili sözcükleri ve satırları değiştirmek için Vim'de harici bir komut nasıl kullanılır?


22

Diğer editörlerde yararlı bulduğum bir şey:

  • seçilen metni al
  • harici bir komut çalıştır ve seçimi kendi stdin
  • harici komutları alın stdoutve mevcut seçimi onunla değiştirin.

Bu yolla, temel io yapabilecek herhangi bir dili kullanarak seçimde çalışan faydalı metin araçları yazabilirsiniz.

Bu seçim kullanılarak vim ile nasıl yapılabilir? ... tek bir karakter, kelime, paragraf ... vb.

(Doğrudan komut satırında veya bir anahtar bağlama ile?)


Not

!sortSatır düzeyinde çalışma gibi komutlar , bu soruyu sormamın nedeni seçimde işlem yapmak istiyorum. (yani, xbasılırsa kaldırılacak metin ).

Yanıtlar:


17

Çoğu zaman en kolay yolun, tüm modları seçmek için v(veya Vtüm satırları seçmek için büyük) görsel modunu kullanmak ve yayınlamak istediğiniz metni seçmek olduğunu biliyorum.

Sonra şunu yazın:

:!cat

Bu yararlı bir şey yapmaz. Sık kullandığım yararlı bir komut:

:!python -m json.tool

JSON'u biçimlendirmek için.

Ayrıca sadece (görsel mod olmadan) yazabilirsiniz:

:<range>!command

Örneğin, tüm dosya için:

:%!python -m json.tool

Veya geçerli satır için:

:.!python -m json.tool

Bununla kullanmak için gerçekten çok yararlı bir araç da sortkomuttur.
Cody Poll,

4
@CodyPoll Vim'in nesi var :sort?
Martin Tournoij

5
@Carpetsmoker Harici sıralama komutu çok daha fazla seçeneğe sahip ve (yerel ayarlara bağlı olarak vb.) Farklı bir düzen üretiyor.
derobert 16

1
Bu, bir satırdaki tek bir kelimeyi seçmek için çalışmaz. (bkz. soru kelime seviyesi seçiminden bahseder)
ideasman42

@ ideasman42 Sağ ... Ben aslen "çizgiler olarak bu soruyu okumak düşünmek veya yerine" çizgilerin kelimeler " ve hatlarda olmayan bariz UNIX programları iştir sözlerle bunu, herhangi bir durumda ... Yani" ve Vim Istisna değil. Bazı deneyler yaptım ve bir çözüm buldum, ama çok iyi çalışmıyor ... Belki yaklaşımım yanlıştır, bu yüzden birkaç gün bırakıp sonra geri döneceğim.
Martin Tournoij,

7

Bu konuda yardımcı olabilecek express.vim adında bir eklenti yazdım . Eklenti g=bir VimScript ifadesini bir hareket (veya Görsel seçim) üzerinde değerlendirmenize izin veren bir işleci tanımlar . v:valHareketin kapsadığı metnin (veya yine Görsel seçimin) yer tutucusu olarak kullanabileceğiniz bir ifade ister .

Bu durumda, yararlı bir ifade system(), harici bir komut çalıştıran işlevi kullanır .

system('tr a-z A-Z', v:val)

(Burada trbasit bir harici komut örneği kullandım .)

Bu sorun için express.vim kullanmanın yolu, metni Visual modlu seçip g=ardından ifadeyi yazıp ardından vurmaktır Enter:

g=system('tr a-z A-Z', v:val)<CR>

Kabul edeceğim, kullanımı kolay değil. (Aslında, bu eklentiyi nadiren kendim kullanıyorum!) İfadeyi başlatmak gibi harici bir komutu çağırmak için bir kısayol eklemeyi düşünüyorum !. Sonunda bunu yaparsam bir güncelleme gönderirim.

DÜZENLE

!Dış komutlarla başlayan ifadeleri tedavi etmek için express.vim'i değiştirdim . Yani, trörnekle yapışarak , yukarıdakiler çok daha basit hale gelir. Görsel seçimden sonra aşağıdakileri yazın:

g=!tr a-z A-Z<CR>

Açıklama:

  1. Express operatörünü çağırın g=
  2. !tr a-z A-Zİfade olarak girin
  3. Basın Enter

4

Vim'de filtre komutlarını arıyorsunuz. Bakın :help filter. İşte ilgili belgeler:

!{motion}{filter}   Filter {motion} text lines through the external
                    program {filter}.
!!{filter}          Filter [count] lines through the external program
                    {filter}.
{Visual}!{filter}   Filter the highlighted lines through the external
                    program {filter} (for {Visual} see |Visual-mode|).
                    {not in Vi}

:{range}![!]{filter} [!][arg]               *:range!*
                    Filter {range} lines through the external program
                   {filter}.  ...[See documentation for details]

Bu yüzden yazmak 5!!sort, imleçten başlayarak sonraki 5 satırı sıralayacaktır.


Tek bir kelimeyi filtrelemek mümkün mü? (satır düzeyinde değil)
ideasman42

Evet. Üçüncü seçenek (görsel mod), vurgulanan şey için çalışır (kelimeler, kısmi çizgiler, çoklu çizgiler, dikdörtgen bloklar, vb.).
Sameer

1
Üçüncü seçenek ayrıca tüm satırları filtreler. Tek bir kelime seçip filtre tr [:lower:] [:upper]uygularsanız, örneğin, vim'den ziyade, sadece bu kelimeyi değil bütün satırı koruyacaksınız.
maria s

0

İle yapılabilir unutmayın:

  1. görsel olarak ne istersen onu seç
  2. s^R=system('tr a-z A-Z', @")[:-2]^M( ^RCTRL + R ve ^ M ise ENTER ile)

Ayrıca seçim + benzeri bir şey yapan herhangi bir şeyle de çalışabilir ci"^R=....


Bunu çok satırlı bir metin seçiminde çalıştırırken ( vimleci basıp taşıdıktan sonra ) hatayı alıyorum E16: Invalid range\nE16: Invalid range\nE476: Invalid command(Linux'ta trve diğer temel komutlar var).
ideasman42

sEkleme moduna ya :sda komutuna giden bastınız mı ?
Luc Hermitte

Şüphelenmeyin, ama aynı zamanda ne demek istediğinizi tam olarak bilmiyorsanız, belki de örnek bunu bir anahtara nasıl bağlayacağını gösterebilir mi?
ideasman42

Doğrudan sgörsel moddan mı vurun yoksa :önce siz mi vurursunuz ? Yazdığım :anahtarların dizisinde yer yok . Bir eşleme olacaktır: vnoremap µ s<c-r>=system('tr a-z A-Z', @")[:-2]<cr>.
Luc Hermitte
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.