Термінал - копіювання з CLI без використання миші


20

Під час запуску команд у CLI я хочу скопіювати команду, яку я щойно вистрілив, або що-небудь, що я написав у терміналі, і вставити її кудись ще, не використовуючи мишу.

Як і на наступному малюнку, я хочу скопіювати команду оновлення (повністю або частково), не використовуючи миші та вставити її кудись.

копіювати з CLI без використання миші


1
Ви використовуєте gnome без миші?
ott--

Відповіді:


11

Ви можете використовувати screen(1) в емуляції терміналу вибору ( xterm, gnome-terminal, ...).

Функціонал, який вам потрібен, є вбудованим screen. Потрібно ознайомитись із способом роботи:

  • за замовчуванням прив'язка клавіш "command" дорівнює Ctrl+ A, ви складаєте команди, видаючи послідовність "command" плюс конкретну дію.
  • команда "копіювати": AltGr+[
  • команда "вставити" AltGr+]

Ви можете "скопіювати" команду та "вставити" в інший термінал.

screen це весело, і як тільки ви почнете його використовувати, ви задумаєтесь, як можливо, ви взагалі не використовували його.


Команди не було screen, тому я встановив її в gnome-terminal і запустив screenу терміналі. Але після цього не вдалося розпочати роботу. Також я не зрозумів, що ви маєте на увазі під вбудованим екраном.
prayagupd

1
Прочитайте man screen. Крім того , я написав «вбудований в екран», тобто копіювання / вставки функціональність присутня в screen відповідно з проектом .
dawud

Щоб spaceвибрати бажану область, потрібно скористатися клавішею. Вам потрібно Yскопіювати всю лінію чи бажану область. Екран - це viрухи дружні.
FelikZ

що є AltGrключовим? У менеAlt
alhelal

1
screenІнструмент не функціонує пояснив тут. І це, здається, не дає відповіді на запитання.
Luís de Sousa

7

Окрім вже наданих відповідей, ви можете розглянути можливість переходу до більш гнучкого емулятора терміналу.

Якщо ви були готові змінити термінали на rxvt-unicode , ви можете використовувати такий інструмент, як urxvt-perls : набір сценаріїв, що забезпечують наступну функціональність клавіатури в цьому емуляторі терміналу:

  • виберіть, скопіюйте та вставте текст
  • вперед і назад пошук
  • виділіть та відкрийте URL-адреси у вибраному веб-переглядачі

Ви просто встановите пакет, а потім додасте кілька рядків до свого ~/.Xresources, і ви зможете назавжди відключити гризуна.


4

Це можна зробити за допомогою такої програми, як xclip:

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

Після встановлення його можна використовувати для підключення до буфера обміну X. На жаль, це не буде працювати у вашому mysqlоточенні (у нього є власний буфер для скопійованих рядків), але це буде, якщо ви хочете виконати команду 'normal'. Наприклад :

$ This is a long command line

Введіть, CtrlAщоб перейти до початку рядка, укладіть команду в лапки, а потім повторіть її:

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

Тепер у вашому середньому кліпі буфер "Це довгий командний рядок".

Якщо ви хочете вставити без використання миші, це залежатиме від того, де ви вставляєте. Ви можете вставити в інший термінал, запустивши:

$ xclip -o

Ви можете вставити в той же термінал, просто вбивши (вирізавши) команду, CtrlKа потім вставивши CtrlY.

Ви також можете зберігати команди через термінали, використовуючи історію bash. Додайте цей рядок до своїх ~/.bashrc:

PROMPT_COMMAND='history -a; history -r'

PROMPT_COMMANDє спеціальною змінною bash. Якщо вона встановлена, значення виконується як команда перед видачею нового запиту. history -aзапише історію поточного сеансу у файл історії та history -rперезавантажить цей файл. Це означає, що кожна запущена команда буде негайно записана у файл історії.

Тепер, коли ви запускаєте довгий командний рядок, ви можете переключитися на інший термінал і натиснути повернення (просто для запуску $PROMT_COMMAND, альтернативно, відкрийте нове вікно терміналу), і він буде доступний для історії цього терміналу. Якщо ви зараз потрапили Up, можете запустити його на новому терміналі.


Це нормально, але я все одно повинен використовувати мишу?
prayagupd

@PrayagUpd ах, так, це скопіює в буфер середнього клацання. Дивіться оновлену відповідь для іншого способу.
terdon

Я думаю, що $ xclip -oце не те, що я хочу, тому що воно просто друкує те, що я сказав xclipe. Але +1 для Ctrl+Aподальшого Ctrl+Kта Ctrl+Yдля вирізання та приклеювання до принаймні в одному терміналі.
prayagupd

@PrayagUpd річ у тому, що в грі є різні буфери буфера обміну, і рішення буде залежати від того, що саме ви хочете зробити. Чи можете ви оновити своє запитання конкретним прикладом того, що вам потрібно? Я маю на увазі копіювання звідки (mysql буде складно) і куди.
terdon

1
@PrayagUpd див. Оновлену відповідь на ще один трюк.
тердон

1

@evilsoup запропонував хороше рішення, але він часто ламається.

Швидке рішення

Ось рішення, яке ніколи не ламається .

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

Просто запустіть цю команду, і вона скопіює команду, яку ви тільки що запустили, до буфера обміну.

В основному, це те, що він друкує історію ваших команд і бере другу останню команду і подає її у буфер обміну (остання команда - це сама, тому вона вибирає другу останню команду).

Спеціальна функція

Розвиваючись на швидкому рішенні, ось невеличка функція, яку я написав, яка досить розумна і скопіює останню використану команду. Ви також можете навести числові аргументи для копіювання останньої п’ятої команди. Наприклад, для копіювання другої останньої команди надайте 2як аргумент

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
}

Скопіюйте та вставте вищевказану функцію у свій ~/.bashrcфайл. Зауважте, що якщо ви помістите це в окремий файл сценарію bash і запустите скрипт, він не працює, оскільки команда "Історія" не зможе отримати доступ до вашої історії в цьому випадку.

Нарешті, запустіть це як:

myclipcopy 3
# This copies the third-last command

Крім того, одна цікава функція, яка додається до цієї функції, - це те, що вона видаляється з історії після її запуску. Це корисно, тому що тоді "зворотний" індекс команд не змінюється.


Це не надійно .
mikeserv

@mikeserv: Я зараз перейменував її на "Спеціальна функція". Але чому ти це спростував? Ви не помічаєте, що це правильно відповідає на питання? Більше того, чому я сказав "надійний", тому що він насправді ніколи не повинен ламатися. Відхиляючись, ви просто приховуєте відповідну відповідь від поста.
шивам

Я вважаю, що ви припускаєте багато : особливо bash та linux, жоден з яких не вказаний у питанні. Крім того, ваш трубопровід є смішно надскладним, і те саме стосується вашого
регексу

@mikeserv: Дякую за коментар. Сподіваюся, це допоможе мені отримати кращі відповіді. Я прийму, що мій вираз і трубопроводи некрасиві. Але вони добре перевірені, і я цим користуюся. Щодо припущень, чи помітили ви, що відповідь з найвищою оцінкою прийняв припущення, яке користувач використовує screen. Друга найвища відповідь також припускала bashі linux. Більше того, припустити, що bashце не велика справа, тому що сценарій все-таки буде працювати в zsh або більшості інших оболонок.
шивам

Я не казав, що це некрасиво - я сказав, що це занадто складно. І ні, це не спрацює нормально в більшості інших оболонок . Більше того, CLI насправді зображений у запитанні - MySQL. Хоча хороша думка щодо інших відповідей.
mikeserv

0

Ця команда використовує розширення історії bash (так !!розширюється в останній рядок, який ви ввели в термінал). Можливо, вам доведеться встановити або xclipі xsel.

echo "!!" | xclip -selection clipboard

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

Це помістить вашу останню команду в буфер обміну Ctrl+ v, тому ви зможете вставити будь-яку програму GUI (або з Ctrl+ Shift+ vу більшості емуляторів терміналу, або з "+pin vim).

Це порушиться для деяких рядків, що містять подвійні лапки, наприклад:

$ 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

Він буде працювати для команди, яку ви подали як приклад; у вас виникатимуть проблеми, лише якщо подвійні котирування пропадають ; & && | ||тощо.


Дякую за цю відповідь, це було найбільш практичне рішення, яке я міг негайно реалізувати. І я вважаю , що проблеми з "можна уникнути , просто не цитуючи !! взагалі, просто робити , echo !!і він буде працювати бездоганно ( за винятком малоймовірному випадку, якщо ваша попередня команда почала з -nабо -eабо кілька інших варіантів , які echoсама приймає).
sundar

0

Можливо, це не найзручніше рішення, але я використовую його, і тому воно може бути корисним для інших, але це не потребує додаткової м'якої установки.

  1. Вам потрібно створити тимчасовий файл у будь-якому зручному каталозі

  2. Перенесіть потрібний напрямок або текст у цей файл. Для передачі напрямку ви можете використовувати

    echo $(pwd) 1> tempo
    
  3. Щоб отримати напрямок з файлу, використовуйте команду

    cd $(tail -n 1 tempo)
    

Для копіювання та вставлення команд ця система буде працювати будь-який звичайно. Сподіваюся, що це було корисно


Kusalananda дякую за редагування. Зараз відповідь виглядає набагато краще
Дмитро Кормулєв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.