Terminal - fare kullanmadan CLI'den kopyala


20

CLI'de komutları tetiklerken, ateş ettiğim komutu veya terminalde yazdığım herhangi bir şeyi kopyalamak ve fare kullanmadan başka bir yere yapıştırmak istiyorum .

Aşağıdaki resimde olduğu gibi, mouse kullanmadan güncelleme komutunu (tamamen veya kısmen) kopyalamak ve bir yere yapıştırmak istiyorum.

fare kullanmadan CLI'den kopyala


1
Gnome'u faresiz mi kullanıyorsunuz?
ott--

Yanıtlar:


11

Sen kullanabilirsiniz screen(1) seçtiğiniz terminal emülatörü içinde ( xterm, gnome-terminal, ...).

İhtiyacınız olan işlevsellik yerleşiktir screen. Çalışma şeklini tanımanız gerekir:

  • varsayılan olarak, "komut" tuş bağlama Ctrl+ ' dır A, "komut" dizisi artı belirli bir eylem vererek komutlar oluşturursunuz.
  • "kopyala" komutu: AltGr+[
  • "Yapıştır" komutu AltGr+]

Komutu "kopyalayabilir" ve başka bir terminalde "yapıştırabilirsiniz".

screen eğlencelidir ve kullanmaya başladığınızda nasıl kullanmış olabileceğinizi merak edeceksiniz.


screenKomut yoktu , bu yüzden gnome terminaline kurdum ve screenbir terminalde başladım . Ama bundan sonra başlayamadım. Ayrıca yerleşik ekranla ne demek istediğinizi anlamadım.
prayagupd

1
Okuyun man screen. Ayrıca, 'yerleşik yazdığı içinde kopyalama / işlevsellik mevcuttur yapıştırmak anlamına ekrana' screen tasarımı ile .
dawud

spaceİstenen alanı seçmek için tuşunu kullanmanız gerekir . YTüm satırı veya istenen alanı kopyalamak için kullanmanız gerekir . Ekran vihareket dostudur.
FelikZ

nedir AltGranahtar? BenAlt
alhelal

1
screenAracı fonksiyonu burada izah etmiştir etmez. Ve soruya bir cevap vermiyor gibi görünüyor.
Luís de Sousa

7

Daha önce verilen cevaplara ek olarak, daha esnek bir terminal emülatörüne geçmeyi düşünebilirsiniz.

Terminalleri rxvt-unicode olarak değiştirmeye hazırsanız, urxvt-perls gibi bir araç kullanabilirsiniz : bu terminal öykünücüsünde aşağıdaki klavye işlevlerini sağlayan bir komut dosyası koleksiyonu:

  • metin seçme, kopyalama ve yapıştırma
  • ileri ve geri arama
  • URL'leri tercih ettiğiniz tarayıcıda vurgulayın ve açın

Paketi kurmanız ve ardından birkaç satır eklemeniz ~/.Xresourcesve kemirgenin fişini çıkarmanız yeterlidir .


4

Bunu aşağıdaki gibi bir program kullanarak yapabilirsiniz xclip:

NAME
   xclip - command line interface to X selections (clip‐
   board)

Yükledikten sonra, X panonuza bağlanmak için kullanabilirsiniz. Ne yazık ki, bu mysqlortamınızda çalışmaz (kopyalanan satırlar için kendi arabelleği vardır), ancak 'normal' bir komut çalıştırmak istiyorsanız çalışacaktır. Örneğin :

$ This is a long command line

Tür CtrlA, satırın başlangıcına gidin o zaman yankı tırnak komutu çevrelemek amacıyla:

$ echo -e "This is a long command line" |xclip 

Artık orta tıklama panonuzda "Bu uzun bir komut satırı" var.

Fare kullanmadan yapıştırmak istiyorsanız, nereye yapıştırdığınıza bağlı olacaktır. Şunları çalıştırarak başka bir terminale yapıştırabilirsiniz:

$ xclip -o

Aynı terminale yapıştırabilirsiniz, sadece komutu öldürerek (keserek) CtrlKve sonra yapıştırarak CtrlY.

Ayrıca komutları bash geçmişini kullanarak terminaller arasında da kaydedebilirsiniz. Bu satırı şuna ekle ~/.bashrc:

PROMPT_COMMAND='history -a; history -r'

PROMPT_COMMANDözel bir bash değişkenidir. Ayarlanmışsa, değer yeni bir komut isteminden önce komut olarak yürütülür. history -ageçerli oturumun geçmişini geçmiş dosyasına yazar ve dosyayı history -ryeniden yükler. Bu, çalıştırdığınız her komutun hemen geçmiş dosyasına yazılacağı anlamına gelir.

Şimdi uzun bir komut satırı çalıştırdığınızda, başka bir terminale geçebilir ve geri dönüşe basabilirsiniz (sadece çalıştırmak için $PROMT_COMMAND, alternatif olarak yeni bir terminal penceresi açmak için) ve bu terminalin geçmişine erişilebilir. Şimdi vurursanız Up, yeni terminalde çalıştırabilirsiniz.


Sorun değil, ama yine de fare kullanmak zorunda mıyım?
prayagupd

@PrayagUpd ah, evet, orta tıklama arabelleğine kopyalanacak. Başka bir yol için güncellenmiş cevaba bakın.
terdon

Bence $ xclip -oistediğim şey bu değil, çünkü sadece ne yaptığımı yazdırıyor xclipe. Ancak + 1 için Ctrl+Atakip Ctrl+Kve Ctrl+Yaynı terminalde en azından kesme ve yapıştırmak için.
prayagupd

@PrayagUpd şey, oyunda çeşitli pano tamponları var ve çözüm tam olarak ne yapmak istediğinize bağlı olacaktır. Sorunuzu, neye ihtiyacınız olduğuna dair belirli bir örnekle güncelleyebilir misiniz? Yani (mysql zor olacak) ve nereye kopyalamak demek.
terdon

1
@PrayagUpd başka bir numara için güncellenmiş cevabı görün.
terdon

1

@evilsoup iyi bir çözüm önerdi ama sık sık kırılıyor.

Hızlı Çözüm

İşte asla kırılmayan bir çözüm .

history | tail -2 | head -1 | xclip -selection clipboard

Sadece bu komutu çalıştırın ve çalıştırdığınız komutu panoya kopyalar.

Temel olarak, komut geçmişinizi yazdırması ve ikinci son komutu alması ve panonuza beslemesi (son komut bunun kendisidir, bu yüzden ikinci son komutu seçer).

Özel Bir İşlev

Hızlı çözüm geliştirirken, yazdığım küçük bir işlev var, oldukça akıllı ve son kullanılan komutu kopyalayacak. Ayrıca, son n. Komutu kopyalamak için sayısal bağımsız değişkenler de sağlayabilirsiniz. Örneğin, ikinci son komutu kopyalamak için 2argüman olarak sağlayın

myclipcopy () {

  if [ -z $1 ]
    then  # if no argument was provided then just copy the last used command
    history | tail -2 | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo 'Anyways, the following command has been copied:'
    history | tail -2 | head -1| sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'

  else
    myindex=$(( $1+1 ))
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo "The following command has been copied:"
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'
  fi

  #Delete this command itself from the history
  myhisnum=$(history | tail -1 | grep -oP '\s\d+\s' | grep -oP '\d+'); history -d $myhisnum
}

Yukarıdaki işlevi kopyalayıp yapıştırın ~/.bashrc. Bunu ayrı bir bash komut dosyasına yerleştirir ve komut dosyasını çalıştırırsanız, geçmiş komutunun bu durumda geçmişinize erişemeyeceği için çalışmadığını unutmayın.

Son olarak şu şekilde çalıştırın:

myclipcopy 3
# This copies the third-last command

Dahası, bu işleve eklenen harika bir özellik, çalıştırıldıktan sonra kendini geçmişten silmesidir. Bu yardımcı olur çünkü komutların "geriye" endeksi değişmez.


Bu sağlam değil .
mikeserv

@mikeserv: Şimdi "Özel İşlev" olarak yeniden adlandırdım. Peki neden düşürdün? Bunun soruyu doğru cevapladığını fark etmiyor musunuz? Dahası, neden "sağlam" dedim ki, aslında asla kırılmaması gerekiyordu. Aşağı oy vererek, sadece gönderinin uygun bir cevabını saklıyorsunuz.
shivams

Eğer farz çünkü downvoted çok söz belirtilen ikisi de özellikle bash ve linux,:. Ayrıca, boru hattınız gülünç derecede aşırı karmaşık ve aynı sizin regex için de geçerlidir
mikeserv

@mikeserv: Yorum için teşekkürler. Umarım bu daha iyi cevaplar üretmeme yardımcı olur. Normal ifademin ve boru hatlarının çirkin olduğunu kabul edeceğim. Ama iyi test edilmişler ve ben de kullanıyorum. Varsayımlara gelince, en yüksek puanlı cevabın kullanıcının kullandığı varsayımını aldığını fark ettiniz mi screen? En yüksek puan alan ikinci cevap da bashve linux. Dahası, varsayım bashbüyük bir anlaşma değildir, çünkü komut dosyası hala zsh veya diğer kabuklarda bulmaya çalışır.
shivams

Çirkin olduğunu söylemedim - aşırı karmaşık olduğunu söyledim. Ve hayır, diğer kabukların çoğunda iyi çalışmaz . Dahası , soruda resmedilen CLI , MySQL'dir. Yine de diğer cevaplar hakkında iyi bir nokta.
mikeserv

0

Bu komut bash'ın geçmiş genişlemesini kullanır (bu nedenle !!terminale yazdığınız son satıra genişler). Muhtemelen ya xclipda yüklemeniz gerekecektir xsel.

echo "!!" | xclip -selection clipboard

echo "!!" | xsel -i --clipboard

Bu, son komutunuzu Ctrl+ vpanoya koyacağından, herhangi bir GUI programına (veya çoğu terminal öykünücüsünde Ctrl+ Shift+ vile veya "+pvim ile) yapıştırabilirsiniz .

Bu, çift tırnak işareti içeren bazı satırlar için kesilir, örneğin:

$ echo "foo;bar"
foo;bar
$ echo "!!"
echo "echo "foo;bar""
echo foo
The program 'bar' is currently not installed. You can install it by typing:
sudo apt-get install bar

Yine de örnek olarak verdiğiniz komut için çalışacaktır; yalnızca çift tırnak işaretleri kaçıyorsa ; & && | ||ve benzeri sorunlar yaşıyorsanız .


Bu cevap için teşekkürler, bu hemen uygulayabileceğim en pratik çözümdü. Ve sadece yapın "ile ilgili sorunlar hiç !! alıntı vermeyerek basitçe önlenebilir inanıyoruz echo !!(önceki komut o imkansız durumlar dışında ve sorunsuz çalışacak başladı ile -nya -eya da birkaç seçenek echokendisi sürer).
sundar - Monica'yı geri

0

Belki en uygun çözüm değil ama kullanıyorum ve bu yüzden başkaları için daha fazla yardımcı olabilir, herhangi bir ek yumuşak kurulum gerektirmez.

  1. Herhangi bir uygun dizinde geçici bir dosya oluşturmanız gerekir

  2. İstediğiniz yönü veya metni bu dosyaya aktarın. Yön aktarımı için şunları kullanabilirsiniz:

    echo $(pwd) 1> tempo
    
  3. Dosyadan yön almak için komutunu kullanın

    cd $(tail -n 1 tempo)
    

Kopyalama ve yapıştırma komutları için bu sistem elbette çalışacaktır. Umarım yardımcı olmuştur


Kusalananda düzenlediğiniz için teşekkürler. Şimdi cevap çok daha iyi görünüyor
Dmitriy Kormulev
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.