欢迎登陆真网站,您的到来是我们的荣幸。 登陆 注册 忘记密码? ☆设为首页 △加入收藏
欢迎加入真幸福QQ群
电脑知识: 基础知识 网络技术 操作系统 办公软件 电脑维修 电脑安全 windows7 windows8 windows10 服务器教程 平板电脑 视频播放教程 网络应用 互联网 工具软件 浏览器教程 QQ技巧 输入法教程 影视制作 YY教程 wps教程 word教程 Excel教程 PowerPoint
云南西双版纳特产小花糯玉米真空包装


怎么使用Dropzone 快速上传图片
怎么使用热键快速开关 Dark Mode for Yosemite
如何在Mac上截图
如何在Mac上截图
苹果笔记本Touch Bar触控板有哪些功能
2016款MacBook Pro配置参数和价格怎么样
笔记本升级SSD的三种方案
惠普EliteBook 1030全面评测
2016苹果新MacBook Pro现场实拍图赏
联想YOGA 5 Pro深度评测
Mac第三方输入法下如何将大写锁定键改为输入法切换键
【 来源:网络 】【 点击:1 】 【 发布时间:2017_03_03 08:59:59 】

   Mac第三方输入法下如何将大写锁定键改为输入法切换键

Mac教程,大写锁定键改输入法切换键

  根据个人习惯,我最终决定将大写锁定键更改为输入法切换键,一是因为作为一个中国人输入法切换是使用最多的一个快捷键之一;另一个原因是因为如此一来键上的指示灯还可作为输入法指示灯,简直完美。

  更改键绑定

  打开系统偏好设置-键盘-键盘-修饰键,将 Caps Lock 键设为“无操作”

  下载 Seil(良心软件,良心作者),打开后将 Caps Lock 键映射为 Key Code 80(或者其他一个不存在的键,80代表F19)

  打开系统偏好设置-键盘-快捷键-输入源,将切换输入法的快捷键设置为F19(通过选择后按一下Caps Lock)

  Done! 但是现在问题来了:大写锁定的灯永远不亮,这不优美!我们希望指示灯也更改为能够指示输入法状态,即在英文状态下不亮,在拼音/五笔等输入法状态下亮。经过 Google 发现,OS X 提供了控制键盘灯的底层 API,可以手动控制其状态,详见 MacLight。这就好办了,于是我依次尝试了以下几种解决方案:

  写一段 Shell 脚本来切换输入法(通过 AppleScript 模拟 Keystroke)+切换指示灯状态,通过 Automator 新建一个“服务”然后将大写锁定键绑定为运行该脚本。但是经过测试发现延时太大(~200ms),放弃。

  用 Objective-C 写一个调用底层 API 的程序来切换输入法(通过TISSelectInputSource系列API)+切换指示灯状态,发现调用 API 切换输入法后需要切换到下一个输入窗口才会生效,并且延时依然很大,放弃。

  用 Objective-C 写一个后台应用,通过NSDistributedNotificationCenter接收输入法变更事件,根据状态改变指示灯。科学!

  最终采用了最后这种科学的方法。当然,这个后台应用只需要是命令行应用就可以了,通过launchctl等方式开机自动启动即可。不过由于强迫症什么的(方便启动、退出,方便加为登录启动项)还是写成了占领在状态栏的应用,并取名为IMLight,如下图:

大写锁定键改输入法切换键

  Update for macOS Sierra

  升级 macOS Sierra 后,Seil 无法正常使用了(IMLight 不影响),详见 Github 上的这个 issue,并且由于是系统接口的大改动,一时半会儿可能不会有修复更新。

  Issue 中也有人提到,可以使用作者正在开发的另一个针对 Sierra 的项目 Karabiner-Elements,但是这个项目对我来说有几个问题:

  与 IMLight 冲突(虽然不一定是他的问题,但是我暂时也不知道怎么修复…)

  会使得系统偏好设置中的针对多个键盘的修饰键设置失效(比如无法把外接键盘的 alt 和 ⌘ 互换),作者表示无法修复

  另外的解决方案是在系统偏好设置中把 Caps Lock 设置为 Ctrl(或者其他),然后用其他软件重映射,比如 Keyboard Maestro(更改 Caps Lock 这件事情比较底层,需要内核级别的修改,而监听 Ctrl 等键这件事情就很简单了)。我使用免费的 hammerspoon 来实现:

  local M = {}

  local events = hs.eventtap.event.types

  M.log = hs.logger.new('caps_remap', 'info')

  M.last_flags_1 = {}

  M.last_flags_0 = {}

  M.last_time_1 = 0

  M.last_time_0 = 0

  M.timeout = 0.15

  M.key = "ctrl"

  M.action = function() hs.eventtap.keyStroke({}, "f19") end

  local function _dict_has_no_other_key(dic)

  for k,v in pairs(dic) do

  if k ~= M.key then

  return false

  end

  end

  return true

  end

  function M.event_callback(e)

  local typ = e:getType()

  local code = e:getKeyCode()

  local flags = e:getFlags()

  local now = hs.timer.secondsSinceEpoch()

  if _dict_has_no_other_key(flags) and not flags[M.key]

  and _dict_has_no_other_key(M.last_flags_0) and M.last_flags_0[M.key]

  and _dict_has_no_other_key(M.last_flags_1) and not M.last_flags_1[M.key]

  and now - M.last_time_0 < M.timeout

  then

  M.log.i("Fire caps action")

  if M.action then

  M.action()

  end

  end

  M.last_flags_1 = M.last_flags_0

  M.last_flags_0 = flags

  M.last_time_1 = M.last_time_0

  M.last_time_0 = now

  return false

  end

  function M.init(options)

  if options.key then

  M.key = options.key

  end

  if options.timeout then

  M.timeout = options.timeout

  end

  if options.action then

  M.action = options.action

  end

  M.watcher = hs.eventtap.new({events.flagsChanged}, M.event_callback)

  M.watcher:start()

  end

  return M

  即快速按一下 ctrl(即 Caps Lock)会触发 F19,而其他包含 ctrl 的组合键并不会,可以满足要求。

本网站由川南居提供技术支持,fkzxf版权所有 浙ICP备12031891号