VIM editörü ve boru çıktısını bash'a çağırmak


34

Bazen metin yazmam ve o metni başka bir komuta aktarmam gerekiyor. Her zamanki iş akışım şuna benzer:

vim
# I edit and save my file as file.txt
cat file.txt | pandoc -o file.pdf # pandoc is an example 
rm file.txt

Bu hantal ve bash betiği öğrenmeye çalışıyorum. Bir editöre ateş eden bir komut yazarak ve editörün stdout'a çıktığı için editörün çıkışını kapattığında işlemi çok daha basit hale getirmek istiyorum. O zaman komutu olarak çalıştırabilirim quickedit | pandoc -o file.pdf.

Bunun nasıl işe yarayacağından emin değilim. Yukarıda tam iş akışını ve bazı eklemeleri takip ederek bunu otomatikleştirmek için bir işlev yazdım. Bir dosya adı olarak işlev görmek için rastgele bir dize oluşturur ve işlev çağrıldığında bunu vim'den geçirir. Kullanıcı dosyayı kaydederek vim'den çıktığında, işlev dosyayı konsola yazdırır ve ardından dosyayı siler.

function quickedit {
    filename="$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 32)"
    vim $filename
    cat $filename
    rm $filename
}
# The problem:
# => Vim: Warning: Output is not to a terminal

Yakında karşılaştığım sorun, quickedit | commandvim'in kendisi gibi bir şey yaptığım zaman editör olarak kullanılamaması çünkü tüm çıktılar boru ile sınırlı.

quickeditFonksiyonumun çıktısını alabilmem için bunun için herhangi bir geçici çözüm olup olmadığını merak ediyorum . En alt alternatif ise ayrı bir editörün ateşlenmesi, yüce metin demek, fakat gerçekten terminalde kalmak istiyorum.


Vim içinden emri ver :w !pandoc -o file.pdf? (Arasında boşluk Not wve !gereklidir.)
John1024

Tamam bu harika. Vim çıkışını vim içinden çıkarabileceğinizi bilmiyordum. Bu, amaçlarıma hizmet ediyor, ancak gelecekteki bilgilerim için, sorunumu tam olarak nasıl çözülmesini istediğimi çözmek mümkün mü?
avukat

İşlevini gönderebilir misin? Yakında karşılaştığınız sorun hakkında konuşurken (geçen ikinci paragrafta) ne demek istiyorsunuz? Anlamadım.
Lucas,

5
Bir kenara, onu güvensiz bir şekilde yeniden icat etmek yerine kullanmalısınızmktemp .
Joker

Yeni bir bash kullanıcısı olarak, mktemp’yi yeniden icat etmenin güvenlik tehlikeleri nelerdir?
avukat

Yanıtlar:


42

vipe boru hatlarını düzenlemek için bir programdır:

command1 | vipe | command2

Çıktısının tamamı ile bir editör elde edersiniz command1ve çıktığınızda içerikler command2boru üzerinden iletilir .

Bu durumda, hayır yok command1. Yani yapabilirsin:

: | vipe | pandoc -o foo.pdf

Veya:

vipe <&- | pandoc -o foo.pdf

vipeEDITORve VISUALdeğişkenlerini seçer , böylece Vim'i açmak için bunları kullanabilirsiniz.

Yüklemiş değilseniz vipe, moreutilspakette bulunur; sudo apt-get install moreutilsya da senin flavour eşdeğeri olursa olsun.


1
Buraya gelen Mac kullanıcıları için: moreutilsHomebrew'de mevcuttur.
vergenzt

FreeBSD kullanıcıları için: pkg (8)moreutils aracılığıyla yüklenmeye hazırdır .
Mateusz Piotrowski

20

Bunu Vim'den yapabilirsiniz:

:w !pandoc -o file.pdf

Hatta tamponu karmaşık bir boru hattına bile yazabilirsiniz:

:w !grep pattern | somecommand > file.txt

Ve sonra kaydetmeden Vim'den çıkabilirsiniz:

:q!

Ancak, özel kullanım durumunuzu göz önünde bulundurarak, muhtemelen vikomut satırı editörünüz olarak kullanarak daha iyi bir çözüm vardır . Kullandığınızı varsayarsak bash:

set -o vi

Bu, anahtar kelimelerinizi için ayarlar vi. Temel ile komut satırında sağ komutlarınızı düzenleyebilirsiniz Yani vibasarak keybinding <Esc>ve sonra yazmaya vigibi komutları x, cwvb (Sen basarak ekleme modunda geri alabilirsiniz i.)

Daha da iyisi ve bu soruya daha ilgisi olursa, doğrudan komut satırı içeriğinizi oluşturmak için Vim'i açabilirsiniz. Sadece yazın <Esc>vve boş bir Vim tamponu alacaksınız. Kaydettiğinizde ve çıktığınızda , komut satırınızdaki komut budur ve hemen çalıştırılır. Bu, doğrudan komut satırında düzenlemekten çok daha esnektir, çünkü isterseniz mini bir senaryo yazabilirsiniz.


Örneğin, biraz zor metinler yazmak ve hemen pandoc'a aktarmak istiyorsanız, şunu yazabilirsiniz:

<Esc>v

Ardından, Vim arabellek düzenleyin:

cat <<EOF | pandoc -o file.pdf
stuff for pandoc
more stuff for pandoc
EOF

Sonra kaydedin ve çıkın (with :x) ve her şey bir kabuk komutu olarak çalışacaktır.

Aynı zamanda kabuğunuzun komut geçmişinde de bulunacaktır.


1
Emacs anahtar bağlantılarını korumayı tercih ediyorsanız, EDITORortam değişkenini ayarlayarak vimve Ctrl-Xardından Ctrl-Ekomut satırını düzenlerken tuşuna basarak komut satırlarını düzenlemek için Vim'i kullanabilirsiniz .
Anthony G - Monica için adalet

18

Bir boru hattında çalışan

Deneyin:

quickedit() (  trap 'rm ~/temp$$' exit; vim ~/temp$$ >/dev/tty; cat ~/temp$$ )

Anahtar, vimnormal şekilde kullanabilmek vimiçin terminal için stdout'a ihtiyaç duyulmasıdır. Bunu burada yönlendirme ile başardık >/dev/tty.

Güvenlik nedeniyle geçici dosyayı kullanıcının giriş dizinine koydum. Bununla ilgili daha fazla bilgi için, Greg'in SSS Soru 062'sine bakın . Bu, belirsiz bir dosya adı kullanma ihtiyacını ortadan kaldırır.

Örnek:

Ne zaman vimaçılır, ben yazdıkça This function succeeded.ve dosyayı kaydedin. Ekrandaki sonuç şöyle görünür:

$ quickedit | grep succeeded
This function succeeded.

Çıkışı quickeditbir boru hattına yönlendirilse bile , vimnormalde çalışıyor çünkü doğrudan erişime izin verdik /dev/tty.

Bir programı vim içinden çalıştırma

Yorumlarda da bahsettiğim gibi, vim bir dosyayı bir komuta gönderebilir. Örneğin, vim içinden, komutu verin :w !pandoc -o file.pdf(Not: w ve! Arasındaki boşluk esastır).


2
Güzel cevap Bu, doğrudan kullanıcının sorusunu ele alır ve hızlı ve zarif bir çözüm sunar: vim'i / dev / tty'ye yönlendirin! Basit!
Mike S,

Zsh kullanıyorum; trap '...' exitBaşarısız ancak çalışıyor trap '...' EXITgibi görünüyor. Bindirme hakkında çok fazla bilgim yok, ancak geçici dosyalar için genel yaklaşımım kullanmak mktmp [--suffix=...]. Ayrıca, vim <outfile> -c '...' >/dev/ttydosya yüklenene kadar normal çalışır, ardından :wqdüzenleme aşamasını atlamak isteyip istemediğiniz de dahil olmak üzere verilen komut zincirini çalıştırır . Ben de kullandım set | grep -a EXITve buldum signals=(EXIT ... DEBUG).
John P,

5

Bunun vimvarsayılan editörünüz olarak ayarlandığından emin olun (örn export EDITOR=vim. .bash_profileVeya sizin .bashrc. Sonra, herhangi bir istemde Ctrl- Xsonra Ctrl- - yazabilirsiniz E. Bu, geçerli komut satırınızı yapılandırılmış düzenleyicinizde açar (örneğin vim). Düzenlemelerinizi yapın, kaydedin ve çıkmak ve komut, komut satırına boru hatları ve benzerleri de dahil olmak üzere yazmışsınız gibi yürütülecektir.

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.