mac下hammerspoon切换app唯独iTerm不行

我把一个按键绑定为ctrl-shift-option-command-(fake hyper键)然后用hyper-*切换到某个app,对于Chrome, Dictionary, Finder, Emacs全部工作正常,但是iTerm只有在Emacs中才会正确跳转,在其他任何app中似乎都无效。

怀疑是按键问题,把原定的hyper-t改成hyper-g,问题仍然存在。

在hammerspoon的console里面使用代码可以正常跳转(true代表找到了这个app):

> hs.application.launchOrFocus('iTerm')
true

hyper键用karabiner绑定;键,单点输出;,组合时输出hyper

iterm2 似乎 自带了一个绑定快捷键的配置 , 另外可以参考下我的配置 看看有没有用

用iTerm自带的选项也是同样的结果,似乎是按键的问题,不用t用v就好了,可是用惯了t来着。我看你配置里也是开始写的t后来换d了。

可能跟当前app的快捷键有关,hammerspoon只能支持“某些modifier加上一个键”的绑定,略遗憾,要是能用"F15+t"这样的键应该可以避免这个问题。

ctrlhyper的定义里去掉就好了。

我在网易云音乐中设置全局快捷键时发现按下hyper-t时会显示command-shift-option-t(没有ctrl),然后松开会清空快捷键的输入框,无法设置,于是推断ctrl-t等键位可能被app识别为有什么特殊的含义,总之某些ctrl-*键位不能放入hyper的定义中,就试着把ctrl去掉了,果然好了。

因为很多应用发给 Mac 系统的名字并不是你看到的,你需要用 appPath 去切换,可以参考一下我的配置文件中的 toggleApplication 函数.

是说xx.app里的xx吗,这样的话好像和我描述的问题不一样。


或者说,为什么你这里的toggleApplication可以用ctrl,hammerspoon自带的launchOrFocus不行呢,没完全懂你上面的回复。

问题的关键在于, 如果一个应用程序起来以后,你用 application.launchOrFocus 是可行的, 因为应用程序的发送给操作系统的名字很有可能就和 iTerm 这个名字匹配, 从而可以生效.

但是当应用程序还没有启动的时候,你传入名字就不一定可以由 application.launchOrFocus 启动起来, 举个例子, Mac 的系统设置的名字是 “系统偏好设置”, 如果系统设置已经启动了,你直接用 launchOrFocus(‘系统偏好设置’) 是可以直接Focus的,但是如果系统设置没有启动, launchOrFocus 就没有效果.

上面的问题,即使官方的 application.find 函数也是不行的, 因为 application.find 只能接受 pid, name, title 参数. 所以我写了一个函数可以通过 appPath 来查找 app:

function findApplication(appPath)
   local apps = application.runningApplications()
   for i = 1, #apps do
      local app = apps[i]
      if app:path() == appPath then
	 return app
      end
   end

   return nil
end

所以问题的关键, 应该是传入 app path 来启动就一直可以生效, 而不是快捷键的问题.

我当时的问题是不管launch,都已经启动了,然后focus的时候,键组合含有ctrl-t等就不行,不用ctrl就一切ok。。

我都是用launch pad……快捷键打开launch pad然后输入应用名字然后回车就行了,跟ivy感觉一样……

这种

你可以试一下我的配置文件, 和 Ctrl 没有关系的.

我现在不用ctrl键,没问题了,我看你用了ctrl,所以你的解释大概是对的,但就是感觉没完全explain我的问题=。=