当前位置: 首页>>技术问答>>正文


如何从终端设置自定义键盘快捷键?

, , ,

问题描述

如何从终端为不同的Linux版本设置自定义键盘快捷键?

基本上我想知道Linux存储键盘快捷方式文件的位置以及如何编辑它们。

在我的研究中,我发现了一个文件~/.config/compiz-1/compizconfig,但当我尝试用nano打开它时,它更像或更像。

最佳解决办法

从命令行分两步添加快捷键绑定(14.04+)

可以从命令行添加自定义快捷方式,但有点复杂;它需要在每个键绑定的几个步骤中完成。另一方面,它是非常简单的,如果你想从命令行以某种方式这样做,那么很好地编写脚本(这是问题,对吧?)。

就像在您的界面(系统设置> “Keyboard”> “Shortcuts”> “Custom Shortcuts”)一样,自定义键盘快捷键由命令行分两步完成:

  1. 通过编辑(添加到 – )命令返回的列表来创建键绑定:

    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>]"
    

    (记住双引号)

    注:无需说列表中的提及(例如custom1custom2)应该是唯一的。如果您编写脚本,脚本应该防止重复。在这种情况下,编辑后的列表应如下所示:

    ['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/']
    

    添加一个键绑定:custom1

  2. 设置其属性:

    • 名称:

      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/

command-line,keyboard,shortcut-keys,ubuntu

第三种解决办法

使用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部件中增加数量以添加更多绑定,即。 custom1custom2

要使其永久化,只需将其添加到.bash_profile或由登录shell运行的类似脚本。只是不要为non-login Shell .bashrc做这件事,因为根据我的经验,这些dconfgsettings显著降低了它。更改/添加30个绑定需要一秒钟!你不想在non-login shell(.bashrc)中使用它!

第四种办法

在12.04中从命令行添加快捷键绑定

为了防止接受的答案变得过于广泛,请为12.04发布单独的解决方案。

在12.04之前(包括),自定义键绑定不存储在dconf数据库中,而是存储在~/.gconf/desktop/gnome/keybindings中(在xml文件中,在custom0等子文件夹中)。

下面的脚本创建了xml文件及其包含的文件夹,自动命名正确。

如何使用

  1. 将脚本粘贴到空文件中,将其另存为set_customshortcuts_12.py

  2. 使用以下命令运行它:

    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>&lt;'+keys[0]+'&gt;'+keys[1]+'</stringvalue>')
else:
    keyfile.insert(9, '\t\t<stringvalue>&lt;'+keys[0]+'&gt;&lt;'+keys[1]+'&gt;'+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")

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/3001.html,未经允许,请勿转载。