Как назначить лишние ярлыки для переключения рабочих пространств в GNOME 3?

Согласно этот , нет. Вы не можете этого сделать, потому что bash не пытается связать (2) сокеты, а только пытается подключить (2) .

Вот несколько способов запустить сервер netcat :

(Я использую nmap ncat , потому что GNU nc не видел обновлений с 2004 г.)


local $ :|{  ncat -l 9999 --keep-open --allow localhost |
local >      PS1='ncat $ '  PS2='ncat > ' dash +m -i 2>&1
local >   }  1<>/dev/fd/0
[1] + Running  : | { ncat -l 9999 --keep-open --allow localhost | PS1='ncat $ ' PS2='ncat > ' dash +m -i 2>&1; } 1<>/dev/fd/0

Я позаимствовал конвейер : | в конце там - тире записывает в него, а ] ncat читает его, потому что нулевой команде : он явно не нужен. Иногда это проще, чем mkfifo .

В любом случае, дело в том, что все, что пишет ncat , передается по конвейеру на стандартный ввод dash , а все записи dash передаются по конвейеру ncat Стандартный ввод . Я знаю, что это не bash , но я перейду к этому. Обратите внимание хотя бы на опцию + m .


local $ ncat localhost 9999
ncat $ echo $0 $$
dash 31231
ncat $ ls -l /dev/fd/[012]
lr-x------ 1 mikeserv mikeserv 64 Dec 11 23:28 /dev/fd/0 -> pipe:[3563412]
l-wx------ 1 mikeserv mikeserv 64 Dec 11 23:28 /dev/fd/1 -> pipe:[3567682]
l-wx------ 1 mikeserv mikeserv 64 Dec 11 23:28 /dev/fd/2 -> pipe:[3567682]
ncat $ ^C
local $ 

Я должен использовать + m , потому что -m onitored оболочка, управляемая заданием, как правило, по умолчанию для -i Интерактивная оболочка - будет пытаться читать со своего управляющего терминала, и ей будет отправлен SIGTTIN - который автоматически приостанавливает его по умолчанию, или еще (если он пытается игнорировать или блокировать его) убить его.


[1] + Stopped(SIGTTIN) : | { ncat -l 9999 | dash -i 2>&1; } 1<>/dev/fd/0

Но здесь нет терминала - это просто каналы, как вы можете видеть в выводе ls - и поэтому отслеживание -m недопустимо.

bash , как оказалось, не так гибок в отношении своих начальных интерактивных терминальных ассоциаций, даже с отключенным readline .


[1] + Stopped(SIGTTIN) : | { ncat -l 9999 | bash --noediting +m -i 2>&1 ; } 1<>/dev/fd/0

Так что же делать? Что ж, нам нужен псевдотерминал. Что-то вроде того, что у нас в эмуляторе.


local $ ls -l /dev/fd/[012]
lrwx------ 1 mikeserv mikeserv 64 Dec 11 23:30 /dev/fd/0 -> /dev/pts/0
lrwx------ 1 mikeserv mikeserv 64 Dec 11 23:30 /dev/fd/1 -> /dev/pts/0
lrwx------ 1 mikeserv mikeserv 64 Dec 11 23:30 /dev/fd/2 -> /dev/pts/0

Мы можем получить его с главного устройства / dev / ptmx в системе Linux (хотя ваш пользователь, вероятно, должен быть членом группы tty если вы не хотите выбрать сначала) . Если мы откроем (2) устройство ptmx, будет создан новый псевдотерминал, и если мы впоследствии разблокируем (3) файл нового устройства, мы сможем прочитать и напиши это.

Некоторое время назад я узнал, что на самом деле нет простого способа сделать это с помощью оболочки, и поэтому я написал для него небольшую программу на C . Вы найдете некоторые объяснения и простые инструкции по сборке (на самом деле просто скопируйте / вставьте в приглашение оболочки) по этой ссылке - это программа pts , которую я использую ниже.


local $ { 9>&- setsid -c -- bash <> "$({ pts && 
local >   >&9  ncat -l 9999 -k --allow localhost
local > } <&9  &)" 2>&0 >&2 ; } 9<> /dev/ptmx
local $

Здесь bash запускается как лидер сеанса на псевдотерминале, который pts разблокируется и называет его стандартным выходом - который заменяется на стандарт перенаправления для bash . Однако, по-видимому, ничего не происходит, потому что весь ввод-вывод идет куда-то еще - на новый псевдотерминал - и единственная ссылка - это сервер ncat , запущенный на порту 9999. -i n интерактивный переключатель здесь не нужен - bash будет автоматически интерактивным на своей собственной pty.


local $ ncat localhost 9999
[mikeserv@desktop ~]$ echo hey
echo hey
hey
[mikeserv@desktop ~]$ ls -l /dev/fd/[012]
ls -l /dev/fd/[012]
lrwx------ 1 mikeserv mikeserv 64 Dec 12 00:27 /dev/fd/0 -> /dev/pts/4
lrwx------ 1 mikeserv mikeserv 64 Dec 12 00:27 /dev/fd/1 -> /dev/pts/4
lrwx------ 1 mikeserv mikeserv 64 Dec 12 00:27 /dev/fd/2 -> /dev/pts/4
[mikeserv@desktop ~]$ ^[[A^[[A

Что ж, мы почти у цели. Итак, у нас определенно есть socketized- bash , но, вероятно, вы заметили там странное двойное эхо, а забавные экраны в последнем приглашении на самом деле связаны с тем, что я нажимаю клавишу со стрелкой ^ вверх. Проблема здесь в том, что у нас есть два уровня псевдотерминалов - тот, на котором работает мой ncat клиент, установлен на stty echo , такой же, как тот, на котором работает сервер. И поскольку терминал на стороне клиента ориентирован на строку и сбрасывает вывод один раз для ввода новой строки, а также печатает escape-символы ctrl-char в соответствии с настройкой по умолчанию stty echoctl , bash никогда не получает клавишу со стрелкой ^ вверх, и мы видим только забавные маленькие побеги.

Хорошо. Мы тоже можем справиться с этим.


local $ ncatsh()(
local >    ${2+":"} set  localhost "${1:?ncatsh(): No port number provided!}"
local >    stty="   stty -F'$(tty)'" || unset stty
local >    trap " ${stty- ncat '${1##*\'*}' '${2##*\'*}'            ${stty+$(for a in -g 'raw -echo isig intr "^A" quit "" susp ""'
local >                    do  eval "$stty $a";done)}
local >             trap - 0 1 2; exit"    0 1 2
local >    ncat  "$@"
local > )

Эта функция будет проверять, является ли ее стандартным входом терминал - ваш локальный терминал - и, если нет, будет просто передавать входной сигнал клиенту ncat .Но если это так, он перехватит сигналы EXIT , HANGUP и INTERRUPT , чтобы восстановить конечное состояние на своем стандарте при выходе. . Это хорошая вещь,потому что он также изменяет это состояние перед вызовом ncat на стандартном входе.

Локальное эхо отключено, а локальный терминал в противном случае установлен в режим raw - поэтому каждое нажатие клавиши немедленно отправляется на сервер ncat . Фактически, все специальные клавиши локального режима отключены , кроме локального intr - который обычно CTRL + C , но здесь настроен для CTRL + A вместо этого - потому что CTRL + C будет интерпретироваться сервером bash .

Я снова сделаю ls , но просто нажав ^ стрелку вверх, а затем RETURN .


local $ ncatsh 9999

[mikeserv@desktop ~]$ ls -l /dev/fd/[012]
lrwx------ 1 mikeserv mikeserv 64 Dec 12 01:00 /dev/fd/0 -> /dev/pts/4
lrwx------ 1 mikeserv mikeserv 64 Dec 12 01:00 /dev/fd/1 -> /dev/pts/4
lrwx------ 1 mikeserv mikeserv 64 Dec 12 01:00 /dev/fd/2 -> /dev/pts/4
[mikeserv@desktop ~]$ ^C
[mikeserv@desktop ~]$ ^C
[mikeserv@desktop ~]$ ^C
[mikeserv@desktop ~]$
local $

Вы не видите его там, потому что при нажатии на него локальное эхо отключается, но я нажал CTRL + A , чтобы прервать сеанс и вернуться в локальное приглашение, после чего все конфигурация локального терминала восстановлена ​​до правильного состояния. Однако сервер bash остается, и ncatsh 9999 вернет меня обратно, если я этого хочу.

6
27.04.2017, 04:35
2 ответа

Да, это параметр dconf, и значение представляет собой массив строк, что означает, что он принимает несколько ярлыков. Вы можете сделать это с помощью dconf-editor, если перейти к

/org/gnome/desktop/wm/keybindings/switch-to-workspace-1

и включить Использовать значение по умолчанию OFF, затем вставьте Пользовательское значение: ['Home', '1']

enter image description here


Или, если вы предпочитаете CLI, вы можете использовать dconf или gsettings например

gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-1 "['<Super>Home', '<Super>1']"

Имейте в виду, что значения должны быть заключены в кавычки и разделены запятой+пробелом.

12
27.01.2020, 20:27

Добавление Super + 1 и друзей для переключения рабочего пространства с помощьюdconf:

dconf write /org/gnome/desktop/wm/keybindings/switch-to-workspace-1 "['<Super>Home', '<Super>1']"
dconf write /org/gnome/desktop/wm/keybindings/switch-to-workspace-2 "['<Super>2']"
dconf write /org/gnome/desktop/wm/keybindings/switch-to-workspace-3 "['<Super>3']"
dconf write /org/gnome/desktop/wm/keybindings/switch-to-workspace-4 "['<Super>4']"

В Gnome 3 не будут создаваться рабочие пространства, которые создаются динамически, когда на предыдущем есть окна.

2
27.01.2020, 20:27

Теги

Похожие вопросы