Terminal - kopiuj z CLI bez użycia myszy


20

Podczas uruchamiania poleceń w CLI chcę skopiować polecenie, które właśnie uruchomiłem lub cokolwiek co napisałem w terminalu i wkleić je gdzie indziej bez użycia myszy.

Jak na poniższym obrazku, chcę skopiować polecenie aktualizacji (całkowicie lub częściowo) bez użycia myszy i wkleić go gdzieś.

kopiuj z CLI bez użycia myszy


1
Używasz gnoma bez myszy?
ott--

Odpowiedzi:


11

Można użyć screen(1) w swoim emulatorze terminala wyboru ( xterm, gnome-terminal...).

Potrzebna funkcjonalność jest wbudowana screen. Musisz zapoznać się ze sposobem działania:

  • domyślnie skrót klawiszowy „komenda” to Ctrl+ A, komponujesz komendy, wydając sekwencję „komenda” plus określoną akcję.
  • polecenie „kopiuj” to: AltGr+[
  • polecenie „wklej” to AltGr+]

Możesz „skopiować” polecenie i „wkleić” w innym terminalu.

screen jest fajny, a kiedy zaczniesz go używać, będziesz się zastanawiać, jak to możliwe, że go wcale nie używałeś.


Nie było screenpolecenia, więc zainstalowałem go w terminalu gnome i uruchomiłem screenw terminalu. Ale później nie można było zacząć. Nie zrozumiałem też, co masz na myśli mówiąc o wbudowanym ekranie.
prayagupd

1
Czytać man screen. Napisałem także „wbudowany w ekran”, co oznacza, że ​​funkcja kopiuj / wklej jest obecna w screen projekcie .
dawud

Musisz użyć spaceklawisza, aby wybrać pożądany obszar. Musisz użyć Ydo skopiowania całej linii lub pożądanego obszaru. Ekran jest viprzyjazny dla ruchów.
FelikZ

co jest AltGrkluczowe MamAlt
prawie

1
screenNarzędzie nie działa wyjaśnił tutaj. I wydaje się, że nie zapewnia to odpowiedzi na pytanie.
Luís de Sousa

7

Oprócz podanych już odpowiedzi można rozważyć przejście na bardziej elastyczny emulator terminala.

Jeśli jesteś przygotowany na zmianę terminali na rxvt-unicode , możesz użyć narzędzia takiego jak urxvt-perls : zbiór skryptów zapewniających następujące funkcje klawiatury w tym emulatorze terminali:

  • zaznacz, skopiuj i wklej tekst
  • wyszukiwanie do przodu i do tyłu
  • zaznacz i otwórz adresy URL w preferowanej przeglądarce

Po prostu zainstaluj pakiet, a następnie dodaj kilka linii do swojego ~/.Xresources, a następnie możesz odłączyć gryzonia na dobre.


4

Możesz to zrobić za pomocą programu takiego jak xclip:

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

Po zainstalowaniu możesz użyć go do połączenia ze swoim schowkiem X. Niestety, nie zadziała to w twoim mysqlśrodowisku (ma własny bufor dla kopiowanych linii), ale zadziała, jeśli chcesz uruchomić „normalne” polecenie. Na przykład :

$ This is a long command line

Wpisz, CtrlAaby przejść na początek wiersza, umieść polecenie w cudzysłowie, a następnie powtórz je:

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

Teraz w schowku środkowego kliknięcia znajduje się „To długa linia poleceń”.

Jeśli chcesz wkleić bez użycia myszy, zależy to od miejsca wklejenia. Możesz wkleić do innego terminala, uruchamiając:

$ xclip -o

Możesz wkleić do tego samego terminala, po prostu zabijając (wycinając) polecenie, CtrlKa następnie wklejając CtrlY.

Możesz także zapisywać polecenia między terminalami, korzystając z historii bash. Dodaj ten wiersz do ~/.bashrc:

PROMPT_COMMAND='history -a; history -r'

PROMPT_COMMANDjest specjalną zmienną bash. Jeśli jest ustawiony, wartość jest wykonywana jako polecenie przed wydaniem nowego monitu. history -azapisze historię bieżącej sesji do pliku historii i history -rprzeładuje ten plik. Oznacza to, że każde uruchomione polecenie zostanie natychmiast zapisane w pliku historii.

Teraz, gdy uruchomisz długą linię poleceń, możesz przełączyć się na inny terminal i nacisnąć klawisz Return (aby uruchomić $PROMT_COMMANDlub alternatywnie otworzyć nowe okno terminala) i będzie on dostępny dla historii tego terminalu. Jeśli teraz trafisz Up, możesz uruchomić go na nowym terminalu.


W porządku, ale nadal muszę używać myszy?
prayagupd

@PrayagUpd ah, tak, to skopiuje do bufora środkowego kliknięcia. Zobacz zaktualizowaną odpowiedź na inny sposób.
terdon

Myślę, że $ xclip -onie jest to, czego chcę, ponieważ po prostu drukuje to, co xcliped. Ale +1 dla, Ctrl+Aa następnie Ctrl+Ki Ctrl+Ydla wycinania i wklejania co najmniej w tym samym terminalu.
prayagupd

@PrayagUpd chodzi o to, że istnieją różne bufory schowka, a rozwiązanie zależy od tego, co dokładnie chcesz zrobić. Czy możesz zaktualizować swoje pytanie konkretnym przykładem tego, czego potrzebujesz? Mam na myśli kopiowanie skąd (mysql będzie trudne) i dokąd.
terdon

1
@PrayagUpd zobacz zaktualizowaną odpowiedź na inną sztuczkę.
terdon

1

@evilsoup sugeruje dobre rozwiązanie, ale często się psuje.

Szybkie rozwiązanie

Oto rozwiązanie, które nigdy się nie psuje .

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

Po prostu uruchom to polecenie, a skopiuje ono właśnie uruchomione polecenie do schowka.

Zasadniczo robi to, że drukuje historię poleceń i pobiera drugie ostatnie polecenie i podaje je do schowka (ostatnie to samo, więc wybiera drugie ostatnie polecenie).

Funkcja niestandardowa

Rozwijając szybkie rozwiązanie, oto mała funkcja, którą napisałem, która jest dość inteligentna i skopiuje ostatnio używane polecenie. Możesz także podać argumenty numeryczne, aby skopiować ostatnie n-te polecenie. Np. Do skopiowania drugiego ostatniego polecenia podaj 2jako argument

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
}

Skopiuj i wklej powyższą funkcję do swojego ~/.bashrcpliku. Zauważ, że jeśli umieścisz to w osobnym pliku skryptu bash i uruchomisz skrypt, nie działałoby to, ponieważ polecenie historii nie byłoby w stanie uzyskać dostępu do twojej historii w takim przypadku.

Na koniec uruchom go jako:

myclipcopy 3
# This copies the third-last command

Co więcej, jedną z fajnych funkcji dodanych do tej funkcji jest to, że usuwa się z historii po uruchomieniu. Jest to pomocne, ponieważ wówczas indeks „wstecz” poleceń nie zmienia się.


To nie jest solidne .
mikeserv

@mikeserv: Zmieniłem teraz nazwę na „Custom Function”. Ale dlaczego to zagłosowałaś? Nie zauważysz, że to właściwie odpowiada na pytanie? Ponadto powiedziałem, że „solidny” to dlatego, że tak naprawdę nigdy nie powinien się zepsuć. Oddając głos, ukrywasz odpowiednią odpowiedź w poście.
shivams

Głosowałem za tym, ponieważ zakładasz dużo : szczególnie bash i linux, z których żaden nie jest określony w pytaniu. Poza tym twój rurociąg jest śmiesznie nadmiernie skomplikowany i to samo dotyczy
wyrażeń

@mikeserv: Dzięki za komentarz. Mam nadzieję, że pomoże mi to uzyskać lepsze odpowiedzi. Zaakceptuję, że moje wyrażenia regularne i potoki są brzydkie. Ale są dobrze przetestowane i korzystam z nich. A jeśli chodzi o założenia, czy zauważyłeś, że najwyżej oceniana odpowiedź przyjęła założenie, że użytkownik używa screen. Druga najwyżej oceniana odpowiedź również przyjęła bashi linux. Co więcej, założenie, że bashto nie jest wielka sprawa, ponieważ skrypt nadal działałby w Zsh lub w większości innych powłok.
shivams

Nie powiedziałem, że to brzydkie - powiedziałem, że to skomplikowane. I nie, nie będzie działać dobrze w większości innych powłok . Co więcej, CLI przedstawiony w pytaniu to MySQL. Dobra uwaga na temat innych odpowiedzi.
mikeserv

0

To polecenie używa ekspansji historii basha ( !!rozwija się do ostatniego wiersza wpisanego w terminalu). Prawdopodobnie będziesz musiał zainstalować albo xclipalbo xsel.

echo "!!" | xclip -selection clipboard

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

Spowoduje to umieszczenie twojego ostatniego polecenia w schowku Ctrl+ v, dzięki czemu będziesz mógł wkleić się do dowolnego programu GUI (lub z Ctrl+ Shift+ vw większości emulatorów terminali lub "+pw vimie).

Spowoduje to uszkodzenie niektórych wierszy zawierających podwójne cudzysłowy, na przykład:

$ 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

Działa to jednak dla polecenia, które podałeś jako przykład; powinieneś mieć problemy tylko wtedy, gdy podwójne cudzysłowy uciekają ; & && | ||i tak dalej.


Dzięki za odpowiedź, było to najbardziej praktyczne rozwiązanie, jakie mogłem od razu wdrożyć. I wierzę, że problemy z "można uniknąć po prostu nie podając !! wcale, po prostu zrobić echo !!i będzie działać bez zarzutu (z wyjątkiem nieprawdopodobnym przypadku, poprzednia komenda zaczęła z -nlub -elub kilka innych opcji, które echosama potrwa).
Sundar - Przywróć Monikę

0

Może nie jest to najwygodniejsze rozwiązanie, ale go używam, więc może być pomocne dla innych, ponieważ nie wymaga dodatkowej miękkiej instalacji.

  1. Musisz utworzyć plik tymczasowy w dowolnym wygodnym katalogu

  2. Przenieś wymagany kierunek lub tekst do tego pliku. Do przesyłania kierunku możesz użyć

    echo $(pwd) 1> tempo
    
  3. Aby uzyskać kierunek z pliku, użyj polecenia

    cd $(tail -n 1 tempo)
    

W przypadku kopiowania i wklejania poleceń ten system będzie działał albo. Mam nadzieję, że było to pomocne


Dziękuję Kusalanandzie za edycję. Teraz odpowiedź wygląda znacznie lepiej
Dmitriy Kormulev,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.