问题描述
如何从终端为不同的Linux版本设置自定义键盘快捷键?
基本上我想知道Linux存储键盘快捷方式文件的位置以及如何编辑它们。
在我的研究中,我发现了一个文件~/.config/compiz-1/compizconfig
,但当我尝试用nano
打开它时,它更像或更像。
最佳解决办法
从命令行分两步添加快捷键绑定(14.04+)
可以从命令行添加自定义快捷方式,但有点复杂;它需要在每个键绑定的几个步骤中完成。另一方面,它是非常简单的,如果你想从命令行以某种方式这样做,那么很好地编写脚本(这是问题,对吧?)。
就像在您的界面(系统设置> “Keyboard”> “Shortcuts”> “Custom Shortcuts”)一样,自定义键盘快捷键由命令行分两步完成:
-
通过编辑(添加到 – )命令返回的列表来创建键绑定:
gsettings get org.gnome.settings-daemon.plugins.media-keys custom-keybindings
返回的列表看起来像(如果它当前只有一个快捷方式):
['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/']
通过命令应用编辑的列表:
gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "[<altered_list>]"
(记住双引号)
注:无需说列表中的提及(例如
custom1
,custom2
)应该是唯一的。如果您编写脚本,脚本应该防止重复。在这种情况下,编辑后的列表应如下所示:['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/']
添加一个键绑定:
custom1
-
设置其属性:
-
名称:
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ name '<newname>'
-
命令:
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ command '<newcommand>'
-
组合键(例如
<Primary><Alt>g
):gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ binding '<key_combination>'
-
有用的信息可以在here找到
用于设置新自定义快捷方式的示例脚本
下面的脚本可用于从命令行设置新的快捷键组合。它可以与命令一起使用(假设组合键可用):
python3 /path/to/script.py '<name>' '<command>' '<key_combination>'
一个例子:
要设置快捷键组合以使用组合键Alt
+ 7
打开gedit
:
python3 /path/to/script.py 'open gedit' 'gedit' '<Alt>7'
剧本:
#!/usr/bin/env python3
import subprocess
import sys
# defining keys & strings to be used
key = "org.gnome.settings-daemon.plugins.media-keys custom-keybindings"
subkey1 = key.replace(" ", ".")[:-1]+":"
item_s = "/"+key.replace(" ", "/").replace(".", "/")+"/"
firstname = "custom"
# get the current list of custom shortcuts
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
array_str = get("gsettings get "+key)
# in case the array was empty, remove the annotation hints
command_result = array_str.lstrip("@as")
current = eval(command_result)
# make sure the additional keybinding mention is no duplicate
n = 1
while True:
new = item_s+firstname+str(n)+"/"
if new in current:
n = n+1
else:
break
# add the new keybinding to the list
current.append(new)
# create the shortcut, set the name, command and shortcut key
cmd0 = 'gsettings set '+key+' "'+str(current)+'"'
cmd1 = 'gsettings set '+subkey1+new+" name '"+sys.argv[1]+"'"
cmd2 = 'gsettings set '+subkey1+new+" command '"+sys.argv[2]+"'"
cmd3 = 'gsettings set '+subkey1+new+" binding '"+sys.argv[3]+"'"
for cmd in [cmd0, cmd1, cmd2, cmd3]:
subprocess.call(["/bin/bash", "-c", cmd])
如何使用:
将脚本粘贴到空文件中,将其另存为set_customshortcut.py
,如上所述运行它。
一些最常用的关键提及(通过实验找到,查看GUI方式对绑定值的更改):
Super key: <Super>
Control key: <Primary> or <Control>
Alt key: <Alt>
Shift key: <Shift>
numbers: 1 (just the number)
Spacebar: space
Slash key: slash
Asterisk key: asterisk (so it would need `<Shift>` as well)
Ampersand key: ampersand (so it would need <Shift> as well)
a few numpad keys:
Numpad divide key (`/`): KP_Divide
Numpad multiply (Asterisk):KP_Multiply
Numpad number key(s): KP_1
Numpad `-`: KP_Subtract
等等
次佳解决办法
所有自定义键盘快捷键设置都存储在dconf数据库中。
您可以使用dconf-editor
轻松访问它们:
sudo apt-get install dconf-editor
然后在编辑器中转到以下dconf路径:
/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/
第三种解决办法
使用dconf
可以很简单地做到这一点:
dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/command "'move-window.sh'"
dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/binding "'<Primary><Alt>Page_Down'"
dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/name "'move-window'"
使用gsettings
:
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ name "'move-window'"
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ binding "'<Primary><Alt>Page_Down'"
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ command "'/usr/local/bin/move-window.sh'"
您需要在custom0
部件中增加数量以添加更多绑定,即。 custom1
,custom2
等
要使其永久化,只需将其添加到.bash_profile
或由登录shell运行的类似脚本。只是不要为non-login Shell .bashrc
做这件事,因为根据我的经验,这些dconf
和gsettings
显著降低了它。更改/添加30个绑定需要一秒钟!你不想在non-login shell(.bashrc
)中使用它!
第四种办法
在12.04中从命令行添加快捷键绑定
为了防止接受的答案变得过于广泛,请为12.04发布单独的解决方案。
在12.04之前(包括),自定义键绑定不存储在dconf
数据库中,而是存储在~/.gconf/desktop/gnome/keybindings
中(在xml文件中,在custom0
等子文件夹中)。
下面的脚本创建了xml
文件及其包含的文件夹,自动命名正确。
如何使用
-
将脚本粘贴到空文件中,将其另存为
set_customshortcuts_12.py
-
使用以下命令运行它:
python /path/to/set_customshortcuts_12.py <name> <command> <key1> <key2> <key3>
key3
是可选的,命令可以是例如:python /path/to/set_customshortcuts_12.py run_browser firefox Primary 7
要么
python /path/to/set_customshortcuts_12.py run_texteditor gedit Primary Alt 3
说明
-
请注意,键的命名与编辑gsettings不同。这些键的名称与它们在“系统设置”中显示的相同。 “Keyboard”> “Shortcuts”> “Custom Shortcuts”,据我所见。
-
我在12.04下在VirtualBox下测试了脚本;它需要注销/进行更改才能进行。
#!/usr/bin/env python
import os
import sys
home = os.environ["HOME"]
name = sys.argv[1]
command = sys.argv[2]
keys = sys.argv[3:]
keyfile = [
'<?xml version="1.0"?>',
'<gconf>',
'\t<entry name="action" mtime="1427791732" type="string">',
'\t\t<stringvalue>'+command+'</stringvalue>',
'\t</entry>',
'\t<entry name="name" mtime="1427791732" type="string">',
'\t\t<stringvalue>'+name+'</stringvalue>',
'\t</entry>',
'\t<entry name="binding" mtime="1427791736" type="string">',
'\t</entry>',
'</gconf>',
]
if len(keys) == 2:
keyfile.insert(9, '\t\t<stringvalue><'+keys[0]+'>'+keys[1]+'</stringvalue>')
else:
keyfile.insert(9, '\t\t<stringvalue><'+keys[0]+'><'+keys[1]+'>'+keys[2]+'</stringvalue>')
n = 0
while True:
check = home+"/"+".gconf/desktop/gnome/keybindings/custom"+str(n)
if os.path.exists(check):
n = n+1
else:
newdir = check
newfile = check+"/"+"%gconf.xml"
break
os.makedirs(newdir)
with open(newfile, "wt") as shortcut:
for l in keyfile:
shortcut.write(l+"\n")