Когда я щелкаю правой кнопкой мыши значок приложения в панели запуска Unity, я могу нажать Quit kbd>, чтобы закрыть все окна, соответствующие этому приложению. Можно ли сделать то же самое с помощью сочетания клавиш, которое работает в активном окне (и во всех других окнах, соответствующих тому же приложению)?
Я мог бы сделать нечто подобное с xkill
, но в этом случае У меня нет сообщения, которое помнит меня о несохраненных файлах.
Ответ user72216 всегда не работал. Например, если я открыл несколько Okular (средство просмотра PDF KDE) окна, код не закроет все окна, поскольку различные идентификаторы окна присвоены окнам. Следующий код извлекает все идентификаторы окна и закрывает их корректно:
#!/usr/bin/env python3
import subprocess
def get(cmd):
return subprocess.check_output(cmd).decode("utf-8").strip()
pid = get(["xdotool", "getactivewindow", "getwindowpid"])
# Identify the name of the application
username = get(["users"])
jobs = get(["ps","-u",username])
jobname = ""
for w in jobs.splitlines():
jobinfo = w.split()
if pid == jobinfo[0]:
jobname = jobinfo[-1]
break
# Get all pids that match the jobname
pidlist = []
for w in jobs.splitlines():
jobinfo = w.split()
if jobinfo[-1] == jobname:
pidlist = pidlist + [jobinfo[0]]
# Close all windows with having the pids
wlist = get(["wmctrl", "-lp"])
for pid in pidlist:
for w in wlist.splitlines():
if pid in w and not "Desktop" in w:
print(w.split()[0])
subprocess.call(["wmctrl", "-ic", w.split()[0]])
Вы могли создать ярлык для xkill.
настройки < клавиатура < ярлыки < пользовательские ярлыки
Добавляют пользовательский ярлык, затем просто пишут "xkill" в меню команды и устанавливают Ваш собственный ярлык путем нажатия клавиш, которые Вы хотите.
Как Вы сказал, что это не дает Вам "сохраненные несохраненные файлы" сообщение все же.
x
только Вам?
– Zanna
11 August 2017 в 00:09
Самый безопасный способ закрыть окно приложения корректно и удостовериться Вы не потеряете данные, использует 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
в сочетании клавиш, но полных путях использования вместо этого.
Теперь ярлык может использоваться для корректного закрытия всех окон frontmost окна.
Я попробовал различное kill
опции (kill -2
, kill -HUP
, kill -s TERM <pid>
и т.д.), которые упоминаются в нескольких сообщениях для закрытия приложения корректно. Протестированный на a gedit
окно с несохраненными изменениями, все они закрыли окно счастливо однако без любого взаимодействия.
wmctrl
действительно спрашивает, что сделать однако, подобный Ctrl+Q.
Сценарий затем сначала узнает pid
из frontmost окна, с командой:
xdotool getactivewindow getwindowpid
впоследствии, список в настоящее время открываемых окон называют с командой:
wmctrl -lp
Из этого списка соответствующие окна выбраны и соглашаются команда:
wmctrl -ic <window_id>
Если Вы закрываете все nautilus
окна, в строке
if pid in w and not "Desktop" in w:
"Desktop"
относится к Вашему окну Desktop, которое обычно должно всегда оставаться. Если Вы не используете английскую версию Ubuntu, замены "Desktop"
локализованным названием Рабочего стола на Вашем языке.
Рев сценария уничтожает все активные окна в настоящее время активного окна, в котором работает пользователь. Это предназначено, чтобы быть связанным с ярлыком.
Сценарий покажет всплывающее окно, предлагающее пользователю подтвердить прежде, чем уничтожить все окна.
Сценарий использует (предварительно установленные) инструменты всего собственного компонента, такой как qdbus
,zenity
, и bash
.
Можно или скопировать источник сценария здесь или получить его из моего репозитория мерзавца с помощью рева инструкций
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
apt-get install aptitude
, который похож склонен - добираются, но более умный для всего я понимаю и использую его для чисткиaptitude purge netbeans
. I' m не слишком уверенный в этом устраняющий его, хотя – DanNightmare 10 August 2017 в 21:09