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 的组合键并不会,可以满足要求。

时间: 2024-09-11 08:56:04

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

误按大写锁定键Win7发声及时提醒你

  在Win7系统中,我们可做一些以简单设置,让Win7系统在我们按下大写锁定键CapsLock 或者数字锁定键NumLock的时候自动及时地发出声音提醒我们. 点击Win7桌面左下角的圆形开始按钮,选择"控制面板-轻松访问",单击打开"轻松访问中心". 在"轻松访问中心"单击"使键盘更易于使用". 在"使键入更容易"部分,勾选"启用切换键",按"确定"按钮保存设置.

Mac OS X下MySQL 5.0的默认连接数

这段时间mysql上的开发过程中崩溃2次,一直没有找到原因,由于使用macbook已经内存满配,top查看也无异常.sar也正常.mysql日志也没有什么有价值的信息.本文介绍其解决方法:修改Mac OS X下MySQL 5.0的默认连接数. 这段时间服务器崩溃2次,一直没有找到原因,今天看到论坛发出的错误信息邮件,想起可能是MySQL的默认连接数引起的问题,一查果然,老天,默认 连接数才100, 怎么够呀,在网上找了半天资料,有说修改my.cnf的,有说修改safe_mysqld,试了,前者无

Mac OS X 下安装Nginx问题详解

  Mac OS X 下安装Nginx问题碰到的朋友不多,因为在mac系统安装nginx环境不实用了,不过有人碰到了我们就一起来看看,说不定对你会有帮助呢. 我是通过brew install nginx的,前面都很顺利, nginx常用命令: nginx -s stop/quit/reopen/reload 用ln -s 命令创建个软件链接于 /usr/sbin/ 下以方便操作. 直接搞个server看看效果,代码如下: server { listen 80; server_name www.g

电脑键盘大写锁定键capslock失灵该怎么解决?

  有时我们在按 caps lock进行大小写转换时,发现不能用了~该怎样恢复锁定键的功能? 1.按大写锁定键不能将字母变小写了.多半是设置的问题. 2.右击桌面右下角的语言栏. 3.选择"设置". 4.在出现的窗口中选择"高级键设置". 5.这时我们看见要关闭大写要按"shift".取消勾选,选择按caps lock.然后确定,就行了.

mac OS X 下ft_rich游戏的重构

      ft_rich是用ruby写的一个简单得扑克大富翁游戏,逻辑很简单,使用了终端颜色 的特性.     原来是在windows下使用ruby c ext实现的颜色功能,现在在mac OS x下做移植, 因为后者终端直接支持颜色显示,所以没那么复杂了--直接在ruby里使用 gem highline搞定鸟.     windows下的颜色使用的是一个class Ctxt#color方法,Ctxt是在c ext中调用 native win32 api实现的.移植得第一步,我想先跑起来这个程

mac os X下开启root用户

    在mac os X下使用su指令想暂时切入root用户下,输入密码会发现无法 登陆root用户.这是因为默认情况下root用户密码未被设置,我们先用passwd 命令来设置一下: passwd root Changing password for root. Old Password: New Password: Retype New Password: passwd: authentication token failure 提示失败,用sudo吧: sudo passwd root

ubuntu和mac OS X下另一种使用QQ的方法

    在ubuntu可以到pidgin官网下载http://www.pidgin.im,然后再安装插件 pidgin-lwqq即可,步骤为: sudo add-apt-repository ppa:lainme/pidgin-lwqq sudo apt-get update sudo apt-get install libpurple0 pidgin-lwqq     而在mac OS X下可以使用pidgin,也可以使用adium,可以到官网https://adium.im下载.

QQ云输入法大写锁定切换快捷键

给各位QQ云输入法软件的使用者们来详细的解析分享一下QQ云输入法的大写锁定切换的快捷键. 分享一览: QQ云输入法的大写锁定切换快捷键是CapsLock.   好了,以上的信息就是小编给各位QQ云输入法的这一款软件的使用者们带来的详细的QQ云输入法的大写锁定切换的快捷键解析分享的全部内容了,各位看到这里的软件使用者们,小编相信你们现在那是非常的清楚了切换的快捷键是什么了吧,那么各位朋友们就来去按照小编的方法自己去切换的看看效果吧.

Mac OS X下的动态链接库

动态链接库已成为现代操作系统的基本组成部分,比如Windows下数不清的.DLL文件和 臭名昭著的DLL地狱,Linux下成千上万的.so文件.Mac OS X下也有许多动态链接库, 他们的扩展名是.dylib. .dylib是Mach-O格式,也就是Mac OS X下的二进制文件格式.Mac OS X提供了一系列 工具,用于创建和访问动态链接库. 编译器/usr/bin/cc,也就是gcc了,Apple改过的.这个主要还是一个壳,去调用其他 的一些部件.当然同时还有/usr/bin/c++,等