Здравствуйте!
Имеется Debian 9-й, без графики (консоль). Хотелось бы задать клавиши для запуска разных программ, причём не просто будучи в bash`е, а в любой консольной программе. Например перенести переключение консолей на Win+1,2 и т.п. задав для Win+1 "chvt 1", для Win+Ctrl+m "mc" и тому подобное.
> Здравствуйте!
> Имеется Debian 9-й, без графики (консоль). Хотелось бы задать клавиши для запуска
> разных программ, причём не просто будучи в bash`е, а в любой
> консольной программе. Например перенести переключение консолей на Win+1,2 и т.п. задав
> для Win+1 "chvt 1", для Win+Ctrl+m "mc" и тому подобное.Нельзя такое сделать.
Подобное только можно сделать имею гуй.
В консоли можно только назначить алиасы команд!
Насчет переключения консолей не понял, это как вы планируете сделать?! )
Возможно вам подойдет вариант переключения консолей ctrl+alt+f1(2.3.4.5.7.8.9.10).
> Нельзя такое сделать.Неужели нет программ, которые бы перехватывали клавиатуру (наверно читали из /dev/input?) и запускали бы чего нибудь (system(), exec(), etc)
> Подобное только можно сделать имею гуй.
Про xbindkeys знаю, но нужно без гуя...
> В консоли можно только назначить алиасы команд!
А для алиасов горячие клавиши не назначаются?
> Насчет переключения консолей не понял, это как вы планируете сделать?! )
> Возможно вам подойдет вариант переключения консолей ctrl+alt+f1(2.3.4.5.7.8.9.10).Там есть ctrl+alt+Fx и alt+Fx, а я хочу как у меня на i3 - Win+1(2,3,4,5...)
>[оверквотинг удален]
> Неужели нет программ, которые бы перехватывали клавиатуру (наверно читали из /dev/input?)
> и запускали бы чего нибудь (system(), exec(), etc)
>> Подобное только можно сделать имею гуй.
> Про xbindkeys знаю, но нужно без гуя...
>> В консоли можно только назначить алиасы команд!
> А для алиасов горячие клавиши не назначаются?
>> Насчет переключения консолей не понял, это как вы планируете сделать?! )
>> Возможно вам подойдет вариант переключения консолей ctrl+alt+f1(2.3.4.5.7.8.9.10).
> Там есть ctrl+alt+Fx и alt+Fx, а я хочу как у меня на
> i3 - Win+1(2,3,4,5...)Что есть i3 ?
> Что есть i3 ?i3wm (https://i3wm.org)
> Имеется Debian 9-й, без графики (консоль). Хотелось бы задать клавиши для запуска
> разных программ, причём не просто будучи в bash`е, а в любой
> консольной программе. Например перенести переключение консолей на Win+1,2 и т.п. задав
> для Win+1 "chvt 1", для Win+Ctrl+m "mc" и тому подобное.В общем случае - никак. bash пользуется readline, а кто-то пользуется только termios.
Кроме того, о юный падаван, открой для себя screens, tmux, muck, dvtm и ещё кучу подобных.
Это если не упоминать терминалы в X11/Gnome/KDE/Xfce/... и SSH.
bash в десяточке - это левая шняга.
>bash пользуется readline...А этот readline позволяет запускать программы? Вроде бы как-то через bind можно для readline задавать хоткеи.
> Кроме того, о юный падаван, открой для себя screens, tmux, muck, dvtm
> и ещё кучу подобных.А там можно менять клавиатурные сокращения? Хочу хоть как-то унифицировать горячие клавиши. На настольном ПК i3wm, ноутбук слабенький, там гуй не поворотный, консоли для работы хватает.
> Это если не упоминать терминалы в X11/Gnome/KDE/Xfce/... и SSH.
В Х11 можно назначать клавиши на любое приложение (xbindkeys).
Про SSH - а там можно назначит клавиши для удалённой консоли?> bash в десяточке - это левая шняга.
На ноуте 9-й дебиан.
> А этот readline позволяет запускать программы? Вроде бы как-то через bind можноРазумеется, нет. Это не его работа. Запускает bash.
> для readline задавать хоткеи.Не всякие, там куча осмысленных ограничений. man termcap.
>> Кроме того, о юный падаван, открой для себя screens, tmux, muck, dvtm
>> и ещё кучу подобных.
> А там можно менять клавиатурные сокращения? Хочу хоть как-то унифицировать горячие клавиши.Можно, но не нужно. Ты убьёшь кучу времени, настроишь какие-то бесполезные Win+1. Потом тебе попадётся клава без Win - например Apple Aluminium. Кнопка яблока там есть, но работает она по-другому. Хотя с виду почти такая же.
> В Х11 можно назначать клавиши на любое приложение (xbindkeys).
> Про SSH - а там можно назначит клавиши для удалённой консоли?Разумеется, нет. Ты не знаешь, кто у тебя консоль на той стороне SSH. Там может оказаться Cisco IOS или вообще z/OS с termios под IBM-овскую клаву. 20 функциональных клавиш и ни одной Win, прикинь?
Начни читать начиная сman termcap
Пока ты не понимаешь, что ты делаешь. Консоль Unix - это совсем не клава с монитором. Твой Debian 9 обязан работать с кучей консолей, причём одновременно. Среди этих консолей есть даже телетайп.
Подстраивать его под конкретную клаву можно, но сложно и не нужно. Сильно быстрее выучить дефолтные настройки и не делать себе мозг.
>man termcapПоизучаю. Спасибо. Ещё бы русских манов бы в систему...
> Можно, но не нужно.
> Потом тебе попадётся клава без Win - например Apple Aluminium. Кнопка
> яблока там есть, но работает она по-другому.Это попытка унифицировать работу на старом ноутбуке (консоль, редко софтина в X) и настольном ПК (i3wm с двумя мониторами). Всё равно работа за чужим ПК это всегда неудобство.
>>SSH
>Ты не знаешь, кто у тебя консоль на той сторонеЭто да, просто SSH был упомянут Вами, вот и спросил.
> Начни читать начиная с man termcapУже. Спасибо.
> Пока ты не понимаешь, что ты делаешь.
Что - понимаю. Частичную идентичность в работе на двух разных машинах. А вот как я этого могу добиться - тут да, не понимаю. "Иду на ощупь ног"
> Подстраивать его под конкретную клаву можно, но сложно и не нужно.
Зато порой интересно :)
>Сильно быстрее выучить дефолтные настройки и не делать себе мозг.
К сожалению "дефолтные настройки" у каждого свои. Даже для переключения раскладки...
> Здравствуйте!
> Имеется Debian 9-й, без графики (консоль). Хотелось бы задать клавиши для запуска
> разных программ, причём не просто будучи в bash`е, а в любой
> консольной программе. Например перенести переключение консолей на Win+1,2 и т.п. задав
> для Win+1 "chvt 1", для Win+Ctrl+m "mc" и тому подобное.Костыляйте в screen, он позволяет назначать хоткеи (уверен tmux тоже подойдёт, но я не пользовался). А вообще как-то упорото звучит, когда есть автодополнение.
> ... screen, он позволяет назначать хоткеиscreen позволяет назначать произвольные хоткеи для произвольных приложений? Спасибо, гляну...
> ... как-то упорото звучит, когда есть автодополнение.
автодополнение работает только в шеле (bash), в других программах оно неизвестно.
да и изначальное желание - переключение между виртуальными консолями по Win+цифра.
> переключение между виртуальными консолями по Win+цифра.Это ядро надо патчить, управление виртуальными консолями там. Но можно переключать не виртуальные консоли, а табы tmux'а или screen'а — это полностью настраиваемо. Также в них можно биндить клавиши на создание табов с определённой командой (tmux bind -n M-m new-window mc).
>> переключение между виртуальными консолями по Win+цифра.
> Это ядро надо патчить, управление виртуальными консолями там.но команда chvt переключает собственно на этом и построил костыль https://www.opennet.ru/openforum/vsluhforumID15/4561.html#11
> Также в них можно биндить клавиши на создание табов с определённой
> командой (tmux bind -n M-m new-window mc).Это очень интересно - обязательно посмотрю. Спасибо.
Выдалось время - "накостылил":
<code>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/input.h>
int main(int argc, char *argv[]){
FILE *fp;
char keyPress [255];
int i, debug;
for (i = 0; i < 255 ; i++)
keyPress [255] = 0;
struct input_event ev[64];
int fd, rd, value, size = sizeof (struct input_event);
if ((fd = open ("/dev/input/event1", O_RDONLY)) == -1)
printf ("/dev/input/event1 is not a vaild device.\n" );
while (1){
if ((rd = read (fd, ev, size * 64)) < size)
printf ("Error read()");
value = ev[0].value;
if (value != ' ' && ev[1].value == 0 && ev[1].type == 1){
keyPress[ev[1].code] = 0;
if (debug) printf ("Отпустил клавишу с кодом %d \n", (ev[1].code));
}
if (value != ' ' && ev[1].value == 1 && ev[1].type == 1){
keyPress[ev[1].code] = 1;
if (debug) printf ("Нажал клавишу с кодом %d\n", (ev[1].code));
}
// 125 -code key "Win", 2 - code key "1", 3 -code key "2" ...
if (keyPress[125] == 1 && keyPress[2] == 1) system("chvt 1");
if (keyPress[125] == 1 && keyPress[3] == 1) system("chvt 2");
if (keyPress[125] == 1 && keyPress[4] == 1) system("chvt 3");
if (keyPress[125] == 1 && keyPress[5] == 1) system("chvt 4");
if (keyPress[125] == 1 && keyPress[6] == 1) system("chvt 5");
if (keyPress[125] == 1 && keyPress[7] == 1) system("chvt 6");
if (keyPress[125] == 1 && keyPress[8] == 1) system("chvt 7");
if (keyPress[125] == 1 && keyPress[9] == 1) system("chvt 8");
if (keyPress[125] == 1 && keyPress[10] == 1) system("chvt 9");
if (keyPress[125] == 1 && keyPress[11] == 1) system("chvt 10");
}
fclose(fp);
return 0;
}
</code>
Вылез косяк - при нажатии на клавиши печатается в терминале ^[1 ^[2 и т.п. Как победить? printf("%c%c", 8, 8); как ожидалось не помогает