изменить сочетания клавиш Bash, такие как Ctrl-C?

21

Я использую Kubuntu 10.04. Я хотел бы изменить некоторые стандартные сочетания клавиш для bash (терминал).

Вот ярлыки, которые я хотел бы установить:

  • Ctrl- Cскопировать выделенный текст в терминале в буфер обмена.

  • Ctrl- Vвставить из буфера обмена в терминал.

  • Ctrl- Zотменить редактирование текущей строки в терминале.

  • Ctrl- Shift- C(или даже лучше, Super- C) прекратить команду.

  • Ctrl- Shift- Z(или Super- Z) быть фоновой командой.

  • Ctrl- Shift- V(или Super- V), чтобы быть буквальной командой вставки (или что-нибудь еще Ctrl- zделали раньше).

Как мне сделать эти изменения?

Кстати, мне нравится, как терминал работает в OS X. Использование клавиши командной строки делает все команды копирования / вставки очень согласованными (в отличие от многих других вещей в OS X).

PS Я прочитал справочную страницу bash, и это не помогло. Это дало мне идеи, но мне нужны конкретные примеры для вышеуказанных комбинаций. Благодарю.

Павел
источник
некоторые из этих «горячих клавиш» не могут быть «реализованы» в bash, но должны быть помещены в сам терминал (xterm, gnome-терминал, консоль и т. д.), например, «выбранный текст», «буфер обмена»
akira

Ответы:

10

Это не функции bash, это функции драйвера терминала. Как таковые, они указаны stty(1).

$ stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
Игнасио Васкес-Абрамс
источник
5
OK. Спасибо за подсказку. Теперь я все еще хотел бы достичь своей цели. И я также знаю, что inputrc может переназначить Ctrl-C. Но мне действительно все равно, как я это делаю, я просто хочу узнать, как переназначить эти ярлыки в терминале.
Пол
15
Вот «рыба»: stty intr \ ^ k (где команда завершения, ранее Ctrl-C теперь становится Ctrl-K, K может быть любой буквенной клавишей) Никто не «дал мне эту рыбу». Я упорно трудился , чтобы найти его самостоятельно. Итак, проповедь с пословицами заставляет вас выглядеть как придурок, ИМО.
Пол
Как вы можете переназначить его на Ctrl + Shift + C?
crypdick
8

Это почти полностью решено сейчас. Часть решения была впервые доведена до моего сведения MTK358 на http://www.linuxquestions.org/questions/linux-software-2/change-bash-shortcut-keys-such-as-ctrl-c-818170/ , Он указал на (довольно очевидный, очень к моему стеснению) тот факт, что сочетания клавиш копирования и вставки можно легко изменить с помощью настроек меню konsole. Как только я увидел это, потребовалось около 1 минуты, чтобы настроить Ctrl-C и Ctrl-V для копирования и вставки с помощью терминала.

Другая часть решения должна была быть понятна со страницы руководства stty, но это не было (для меня). В итоге я просто экспериментировал, основываясь на различных подсказках, таких как те, что были опубликованы выше.

Я решил, какой не числовой ключ я хочу заменить Ctrl-C в качестве команды завершения. (Я использовал "к"). Я никогда не находил никакой информации о том, как передать модификатор сдвига в stty, поэтому я отказался от этого. После этого я должен был ввести в командной строке следующее:

stty intr \ ^ k

Я проверил, что все работает как хотелось.

Теперь мне просто нужно было поместить одну вышеупомянутую команду (stty intr \ ^ k) в сценарий запуска. Я не уверен, какой из них "правильный". Я хотел бы, чтобы это изменение было системным и постоянным.

Любые предложения относительно того, в какой сценарий я должен поместить команду?

И, наконец, что касается ответов на проповеди, они не нужны и бесполезны.

Павел
источник
Вы когда-нибудь определяли, какой «правильный» скрипт запуска использовать, или лучший способ сделать это? Я борюсь с этой же проблемой (ваш оригинальный вопрос). Но хотя я могу заставить 'stty intr \ ^ k' связывать ctrl-k, он не отменяет привязку ctrl-c и ни 'stty intr undef', ни 'stty intr = ^ -' делают это, ctrl-c все равно отправляет прерывание , И 'stty -a' никогда не показывает никаких изменений, которые я сделал.
EricS
4

Некоторые из них могут быть установлены с помощью обычного механизма сочетания клавиш KDE. В меню «Настройки» Konsole нажмите «Настроить ярлыки», и вы получите диалоговое окно, которое можно использовать для изменения привязок клавиш для функций, которые обрабатываются KDE. Это позволит вам переназначить Ctrl + C для копирования и Ctrl + V для вставки - но имейте в виду, что после этого эти последовательности клавиш больше не будут передаваться на терминал, поэтому вы не сможете использовать Ctrl + C, чтобы прервать программу, например.

Другие функции контролируются readlineбиблиотекой, которую вы можете настроить, отредактировав файл ~/.inputrc. Чтобы получить Ctrl + Z, чтобы отменить любые изменения, сделанные в текущей строке, вы хотите добавить

C-z: revert-line

но эта последовательность клавиш, вероятно, уже захвачена терминалом, поэтому вам, возможно, придется использовать ее, sttyчтобы отсоединить, прежде чем она заработает. Сначала ищите ^Zв выводе stty -a(как показано в ответе Игнасио), а затем, например, если он появляется в susp = ^Z, запустите

stty susp ^-

чтобы открепить это сопоставление клавиш.

Другие изменения, о которых вы спрашиваете, должны быть сделаны, sttyкак говорит Игнасио, поскольку это терминальные функции, но я не совсем уверен, как именно. Проблема в том, что я не знаю, распознает ли терминал Shift или, если да, как передать эту информацию stty.

Дэвид З
источник
3

Bash использует emacsили viрежим в командной строке. Он не имеет понятия «выбор» или «буфер обмена». Он использует такие вещи, как «kill buffer» и «point», «mark», «word», «line», «kill» и «yank» и т. Д.

Попытка включить в него функциональность в стиле GUI будет в лучшем случае разочаровывающей и не будет работать полностью. Вы должны попытаться объединить функции stty, readlineи ваш терминал (предположительно Terminal.appдля вас). Вам нужно будет переназначить функции , такие как intr, susp, lnextи т.д., так что вы можете использовать свои возможности.

Я настоятельно рекомендую против таких радикальных модификаций. Он просто не предназначен для того, чтобы делать то, что вы хотите.

Когда в Риме...

Приостановлено до дальнейшего уведомления.
источник
Дэйв, для системы, которая работает так же, как OS X, могу я предложить вам использовать OS X? Как намекнул Деннис, даже если вы сможете заставить его работать, вы будете довольно хромать, когда будете входить в систему как угодно, кроме вас на своей собственной машине.
Msw
Я не могу поручиться за другие команды, но копирование и вставка имеют смысл в командном окне и очень удобны. Я использую их постоянно для копирования и вставки между другими окнами и консолью, и делал это в течение многих лет. Shift-Ctrl-C и Shift-Ctrl-V работают таким образом для Konsole из коробки. И хотя я делал это каждый день в течение многих лет, я неизбежно забывал и нажимал Ctrl-c в Konsole. Лично я готов прекратить применять пословицу «когда в Риме» и переназначить их, чтобы они работали, как практически КАЖДЫЕ из других существующих приложений.
EricS
1

Я запустил Ubuntu и изменил ярлык для копирования по умолчанию Ctrl+ Shift+C на более обычный и простой Ctrl+ C. Это , однако , заставил меня бежать в проблему не в состоянии послать команду прерывания ^ C .

Благодаря ответу @Paul я нашел команду запуска

tty intr \^k

Позволит мне отправить команду прерывания, используя Ctrl+ K. Однако эту команду нужно было запускать каждый раз, когда я открываю терминал, что создает трудности (как он сам упомянул).

С небольшим количеством дальнейших исследований (поиск в Google) я обнаружил, как выполнять команду каждый раз, когда открывается терминал (в любом случае, в Ubuntu) .

Таким образом, в конечном итоге выполнение следующей команды (один раз) (в Ubuntu 18.04 и, вероятно, более) даст ожидаемое поведение каждый раз.

echo $'# Make Ctrl+K interrupt command in terminal\nstty intr \^k\n' >> ~/.bashrc

Наконец, стоит упомянуть, что вы не должны использовать Kкнопку. Вы можете поменять букву k во всех приведенных выше командах на любой выбранный вами буквенный ключ.

Вигги Линдхольм
источник