Большой JetBrains IDE (ИДЕЯ и др.) присваивает в значительной степени каждое мыслимое сочетание клавиш некоторой функции. В то время как мягко подавляющий время от времени, это также делает для эффективного использования.
Моя проблема состоит в том, что Единица присваивает некоторые из этих ярлыков также, и они имеют приоритет. Одним особенно раздражающим примером является CTRL + ALT + L. Проблема была исследована прежде здесь.
Однако ни один из подходов не является удовлетворительным.
Существует ли способ выключить системные ярлыки только, когда определенное приложение активно, т.е. выполнение и в фокусе?
Я был бы готов запустить скрипт каждый раз, когда я запускаю приложение.
Доорх скрипт нь дурын програмын цонх идэвхжсэн үед товчлуурын тодорхой товчлолыг хаах болно. .
Та хэдийгээр "" "Програмыг ажиллуулах болгондоо би скрипт ажиллуулахад бэлэн байх болно." , Дараа нь скриптийг устгах шалтгаан байхгүй, жүүс нь маш бага байдаг.
#!/usr/bin/env python3
import subprocess
import time
import os
app = "gedit"
f = os.path.join(os.environ["HOME"], "keylist")
def run(cmd):
subprocess.Popen(cmd)
def get(cmd):
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except:
pass
def getactive():
return get(["xdotool", "getactivewindow"])
def setkeys(val):
# --- add the keys to be disabled below
keys = [
["org.gnome.settings-daemon.plugins.media-keys", "logout"],
["org.gnome.settings-daemon.plugins.media-keys", "screensaver"],
]
# ---
writelist = []
if not val:
try:
values = open(f).read().splitlines()
except FileNotFoundError:
values = []
for i, key in enumerate(keys):
try:
cmd = ["gsettings", "set"]+key+[values[i]]
except IndexError:
cmd = ["gsettings", "reset"]+key
run(cmd)
else:
for key in keys:
cmd = ["gsettings", "set"]+key+["['']"]
read = get(["gsettings", "get"]+key)
writelist.append(read)
run(cmd)
if writelist:
open(f, "wt").write("\n".join(writelist))
front1 = None
while True:
time.sleep(1)
pid = get(["pgrep", app])
if pid:
try:
active = get(["xdotool", "getactivewindow"])
relevant = get(["xdotool", "search", "--all", "--pid", pid]).splitlines()
front2 = active in relevant
except AttributeError:
front2 = front1
else:
front2 = False
if front2 != front1:
if front2:
setkeys(True)
else:
setkeys(False)
front1 = front2
Скрипт хэрэгтэй xdotool
:
sudo apt-get install xdotool
Скриптийг хоосон файлд хуулж, disable_shortcuts.py
гэж хадгалж, скриптийн толгой хэсэгт мөрөнд орлуулна уу:
app = "gedit"
цонхыг эзэмшдэг процессын нэр гэсэн утгатай таны програмын дагуу "gedit".
Скриптийг дараах тушаалаар туршиж ажиллуулна уу:
python3 /path/to/disable_shortcuts.py
Хэрэв бүгд сайн ажиллаж байвал Startup Applications дээр нэмж оруулна уу: Dash> Startup Applications> Add. Тушаалыг нэмнэ үү:
/ bin / bash -c "sleep 15 && python3 /path/to/disable_shortcuts.py"
Жишээ болгон би таны дурдсан товчлолыг нэмж оруулав: CTRL + ALT + L . Товчлолуудыг dconf
мэдээллийн санд тохируулах бөгөөд gsettings
ашиглан тохируулах буюу идэвхгүйжүүлэх боломжтой.
Скриптэд эдгээр gsettings
оруулгуудыг функцэд тохируулсан болно. : setkeys ()
def setkeys(val):
# --- add the keys to be disabled below
keys = [
["org.gnome.settings-daemon.plugins.media-keys", "screensaver"]
]
# ---
Гарах товчлолыг нэмэх (идэвхгүй болгох) жишээ:
dconf watch /
Товчлолыг өөртөө дахин тохируулна уу. Терминал дээр та товчлолд хамаарах gsettings
товчлуурыг харж болно:
Одоо бид олсон товчлуурыг нэмэх ёстой (арай өөр дүр төрхөөр):
["org.gnome.settings-daemon.plugins.media-keys", "logout"]
... манай функцийн "товчлуурууд" жагсаалтад:
def setkeys (val):
# --- идэвхгүй болгох түлхүүрүүдийг доор нэмнэ үү
түлхүүрүүд = [
["org.gnome.settings-daemon.plugins.media-keys", "screensaver"],
["org.gnome.settings-daemon.plugins.media-keys", "logout"],
]
Одоо хоёулаа CTRL + ALT + L ба CTRL + ALT + Устгах [ Хэрэв таны програм урд талд байвал 11110291] -ийг идэвхгүйжүүлнэ.
Дээр дурдсанчлан, таны дурдсантай адил товчлолуудыг dconf
мэдээллийн санд тохируулсан болно. CTRL + ALT + L жишээнд богино холболтыг тохируулах эсвэл засах түлхүүр нь:
org.gnome.settings-daemon.plugins.media-keys screensaver
-г идэвхгүйжүүлэх , тушаал нь:
gsettings set org.gnome.settings-daemon.plugins.media-keys screensaver ""
Түлхүүрийг анхны утгад нь тохируулахын тулд:
gsettings reset org.gnome.settings-daemon.plugins.media-keys screensaver
Хэрэв скрипт секундэд нэг удаа харагдана, хэрэв:
дахин (зөвхөн) хэрэв тийм бол
# --- жагсаалтад орсон товчлолуудыг идэвхгүйжүүлнэ.
түлхүүрүүд = [
["org.gnome.settings-daemon.plugins.media-keys", "screensaver"],
["org.gnome.settings-daemon.plugins.media-keys", "logout"],
]
... төлөвийн дараагийн өөрчлөлтийг хүлээж байна.
Хэрэв идэвхтэй цонх таны програмын нэг биш бол жагсаалтад дурдсан товчлууруудыг анхдагчаар буцаана.
Өмнө дурьдсанчлан, скриптийн процессорт ирэх нэмэлт ачаалал нь nihil. Та "Хэрхэн ашиглах" хэсэгт тайлбарласны дагуу үүнийг эхлүүлэхдээ маш сайн ажиллуулж болно.
Тайлбар дээр дурдсанчлан, ОП-ийн тодорхой тохиолдолд, идэвхгүйжүүлэх товчлолыг бүлэгт ашиглах нь ашигтай байдаг. програмууд бүгд нэг директор дотор байрладаг.
Үүнийг
pgrep -f
гаралт нь тодорхой лавлах бичгийг багтаасан бүх програмуудад ашиглах хувилбарын доор байрлуулна. Миний жишээнд би / opt
директорыг тохируулсан тул хэрэв идэвхтэй цонх нь / opt
дээрх програмын аль нэг нь байвал тохируулсан товчлолууд идэвхгүй болно.
аль нэг програмын цонхыг урд талд нь авчрах нь гаралтын товчлолыг идэвхгүй болгоно
, хэрэв өөр цонх фокуствал товчлолыг идэвхжүүлнэ
#!/usr/bin/env python3
import subprocess
import time
import os
appdir = "/opt"
f = os.path.join(os.environ["HOME"], "keylist")
def run(cmd):
subprocess.call(cmd)
def get(cmd):
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except:
pass
def getactive():
return get(["xdotool", "getactivewindow"])
def setkeys(val):
# --- add the keys to be disabled below
keys = [
["org.gnome.settings-daemon.plugins.media-keys", "logout"],
["org.gnome.settings-daemon.plugins.media-keys", "screensaver"],
["org.gnome.desktop.wm.keybindings", "begin-move"],
]
# ---
writelist = []
if not val:
try:
values = open(f).read().splitlines()
except FileNotFoundError:
values = []
# for key in keys:
for i, key in enumerate(keys):
try:
cmd = ["gsettings", "set"]+key+[values[i]]
except IndexError:
cmd = ["gsettings", "reset"]+key
run(cmd)
else:
for key in keys:
cmd = ["gsettings", "set"]+key+["['']"]
read = get(["gsettings", "get"]+key)
writelist.append(read)
run(cmd)
if writelist:
open(f, "wt").write("\n".join(writelist))
front1 = None
while True:
time.sleep(1)
# check if any of the apps runs at all
checkpids = get(["pgrep", "-f", appdir])
# if so:
if checkpids:
checkpids = checkpids.splitlines()
active = getactive()
# get pid frontmost (doesn't work on pid 0)
match = [l for l in get(["xprop", "-id", active]).splitlines()\
if "_NET_WM_PID(CARDINAL)" in l]
if match:
# check if pid is of any of the relevant apps
pid = match[0].split("=")[1].strip()
front2 = True if pid in checkpids else False
else:
front2 = False
else:
front2 = False
if front2 != front1:
if front2:
setkeys(True)
else:
setkeys(False)
front1 = front2
Like эхний скрипт, xdotool
-г суулгах шаардлагатай:
sudo apt-get install xdotool
Скриптийг хоосон файлд хуулж, disable_shortcuts.py
гэж хадгалж, скриптийн толгой хэсэгт мөрөнд орлуулна уу:
appdir = "/ opt"
"/ opt" -ийг өөрийн програмын жагсаалтад оруулна уу.
Скриптийг дараах тушаалаар туршиж ажиллуулна уу:
python3 /path/to/disable_shortcuts.py
Хэрэв бүгд сайн ажиллаж байвал Startup Applications дээр нэмж оруулна уу: Dash> Startup Applications> Add. Тушаалыг нэмнэ үү:
/ bin / bash -c "sleep 15 && python3 /path/to/disable_shortcuts.py"
Жагсаалтад бусад товчлолуудыг нэмж оруулах нь скриптийн 1-р хувилбартай яг ижил төстэй ажиллана.
Таны хариулт дээр:
xprop нь бүх цонхнуудад PID илрүүлдэггүй . Бүтэлгүй жишээ: секундомер.
pid 0 -тай Windows (tkinter цонх, түүний дотор Idle гэх мэт), xprop -id
гаралтад цонх id байхгүй байна. Сул зогсолт
-д миний мөрдөж байгаа мөргөлдөөний товчлол байхгүй байна. Хэрэв та тусгай товчлолыг идэвхгүй болгохыг шаардсан pid 0 програмтай ямар нэгэн програм ажиллуулах бол дурдах хэрэгтэй.
Ийм тохиолдолд
xdotool getactivewindow
-н гаралтыг hex хэлбэрт хөрвүүлэх wmctrl
] ашигладаг бөгөөд дараа нь харгалзах pid
-ийг
wmctrl -lp
-н гарцаас хайж олох хэрэгтэй байсан боловч эхлүүлэх нь хамгийн тодорхой зүйл байсан ч би скриптийг дараах байдлаар хадгалахын тулд скриптэд үүнийг ашиглаагүй. аль болох хөнгөн жинтэй.
дээр үндэслэсэн (хуучин хувилбар) Жейкоб Влиймын хариулт Эдгээр нэмэлт асуудлуудыг шийдвэрлэхийн тулд би энэ хувилбарыг бичсэн:
gsettings
ба dconf
товчлолууд. Нээлттэй асуудлууд:
xprop
бүх цонхны PID-ийг илрүүлэхгүй. Бүтэлгүй жишээ: секундомер
. ( Жако Влиймд зарим санаа байна .) #!/usr/bin/env python3
import subprocess
import time
import os
# Path pattern to block
apppattern = "myprocess"
# Write a backup that can restore the settings at the
# start of the script.
# Leave empty to not write a backup.
backupfile = "~/.keymap_backup"
# Add the keys to be disabled below.
shortcuts = {
"org.gnome.settings-daemon.plugins.media-keys/key" : "gsettings",
"/org/gnome/desktop/wm/keybindings/key" : "dconf",
}
#
# Helper functions
#
# Run a command on the shell
def run(cmd):
subprocess.Popen(cmd)
# Run a command on the shell and return the
# stripped result
def get(cmd):
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except:
pass
# Get the PID of the currently active window
def getactive():
xdoid = get(["xdotool", "getactivewindow"])
pidline = [l for l in get(["xprop", "-id", xdoid]).splitlines()\
if "_NET_WM_PID(CARDINAL)" in l]
if pidline:
pid = pidline[0].split("=")[1].strip()
else:
# Something went wrong
print("Warning: Could not obtain PID of current window")
pid = ""
return pid
def readkey(key):
if shortcuts[key] == "gsettings":
return get(["gsettings", "get"] + key.split("/"))
elif shortcuts[key] == "dconf":
return get(["dconf", "read", key])
def writekey(key, val):
if val == "":
val = "['']"
if shortcuts[key] == "gsettings":
run(["gsettings", "set"] + key.split("/") + [val])
elif shortcuts[key] == "dconf":
run(["dconf", "write", key, val])
def resetkey(key):
if shortcuts[key] == "gsettings":
run(["gsettings", "reset"] + key.split("/"))
elif shortcuts[key] == "dconf":
run(["dconf", "reset", key])
# If val == True, disables all shortcuts.
# If val == False, resets all shortcuts.
def setkeys(flag):
for key, val in shortcutmap.items():
if flag == True:
# Read current value again; user may change
# settings, after all!
shortcutmap[key] = readkey(key)
writekey(key, "")
elif flag == False:
if val:
writekey(key, val)
else:
resetkey(key)
#
# Main script
#
# Store current shortcuts in case they are non-default
# Note: if the default is set, dconf returns an empty string!
# Optionally, create a backup script to restore the value in case
# this script crashes at an inopportune time.
shortcutmap = {}
if backupfile:
f = open(os.path.expanduser(backupfile),'w+')
f.write('#!/bin/sh\n')
for key, val in shortcuts.items():
if shortcuts[key] == "gsettings":
shortcutmap[key] = get(["gsettings", "get"] + key.split("/"))
if backupfile:
if shortcutmap[key]:
f.write("gsettings set " + " ".join(key.split("/")) + " " +
shortcutmap[key] + "\n")
else:
f.write("gsettings reset " + " ".join(key.split("/")) + "\n")
elif shortcuts[key] == "dconf":
shortcutmap[key] = get(["dconf", "read", key])
if backupfile:
if shortcutmap[key]:
f.write("dconf write " + key + " " + shortcutmap[key] + "\n")
else:
f.write("dconf reset " + key + "\n")
if backupfile: f.close()
# Check every half second if the window changed form or to a
# matching application.
front1 = None
while True:
time.sleep(0.5)
checkpids = get(["pgrep", "-f", apppattern])
if checkpids:
checkpids = checkpids.splitlines()
activepid = getactive()
#print(activepid)
if activepid:
front2 = True if activepid in checkpids else False
else:
front2 = False
else:
front2 = False
if front2 != front1:
#print("Matches: " + str(flag))
if front2:
setkeys(True)
else:
setkeys(False)
front1 = front2
Тэмдэглэл:
gsettings
resp. dconf
. gsettings
түлхүүрүүд do dconf
дээр гарч ирсэн боловч хийсэн өөрчлөлтүүд нь ямар ч нөлөө үзүүлэхгүй.
Ерөнхий дүрмийн дагуу Жейкобын аргыг ашиглан олсон түлхүүрүүдийг gsettings
болон dconf
хэсэгт гараар мөрдөх шаардлагатай байсан түлхүүрүүдийг нэмнэ үү.