Skip to content

Instantly share code, notes, and snippets.

@nozma
Created April 14, 2019 11:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nozma/9c0f11e3921c100fc19a13c4d2cc3c9c to your computer and use it in GitHub Desktop.
Save nozma/9c0f11e3921c100fc19a13c4d2cc3c9c to your computer and use it in GitHub Desktop.
Hammerspoonの設定
--
-- Hammerspoon用 KeyRemap 設定
--
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|RStudio|Colaboratory" then
enableAllHotkeys()
else
disableAllHotkeys()
end
if name == 'Code' then
for i, key in ipairs(remapKeys) do
key:disable()
end
end
end
end
appsWatcher = hs.application.watcher.new(handleGlobalAppEvent)
appsWatcher:start()
--
-- ここから KeyRemap 設定
--
-- カーソル移動
-- 現状 hs.hotkey.bind の挙動が怪しいので getFlags+getKeyCode を使うといい
hs.eventtap.new({hs.eventtap.event.types.keyDown}, function(e)
-- Ctrl + Shift + FBNP(ctrl単体のものよりより先に書く必要がある)
if e:getFlags().ctrl and e:getFlags().shift then
if e:getKeyCode() == 35 then
hs.eventtap.event.newKeyEvent({"shift"}, "up", true):post(); return true;
elseif e:getKeyCode() == 11 then
hs.eventtap.event.newKeyEvent({"shift"}, "left", true):post(); return true;
elseif e:getKeyCode() == 45 then
hs.eventtap.event.newKeyEvent({"shift"}, "down", true):post(); return true;
elseif e:getKeyCode() == 3 then
hs.eventtap.event.newKeyEvent({"shift"}, "right", true):post(); return true;
elseif e:getKeyCode() == 6 then
hs.eventtap.event.newKeyEvent({'shift','cmd'}, 'z', true):post(); return true;
end
end
-- Ctrl + FBNP
if e:getFlags().ctrl then
-- log の吐き方
-- local log = hs.logger.new('mymodule','debug')
-- log.i(e:getKeyCode())
if e:getKeyCode() == 35 then
hs.eventtap.event.newKeyEvent({}, 'up', true):post(); return true;
elseif e:getKeyCode() == 11 then
hs.eventtap.event.newKeyEvent({}, 'left', true):post(); return true;
elseif e:getKeyCode() == 45 then
hs.eventtap.event.newKeyEvent({}, 'down', true):post(); return true;
elseif e:getKeyCode() == 3 then
hs.eventtap.event.newKeyEvent({}, 'right', true):post(); return true;
-- PCライクなバインディング、たとえば
-- ctrl + W を cmd + W にするのも hs.hotkey.bind だと何故か出来ないので
-- こっちの方法を使っている
-- elseif e:getKeyCode() == 6 then
-- hs.eventtap.event.newKeyEvent({'cmd'}, 'z', true):post(); return true;
-- elseif e:getKeyCode() == 7 then
-- hs.eventtap.event.newKeyEvent({'cmd'}, 'x', true):post(); return true;
-- elseif e:getKeyCode() == 8 then
-- hs.eventtap.event.newKeyEvent({'cmd'}, 'c', true):post(); return true;
-- elseif e:getKeyCode() == 9 then
-- hs.eventtap.event.newKeyEvent({'cmd'}, 'v', true):post(); return true;
-- elseif e:getKeyCode() == 13 then
-- hs.eventtap.event.newKeyEvent({'cmd'}, 'w', true):post(); return true;
-- elseif e:getKeyCode() == 46 then
-- hs.eventtap.event.newKeyEvent({}, 'return', true):post(); return true;
-- hs.eventtap.keyStroke({}, 'return');
end
end
return false
end):start()
remapKey({"ctrl"}, "a", keyCode("left", {"cmd"}))
remapKey({"ctrl"}, "e", keyCode("right", {"cmd"}))
remapKey({"alt"}, "b", keyCode("left", {"alt"}))
remapKey({"alt"}, "f", keyCode("right", {"alt"}))
remapKey({"alt"}, "n", keyCode("down", {"alt"}))
remapKey({"alt"}, "p", keyCode("up", {"alt"}))
remapKey({"alt"}, "h", keyCode('delete', {"alt"}))
local function deleteWordForward()
keyCode('right', {'shift', 'alt'})()
keyCode('delete')()
end
remapKey({'alt'}, 'd', deleteWordForward)
-- Return
remapKey({'ctrl'}, 'm', keyCode('return'))
-- Delete
remapKey({'ctrl'}, 'h', keyCode('delete'))
-- ページスクロール
remapKey({'ctrl'}, 'v', keyCode('pagedown'))
remapKey({'ctrl'}, 'z', keyCode('pageup'))
-- Esc
remapKey({'ctrl'}, 'g', keyCode('escape'))
-- undo
remapKey({'ctrl'}, '/', keyCode('z', {'cmd'}))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment