読者です 読者をやめる 読者になる 読者になる

改:Hammerspoonでホットキーのキーリマップ(blacklist方式)

Spotlight、Alfred でも Vim Binding やりたくなってきたので、少し修正しました。
昨日書いたやり方ホワイトリスト方式ですので ここにアプリ名追加すれば良いかと思ったら、はまってしまいました。
 
hammerspoon/filter.lua at 3e141946732a66547dd9e43d31fd2008a68c020a · Hammerspoon/hammerspoon
に記載のある通り、SKIP_APPS_TRANSIENT_WINDOWS で対象外アプリを設定しているようです。
原因っぽいのはわかりましたが、いまいち回避方法がわからない。。

ブラックリスト方式

hs.window.filter.default:allowApp'Spotlight' みたいにやれと書いてありますが、どうもうまくいかないのでブラックリスト方式でやってみました。
Editor、iterm、chrome を対象外にする方法です。

local function keyStroke(key, mods)
  mods = mods or {}
  return function()
    hs.eventtap.keyStroke(mods, key, 1000)
  end
end

local function disableAll(keySet)
  for k, v in pairs(keySet) do v:disable() end
end

local function enableAll(keySet)
  for k, v in pairs(keySet) do v:enable() end
end

local function hasValue (tab, val)
  for index, value in ipairs(tab) do
    if value == val then
      return true
    end
  end
  return false
end

local vimBinding = {
  hs.hotkey.bind({'ctrl'}, 'J', keyStroke('down')),
  hs.hotkey.bind({'ctrl'}, 'K', keyStroke('up'))
}

local notVimBindingApps = {
  "Atom", "CotEditor", "iTerm", "Google Chrome"
}

function handleGlobalAppEvent(name, event, app)
  if event == hs.application.watcher.activated then
    -- hs.alert(name)
    if hasValue(notVimBindingApps, name) then
      disableAll(vimBinding)
    else
      enableAll(vimBinding)
    end
  end
end

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