Как я могу сделать ярлык, чтобы закрыть все окна одного и того же приложения?

Я также нахожу раздражающим, что ярлыки терминала для копирования и вставки отличаются от того, что используется в остальной части системы. Альтернативное решение для того, которое вы нашли, - это смена ярлыков терминала на ctrl + c и ctrl + v и изменение ключа прерывания, добавив следующее в ~/.bashrc:

stty intr ^b

Теперь, чтобы прервать программу, вы ', чтобы ввести ctrl + b вместо ctrl + c, но вы можете продолжить и переназначить ярлыки терминала. Как только это будет сделано, вы можете последовательно использовать ctrl + c, ctrl + v для копирования и вставки текста в систему.

Чтобы узнать, какие другие клавиши управления уже используются для отправки сигналов терминала, проверьте вывод stty -a.

1
задан 3 April 2016 в 13:05

3 ответа

Как безопасно закрыть все окна приложения gui с помощью сочетания клавиш

Самый безопасный способ закрыть окно приложения изящно и убедиться, что вы не потеряете данные, использует wmctrl (не установленный по умолчанию):

wmctrl -ic <window_id>

Чтобы использовать его в скрипте для закрытия всех окон приложения:

установите оба xdotool и wmctrl
sudo apt-get install wmctrl xdotool
Скопируйте сценарий ниже в пустой файл сохраните его как stop_active.py
#!/usr/bin/env python3
import subprocess

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

pid = get(["xdotool", "getactivewindow", "getwindowpid"])
for w in get(["wmctrl", "-lp"]).splitlines():
    if pid in w and not "Desktop" in w:
        subprocess.call(["wmctrl", "-ic", w.split()[0]])
Добавьте следующую команду к клавише быстрого доступа:
python3 /path/to/stop_active.py
Выберите: «Системные настройки»> «Клавиатура»> «Ярлыки»> «Пользовательские ярлыки». Нажмите «+» и добавьте команду:
python3 /path/to/stop_active.py
N.B. не используйте ~ или $HOME в комбинации клавиш, но вместо этого используйте абсолютные пути.

Теперь ярлык можно использовать для изящного закрытия всех окон самого последнего окна.

Объяснение

Я попробовал различные опции kill (kill -2 , kill -HUP, kill -s TERM <pid> и т. д.), которые упоминаются в нескольких сообщениях, чтобы закрыть приложение изящно.

wmctrl изящно спросить, что делать, однако, как и в случае с gedit с несохраненными изменениями, все они закрыли окно, однако, Ctrl + Q.

Затем скрипт сначала обнаруживает pid самого фронтального окна с командой:

xdotool getactivewindow getwindowpid

, затем список открытых окон открывается с помощью команды:

wmctrl -lp

Из этого списка соответствующие окна выбираются и закрываются командой:

wmctrl -ic <window_id>

Примечание

Если вы закрываете все nautilus, в строке

if pid in w and not "Desktop" in w:

"Desktop" обращается к окну рабочего стола, который обычно должен всегда оставаться. Если вы не используете английскую версию Ubuntu, замените "Desktop" на локализованное имя рабочего стола на вашем языке.

8
ответ дан 23 May 2018 в 12:26
  • 1
    Мне нужна помощь. У меня есть код в моей домашней папке. Если я нахожу python3 ~ / stop_active.py в терминале, все окна терминала закрыты, и у меня также есть сообщение из активных окон о запуске процессов. Таким образом, код, похоже, работает. Но если я добавлю ту же команду к клавише быстрого доступа, когда я нажимаю клавишу быстрого доступа, ничего не происходит. я что-то упускаю? – user525864 2 April 2016 в 18:33
  • 2
    @ user525864 Ах, я должен был упомянуть: в клавишах быстрого доступа ~ не работает, вам нужно использовать полные пути :) – Jacob Vlijm 2 April 2016 в 18:34
  • 3
    танки. Оно работает. – user525864 2 April 2016 в 18:44
  • 4
    У меня только один вопрос. действительно ли невозможно достичь этого проще? без wmctrl, я имею в виду, что Launcher Quit уже работает. невозможно каким-то образом использовать его? – user525864 2 April 2016 в 18:48
  • 5
    @ user525864 Я вижу, конечно, что вы имеете в виду, но дело в том, что во многих случаях опция кодируется внутри приложения, в данном случае: Unity. Затем мы зависим от параметров cli, которые предлагает приложение. Unity не имеет опции cli, чтобы изящно закрыть все окна приложений, поэтому, к сожалению, существующий код не может повторно использоваться «снаружи». – Jacob Vlijm 2 April 2016 в 18:51

Введение

Сценарий ниже убивает все активные окна текущего активного окна, в котором пользователь работает. Это означает, что он связан с ярлыком.

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

Скрипт использует все собственные (предварительно установленные) инструменты, такие как qdbus, zenity и bash.

Получение скрипта

Вы можете скопировать исходный код скрипта или получить его из моего репозитория git, используя инструкции ниже

] sudo apt-get install git cd /opt ; sudo git clone https://github.com/SergKolo/sergrep.git Файл будет расположен в /opt/sergrep/kill_windows_set.sh; Убедитесь, что файл выполним с помощью sudo chmod +x kill_windows_set.sh

Связывание сценария с ярлыком

Соответствующую информацию можно найти здесь:

Как мне привязать файлы .sh

Источник

#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: 1047481448@qq.com 
# Date: April 2nd , 2016
# Purpose:  Close all windows of the active application
# Written for: https://askubuntu.com/q/753033/295286
# Tested on: Ubuntu 14.04 LTS
###########################################################
# Copyright: Serg Kolo , 2016
#    
#     Permission to use, copy, modify, and distribute this software is hereby granted
#     without fee, provided that  the copyright notice above and this permission statement
#     appear in all copies.
#
#     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
#     THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#     DEALINGS IN THE SOFTWARE.

ARGV0="$0"
ARGC=$#
get_running_apps()
{
  qdbus org.ayatana.bamf /org/ayatana/bamf/matcher org.ayatana.bamf.matcher.RunningApplications
}

list_children()
{
 qdbus org.ayatana.bamf "$1"  org.ayatana.bamf.view.Children
}

get_pid()
{
 qdbus org.ayatana.bamf "$1"  org.ayatana.bamf.window.GetPid
}

main()
{
  local ACTIVE
  local apps_list
  apps_list=( $( get_running_apps | tr '\n' ' ' ) )

  for app in ${apps_list[@]} ; do
      ACTIVE=$(qdbus org.ayatana.bamf $app org.ayatana.bamf.view.IsActive)
      if [ "x$ACTIVE" = "xtrue"   ] ; then
         windows=( $( list_children $app | tr '\n' ' ' ) )
      fi
  done

for window in ${windows[@]} ; do
    PIDS+=( $(get_pid $window) )
done

if zenity --question \
   --text="Do you really want to kill ${#PIDS[@]} windows ?" ; 
   then
   kill ${PIDS[@]}
fi

}
main

Сценарий в действии

Как связать файлы .sh с комбинацией клавиш?

1
ответ дан 23 May 2018 в 12:26
  • 1
    У этого есть несколько основных недостатков: он слепо просит подтверждения, даже если ни одно окно не имеет несохраненных изменений, чтобы принять решение, и-связанное - оно запрашивает один раз для всех окон, как показано на изображении, в то время как желаемое решение может отличаться для каждого окна , Кроме того, возможно, только одно окно может иметь несохраненные изменения и быть вне поля зрения в тот момент, когда вы должны решить. Почему так сложно переосмыслить, какие существующие инструменты уже обеспечивают лучше? – Jacob Vlijm 3 April 2016 в 06:41
  • 2
    @JacobVlijm, насколько я знаю, до сих пор не существует много инструментов для проверки того, была ли работа сохранена или не сохранена. Это для одного. Каждое приложение может использовать эту функцию, когда получает сигнал закрытия. Когда вы закрываете несохраненный документ LibreOffice, он спрашивает. Когда вы закрываете окно терминала с меньшей открытостью, оно может или не может быть задано - зависит от термина. Опять же, это также относится к случаям, когда «желаемое решение может отличаться в каждом окне». – Sergiy Kolodyazhnyy 3 April 2016 в 07:53
  • 3
    Что касается вопроса один раз - это желаемый эффект! Пользователь специально запросил ярлык, чтобы убить все окна приложения. Они не хотят иметь ярлык, который подскажет им окно после окна - они могут сделать это вручную, если захотят, но им нужен автоматический способ для killall windows – Sergiy Kolodyazhnyy 3 April 2016 в 07:55
  • 4
    В случае wmctrl он использует язык C на низком уровне для реализации вызовов на X-сервер, чтобы «изящно закрыть окно». Конечно, я могу реализовать вызов lsof, но это займет больше времени – Sergiy Kolodyazhnyy 3 April 2016 в 08:21
  • 5
    О намерении OP: ", когда я нажимаю правой кнопкой мыши на приложение в панели запуска, я могу нажать« Выход », чтобы закрыть все окна, соответствующие этому приложению. Можно ли сделать то же самое с помощью сочетания клавиш ... " явно требует решения, которое только запрашивает подтверждение при необходимости и, если необходимо, за окно . Зачем вам запрашивать подтверждение для всех окон одновременно? Если вы не хотели его закрывать, вы не запускали команду. Вопрос заключается в том, чтобы не потерять данные , если , и только если одно или несколько окон имеют несохраненные изменения. Точно как щелкните правой кнопкой мыши значок в панели запуска. – Jacob Vlijm 3 April 2016 в 08:50

Вы можете создать ярлык для xkill.

настройки & lt; клавиатура & lt; ярлыки & lt; пользовательские ярлыки

Добавьте пользовательский ярлык, а затем просто напишите «xkill» в меню команд и установите собственный ярлык, нажав нужные клавиши.

Как вы сказали, это не дает вам сообщение «сохраненные несохраненные файлы».

-2
ответ дан 23 May 2018 в 12:26
  • 1
    Как вы можете отправить ответ, о котором OP упомянул, что он этого не хочет? – Jacob Vlijm 2 April 2016 в 17:47

Другие вопросы по тегам:

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