Bir kabuğun kastedilen anlamı “vi” modunda ya da “emacs” modunda mı?


32

Bu soru doğrudan cevaptan gelir . Bu durumda, özellikle şöyle yazan kısmı anlayamıyorum:

Bu bağlamda, davranışı emacs 'bash (readline) / ksh / zsh emacs kipine göre daha yakındır, ancak Ctrl-Wönceki kelimeyi silen (sürücü kipinde de silinen ) terminal sürücüsü gömülü çizgi editöründen (kanonik modda) ayrılır. ).

Burada iki tamamen farklı program olan editörlerden değil kabuklardan bahsediyoruz. Kabuğun bazı editör modunda olduğunu söylemek ne anlama geliyor?

Not: Cevabınızı, bir kabuğun ne olduğunu ve temel düzenleme için vim'in nasıl kullanıldığını anladığım önceliğine dayanabilirsiniz.


Bu, çekirdek kabuk işlevselliği ile ilgili değil, satır düzenlemesiyle ilgilidir (bir yazım hatası yaptığınızda ve geri dönüp kendiniz düzeltirken ne yaparsınız).
n. 'zamirler' m.

Yanıtlar:


27

"Vi" modunda, geçerli düzenleyicide vi düzenleyicideki bir çizgi gibi düzenleyebilir / gezinebilirsiniz. Tek satırlık bir metin dosyası gibi bakabilirsiniz. Benzer şekilde "emacs" modunda, Emac'ın kısayollarını (bazıları) kullanarak geçerli komut satırını düzenleyebilir / gezinebilirsiniz.

Örnek

Örneğin vi-mode'da (bash'ta) gibi bir şeyler yapabilirsiniz:

$ set -o vi
$ ls hello world
<ESC>
bbdw # results in
$ ls world

Emacs-modda örneğin vurabilir Ctrl+ A(: vi bir satırın başında atlamak için Ctrl+ [, 0veya ESC, 0). Emacs modunu set -o emacs(bash, ksh, zsh vb.) Kullanarak açabilirsiniz .

taleb

Çok sayıda etkileşimli komut satırı programı ( bash dahil ), readline kütüphanesini kullanır. Böylece, hangi giriş modunu (vi veya emacs) kullanacağınızı ve diğer seçenekleri tek bir yerde yapılandırabilirsiniz, böylece readline kullanan her program aynı düzenleme / gezinme arayüzüne sahip olacaktır.

Örneğin, okuma çizgisi yapılandırmam şuna benziyor:

$ cat ~/.inputrc 
set editing-mode vi
set blink-matching-paren on

Örneğin, zsh / ksh bildiğim kadarıyla readline kullanmıyor, aynı zamanda bash / readline'a çok benzeyen vi / emacs modlarını da destekliyor.

Tabii ki, bir komut satırı kabuğundaki vi / emacs modu, tüm editör özellik setinin sadece bir alt kümesidir. Komut satırı kabuğunda her özellik anlam ifade etmiyor ve bazı özellikler diğerlerinden daha fazla destek sağlıyor.

Kanonik Mod

Vi / emacs etkileşimli komut satırı kabukları modları 'icat edilmeden' önce, kabuğunuz yalnızca terminalinizin kanonik modunu kullanır , bu da yalnızca sınırlı sayıda düzenleme komutları sağlar (örneğin , son kelimeyi silmek için Ctrl+) W.


Diyelim ki hangi Giriş modunda olduğumu bilmiyorum. Bir metin girerek doğrulayabilir miyim ve [Ctrl] + [A] tuşlarına basabilir miyim? imleç emacs basamağına baslarsa baska vi?
limovala

2
@ limovala, iyi bir yaklaşım olmalıdır. Elbette kabuğunuza bağlı - eğer CTL + A işe yaramazsa, başka bir olasılık da kabuğunuzun herhangi bir düzenleme modu içermemesidir. Belki bazı mermiler başka düzenleme modları da uygular. Ancak uygulamada yönteminiz yeterince iyi olmalı. Daha sonra emin olmak için bundan sonra vi komutuyla test edebilirsiniz. Bash'ta ayrıca gibi bir şey kullanabilirsiniz set -o | grep 'emacs\|vi'. Zsh'de (vi-modum olduğu yerlerde) bu işe yaramıyor.
maxschlepzig

bağlama -P ayrıca bir modun hangi modda olduğunu da gösterir
Paul

23

catBir terminaldeki bir kabuk isteminde çalıştırdığınızda , catstdin'den okuduğu stdout'a yazması gerektiğini ve basarsanız terminal sürücüsünün yankılandığını agörürsünüz a, ama şunu catyazmazsınız a(görüyorsunuz). sadece biri a, terminal sürücüsü tarafından yankılandı).

Yazarsanız Ancak a Backspace b Enter, görmüyor musun catçıktısı alınması a\010b\015ancak, b\012( bve yeni satır).

Bunu sebebi ise, terminal sürücü (biz değil gibi terminal emülatörü içinde, çekirdekteki yazılım söz ediyoruz xterm) uygular çok temel bir çizgi editörü içinde kanonik mod. Terminal sürücüsü ioctl(), sttykomutu kullanırken olduğu gibi sistem çağrıları kullanılarak yapılandırılabilir . Örneğin, kanonik moddan çıkmak için yapabilirsiniz stty -icanon. Yaparsan:

stty -icanon; cat

Ardından, hem echo(ile devre dışı bırakmış olabilirsiniz stty -echo) hem de catçıktısını aynı anda görürsünüz .

Bu editör çizgi editörüdür. Diğer bir deyişle, kullanıcı basıldığında terminal cihazını okuyan uygulamaya gönderilinceye kadar bir satır metin düzenlemek içindir Enter.

Bu editörün düzenleme yetenekleri çok sınırlıdır. Çoğu uygulamada, ayrıca yapılandırılabilen sadece 4 düzenleme tuşu (aslında karakterler) bulunmaktadır stty:

  • sil ( ^Hveya ^?genellikle): önceki karakteri sil
  • kill ( ^Ugenellikle): boş (öldür) şimdiye kadar girilen satır
  • werase ( ^W): önceki sözcüğü siler
  • lnext ( ^V): bir sonraki karakteri tam anlamıyla girin (yukarıdakilerin özel anlamını iptal edin)

Eski günlerde, terminal sürücüsü çizgi editörünün meraklısı yeteneklerle genişletileceği düşünülmüştü. Bu nedenle, ilk mermilerin hiçbirinde komut satırı düzenleme yetenekleri yoktur ( catyukarıda yaptığımız gibi çalıştığımız zaman kabuk isteminde aynı satır düzenleme yeteneklerini elde edersiniz ).

Bununla birlikte, bu gerçekten hiç olmadı, belki de bunun nedeni, çekirdeklerde uygulanmaması gerektiğini açıkça ortaya koyan bazı tuş basmalarında aynı karakterleri göndermeyen farklı uçbirimlerin karışıklığıydı.

Böylece bazı mermiler terminal sürücüsünün kurallı modunu düşürmeye ve kendi satır düzenleyicisini uygulamaya başladı. O zamanlar emacsve vitamamen farklı anahtar ciltleme ve çalışma modu ile en popüler görsel metin editörleriydi. İçinde vimetin girmek için bir, düzenleme için de bir modunuz vardır. Bölümünde emacs, her zaman metin moduna girersiniz, ancak düzenleme tuş kombinasyonlarına basılarak yapılır ( ^bkarakteri geriye doğru hareket ettirmek gibi ).

O sırada mermilerin kendi farklı kilit bağlarıyla gelmelerine gerek yoktu. Bu, insanların farklı bir şeyler öğrenmeleri için hayal kırıklığına neden olabilirdi. Bununla birlikte, diğerinden bir ( emacsveya vi) stil seçmek , diğer düzenleyicinin kullanıcılarını yabancılaştırmanın kesin bir yolu olabilirdi .

Https://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.a'ya göre :

Ksh'ın popüler satır içi düzenleme özellikleri (vi ve emacs modu) Bell Laboratories'deki yazılım geliştiricileri tarafından oluşturuldu; Pat Sullivan'ın vi satırı düzenleme modu ve Mike Veach tarafından emacs satırı düzenleme modu. Her biri, bu özellikleri eklemek için Bourne kabuğunu bağımsız olarak değiştirdi ve her ikisi de, ksh'ı sadece kendi satır içi düzenleyicisine sahipse ksh kullanmak isteyen organizasyonlardaydı. Başlangıçta ksh'a komut satırı düzenleme ekleme fikri, satır düzenlemenin terminal sürücüye taşınması umuduyla reddedildi. Bununla birlikte, bunun yakında gerçekleşmesi muhtemel olmadığı anlaşıldığında, her iki satır düzenleme modu da ksh ile birleştirildi ve isteğe bağlı olarak yapıldı, böylece terminal arayüzünün bir parçası olarak düzenleme sağlayan sistemlerde devre dışı bırakılabilirler.

Bunun yerine, hem ikisi hem de kullanıcıların ikisi arasında seçim yapmaları için bir arayüz oluşturdular. kshMuhtemelen 80'lerin başlarında ilk olarak (yukarıda gösterildiği gibi Bourne kabuğuna bir vi modu ve bir emacs modu eklemek için ayrı olarak yeniden yazılmış kod) yeniden kullanıldı ve ardından tcsh( tcshbaşlangıçta sadece emacsanahtar bağlama, vimod daha sonra eklendi) ve daha sonra bashve zsh90'lı yılların başında.

İçeri iki mod arasında geçiş bash, zshya kshbirlikte set -o viya set -o emacsve birlikte bindkey -eya bindkey -viçinde tcshya zsh.

POSIX aslında belirten vimodu değil emacsiçin mod sh(hikaye o vardır Richard Stallman belirterek POSIX'e itiraz emacsmodu içinsh ).

İçin varsayılan mod bash, kamu malı ait varyantları ksh(pdksh, mksh, oksh), tcshve zsh(gerçi emacs modu ise zsh, bu kadar visenin eğer $EDITORis viAT & T ise,) ksh, bu kadar aptal olmadıkça modu $EDITORveya $VISUALbahseder viya emacs.

kshAyrıca daha sonra farklı ele alınan gmacsGosling kullanıcılarını barındıracak bir mod ekledi .emacsCtrl+T

Şimdi ele alınması ^Whalinde emacsveya tcshemacs modu muhtemelen eskidir werasegerçekten bunun için onları suçlayamam ve yaklaşık ifadem böylece terminal hattı editörü karakteri "çıkış yapan ..." yanıltıcı olarak görülebilir. Ben şeyler gibi zaman rahatsız edici bulmak bu sadece var emacs, tcshya infoyazarken her şey farklı davranabilir Ctrl-W. Bazı uygulamalar siz yazarken pencerelerini kapatmaya başladığında bunu daha rahatsız edici bulduğumu hayal edebilirsiniz Ctrl-W.


1
pdkshAyrıca ayrıştırır $EDITORiçin vive başlangıçta modlar arasında geçiş; Bunu kaldırdım mksh(özellikle de zaten yalnızca Emacs modunu koruduğum için).
mirabilos,

Özellikle, çeşitli mermilerin davranışları ve tarihçelerinin detaylı tartışmasıyla, çok teşekkür ederiz. Yapılandırmadığım mermilerle düzenli olarak farklı dağıtımlarda çalışması gereken biri olarak, bu olağanüstü yardımcı oldu.
BryKKan

Mükemmel tarihi bağlam için teşekkürler. Daha karmaşık satır içi düzenleme özelliklerinin o sırada terminal sürücüsüne eklenmemiş olması üzücü. Readline gibi kütüphaneleri dahil etmek için programlara ihtiyaç duyulmayacaktı. Ayrıca, Emacs-modunun POSIX tarafından neden belirtilmediğini merak ettim, bu yüzden Rationale ile olan bağlantı ilginçti. (Ayrıca hayal kırıklığınızı ^Wpencereleri kapatırken de paylaşıyorum ).
Anthony G - Monica

1
@AnthonyGeoghegan, dosya adı / komut tamamlama gibi şeyler terminal sürücüsünde gerçekten yapılamadığından hala zle / readline gibi şeylere ihtiyaç duyarız.
Stéphane Chazelas
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.