URL: https://ssl.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID15
Нить номер: 4561
[ Назад ]

Исходное сообщение
"Назначение 'горячих клавиш' для программ консоли "

Отправлено Айнанимм , 10-Янв-20 10:10 
Здравствуйте!
Имеется Debian 9-й, без графики (консоль). Хотелось бы задать клавиши для запуска разных программ, причём не просто будучи в bash`е, а в любой консольной программе. Например перенести переключение консолей на Win+1,2 и т.п. задав для Win+1 "chvt 1", для Win+Ctrl+m "mc" и тому подобное.

Содержание

Сообщения в этом обсуждении
"Назначение 'горячих клавиш' для программ консоли "
Отправлено bagas , 10-Янв-20 10:32 
> Здравствуйте!
> Имеется 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).


"Назначение 'горячих клавиш' для программ консоли "
Отправлено Айнанимм , 10-Янв-20 11:08 
> Нельзя такое сделать.

Неужели нет программ, которые бы перехватывали клавиатуру (наверно читали из /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...)


"Назначение 'горячих клавиш' для программ консоли "
Отправлено bagas , 10-Янв-20 11:46 
>[оверквотинг удален]
> Неужели нет программ, которые бы перехватывали клавиатуру (наверно читали из /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 ?


"Назначение 'горячих клавиш' для программ консоли "
Отправлено Айнанимм , 10-Янв-20 11:52 
> Что есть i3 ?

i3wm (https://i3wm.org)


"Назначение 'горячих клавиш' для программ консоли "
Отправлено ACCA , 10-Янв-20 10:36 
> Имеется 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 в десяточке - это левая шняга.


"Назначение 'горячих клавиш' для программ консоли "
Отправлено Айнанимм , 10-Янв-20 11:17 
>bash пользуется readline...

А этот readline позволяет запускать программы? Вроде бы как-то через bind можно для readline задавать хоткеи.

> Кроме того, о юный падаван, открой для себя screens, tmux, muck, dvtm
> и ещё кучу подобных.

А там можно менять клавиатурные сокращения? Хочу хоть как-то унифицировать горячие клавиши. На настольном ПК i3wm, ноутбук слабенький, там гуй не поворотный, консоли для работы хватает.

> Это если не упоминать терминалы в X11/Gnome/KDE/Xfce/... и SSH.

В Х11 можно назначать клавиши на любое приложение (xbindkeys).
Про SSH - а там можно назначит клавиши для удалённой консоли?

> bash в десяточке - это левая шняга.

На ноуте 9-й дебиан.



"Назначение 'горячих клавиш' для программ консоли "
Отправлено ACCA , 12-Янв-20 02:47 
> А этот 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 обязан работать с кучей консолей, причём одновременно. Среди этих консолей есть даже телетайп.

Подстраивать его под конкретную клаву можно, но сложно и не нужно. Сильно быстрее выучить дефолтные настройки и не делать себе мозг.


"Назначение 'горячих клавиш' для программ консоли "
Отправлено Айнанимм , 12-Янв-20 10:21 
>man termcap

Поизучаю. Спасибо. Ещё бы русских манов бы в систему...

> Можно, но не нужно.
> Потом тебе попадётся клава без Win - например Apple Aluminium. Кнопка
> яблока там есть, но работает она по-другому.

Это попытка унифицировать работу на старом ноутбуке (консоль, редко софтина в X) и настольном ПК (i3wm с двумя мониторами). Всё равно работа за чужим ПК это всегда неудобство.

>>SSH
>Ты не знаешь, кто у тебя консоль на той стороне

Это да, просто SSH был упомянут Вами, вот и спросил.


> Начни читать начиная с man termcap

Уже. Спасибо.

> Пока ты не понимаешь, что ты делаешь.

Что - понимаю. Частичную идентичность в работе на двух разных машинах. А вот как я этого могу добиться - тут да, не понимаю. "Иду на ощупь ног"

> Подстраивать его под конкретную клаву можно, но сложно и не нужно.

Зато порой интересно :)

>Сильно быстрее выучить дефолтные настройки и не делать себе мозг.

К сожалению "дефолтные настройки" у каждого свои. Даже для переключения раскладки...



"Назначение 'горячих клавиш' для программ консоли"
Отправлено anonymous , 10-Янв-20 18:31 
> Здравствуйте!
> Имеется Debian 9-й, без графики (консоль). Хотелось бы задать клавиши для запуска
> разных программ, причём не просто будучи в bash`е, а в любой
> консольной программе. Например перенести переключение консолей на Win+1,2 и т.п. задав
> для Win+1 "chvt 1", для Win+Ctrl+m "mc" и тому подобное.

Костыляйте в screen, он позволяет назначать хоткеи (уверен tmux тоже подойдёт, но я не пользовался). А вообще как-то упорото звучит, когда есть автодополнение.


"Назначение 'горячих клавиш' для программ консоли"
Отправлено Айнанимм , 11-Янв-20 10:08 
> ... screen, он позволяет назначать хоткеи

screen позволяет назначать произвольные хоткеи для произвольных приложений? Спасибо, гляну...

> ... как-то упорото звучит, когда есть автодополнение.

автодополнение работает только в шеле (bash), в других программах оно неизвестно.
да и изначальное желание - переключение между виртуальными консолями по Win+цифра.



"Назначение 'горячих клавиш' для программ консоли"
Отправлено Аноним , 11-Янв-20 21:07 
> переключение между виртуальными консолями по Win+цифра.

Это ядро надо патчить, управление виртуальными консолями там. Но можно переключать не виртуальные консоли, а табы tmux'а или screen'а — это полностью настраиваемо. Также в них можно биндить клавиши на создание табов с определённой командой (tmux bind -n M-m new-window mc).


"Назначение 'горячих клавиш' для программ консоли"
Отправлено Айнанимм , 12-Янв-20 10:03 
>> переключение между виртуальными консолями по Win+цифра.
> Это ядро надо патчить, управление виртуальными консолями там.

но команда chvt переключает собственно на этом и построил костыль https://www.opennet.ru/openforum/vsluhforumID15/4561.html#11

> Также в них можно биндить клавиши на создание табов с определённой
> командой (tmux bind -n M-m new-window mc).

Это очень интересно - обязательно посмотрю. Спасибо.


"Назначение 'горячих клавиш' для программ консоли "
Отправлено Айнанимм , 12-Янв-20 10:01 
Выдалось время - "накостылил":
<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); как ожидалось не помогает