터미널에서 사용자 정의 키보드 단축키를 설정하는 방법은 무엇입니까?


56

다른 Linux 버전에 대해 터미널에서 사용자 정의 키보드 단축키를 설정하는 방법은 무엇입니까?

기본적으로 Linux가 키보드 단축키 파일을 저장하는 위치와 편집 방법을 알고 싶습니다.

내 연구에서 파일을 찾았 ~/.config/compiz-1/compizconfig지만 파일 을 열려고 할 때 암호화되었거나 비슷했습니다 nano.


참고 XFCE / 분투 시스템은 이미 대답을 여기에
Ulad Kasach

답변:


62

명령 행에서 두 단계로 바로 가기 키 바인딩 추가 (14.04+)

명령 행에서 커스텀 단축키를 추가하는 것은 가능하지만 약간 복잡합니다. 키 바인딩마다 몇 단계를 거쳐야합니다. 다른 한편으로는 이다 매우 간단하고 어떻게 든 명령 행 (즉, 오른쪽 질문이었다?)에서 작업을 수행하려는 경우 매우 잘 스크립팅 할 수 있습니다.

인터페이스 (시스템 설정> "키보드"> "바로 가기"> "사용자 정의 단축키")에서와 같이 사용자 정의 키보드 단축키는 다음 두 단계로 명령 행에서 작성됩니다.

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

    (큰 따옴표를 생각하십시오)

    NB는 필요가 목록에서 언급 (예를 들어 말 없습니다 custom1, custom2) 고유 한 것이어야한다. 스크립트를 작성하면 스크립트가 중복을 방지해야합니다. 이 경우 편집 된 목록은 다음과 같아야합니다.

    ['/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>'
      

유용한 정보는 여기 에서 찾을 수 있습니다

새 사용자 정의 바로 가기를 설정하는 예제 스크립트

아래 스크립트는 명령 행에서 새 단축키 조합을 설정하는 데 사용할 수 있습니다. 키 조합을 사용할 수 있다고 가정하면 명령과 함께 사용할 수 있습니다.

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
훌륭한 답변입니다. 해당 스크립트에 100 개의 공감 버튼이 필요합니다. ;)
Anandu M Das

@JacobVlijm Key 조합 부분 에 대해 조금 설명해 주 시겠습니까? <primary> 태그는 무엇을 나타 냅니까? 그리고 문자 g 대신 내가 생각하는 문자를 대체 할 수 있습니까?
Anonymous Platypus

1
@VladK ai, xubuntu는 xubuntu의 단축키가 여전히 xml 파일에 설정되어있을 수 있습니다. 나는 봐야 할 것이다. 그렇다면 xubuntu 관련 태그로 질문을 다시 열어야합니다.
Jacob Vlijm

1
감사합니다, @JacobVlijm, 시도했습니다. 그리고 나는 단지 내 수정이 실수라는 것을 알았습니다. 여기에는 정말 까다로운 것이 있습니다. custom-keybinding스키마 내부에서 끝에 "s"를 포함해서는 안됩니다. 그러나 키 또는 경로로 작동 할 때는 "s"를 포함해야합니다. 그렇지 않으면 "set"명령에서 예외가 발생합니다. 따라서 custom-keybinding스키마에서 의 "s"를 제거하십시오 . 게다가 파이썬 스크립트도 업데이트해야합니다.
e-cloud

2
참고로, 파이썬 스크립트에는 버그가 있습니다. 키보드 단축키가 설치되어 있지 않으면 평가되지 않는 키가 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바인딩을 더 추가 하려면 파트 에서 숫자를 늘려야 합니다. custom1, custom2

영구적으로 만들려면 .bash_profile로그인 셸에서 실행하는 유사한 스크립트 또는 유사한 스크립트에 추가하십시오 . 그냥 비 로그인 쉘을 위해 그것을하지 않는 .bashrc때문에 내 경험에서 이들을 dconfgsettings크게 그것을 천천히. 30 바인딩 변경 / 추가에는 1 초가 걸립니다! 비 로그인 쉘 ( .bashrc) 에서는 이것을 원하지 않습니다 !


1
우분투 18.04에서는 둘 다 실패합니다. @Jacob Vlijm의 답변 과이 커뮤니티 위키에 따라을 ( custom0를) 사용하여 사용자 정의 바로 가기 목록 에 추가해야합니다 gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['.../custom1/']". 에 대해 모르겠습니다 dconf.
miguelmorin

또한 전체 하위 경로를 stdoutdconf dump DIR덤프합니다. 출력은 GVariant 구문의 값을 가진 키 파일과 같은 형식으로되어 있습니다.
Pablo A

10

모든 사용자 정의 키보드 단축키 설정은 dconf 데이터베이스에 저장됩니다.

다음을 통해 쉽게 액세스 할 수 있습니다 dconf-editor.

sudo apt-get install dconf-editor

그런 다음 편집기에서 다음 dconf 경로로 이동하십시오.

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

여기에 이미지 설명을 입력하십시오


모든 Linux 버전에서 위치가 동일합니까? 아니면 우분투의 모든 버전을 적어도?
Anonymous Platypus

1
@AnonymousPlatypus : 이것은 14.04 이후 설정의 위치입니다 (다른 배포판으로는 말할 수 없습니다)
Sylvain Pineau

2
이것은 터미널이 아닌 그래픽 방식입니다
Anandu M Das

1
미디어 키 키에 사용자 정의 키 바인딩 하위 키가없는 경우 어떻게해야합니까?
Brandon Kuczenski 2016 년

질문은 GUI가 아닌 터미널에 관한 것이 었으므로 대답은 관련이 없습니다
Alexei 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 
    

노트

  • 키 이름은 편집 설정과 다릅니다. 키는 시스템 설정> "키보드"> "바로 가기"> "사용자 정의 바로 가기"에 표시된대로 이름이 지정됩니다.
  • VirtualBox에서 12.04의 스크립트를 테스트했습니다. 변경 사항을 적용하려면 로그 아웃 / 인이 필요했습니다.
#!/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 , bindingaction 을 원하는대로 설정 하면됩니다.

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.