Linuxバージョンごとにターミナルからカスタムキーボードショートカットを設定する方法
基本的に、Linuxがキーボードショートカットファイルを保存する場所とその編集方法を知りたいと思います。
私の研究では、ファイル~/.config/compiz-1/compizconfig
が見つかりましたが、nano
でファイルを開こうとすると、暗号化されていたり、暗号化されていたりしました。
コマンドラインからカスタムショートカットを追加することはできますが、少し複雑です。キーバインドごとに数ステップで実行する必要があります。一方、は非常に単純で、コマンドラインから何らかの方法で実行したい場合は非常にうまくスクリプト化できます(それが問題ですか?)。
インターフェイスと同様([システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット])、カスタムキーボードショートカットはコマンドラインから2つの手順で作成されます。
コマンドによって返されるリストを編集(追加)してキーバインドを作成します。
gsettings get org.gnome.settings-daemon.plugins.media-keys custom-keybindings
返されるリストは次のようになります(現在、ショートカットが1つだけの場合)。
['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/']
次のコマンドで編集済みリストを適用します。
gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "[<altered_list>]"
(二重引用符に注意してください)
N.B。リスト内の言及(例:custom1
、custom2
)は一意である必要はありません。スクリプトを作成する場合、スクリプトは重複を防ぐ必要があります。この場合、編集されたリストは次のようになります。
['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/']
1つのキーバインドを追加するには: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>'
有用な情報を見つけることができます こちら
以下のスクリプトを使用して、コマンドラインから新しいショートカットキーの組み合わせを設定できます。コマンドで使用できます(キーの組み合わせが利用可能であると仮定):
python3 /path/to/script.py '<name>' '<command>' '<key_combination>'
例:
ショートカットキーの組み合わせを設定して、キーの組み合わせでgedit
を開くには Alt+7:
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
として保存し、上記の説明に従って実行します。
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
partの数を増やす必要があります。 custom1
、custom2
など.
永続的にするには、.bash_profile
またはログインシェルによって実行される同様のスクリプトに追加します。私の経験から、これらのdconf
およびgsettings
は、非ログインシェル.bashrc
に対しては実行しないでください。 30個のバインディングの変更/追加には1秒かかります!非ログインシェル(.bashrc
)ではこれは望ましくありません!
受け入れられた回答が広範になりすぎないように、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
#!/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")
Sedを使用すると、pythonスクリプトなしで新しいカスタムショートカットを設定できます。次のスクリプトでname、binding、およびactionを選択するだけです。
name="myaction"
binding="<CTRL><ALT>v"
action="/usr/local/bin/myaction"
media_keys=org.gnome.settings-daemon.plugins.media-keys
custom_kbd=org.gnome.settings-daemon.plugins.media-keys.custom-keybinding
kbd_path=/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/$name/
new_bindings=`gsettings get $media_keys custom-keybindings | sed -e"s>'\]>','$kbd_path']>"| sed -e"s>@as \[\]>['$kbd_path']>"`
gsettings set $media_keys custom-keybindings "$new_bindings"
gsettings set $custom_kbd:$kbd_path name $name
gsettings set $custom_kbd:$kbd_path binding $binding
gsettings set $custom_kbd:$kbd_path command $action
そのためのスクリプトを書きました。下記参照。
creatShortcut
呼び出しの使用法を参照してください。
export nextShortcutId=0
function creatShortcut() {
name="$1"
commandToRun="$2"
binding="$3"
path="/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${nextShortcutId}"
nextShortcutId=$nextShortcutId+1
dconf write "$path/name" "'""$name""'"
dconf write "$path/command" "'""$commandToRun""'"
dconf write "$path/binding" "'""$binding""'"
}
# dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/binding '"<Primary><Shift>exclam"'
creatShortcut 'copyq show' 'copyq show' '<Primary><Shift>exclam'
creatShortcut 'System Monitor' 'gnome-system-monitor' '<Primary><Alt>m'
creatShortcut 'Suspend' 'systemctl suspend -i' '<Super>d'
creatShortcut 'Volume Up' 'amixer -D Pulse sset Master 5%+' '<Super>Page_Up'
creatShortcut 'Volume Down' 'amixer -D Pulse sset Master 5%-' '<Super>Page_Down'
overallbindings=""
for ((i = 0 ; i < $nextShortcutId ; i++ ));
do
overallbindings="$overallbindings, '$customindingPathPrefix$i/'"
done
overallbindings="[${overallbindings:2}]" # Delete the first 2 chars: " ," - space and comma
# echo $overallbindings
# Update the list of bindings for the shortcuts to work
dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings "$overallbindings"
# dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings "['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom3/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom4/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom5/']"
@JacobVlijmが投稿した answer は、特にスクリプトが非常に有用であることがわかりました。コードをbash
に移植しました。この機能は完璧ではありません。いくつかのバグが含まれている可能性がありますが、機能します。
function set_shortcuts(){
# Usage: set_shortcuts [name] [command] [shortcut]
unset num i name command shortcut value test value_new
local name="$1"
local command="$2"
local shortcut="$3"
local value=$(gsettings get org.gnome.settings-daemon.plugins.media-keys custom-keybindings)
local test=$(echo $value | sed "s/\['//;s/', '/,/g;s/'\]//" - | tr ',' '\n' | grep -oP ".*/custom\K[0-9]*(?=/$)")
if [ "$(echo "$value" | grep -o "@as")" = "@as" ]; then
local num=0
local value_new="['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/']"
else
local i=1
until [ "$num" != "" ]; do
if [ "$(echo $test | grep -o $i)" != "$i" ]; then
local num=$i
fi
i=$(echo 1+$i | bc);
done
local value_new=$(gsettings get org.gnome.settings-daemon.plugins.media-keys custom-keybindings | sed "s#']\$#', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/']#" -)
fi
gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "$value_new"
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/ name "$name"
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/ command "$command"
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/ binding "$shortcut"
}