Neden shift + ok tuşlarıyla bir linux terminal emülatöründeki metni vurgulayamıyorum?


15

Bunlar, kelimenin tam anlamıyla, terminal emülatörleri dışındaki herhangi bir linux uygulamasında metin düzenlerken sürekli kullandığım standart metin düzenleme klavye kısayolları:

  • sola + sağa hareket etmek için sol + sağ oklar
  • kelimenin tamamını taşımak için ctrl + ok
  • home / end satırın başına / sonuna gitmek için
  • kopyalamak / yapıştırmak için ctrl + c / ctrl + v [bazı terminaller shift-ctrl-C / shift-ctrl-V kullanabilir; bu iyi bir alternatiftir]
  • metni vurgulamak için shift + ok
  • Tüm bir kelimeyi vurgulamak için shift + ctrl + arrow

Bu listedeki son iki öğeye izin veren shell plus terminal emülatörü kombinasyonunu hiç bulamadım ve bu beni delirtiyor. Açıkça görüldüğü gibi, terminal emülatörleri vurgulamayı destekler (fare bunu yapabilir) ve bunlar ctrl ve shift tuşlarının değiştirici olarak kullanılmasını destekler (imleci tüm bir kelimeyi hareket ettirmek ve harfleri büyük harf yapmak için kullanılabilir; shift-ctrl-C ve shift-ctrl-V ile kopyalamak / yapıştırmak için birlikte bile kullanılabilirler), bu yüzden bu işlevi engelleyen sorun nedir? Birkaç sorum var:

  • Bu benim terminal emülatörümle mi yoksa kabuğumla mı (sorun olsa da bash) sorun mu?
  • Neden terminal emülatörleri / mermileri bu evrensel şartlara uymuyor?
  • Gerçek bir neden varsa, eski ve modası geçmiş mi, yoksa hala önemli sayıda masaüstü Linux kullanıcıları?
  • Herhangi bir geçici çözüm var mı?
  • Bunu destekleyen kullanabileceğim belirsiz bir program var mı?
  • Bunu desteklemek için gnome-terminal kaynağını değiştirmek mümkün mü?

Metnin fare ile kopyalanıp yapıştırılabileceğini biliyorum, bunun hakkında istediğim şey bu değil. Bu şeyleri neden klavyeyle bir terminal emülatöründe yapamadığımı soruyorum.


Fare ile metin seçmenin imleç konumunu değiştirmediğini unutmayın. Metin seçimini klavyede normal komutlar girerek karıştırırsanız, Gerçekten mi Komutun sınırlarının ötesinde kafa karıştırıcı, daha önce yazmış ve henüz uygulamamış. Bir web sayfasındaki metin kutusunun sınırlarının ötesindeki klavyeyi klavyeyle seçebiliyor musunuz? Ayrıca, tüm terminal için metin seçimine sahip farklı bir moda girmeye izin veren, ancak elbette artık komut girmeye izin vermediğine dikkat edin.
Daniel Beck

1
Daniel: Örneğin, Matlab konsolu, klavyeyle vurgulanan metinlere izin veren bir CLI'dir. Benim deneyimimde mükemmel çalışıyor; İstenirse, yürürlükte bulunmayan komutun ötesinde seçime izin verir, şahsen bunun için çok az kullanıyorum.
monguin


Yanıtlar:


5

Sanırım bunu bir kerede bir parça alırsam çok faydalı olur. Genel sorun şudur: Anahtar basının amacı nedir? Terminal veya terminal içinde çalışan program?

Örnek olarak, bir terminal gibi "ekran" kullanır Ctrl + bir komutları için ön ek olarak, onları çalışan programın kendisine giden şeylerden ayırmak. (Ve göndermek için bir yol sağlar Ctrl + bir .)

gnome-terminal İstediğiniz bazı şeyler de dahil olmak üzere çeşitli şeyler yapmak için yakaladığı çeşitli anahtarlara sahiptir.

Ayrıca aklınızda bulundurun bir terminalin "vurgulaması" terminalin imleç konumundan ayrıdır . Bazı terminallerin hiç vurgulama yeteneği yoktur.

Şimdi, bu tuş kombinasyonlarını bir kerede alarak:

sola + sağa hareket etmek için sol + sağ oklar   kelimenin tamamını taşımak için ctrl + ok   home / end satırın başına / sonuna gitmek için

Neyi sola ve sağa hareket ettir? Bash, bunu yapmak için yapılandırılabilir ve genellikle varsayılandır. Genellikle, bunlar imleç konumunu hareket ettirir.

kopyalamak / yapıştırmak için ctrl + c / ctrl + v

Birincisi: kopyala / yapıştır bile mantıklı mı? VT'deyseniz, özellikle X çalışmıyorsa, gerçekten bir panoya sahip değilsiniz.

Bazı terminaller çıktıdaki metni kopyalayabilir ve bazıları da pano içeriğini yazarak simüle ederek "yapıştırabilir". Ctrl + vardiya + V , örneğin, yapıştır gnome-terminalyardımcı olabilir. (Ve Ctrl + vardiya + C kopyadır.) Daha önce tartışıldığı gibi, büyük sorun Ctrl + C ve Ctrl + V Ortak terminal / program komutları ile çakışıyor mu? ( Ctrl + C kesme (SIGINT) gönderilir ve Ctrl + V sözlüdür.)

Bazı terminaller ayrıca iki veri kopyalama modunu da destekler: daha normal bir "sadece kopya" ve "blok seçimi" veya "blok kopya" olarak bilinenler. (Ambar Ctrl , ve ardından gnome-terminal Örneğin.)

Bunlara ek olarak, xsel -b Pano içeriğini etrafa yönlendirmek için kullanılabilir. Durumun kesin olmasına bağlı olarak değişir. xsel veya terminalin macun sürümü daha kullanışlıdır. Görmek man xsel.

metni vurgulamak için shift + ok   Tüm bir kelimeyi vurgulamak için shift + ctrl + arrow

Terminalinizin vurgusu (bu özelliğe sahipse) imleç konumundan ayrıdır. Yine, mevcut tuş kombinasyonlarının eksikliği muhtemelen bir faktördür. Bir vurgunun iki konumu olduğunu unutmayın: başlangıç ​​ve bitiş veya sol üst ve sağ alt köşeler. İkisini de nasıl yönetirsiniz?

Son olarak, birçok GUI terminalinin bir kelimeyi çift tıklatarak vurgulayacağını unutmayın. (Ve X'te, birincil seçime kopyala.)

screenbir örnek olarak, arabellek (önceki çıktı) etrafında hareket etme ve kopyalama / yapıştırma için bir moda geçmek için tuşları vardır.

Bence yeterince kullanırsanız xsel ve birincil seçim, pano işlemlerinin hem fareyi hem de kullanmaya yetecek kadar nadir ve karmaşık olduğunu göreceksiniz.


4
Cevabınızı yazmak için harcadığınız zaman için teşekkür ederim, ancak bir şekilde bunun terminal emülatörlerinde neden mevcut bir özellik olmadığı konusunda daha fazla bir fikrim yok gibi hissediyorum. Bana, yeni bir fikre işaret ettiniz - bir terminal emülatörünün diğer programları çalıştırabilmesi açısından benzersiz olduğunu - ancak neden sadece seçili bir tuş kombinasyon alt grubunun kullanıcıya sunulmasının imkansız olduğunu anlamıyorum.
monguin

2
Terminal emülatörleri taklit fiziksel terminalleri . Komut satırı arayüzü sağlamak için sıfırdan yaratılmadılar. Control-C gibi şeyler, Microsoft'un klavye kısayolları olarak onları seçmeye karar vermesinden çok önce anlamlar getirdiler ve terminal emülatörleri bunlara bağlı kalmalı.
chepner

2
Bence şeytan burada ayrıntılarda. İmkansız değil: ekranın istediğini yapacak bir modu var, sanırım. Ancak bunu başarmak için bir "şey seçmek istiyorum" moduna geçmelisin. gnome-terminal benzer sorunları olurdu: Muhtemelen bunu gerçekleştirmediler çünkü tam olarak yaptığınız bir şey değildi. Unutmayın, kabuk çalışan tek program değildir: herhangi program çalışıyor olabilir ve kopyalamak / yapıştırmak için kullanabileceğiniz herhangi bir tuş sırasını kendi amaçları için kullanmak isteyebilir. Ekranda geçersiz kılan tuşları gönderme yolları vardır ve gnome-terminali parmak uçlarına basmamaya çalışır.
Thanatos

1
Blok seçimi bir dikdörtgen seçmenin bir yoludur: Kontrolü tutun ve gnome-terminalinde sürükleyin; bunun nasıl farklı olduğunu hemen görmelisiniz. GUI terminal emülatörlerinin çoğu bu kabiliyete sahiptir ve en gelişmiş metin editörleri de vardır. (Örneğin vim'deki görsel bloğa bakın.)
Thanatos

1
Ah, o zaman blok seçimine aşinayım ama adın farkında değildim. Ayrıca bu eylem için bir GUI klavye kısayolunun farkında değilim, bu yüzden sorumu yanıtlamak için birini icat etmek gereksiz görünüyor. Buradaki herkesin yorumlarını takdir ediyorum, ancak hala tatminsiz olduğum için sanırım şimdi yapabileceğim tek şey kaynağa kendim kazmak ...
monguin

1

Terminal emülatörleri konusunda uzman değilim ama ...

terminal emülatörüne giren bash (readline) gibi uygulamalar, çalışan X pencere sistemi ve içinde bulundukları X pencere hakkında hiçbir şey bilmezler, bir terminal cihazında stdin ve stdout'u bilirler (linux'ta ttyS / ttyUSB / tty / pts).

Sorun değil vurgulanan metni göster fakat seçilen metnin X penceresi uygulamasını (terminal emülatörü) nasıl bildirebileceğimizi, vasitasiyla bu terminal cihazları.

ben tahmin X terminal uygulaması, giriş ve çıkışta bu cihazlardan birini açar ve ardından X tuşu olaylarını doğru şekilde çevirir. çıktı (X tarafından) giriş (bash tarafından). Viceversa bash çıktı X terminaline akış olarak giriş Burada X terminali bu girişi işlemden geçirir, imleci hareket ettirmek için, arka plan rengi bash uygulama çıktısına göre bir miktar doldurur.

Bildiğim kadarıyla, kaçış kodları, açık, arka planı doldurmak, imleci hareket ettirmek ve olabilir bazı görenek X terminalini bir metnin bu olduğunu bildirmek için escape kodu eklenebilir satırdan sütun başa doğru seçildi, sadece bir örnek, belki de seçilen metin geri döndürülebilir (bir uygulama detayı).

ben tahmin standart bir tanım olmamak için, tuş kombinasyonu hakkında bilmek istediğiniz her bir uygulamayı yamalamanız gerekecek. Bashta isterseniz diğer satırdaki X terminali emülatörüne basmanız ve uygun kaçış kodunun çıktısını almanız gerekir. kaçış kodunu doğru bir şekilde işlemek için yan (ve nihayet bilgileri panoya gönderin). Muhtemelen bunu bir terminal yeteneği her uygulamada sizi yamadan kurtaracaktı. Umarım çekirdekteki terminal aygıtı sürücülerinin kaçış kodları hakkında mümkün olduğunca az bilgi sahibi olmasını (ve sanırım) isterseniz, eğer şanslıysanız yama yapmanız gerekmez.

X terminali çıkışı çizer, böylece fareyi kullandığınızda hangi metni / karakterleri seçtiğinizi kolayca bilir.

Bir grafik metin gereci, X penceresiyle ilgili her şeyi bilir, bu nedenle seçme ve kopyalama işleminin bu kadar kolay olmasının nedenidir.

DÜZENLE

İşte bu urxvt-9.16-image-display yaması, yeni kaçış kodlarını desteklemek için neyin gerekli olduğunu anlamak için iyi bir başlangıç ​​noktası olabilir. http://lists.schmorp.de/pipermail/rxvt-unicode/2013q1/001736.html


1

Cevaplar, bunu yapmanın neden zor olduğunu açıklıyor. Kurulum için gnome-terminalinde yapabileceğiniz bir şey var Ctrl-C ve Ctrl-V Terminal disiplindeki diğer tuşları yeniden bağlarken kopyalamak ve yapıştırmak stty göndermek SIGINT ve bir karakter verbatim ekleyin. Bu tam bir çözüm değildir, çünkü bazı programlar terminal disiplinini devre dışı bırakır ve '^ C' ve '^ V' gönderemezsiniz. Daha fazla bilgi İşte .

Kabuk başlangıç ​​komut dosyanızda (ör. ~/.bashrc, ~/.zshrc, ~/.rcrc ), yap

stty intr '^Q' 2>/dev/null  # To send SIGINT I will use ctrl-q
stty lnext '^A' 2>/dev/null # To insert a character verbatim I will use ctrl-a

Sonra gnome-terminalinde Edit & gt; Tercihler & gt; Kısayolları Kopyala ve Yapıştır'ı ctrl-c ve ctrl-v'ye bağlayabilirsiniz. Terminalin terminal cihaza herhangi bir şey gönderilmeden önce kilit olayları alacağına dikkat edin, o zamandan itibaren terminalde çalışan herhangi bir işleme '^ C' ve '^ V' gönderemezsiniz.

Bunu yeni yaptım ve nasıl gittiğini ve hangi sorunlara yol açtığını göreceğim. Stty koşullarını yalnızca X çalıştırırken uygulamak için koşullu olarak yaptım.


1
Yanıtınız için teşekkürler. Bu arada OSX ve Emacs ciltlerine alıştım ve bir terminalde ctrl + shift + arrow hayalini bıraktım ...
monguin

1

Thanatos'un da belirttiği gibi, arasında yapılması gereken bir ayrım vardır. bağlantı emülatörü (X Windows veya Wayland'da çalışıyor) ve terminal içinde çalışan programlar (hadi olmasa da "kabuk" diyelim); bu iki şey birbirinden izole edilmiştir (bkz. teknik detaylar ).

Listenizdeki ilk öğeler (ok tuşları, Giriş / Bitiş, vb.) Doğrudan terminalin içindeki program tarafından yönetilir ve bu imleç konumu terminalin içindeki program tarafından kontrol edilir.

Diğer yandan, kopyala ve yapıştır kısayolları (Ctrl + ÜstKrkt + C ve Ctrl + ÜstKrkt + V) ise, fareyi anlayan terminal emülatörü tarafından kullanılır (böylece fareyi seçerek metni seçebilir) Ekranda (böylece kopyalayabilir) ve içindeki programa tuşlara basabilir (böylece yapıştırabilir).

Üst Krkt + Sol ve Üst Krkt + Sağ'ı desteklemek için, terminal emülatörünün ya da kabuğun tuşa basması gerekecekti. Her iki durumda da bir sorunumuz var:

  1. Kabuk bu anahtarları kolayca kullanamaz çünkü sonunda seçili metni panoya kopyalamak isteyeceksiniz ve pano, kabuğun erişmesi gerekmeyen bir X Windows konseptidir ( xclip ). Ve bildiğim kadarıyla, eğer kabuk metin seçimini destekliyorsa, Linux, terminal emülatörünü neyin seçildiğine dair bilgilendiren herhangi bir mekanizma tanımlamaz.
  2. Bu arada, terminal emülatörü imlecin konumundan sorumlu değildir. Terminal emülatörü, imlecin konumunu değiştirebilse bile, muhtemelen geçerli metin satırının nerede başladığını ve bittiğini bilmiyor. Örneğin, terminal şöyle bir metin içerebilir: ~ $ ls -l ve terminal emülatörü, yalnızca ls -l bölüm kullanıcıya aittir.

Shift + Ok tuşlarıyla seçimi destekleyen bir terminal emülatörü hayal etmek zor değil, ancak sanırım kabuğun imlecini gizlemek ve geçici olarak bir şey seçmenize yardımcı olmak için var olan kendi "sahte imlecini" tanıtmak zorunda kalacaksınız ve sonra Ctrl tuşuna basabilirsiniz. + C / Ctrl + Shift + C / Ctrl + Ins kopyalamak (veya iptal etmek için Esc) ve gerçek imleci bir kez daha gösterir. Bu, elbette normal bir seçim seçiminin tüm özelliklerine sahip olmazdı - özellikle kes ve sil olmazdı.


Teşekkürler, bu TTY makalesini okuyacağım, ancak henüz okumadım. Bu, "terminal emülatörleri" ile "metin programlarını işleyen masaüstü uygulamaları" arasındaki farkı anlamamdaki açığı açıklayabilir. Daha önceki örneğim, Matlab konsolu, tam olarak istediğim gibi davranıyor. Neden bu davranışla bir masaüstü uygulamasının olamadığını anlamıyorum, içinde çalışan metin programı Matlab dışında bir şey. Sadece en temel kabuk komutlarını kullanmak istediğimi söyleyin - ls, cd, cp, mv - sonra herhangi bir çakışma görmüyorum. Ekran veya tmux gibi programlar, işleri daha zorlaştırabilir.
monguin

0

Sadece bir arkadaşıma buna benzer bir konuda yardımcı oldum ve pano yöneticisi klibin suçlu olduğunu öğrendim.

sudo apt-get clipit kaldır

Herşeyi toparlayıp, onun için gayet iyi çalışıyordu. Umarım orada başka birine yardım edebilir.


Yanlış soruyu cevapladın mı? Bu, tüm terminal emülatörlerinin yetenekleriyle ilgili genel bir soruydu. Bir "çözüm" olmadığı çok açık. Ben şimdi yok, ne de herhangi bir makineye yüklü clipit oldu mu.
monguin
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.