Vim penceresinde etkileşimli bir kabuk verebilir miyim?


17

Dış komut yürütmek :!veya :r!isteğe bağlı olarak çıktısını metne eklemek biliyorum . Ben bile yapabilirim :!shve çıkana kadar yaşayacak bir kabuk ortaya çıkaracağım - ama kabuk aktifken Vim 'uykuda' ve erişilemez. Bir anlığına Vim'e dönmek istersem kabuğu bırakmalı ve yeni bir tane çıkarmalıyım - çok yararlı değil.

Birlikte Vim askıya alarak, zıt ucunda kabuk erişebilir ^Zve içinden Vim işini yönetmek bg, fgve jobs. Bu daha mantıklı ama uzun vadede çok hantal. Ben kullanabilirsiniz Screenbenim pencere yöneticisinin açık birçok pencere (genellikle değildir) mevcuttur, ya eğer (yine uzak ana hem vim ve kabuk, hantal olması, sırayla onların her hedef ana bilgisayara ve ssh.)

Vim bir kabuk oturumu açmama ve diyelim ki (iç) pencerelerinden birinde saklamama ya da ona geri dönmeme izin vermem en uygun olurdu. Böyle bir şey mümkün mü?


1
Yani temelde, :splitdosyayı diğer pencerede tutarken bir kabuk açmak ister misiniz ? ... Bu bana tmux veya ekran için bir iş gibi geliyor ...
Martin Tournoij

1
@Carpetsmoker: Uzaktaki sisteme neyin yüklendiğini kontrol edemiyorum ve Vim her zaman oradayken, ikisinden de daha sık değilim.
SF.

Neovim'e geçmeyi düşünün. Şimdi oldukça iyi çalışan ve bir vim tamponunda açılabilen dahili bir terminal emülatörüne sahiptir.
Zach

Yanıtlar:


16

Buna izin veren birkaç vim eklentisi var. Kullandığım Conque ( Github ).

Eklentiler dizininize koyduktan sonra yapmanız gereken tek şey:

:ConqueTermSplit bash

Ve vim'de etkileşimli bir bash kabuğuna sahip olacaksınız. Daha sonra pencerede yapmak isteyebileceğiniz başka bir şey yapmak için normal vim hareketlerinizi kullanabilirsiniz.

Ayrıca diğer eklenti vimshell .


1
Eklenti olmadan böyle bir şey yapmanın yolu yok mu?
SF.

3
@SF Bkz :help shell-window. (Kısa cevap: hayır.)
muru

3

IMO vimshell en yakın geliyor olsa da VIM ile bunu yapmak için eklentilerin o kadar da iyi olmadığına inanıyorum. Ancak bunun 2 bölümlü bir sorun olduğunu anlamanız gerekir.

  1. VIM, böyle şeyler yapmak için tasarlanmamıştır, özellikle hantal, uzun süren herhangi bir görevi yürütebilir ve VIM'i engellemeden senkronize olmayan bir şekilde konuşabilir. Bu durumda, yalnızca kabuğun kendisi değil, kabuk işlemi içinde gerçekleştirebileceğiniz diğer görevler de vardır.
  2. VIM'in kalıcı felsefesi, bir mermiyle etkileşim şeklimizle o kadar da iyi oynamıyor. Bir kabukta yalnızca geçerli satır düzenlenebilir, ancak geçmişinizdeki eski metni kabukla kaydırabilir ve düzenleyebilirsiniz. Bu, VIM'in felsefesine hiç uymuyor, ESC'ye basacak ve normal moda geri dönecek olursanız, bir kullanıcının geri dönüp yukarıdaki tarihin bölümlerini düzenlemesine izin vermemek oldukça zor olurdu.

Bence bu konuda çok daha iyi çalışan 2 yaklaşım var.

  1. Hem vim hem de kabuğa sahip olmak için TMUX / Screen ve multiplex terminal pencerelerini kullanma. Bu şekilde ikisi düzgün bir şekilde ayrılır ve yine de her ikisini de çok az çaba ile görüntüleyebilirsiniz ve ikisi birbirlerinin akışıyla çelişmeden potansiyellerinin en iyisini yapabilirler.
  2. Tpope / vim-dispatch ve beğenileri gibi eklentileri kullanarak, bir kabuk dışından komutları kolayca başlatabilir ve gerçek bir terminal kabuğunda arka planda eşzamansız olarak çalıştırabilir ve tamamlandıktan sonra sonuçları vim'e geri çekebilirsiniz. Bu aynı zamanda ikisi arasında aynı izolasyon seviyesini sağlar ve böylece ikisi de birbirlerinin ayak parmaklarına basmadan yeteneklerinin en iyi şekilde çalışabilir.

Şunu da eklemeliyim ki NeoVIM'in bu açıdan bir değişiklik getirebileceği ihtimali yüksektir, çünkü ana hedeflerinden biri işleri eşzamansız olarak yürütebilmektedir. Ama o zamana kadar bu bence alabileceğimiz en iyisi.


3

Gelen :help shell-windowbir pencerede kabuk komutları çalıştırarak okuyabilirsiniz:

Vim'in içindeki bir pencerede bir kabuk yürütme olasılığı için sorular var.

Cevap: yapamazsınız!

Bunu dahil etmek, Vim'e çok fazla kod ekleyecektir, bu da bunu yapmamak için iyi bir nedendir. Sonuçta, Vim bir editördür , düzenleme yapmayan görevler yapması gerekmez. Ancak, böyle bir şey almak için, terminal ekranınızı veya ekran pencerenizi " splitvt " programı ile bölmeyi deneyebilirsiniz .

Alternatif olarak, birden çok çakışan pencereyi destekleyen BSD Unix sistemlerinde bulunan " pencere " komutu kullanılır. Veya " ekran " programı.

Ancak kullanabileceğiniz birkaç çözüm vardır:

  • screenbu tür şeyler için özel olarak tasarlanmış kullanım , örneğin:

    • Ctrl+ a, Sgeçerli pencereyi yatay olarak bölmek için
    • Ctrl+ a, Tabpencereler arasında geçiş yapmak için
    • Ctrl+ a, Xgeçerli bölgeyi kaldırmak için
    • Ctrl+ a, Qbiri hariç tüm bölgeleri kaldırmak için

    Daha fazla bilgi için: stackoverflow SE'de GNU Ekran Hayatta Kalma Rehberi

    Veya: GNU Ekran Bölme , daha fazla bilgi için ekran Hızlı Referansı .

  • VIM-Shell - üçüncü taraf bir yama

    VIM kabuğu, bölünmüş pencerelere sahip VIM için bir uzantıdır ve bu yama, bu pencerelerde kabukların başlatılmasını mümkün kılar. Yalnızca POSIX sistemleri için kullanılabilir

  • vterm - vim içindeki terminal emülatörü.

    Vterm'in amacı, herhangi bir bağımlılık olmadan kutudan çıkar çıkmaz çalışan, vim içinde bir unix terminal klonu sağlamaktır.

  • Vimux - vim'den tmux ile kolayca etkileşim kurun.

    Tmux'a giriş göndermenizi sağlayan bir eklenti olan tslime.vim'den ilham alan vimux , vim'den tmux ile etkileşimi kolaylaştırmaktır.

  • daha önce bahsedilen diğer: Conque

İlgili: Vim'in içinde bir terminal nasıl çalıştırılır? stackoverflow'ta


Nasıl bölünmüş kurtulmak için ?? : - /
0xc0de

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.