Vim komutlarını vim'e bağlamak mümkün mü?


18

Aşağıdaki kabuğu çalıştırmak istiyorum.

wea-this is the end of the second word | vim j
exit 0

Umduğum anahtar vuruşlarını w(bir kelime ileri git) sonra e( kelimenin sonu) sonra a(append) sonra -this is the end of the second word(metin) jiçinde zaten kelime olan Vim belgesine boru olacaktır .

Kabuk betiğini çalıştırdığımda aşağıdaki hata oluştu.

/root/bin/tt.sh: line 1: wea-this: command not found
Vim: Warning: Input is not from a terminal

Ubuntu 14.04 kullanıyorum. İki tür cevap takdir edilecektir:

  1. Bu istenen sonucu elde etmek için boruların kullanılması.
  2. Kabuk komut dosyasından bir metin belgesini düzenlemek için "Vim komutları" (ed veya sed komutları değil) kullanabileceğim başka bir yöntem.

1
|Karakter boruları başka bir komutun çıktısı. wea-thisbir komut değildir. Borulama yapmak istediğiniz şeyi elde etmek için kullanılamaz; Vim'in stdin'inin klavye değil sol el uygulaması olmasına neden olur. Eğer vim bir tampon içine stdin'i almak istiyorsanız, dosya adı için bir eksi başlatın: echo Hello, world! | vim -.
dash-tom-bang

Yanıtlar:


16

Dizeyi "hello"dosyanın ilk satırına eklemek jiçin kabuğunuza aşağıdaki komutu yazabilirsiniz:

vim +"1 | put! ='hello'" j

  • :1 imleci arabelleğin ilk satırına taşır
  • :put! ='hello' "merhaba" dizesini geçerli satırın üstüne yapıştırır

Dizeyi eklemek "hello"ve ardından dosyayı kaydedip çıkmak için:

vim +"1 | put! ='hello' | x" j

Daha önce olduğu gibi, kaydedip çıkmayı :xsağlayan Ex komutunu ekledik .

Daha genel olarak, bir dosyada, etkileşimli bir kabuktan veya bir bash komut dosyasından herhangi bir Ex komut dizisini şu şekilde çalıştırabilirsiniz:

vim +'Ex command1 | Ex command2 | ...' file

Çok fazla Ex komutunuz varsa, bunları özel bir dosyanın (örneğin olarak adlandırılır myExCommands.vim), her satıra bir komutun içine yazabilir ve ardından kabuktan veya komut dosyasından (Ex komutuyla :sourceveya kısa sürümle) :so) bunun gibi:

vim +'so myExCommands.vim' file

Düzenle

Sorunuzu düzenlediğinizi görüyorum.
Sana Ex komutlarıyla Ex modundan herhangi bir normal komutunu çalıştırabilirsiniz çünkü önceki cevabı hala geçerlidir düşünüyorum :normalve :execute.

Örneğin, şunları yapmak istediğinizi varsayalım:

  • imlecinizi arabelleğin ilk satırına götür ( 1G)
  • imlecinizi satırdaki ilk boşluk olmayan karaktere götür ( _)
  • imlecinizi bir kelime ileri götür ( w)
  • imlecinizi yeni kelimenin sonuna götür ( e)
  • imlecin altındaki karakterden sonra ekleme moduna geç ( a)
  • ipi ekle hello
  • kaydet ve çık ( :x)

Dosyada bunu yapmak jiçin kabuktan yazın:

vim +"execute 'normal! 1G_weahello' | x" j

Daha fazla bilgi için bakınız:

:help +cmd
:help :normal
:help :execute

Hedefimi tam olarak açıklayamadım. Bir kelime ve benzeri ileri gitmek için w gibi vims komutları kullanabilmek istiyorum. Düzeltmek için sorumu düzenleyeceğim.
Jason Basanese

@JasonBasanese Cevabımı düzenledim, Ex komutlarını :normalve :executeistediğini yaptım?
saginaw

10

Burada, stim'den Vim'e sunulan bir akışı düzenlemek için sadece ex komutları yerine normal mod komutlarını kullanabileceğiniz bir yol vardır. Bu çok yararlı bir örnek değil, ancak ilgili teknikleri gösteriyor. Kabuğunuzun bash olduğunu varsayar.

echo "The brown fox jumped." | vim -s <(printf 'wcwred\e:wq! foo\n') -

-Sonunda stdin'den metni (değil komutları) okumak için Vim söyler. -sBelirtilen dosyadan tuş vuruşlarını yürütmek için Vim söyler. Bu durumda, dosya bir bash işlemi ikamesinin çıktısıdır. Bunun <(...)yerine adlandırılmış bir kanalın adı gelir. Borunun çıkışı, komutun parantez içindeki çıkışıdır. wcwred\eTek sözcükle hamle imleç ve değişikliklerin bir sonraki kelime için red. Bu dosya zaten mevcut olsa bile :wq! foo\nsonucu dosyaya kaydeder foo. Sonuç, foometni içeren bir dosyadırThe red fox jumped.

Bu konulardan bazıları hakkında daha fazla bilgi için bkz.

:help -file
:help -s

Ayrıca man sayfasının Process Substitutionbölümüne bakınız bash(1).


1
~ / .Zshrc: öğesine eklendi vimx () { vi -s <(echo "$1"':wq') "$2" &> /dev/null; }. Şimdi yapabilirim vimx 'iThe brow fox jumped.\e' foo; vimx 'wcwred\efjdwiclimbed\e' foo; cat foo. Temiz!
Leonard Pauli

@LeonardPauli: Yararlı görünüyor! Hata çıkışı kullanılamıyor mu? Neden /dev/nulled?
Miłosz Łakomy


4

Bir programın çıktısını alt kabuktan yeniden yönlendirilen olarak alma yöntemini çok kolay buldum:

vim <( program )

Misal:

 vim <( grep -nH  hello  myFile.cpp )
 vim <( find . -name '*.cpp' -exec grep -nH code_expr {} \+ )

4

Seninle tamamen aynı arzum vardı: Normal vim komutları yazmak ve bunların bir boru hattı akışını düzenlemesini istedim. Varsayılan vim seçenekleri tarafından sağlanan normal vim (bu kadar çok bayrak!) Bu şekilde kullanmanın zorluğu beni hayal kırıklığına uğrattı.

Bu nedenle, vim üzerinde bunu yapmak için küçük bir paket yazdım: https://github.com/MilesCranmer/vim-stream/ . Denir vims.

Sargının kalbi aşağıdaki komuttur:

vim - -nes "${vim_cmds[@]}" -c ':q!' | tail -n +2

Bunu kullanarak, yaptığım komut üretimi ile oldukça özlü olur ve vim kalıcı bir editör olduğu için kalıcı vimsbir akış editörü yaptım . Boru hattı düzenleme zihniyeti için yararlı olan üç ana mod vardır:

[-t|--turn-off-mode] - (Default mode)
                       Every string is a vim command line, e.g., '%g/foo/d' deletes
                       all lines with foo.
[-e|--exe-mode] -      Translated to '%g/$1/exe "norm $2"', see examples below
[-s|--simple-mode] -   Like exe-mode, but runs on 1st line only

Şunu izle:

$ echo "Hello World" | vims -s "ea Beautiful"
Hello Beautiful World

Böylece, esonuna kadar gider Hello, sonra aeklemeye başlar.

Exe-modunda, my_bad_varönceki satırı içeren satırları yorumlamak ve silmek için bir şey meraklısı .

cat my_script.cpp | vims -e 'my_bad_var' 'I//\<esc>kdd'

Bu da demektir vims '%g/my_bad_var/exe "norm I//\<esc>kdd"'- Isatırın başlangıcında ekleme başlatma komutu //olmak ve yorum sırası olmak. \<esc>kddçıkış tuşuna basar, bir satırı yukarı taşır, ardından satırı siler.

Repo hakkında toplam 11 örneğim var, onları kontrol etmenizi öneririz. Yine, bu vim üstünde çalışıyor, bu sadece vim akış girişi için sed gibi yapmak için bir yoldur (ancak tüm sevgili vim makrolarınızı koruyarak!)


3

Bu oldukça eski bir soru, ancak verdiğiniz dağıtım / işletim sisteminizin erişimi moreutilsvarsa, o zaman bunu yükleyebilir ve vipestandart bir ek olarak kullanabilirsiniz vim:

echo foo | vipe # Now you can edit "foo" to be "bar"!

moreutilsdiğer araçları için de çok kullanışlıdır ve ciddi bir komut satırı kullanıcısıysanız onları kesinlikle tavsiye ederim! :) Daha fazla ayrıntı için yazarın tanıtımına (önceki bağlantı) bir göz atın.

moreutilsgenellikle * nix benzeri dağıtımların çoğuna bir paket yöneticisi ve Mac'teki Homebrew aracılığıyla erişilebilir olmalıdır . Örneğin...

# Arch Linux and MSYS2 (more below) as part of the `community` repo
pacman -Sy moreutils


# Mac OS and Homebrew
brew install moreutils

moreutilsayrıca MSYS2 paket deposunun bir parçasıdır , bu nedenle teknik olarak Windows'ta da kullanabilirsiniz. :)

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.