Bir şeyi kontrol ederken yarı yazılmış bir komut hatırla


97

Sık sık kendimi aşağıdaki pozisyonda buluyorum: bash isteminde uzun bir komut yazmaya başladım, ancak yolun yarısında başka bir komutla bir şeyi kontrol etmem gerektiğini öğrendim. Konseydeyken (X yok), bu genellikle bir sorun olduğu için bir sorun, çünkü o zaman bunu yapmak için sadece aşağıdaki tatmin edici olmayan yöntemlere sahibim:

  • ctrl+ alt+ Tuşlarına basın F2ve başka bir sanal konsolda oturum açın ve ne istediğimi öğrenin, ardından geri dönün ve devam edin
  • ctrl+ a, echo + space+ yazın enter, ne istediğimi öğrenin, komutumu bulana kadar basın , ctrl+ a, delx 5, ctrl+ eve devam et
  • Şu ana kadar fareyle ne yazdığımı vurgula (eğer gpm çalışıyorsa, genellikle olur), kesmek için ctrl+ ' cya basın , fareyi vurgulamak için fareyi kullanmamaya dikkat ederken ne istediğimi öğrenin, ardından orta fare düğmesine basın yeni bir istekte ve devam
  • Komut satırı tanrılarına yarı yazılı komutun hiçbir olumsuz etkisi olmayacağına dua edin, ancak başarısız olun ve zekice basın, sonra ne istediğimi bulun, emirimi geri alana kadar yukarı doğru basın ve devam edin.
  • Zaman makineme gir, zamanda geriye yolculuk et ve kendimi komut yazmaya başlamadan önce ekranı başlatmamı hatırlat, bugüne geri dön, ctrl+ tuşlarına bas a c, ne istediğimi bul, ctrl+ tuşlarına bas a ctrl+ave devam et

Öyleyse bilmek istediğim şu, bunu yapmanın daha zarif bir yolu var mı? Bir çeşit alt kabuk komutu veya benzeri?

Çalışmak için herhangi bir hazırlık veya kurulum gerektirmeyen yöntemlerle ilgileniyorum.

Yanıtlar:


68

Alex Ctrl + A Ctrl+ ' nın biraz daha hızlı bir sürümü ( Ksatırın önüne doğru hareket eder ve sonra her şeyi ileri doğru keser) yalnızca bash üzerinde geriye doğru kesen Ctrl+ U, zsh üzerinde tüm satırı (geçerli konumunuz ne olursa olsun) kullanmaktır. Sonra tekrar yapıştırmak için Ctrl+ Ykullanın.


1
Bunu sınamak için, Ctrl + U'nun geriye doğru hareket etmediğini ve ileri doğru kesmediği, aksine geriye doğru kesim yaptığı sonucuna varıyorum. İmlecin komutun ortasında olması, arkasında ne varsa komut satırında kalır. Yine de @ alex'in çözümünde% 33'lük bir gelişme, ancak bir tuşa basılmasından tasarruf sağlıyor.
Lauritz V. Thaulow

2
@ lazyr Oh, oldukça doğru; Üzerinde zshtüm çizgiyi bashkeser , ancak üzerinde geriye doğru keser. Bu farkı daha önce hiç fark etmemiştim
Michael Mrozek

2
Oh, Ctrl + U'nun da tampon öldürmek için metin koyduğunu bilmiyordum. Bilmek güzel! :)
alex

1
^U ^Kile aynı etkiye sahip olacak ^A ^Kancak marjinal olarak daha ergonomik ve altında daha önemli screen.
intuited

53

Satırın başlaması, karması hazırlanması ve dönüş tuşuna basması için ctrl-A komutunu kullanın - bu yolla komut geçmişinde yorum olarak kalır ve imleç yukarı döndürebilirsiniz.

EDIT: sadece fark ettim ki bu # 2;) üzerinde biraz daha şık bir değişken


1
Evet ve neden bunu düşünmedim? Teşekkür ederim!
Lauritz V. Thaulow

1
Kendi cevabımı göndermeden önce okumam gerek. James haklı çıkmış.
Sean C.

4
Bunun işe yaramayacağını cshveya zshetkileşimli kabukta yorumlara izin vermediklerinden çalışmadığını unutmayın . Gelen zshDoğru seçeneği aktif hale getirmek gerekir: setopt interactive_comments.
sam hocevar

1
@Sam Evet, ancak ": komut" aynı etkiye sahip (":" = null komut)
barrycarter

6
@ barrycarter: hayır, :bu amaç için zararlı olarak kabul edilmeli ve asla, asla önerilmemelidir. Tüm noktalı virgüllerden sonra, backtick'ler vb. İçerisindeki tüm yan etkileriyle her şeyi yürütür.
sam hocevar,

29

Hit Ctrl+A, Ctrl+Kbunun sonuna kadar (öldürmek) satırın başlangıcına taşımak ve silmek için. Ardından araştırmanızı yapın ve devam etmeye hazır olduğunuzda Ctrl+Y(yank) kaydettiğiniz (öldürülen) hattınızı geri koyun.


3
Ah, şimdi bu daha çok aklımdaki gibi. Ve bunu Emacs’ta her zaman aynı şeyi komut satırında yapmayı düşünmeliydim.
Lauritz V. Thaulow

13

Zsh'de, yazdığım komutu “askıya almak” için Ctrl+ Zyazın ve başka bir komut yazın. Bu komutu çalıştırdıktan sonra (veya Ctrl+ ile durdurduktan sonra C), askıya alınmış komut baskı için geri döner (imleç konumunu bile hatırlar). Ek bir kolaylık olarak, Ctrl+ yazdığımda komut satırı boşsa Z, anahtar bgyerleşik olanı çağırır (böylece bir çift Ctrl+ Zçalışan bir komutu doğrudan arka plana gönderir).

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

Bash'da benzer bir şeyi nasıl yapacağımı bilmiyorum.

Herhangi bir kabukta, mevcut satırın başına düşük ekleme# yöntemini kullanabilirsiniz .


2
işleviniz takdire şayan, ama bunun zaten yerleşikzsh bir işlevi olduğunu biliyor muydunuz ? Bu denir ve yapmanız gereken tek şey onu kullanmak için kullanmaktır . push-linebindkey
Caleb

@Caleb: Ben kullanmak neden bilmiyorum push-inputziyade push-lineburada, push-linedaha uygun (sadece vardı zsh belki eski sürümlerini görünüyor push-input?). Fakat bu, fonksiyonun geri kalanının yerine geçmez.
Gilles

Söyleyebileceğim kadarıyla tek fark, çalışan bir işin arka planında aynı bağlayıcı etkiye sahip. Bir şey mi eksik?
Caleb

1
@Caleb: Hayır, sadece ikisinin kombinasyonunu uygun push-linebuluyorum ( boş bir hatta işe yaramaz, bgdevam Ctrl+Zetmek sadece bu işlemi askıya aldığımda yararlıdır Ctrl+Z) ve anımsatıcı (süreci arka planlıyorum) veya kısmi komut satırı).
Gilles

3
@Caleb push-input, giriş arabelleğini push-lineaskıya alırken, yalnızca geçerli satırı askıya alır. Çok satırlı bir komut yazıyorsam, tüm komutu askıya almak istiyorum push-input, doğru olanı. (Çok satırlı giriş arabelleğindeki bir satırı geciktirmek istersem, satırın başına gidip yeni bir satır ekleyebilirim) ' push-inputden daha sık yararlı buluyorum push-line, bu yüzden aslında neden push-linevarsayılan anahtarlamayı neden alıp almadığımı merak ediyorum push-input.
Gilles

13

Bash, sadece Alt+ yazın #.

Sonra hazır olduğunuzda, Upardından Alt+ tuşlarına basın #.

Birincisi #, çizginin başına bir yorum haline getirmek için bir satır koyar , ardından çizgiyi, bastığınız gibi kabul eder Enter.

Ardından, ikinci kez yaptığınızda, hattın #başlangıçta zaten bir başlangıcına sahip olduğunu görür , bu nedenle onu kaldırır ve kabul eder, Enteranahtarı yeniden kaydeder .

İkinci kez bir tane daha eklerse #, bunun yerine Alt+ - Alt+ yazmanız gerekir #.

Zsh ile aynı şeyi yapmasını sağlayabilirsiniz.

bindkey -M emacs '\e#' pound-insert

~ / .zshrc içinde.

Veya vi bağlama kullanıyorsanız #, hem bash hem de zsh komut modundan komut yazabilirsiniz .


2
Benim için işe yaramıyor, ikinci komut # çıkarmak için # sadece öne # 's ekler.
Lauritz V. Thaulow

1
İlki çalışıyor mu? Hangi bash sürümünü kullanıyorsunuz?
Mikel

3
Alt + #, üçüncü paragrafınızda tanımladığınız gibi çalışır, ancak dördüncü olduğunuzda olduğu gibi, sadece bir tane daha # hazırlar ve satırı kabul eder. Ben 4.1.5 (1) bash'ı Ubuntu 10.10'da kullanıyorum.
Lauritz V. Thaulow

1
Ah canım, bash'da sayısal bir argüman gerektirir, örneğin geçiş yapmak için + Esc+1sonra . Alt#
Mikel

Bu işe yarar, ancak Ctrl + A Del Ctrl + E'den çok daha zahmetlidir, özellikle Alt + # tuşlarının Alt + Shift + 3 olduğu klavye düzeninde.
Lauritz V. Thaulow

10

zshBuradaki en sevdiğim özelliklerden biri , buradaki diğer cevaplarda korsanlık olmadan bununla ilgilenen yerleşik push-line işlevidir. Ben bağlı olan Ctrl+ lbenim de .zshrcböyle dosyası:

bindkey '^L' push-line

Sonra bazı komutları yazarken ve çok hızlı bir şey yapmam gerektiğinde bunu bir anahtarla çağırabilir ve boş bir bilgi istemi alabilirim. Diğer komutu çalıştırdıktan sonra bilgi istemi otomatik olarak daha önce yazdıklarım ile doldurulur.

Bunun birden çok katmanını bile zincirleyebilirsiniz ve komutlar onları sıraya ittiğiniz sırayla size geri dönecektir.


5
Varsayılan olarak Ctrl+Qve ESC qvarsayılan olarak (emacs modunda).
Gilles

Bash için benzer bir şey var mı?
Magnus

@Magnus: Lütfen bu sorudaki cevapların geri kalanını gözden geçirin. Bash için çözümler var, bu kadar şık değil.
Caleb

@Caleb, daha spesifik olmalıydım, bash için benzer tek bir tuş kombinasyonu var mı?
Magnus

1
Zsh için bu kesinlikle “doğru” cevap! Sadece push-line-or-editvarsayılan olarak herhangi bir tuş haritasına bağlı olmayan widgettan bahsetmek istiyorum . En üst seviye komut isteminde aynı şeyi yapar push-line, ancak daha düşük herhangi bir bilgi istemi seviyesine girilen komutun tamamını çok satırlı bir ara belleğe dönüştürür. Bir tuş bağlamada iki harika fonksiyon! push-line-or-editDüz yerine ciltleme önerebilirim push-line. Hiçbir şey kaybetmezsiniz ve faydalı işlevler kazanırsınız.
wjv

5

Ek olarak ctrl- a ctrl- knumara, ekranda iseniz, sadece ctrl- a dayırmak ve sonra yeniden bağlamak içinscreen -r

Ayrıca ctrl+ ile başka bir pencere de açabilirsiniz.a c


8
Ekranda iseniz, sadece başka bir pencere ile açın Ctrl+A c.
Gilles

1
@Gilles .. kabuk durumunun bir kısmını kullanmanız gerekmiyorsa (değişkenler, fonksiyonlar, takma adlar, vb.).
intuited

4

Alternatif bir yol, mükemmel olmasa da, basın Ctrl-X Ctrl-E. Bu, yarı yazılmış komutunuzu içeren varsayılan düzenleyicinizi açacaktır. Ardından komutunuzu bir dosyaya kaydedebilir veya editörünüzden yeni bir kabuk açabilirsiniz. Yeni kabuktan çıktığınızda, sizi düzenleyiciye döndürür ve içeriği kaydetmek otomatik olarak yürütür.

Bu mükemmel değildir, çünkü sizi orijinal kabuğunuza döndürmez, ancak ya komutun yürütülmesini zorlar ya da tamamen atar. Ancak endişelenecek geçici seçimler veya tamponları öldürmek yok ve ayrıca bazı güzel tweakslar da var, örneğin editör = vi

:wq            # execute the command
:cq            # cancel and abort
:! command     # execute command
:shell         # open a new shell
:r filename    # insert the contents of a file for editing
:r ! command   # insert the output of a command for editing

Çok güzel bir alternatif. Ben vi-emacs-agnostic, bu yüzden powertools gerçekten gerekli olduğunda bunu kullanarak bir istiridye olarak mutlu olacağım. (Vi'den bahsetmişken, bir süre önce N64 linux emülatörü Mupen64Plus'ı denedim. Esc emülatörden tasarruf etmeden ayrıldı. Yakında bir şey çalmaktan vazgeçtim.)
Lauritz V. Thaulow 07.07.2011

1
@lazyr, debian / ubuntu için koş sudo update-alternatives --config editorve favori editörünü seç. Diğer sistemler için EDITOR veya VISUAL ortam değişkenlerini favori düzenleyicinize ayarlayın, örneğin export EDITOR=/usr/bin/nano.bashrc'nizi ekleyin.
forcefsck

3

#Satırın başına ekleme yöntemine benzer şekilde, satırın başına dönmeyi gerektirmeyen, kullandığım tartışmasız daha basit bir yöntem var:

Sadece açık bir teklif ekleyin ve ister tek ister çift olsun , kapatmayın .

Ardından tuşuna basın Enter.

Ardından tuşuna basın CtrlC.

Kısmi komut, komut geçmişine kaydedilir (yukarı okla kullanılabilir), ancak gerçekte yürütülmez.


2

Zsh kullanarak, yazarsanız <ESC> q(kaçış, sonra Q), komut istemi kesilir, böylece başka bir komut yazabilirsiniz. Kesim metninizi bir sonraki istemde otomatik olarak geri alırsınız.

Aynı anda birkaç çizgiyi hatırlayabilir, böylece bir çizgi sizi beklerken kullanabilirsiniz. Kesim hattınızın özgeçmişini geciktirmek için boş hatta bile kullanabilirsiniz.

Kontrol / hazırlık için birkaç komut kullanmak zorunda kalırsanız en etkili yol bu değildir ( <ESC> qher komuttan önce yeniden yazmanız gerekir ). Ancak daha kısa bir kısayola bağlamak mümkün olduğunu düşünüyorum.


Sadece el kitabını kontrol etmek istiyorsanız, yazın <ESC> h(kaçış, sonra H). Bu, run-helpyerleşik olarak komut satırının ilk sözcüğü ile argüman olarak çalıştırılır. Bir kez yapılırsa hattınızı bozulmadan geri bulacaksınız.


Çoğu terminaller yapmanız izin verir M-qyerine<ESC> q
sleblanc
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.