Terminaldeki kaydırma işlemini bir kabuk komutu ile nasıl sıfırlarım?


41

Terminal.app'i kullanırken, ekranı kabuğunu kullanarak clearveya ^+ L(Control-L) tuşlarına basarak temizleyebilirsiniz .

Ancak, tüm bunlar mevcut ekran içeriğini bir ekran yüksekliğine geri itmek ve imleci / girişi ilk satırda sıfırlamaktır. Yani hala geri kayıp görebilirsin.

Yapabilecekleriniz, + K(Command-K) tuşlarına basarak geri kaydırma ayarlarınızı sıfırlar .

Bunu yaptıktan sonra hiç geri kayamazsınız.

Bazı durumlarda (özellikle, çalıştırmadan önce screenveya vim), komut gerçekten çalışmadan önce kaydırmayı geri almak istiyorum.

clearBunu yapmamı sağlayan OS X'te uygulanan bir komut var mı ? Varlığını göz önüne alındığında pbcopyve pbpasteben bana bunu sağlayacak benzer bir şey bulunamadığı düşünüyorum.


Chris Pages’in cevabının Terminal use komutunda yazdığı gibi: clear && printf '\e[3J' (Yanlış cevabı doğru cevap olarak
seçtiniz

Yanıtlar:


57

Terminal, geri kaydırmayı silmek için ED (Ekranda Sil) çıkış dizisinin bir uzantısını destekler. Ayrıca xterm tarafından desteklenir. VT100 el kitabında açıklanan ED komutu, Ps parametresi için şu değerleri kabul eder:

ESC [Ps J

Parametre Parametre Anlamı

0 Aktif konumdan ekranın sonuna kadar sil
1 Ekranın başlangıcından aktif konuma silme
2 Tüm ekranı sil

Terminal ( ve xterm ) ekler:

3 Kaydırmayı silin (aka “Saved Lines”)

Bunun ekranı geri değil yalnızca ekranı sildiğini unutmayın. Bu, iki kaçış dizisi göndererek birini veya diğerini veya her ikisini de silmenizi sağlar.

Örneğin, aşağıdaki kabuk komutuyla ekranı ve geri kaydırma işlemini silebilirsiniz: clear && printf '\e[3J'

( clearKomut, mevcut terminal için ekranı temizlemek için uygun sırayı arar, ancak “geri silme” kaçış sırası özeldir ve kodlanmış olmalıdır. Bunu bir bildiğiniz kabuk komut dosyasına koyarsanız belirli sadece hiç Terminali ile idare edilecek için, bunu kontrol etmelisiniz $TERM_PROGRAMolduğu Apple_Terminalgöndermeden önce.)


4
Bu osascript'ten çok daha hızlı!
Sergei

3
Bu çok daha iyi bir cevap. Öyleyse, bunu kalıcı hale getirmek için ~ / .bash_profile dosyasına ekleyin: alias clear="clear && printf '\e[3J'"
Tom

1
Bu senaryoyu PATH'ime koydum:echo $'#!/usr/bin/env bash\n/usr/bin/clear\nprintf \'\\e[3J\'' >clr; chmod +x clr
Walker Hale IV

2
@WalkerHaleIV Neden sadece escape dizisini stdout'a yazdırmak yerine yürütülebilir bir dosya oluşturuyorsunuz?
Chris Sayfa

1
$ TERM_APPLICATION $ TERM_PROGRAM olmalıdır
pbatey

30

⌘K, “Görünüm> Kaydırmayı temizle” kısayolu.

GÜNCELLEME : Bu, aşağıdaki komutla AppleScript ile otomatikleştirilebilir:

osascript -e 'tell application "System Events" to keystroke "k" using command down'

… Tabii ki aliasne istersen yapabilirsin ya da ~/.profilegiriş betiğinde bir işlevde saklayabilirsin :)

Bir güvenlik olarak, yanlış bir cihaza bir tuşa basma riski olmadan bunu arka planda bile kullanabilmek için, aşağıdaki testle çevreyi tavsiye ederim:

if application "Terminal" is frontmost

… Bize şu kodu veriyor:

osascript -e 'if application "Terminal" is frontmost then tell application "System Events" to keystroke "k" using command down'

… Sırasıyla doğru şekilde kaçan ve çıkan sırayla alias:

alias clear="osascript -e 'if application \"Terminal\" is frontmost then tell application \"System Events\" to keystroke \"k\" using command down'"

Ve burada yeni clear! :)


Buradaki mesele, kabuğumun ortamında bir komut ayarlamak istiyorum, böylece bir komut (say vim) çalıştırdığımda, kabuk vim komutunu çalıştırmadan önce "scrollback reset" işlemini gerçekleştirir. Programlı, etkileşimli değil.
Jason Salaz

1
@ JasonSalaz Tamam, anlamadım, üzgünüm. Bunun için kod eklendi.
MattiSG

1
@JasonSalaz bu cevap sorununuzu çözdüyse, lütfen doğrulamayı unutmayın.
Olmazsa

Bu çizgi benimle ilgili, biliyorsun. Denver,
CO'da

Bu benim için çalışmıyor. Söyleyebileceğim kadarıyla, bu yazarak eşdeğerdir clear; yani, ekranı temizler, ancak yine de geri dönebilirim. Vurmak Command Knormal çalışır.
Zev Eisenberg

7

İşte hem macOS 'Terminal hem de iTerm2 için çalışan kod. Pencerenin de ön planda olması gerekmez.

printf '\033[2J\033[3J\033[1;1H'

Nasıl çalışır

Bu, 3 ANSI kaçış dizisinin , özellikle "Kontrol Dizisi İntrodüseri" komutlarının bir bileşimidir .

\033temsil ettiği karakterin kod noktasını kodlayan bir kaçış dizisidir. Önde gelenler 0, dizinin geri kalanının sekizli bir, bu durumda sekizli bir değeri kodladığını gösterir 33. Bunun ondalık değeri 27( 3 * 8^1 + 3 * 8^0= 3 * 8 + 3= 24 + 3= 27). ASCII'de kod noktası 27"ESC" (kaçış) karakteridir.

CSIkomutlar ESC [, aka ile başlar \033[. Bunu bilerek, ipi 3 parçaya bölebiliriz.

  1. CSI 2 J
    • Bu, forma sahip "Ekrandaki ED - Sil" komutunun bir örneğidir. CSI n J
    • Bu ndeğer, 2ikinci değişkeni çağıran bu durumda ayarlanır : "n, 2 ise, tüm ekranı temizle (ve imleci DOS ANSI.SYS üzerinde sola taşır)."
  2. CSI 3 J:
    • Bu, forma sahip "Ekrandaki ED - Sil" komutunun bir örneğidir. CSI n J
    • nDeğeri olarak ayarlanır 3, üçüncü varyant başlatır Bu durumda, "n, 3, açık bir tüm ekran olup (bu özellik xterm'imle ilave edildi ve diğer terminal uygulamalar tarafından desteklenir) scrollback tampon kaydedilen tüm satırları silin."
  3. CSI 1 ; 1 H:
    • Bu, forma sahip "Ekrandaki ED - Sil" komutunun bir örneğidir. CSI n ; m H

      İmleci satır n, sütun şeklinde hareket ettirir m. Değerler 1 tabanlıdır ve varsayılan olarak 1 (sol üst köşe), ihmal edilirse varsayılandır. Gibi bir dizi CSI ;5Hile eş anlamlıdır CSI 1;5Hsıra sıra CSI 17;HCSI 17H ve aynıCSI 17;1H

    • nVe mdeğerler Her iki kümeye 1bu komut hamle soldan en köşesine imleç demektir.

Sana nereden aldığını sorabilir miyim? Benden +1 - yine de çalışıyor
rbrtl

1
Hatırlamıyorum, ama bunların bir bileşimi: en.wikipedia.org/wiki/ANSI_escape_code
Alexander - Reinstate Monica

1
" CSI n J" (Burada n = 2) + " CSI n J" (burada n = 3) + " CSI n ; m H" (burada n, m = 1, 1) gibi görünüyor: "Ekrandaki ED - Sil" (değişken 2), "ED - Ekrandaki Sil" (değişken 3), "CUP - İmleç Konumu" (1, 1'e
taşınır
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.