来世ガチャ乱数調整日記

Lily, Bass & Programing

Gtkアプリケーションのキーバインド

こんにちは、びしょ〜じょです。さて、あなたはVimのキーマップをガンガン追加するタイプですか。~/.xmodmapをガンガン書くタイプですか。

(中略)

GTKアプリケーションのキーバインドを適当に変える方法をかく。Googleで調べてもEmacs風のキーバインドにするみたいなことしか出てこず、若干情報が古かったりディストロの差異で無効だったりしたので困った。対象の環境は最新のArchLinuxです。

とりあえず$HOME.theme/THEME_NAME/みたいなディレクトリを作る。もちろんTHEME_NAMEはお好きに。

2.0系

mkdir -p ~/.theme/THEME_NAME/gtk-2.0-keyでディレクトリを作り、そこにgtkrcを書く。

binding "gtk-THEME_NAME-text-entry" {
    bind "<alt>w" {"move-cursor" (words, -1, 0)}
    bind "<alt>e" {"move-cursor" (words, 1, 0)}
    bind "<shift><alt>w" {"move-cursor" (words, -1, 1)}
    bind "<shift><alt>e" {"move-cursor" (words, 1, 1)}
    bind "<alt>d" {"delete-from-cursor" (word-ends, 1)}
    bind "<alt>c" {"copy-clipboard" ()}
    bind "<alt>v" {"paste-clipboard" ()}
}

binding "gtk-THEME_NAME-text-view" {
    bind "<alt>c" {"copy-clipboard" ()}
    bind "<alt>v" {"paste-clipboard" ()}
}

binding "gtk-THEME_NAME-tree-view" {
    bind "<alt>c" {"copy-clipboard" ()}
    bind "<alt>v" {"paste-clipboard" ()}
}

binding "gtk-THEME_NAME-menu" {
    bind "<alt>e" {}
    bind "<alt>w" {}
    bind "<alt>c" {"copy-clipboard" ()}
    bind "<alt>v" {"paste-clipboard" ()}
}


class "GtkEntry" binding "gtk-THEME_NAME-text-entry"
class "GtkTextView" binding "gtk-THEME_NAME-text-entry"
class "GtkTextView" binding "gtk-THEME_NAME-text-view"
class "GtkTreeView" binding "gtk-THEME_NAME-tree-view"
class "GtkMenuShell" binding "gtk-THEME_NAME-menu"

みたいな感じになる。他にもinsert-at-cursorなどのコマンドがあるので調べてみてください。undo/redoが欲しかったけど見つからなかった。


追記 2015 02/10 12:05

GtkTextView

ここを参照するといいかもしれん。


gyk-mytheme-text-entryはテキストボックス内の挙動で、text-viewは他(?)か。よくわかっていない。

そして$HOME/.gtkrc-2.0の適当な場所にinclude "/PATH/TO/.theme/THEME_NAME/gtk-2.0-key/gtkrc"を追加する。$HOMEなどの変数は展開してくれないので絶対パスを書く。

これで、上記の例でいけばAlt+e/wで単語単位でカーソル移動ができる。ターミナルからアプリケーションを開くと無効な記述があれば教えてくれるのでデバッグ用につかおう。

3.0系

mkdir -p ~/.theme/THEME_NAME/gtk-3.0でディレクトリを作り、gtk-keys.cssを編集する。

@binding-set gtk-THEME_NAME-text-entry {
    bind "<alt>w" {"move-cursor" (words, -1, 0)};
    bind "<alt>e" {"move-cursor" (words, 1, 0)};
    bind "<shift><alt>w" {"move-cursor" (words, -1, 1)};
    bind "<shift><alt>e" {"move-cursor" (words, 1, 1)};
    bind "<alt>c" {"copy-clipboard" ()};
    bind "<alt>v" {"paste-clipboard" ()};
}

@binding-set gtk-THEME_NAME-text-view {
    bind "<alt>c" {"copy-clipboard" ()};
    bind "<alt>v" {"paste-clipboard" ()};
}

@binding-set gtk-THEME_NAME-tree-view {
    bind "<alt>c" {"copy-clipboard" ()};
    bind "<alt>v" {"paste-clipboard" ()};
}

@binding-set gtk-THEME_NAME-menu
{
}

GtkEntry {
    gtk-key-bindings: gtk-THEME_NAME-text-entry;
}

GtkTextView {
    gtk-key-bindings: gtk-THEME_NAME-text-entry, gtk-THEME_NAME-text-view;
}

GtkTreeView {
    gtk-key-bindings: gtk-THEME_NAME-tree-view;
}

GtkMenuShell {
    gtk-key-bindings: gtk-THEME_NAME-menu;
}

~/.config/gtk-3.0/settings.inigtk-key-theme-name = THEME_NAMEを追加する。これは2.0系とは違いパスは要らずTHEME_NAMEだけで良い。

ついでに

OpenboxとawesomeのデフォルトではGTK+3.0系のアプリケーションを開くとウィンドウの縁が透明になっていてなんか鬱陶しかったと思うんですがボクだけですか。以下を~/.config/gtk-3.0/gtk.cssに書く。

.window-frame, .window-frame:backdrop {
box-shadow: 0 0 0 black;
border-style: none;
margin: 0;
border-radius: 0;
}

.titlebar {
border-radius: 0;
}

がんがん魔改造しよう。