ターミナルからカスタムキーボードショートカットを設定する方法は?


56

Linuxバージョンごとにターミナルからカスタムキーボードショートカットを設定する方法

基本的に、Linuxがキーボードショートカットファイルを保存する場所と、その編集方法を知りたいと思います。

私の研究でファイルを見つけました~/.config/compiz-1/compizconfigが、でファイルを開こうとしたときに暗号化されていましたnano


注意、XFCE / Xubuntuのシステムは、すでに答えを持ってここに
Ulad Kasach

回答:


62

コマンドラインから2ステップでショートカットキーバインドを追加する(14.04+)

コマンドラインからカスタムショートカットを追加することはできますが、少し複雑です。キーバインドごとに数ステップで実行する必要があります。一方、それ非常に簡単で、コマンドラインから何らかの方法で実行したい場合にスクリプトを作成できます(質問でしたよね?)。

インターフェイスと同様([システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット])、カスタムキーボードショートカットはコマンドラインから2つの手順で作成されます。

  1. コマンドによって返されるリストを編集(追加)してキーバインドを作成します。

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

    (二重引用符に注意してください)

    NBリストで言及(例えばと言うする必要はありませんcustom1custom2)ユニークなものでなければなりません。スクリプトを作成する場合、スクリプトは重複を防ぐ必要があります。この場合、編集されたリストは次のようになります。

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

    1つのキーバインドを追加するには: 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>'
      

有用な情報はここにあります

新しいカスタムショートカットを設定するサンプルスクリプト

以下のスクリプトを使用して、コマンドラインから新しいショートカットキーの組み合わせを設定できます。コマンドで使用できます(キーの組み合わせが利用可能であると仮定):

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、上記の説明に従って実行します。

主に使用される重要な言及のいくつか(実験的に発見され、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


5
素晴らしい答え。そのスクリプトには10​​0のボタンの投票が必要です。;)
アナンドゥMダス

@JacobVlijm キーの組み合わせ部分について少し説明してもらえますか?その<primary>タグは何を示していますか?そして、文字gの代わりに、私が思うに文字を置き換えることができます、ryt?
匿名カモノハシ

1
@VladK ai、xubuntuは、xubuntuのショートカットが(まだ)xmlファイルに設定されている可能性があります。見なければなりません。その場合、xubuntu固有としてタグ付けされた質問を再度開く必要があります。
ジェイコブVlijm

1
ありがとう、@ JacobVlijm、試してみた。そして、私は自分の修正が間違いだったことを知りました。ここには本当に難しいものがあります。 custom-keybindingスキーマ内の最後に「s」を含めないでください。ただし、キーまたはパスとして機能する場合は、「s」を含める必要があります。そうでない場合、「set」コマンドは例外をスローします。そのため、custom-keybindingスキーマ内の「s」を削除してください。また、Pythonスクリプトも更新する必要があります。
e-クラウド

2
参考までに、Pythonスクリプトにはバグがあります。キーボードショートカットがインストールされていない場合、評価されないものをgsettings返します@as []
Seanny123

11

を使用してそれを行う簡単な簡単な方法があります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は、ログインシェルによって実行されるスクリプトまたは同様のスクリプトに追加するだけです。ただ、非ログインシェルのためにそれをしない.bashrcので、私の経験からこれらdconfgsettings大幅に遅くなります。30個のバインディングの変更/追加には1秒かかります!非ログインシェル(.bashrc)でこれを望まない!


1
Ubuntu 18.04では両方とも失敗します。@Jacob Vlijmの回答とこのコミュニティwikicustom0に従って、などでカスタムショートカットリストに追加する必要がありますgsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['.../custom1/']"。私は知らないdconf
ミゲルモリン

また、サブパス全体を標準出力dconf dump DIRダンプします。出力は、GVariant構文の値を持つキーファイルのような形式です。
パブロA

10

すべてのカスタムキーボードショートカット設定は、dconfデータベースに保存されます。

以下を使用して簡単にアクセスできますdconf-editor

sudo apt-get install dconf-editor

次に、エディターで次のdconfパスに移動します。

/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/

ここに画像の説明を入力してください


場所はLinuxのすべてのバージョンで同じですか?または、少なくともUbuntuのすべてのバージョンですか?
匿名カモノハシ

1
@AnonymousPlatypus:これは14.04以降の設定の場所です(他のディストリビューションについてはわかりません)
シルヴァンピノー

2
これは、端末からグラフィック方法ではなく、
Anandu Mダス

1
メディアキーキーにカスタムキーバインディングサブキーがない場合はどうすればよいですか?
ブランドンKuczenski

質問は、端末ではなく、GUIについてだったので、答えは無関係です
アレクセイMartianov

6

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の編集とは異なることに注意してください。キーは、私が見る限り、[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]に表示されるように名前が付けられています。
  • 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")

1

sedを使用して、Pythonスクリプトなしで新しいカスタムショートカットを設定できます。次のスクリプトで、名前バインディング、およびアクションを選択したものに設定するだけです。

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

1

そのためのスクリプトを書きました。下記参照。

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

競合がないことを確認するためだけに、nextShortcutIdが古いキーが既に存在する(他のプログラムによって既に作成されている)かどうかを自動検出できれば完璧です。また、入力されたキーに他の何かがバインドされているかどうかを確認します。
ジャックギフィン

0

@JacobVlijmが投稿した回答、特にスクリプトが非常に有用であることがわかりました。コードをに移植しました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"
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.