Skip to content

Instantly share code, notes, and snippets.

@nozma
Created June 19, 2019 02:47
Show Gist options
  • Save nozma/492aa72f1d3e4eb42b04542a74598401 to your computer and use it in GitHub Desktop.
Save nozma/492aa72f1d3e4eb42b04542a74598401 to your computer and use it in GitHub Desktop.
.hammerspoon
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 ~= "RStudio|iTerm|Microsoft" then
enableAllHotkeys()
else
disableAllHotkeys()
end
end
end
appsWatcher = hs.application.watcher.new(handleGlobalAppEvent)
appsWatcher:start()
-- カーソル移動
-- 現状 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("home"))
--remapKey({"ctrl"}, "e", keyCode("end"))
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'))
-- ページスクロール
remapKey({'ctrl'}, 'v', keyCode('pagedown'))
remapKey({'ctrl'}, 'z', keyCode('pageup'))
-- Esc
remapKey({'ctrl'}, 'g', keyCode('escape'))
-- テキスト編集
remapKey({'alt'}, 'w', keyCode('c', {'cmd'})) -- copy
remapKey({'ctrl'}, 'w', keyCode('x', {'cmd'})) -- cut
remapKey({'ctrl'}, 'y', keyCode('v', {'cmd'})) -- paste
remapKey({'ctrl'}, 'h', keyCode('delete')) -- backspace
remapKey({'ctrl'}, 'd', keyCode('forwarddelete')) -- delete
-- コマンド
-- remapKey({'ctrl'}, 's', keyCode('f', {'cmd'}))
remapKey({'ctrl'}, '/', keyCode('z', {'cmd'}))
remapKey({'ctrl'}, 'g', keyCode('escape'))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment