macOS Sierra で キーバインドをカスタマイズ

  • 5
    いいね
  • 0
    コメント

実現したいこと

  • SandS
  • Fn -> left_Option + left_control
  • left_shift -> left_option
  • Emacsキーバインド
  • 左右のcomamnd押した時に英数/かなを切り替える

上3つ

  • SandS
  • Fn -> left_Option + left_control
  • left_shift -> left_option

Karabiner-Elements に現在出ている PR (Standalone keys + One-to-many mappings) を使用する.
Download the customized build at https://github.com/wwwjfy/Karabiner-Elements/releasesって書いてあるところからダウンロードできる.


{
    "profiles": [
        {
            "devices": [],
            "selected": true,
            "simple_modifications": {
                "spacebar": "left_shift"
            },
            "selected": true,
            "one_to_many_mappings": {
                "fn": [
                    "left_control",
                    "left_option"
                ]
            },
            "simple_modifications": {
                "caps_lock": "left_control",
                "left_shift": "left_option",
                "spacebar": "left_shift"
            },
            "standalone_keys": {
                "spacebar": "spacebar"
            },
            "virtual_hid_keyboard": {
                "caps_lock_delay_milliseconds": 0,
                "keyboard_type": "ansi",
                "standalone_keys_delay_milliseconds": 300
            }
        }
    ]
}

Sands と Fn -> left_Option + left_control はそれぞれ、このPRの提案されている "standalone_keys""one_to_many_mappings" を使用することで実現している.

ただ、

It's a temp solution, which can be used until the official one comes out.

といっているので、本家ではこの名前は使われないかもしれない可能性もあるので中止してください。

Emacsキーバインド

これは Hammerspoon を使用する.

http://www.hammerspoon.org/

ここに書いてあることを真似ただけなのでこちらを見たほうがはやい -> http://qiita.com/naoya@github/items/56a34be85710f4ed5531


local function keyCode(key, modifiers)
   modifiers = modifiers or {}
   return function()
      hs.eventtap.event.newKeyEvent(modifiers, string.lower(key), true):post()
      hs.timer.usleep(1000)
      hs.eventtap.event.newKeyEvent(modifiers, string.lower(key), false):post()
   end
end

local function remapKey(modifiers, key, keyCode)
   hs.hotkey.bind(modifiers, key, keyCode, nil, keyCode)
end

local function disableAllHotkeys()
   for k, v in pairs(hs.hotkey.getHotkeys()) do
      v['_hk']:disable()
   end
end

local function enableAllHotkeys()
   for k, v in pairs(hs.hotkey.getHotkeys()) do
      v['_hk']:enable()
   end
end

local function handleGlobalAppEvent(name, event, app)
   if event == hs.application.watcher.activated then
      -- hs.alert.show(name)
      if (name ~= "iTerm2") and (name ~= "Emacs") then
         enableAllHotkeys()
      else
         disableAllHotkeys()
      end
   end
end

local function keyCtrlK()
   keyCode('right', {'shift', 'cmd'})()
   keyCode('x', {'cmd'})()
end

appsWatcher = hs.application.watcher.new(handleGlobalAppEvent)
appsWatcher:start()

remapKey({'ctrl'}, 'e', keyCode('right', {'cmd'}))
remapKey({'ctrl'}, 'a', keyCode('left', {'cmd'}))

remapKey({'ctrl'}, 'f', keyCode('right'))
remapKey({'ctrl'}, 'b', keyCode('left'))
remapKey({'ctrl'}, 'n', keyCode('down'))
remapKey({'ctrl'}, 'p', keyCode('up'))

remapKey({'ctrl'}, 's', keyCode('f', {'cmd'}))
remapKey({'ctrl'}, 'm', keyCode('return'))
remapKey({'ctrl'}, 'w', keyCode('x', {'cmd'}))
remapKey({'ctrl'}, 'd', keyCode('forwarddelete'))
remapKey({'ctrl'}, 'h', keyCode('delete'))
remapKey({'ctrl'}, 'i', keyCode('tab'))
remapKey({'ctrl'}, 'k', keyCtrlK)

remapKey({'ctrl'}, 'y', keyCode('v', {'cmd'}))
remapKey({'ctrl'}, '/', keyCode('z', {'cmd'}))

remapKey({'option'}, 'f', keyCode('right', {'option'}))
remapKey({'option'}, 'b', keyCode('left', {'option'}))
remapKey({'option'}, 'd', keyCode('forwarddelete', {'option'}))
remapKey({'option'}, 'h', keyCode('delete', {'option'}))
remapKey({'option', 'shift'}, ',', keyCode('home'))
remapKey({'option', 'shift'}, '.', keyCode('end'))

remapKey({'ctrl'}, 'v', keyCode('pagedown'))
remapKey({'option'}, 'v', keyCode('pageup'))

左右のcomamnd押した時に英数/かなを切り替える

最初は Karabiner-Elements を使おうかと思ったが SandSのために入れた設定と相性が悪いらしく Cmd + Sapce がうまく発火しないことがよくあったので,普通にアプリ使った.⌘英かな というやつ.

https://ei-kana.appspot.com/