日本购买的mac电脑改键成习惯的英文键位

为什么会有这个文章

之前去日本旅游,跑到商场里,看到苹果店里的mbp价格比国内要便宜1000多,直接就付款买了一台,回国后拆机就傻眼了,我靠,键盘上这都是啥玩意!

键盘上英文字母的位置变化不大,主要是键盘上的数字键上方的符号和其他符号键,这些和国内习惯用的键盘区别很大。听朋友说,日本键位输入日文很方便,可惜我虽然想学日文,但是一直没有开始,所以好用归好用,和我无关啊。用了小半年,虽然已经习惯了直接输入@(日文键盘上直接使用p键右侧的按键直接输入@符号),但是发现在写代码或者快速输入文字的时候,比如最近开始用MD写HEXO的博客,基本没有啥排版的纠结,全部时间都在码字,差别还是挺大的。比如,我在pc和mac电脑上使用git同步博客,电脑切换之后,输入的键位完全变成了另外一个世界。ORZ…

国际键盘

日本键盘

通过这两张图片,就可以看到主要是标点符号的位置差别比较大,我之前看了很多前人的文章,但是效果都不是很理想,目前主要想实现的,就是基本键位和国际键盘想同,为了实现这个目标,我在自己的日语键盘上,贴下了一些sticker来挡住后面的字,先上效果图。

键盘上加了一些贴纸

这是初步的理想图,CAPS COMMAND 和 CONTROL 三个键可以通过系统偏好进行修改,但是其他键,就只能通过第三方软件的方式了。

失败方案:修改键盘为英国键盘

系统偏好设置-输入源里面,可以添加“英国键盘”来实现改键盘成为熟悉的国际键盘。

这里有点奇怪,为啥美国的键盘,和日本键盘的"输入源"键位一样呢?

这个方案本来挺好的,但是发现,一旦切换到搜狗的输入法,键位就又变回来了。

网上的一个帖子“MAC日文键盘绮丽丽改键”里面说QQ输入法作为第三方输入法可以实现“输入源”的选择,可是在点选了QQ拼音输入法后,右侧是空的,和搜狗一样样子。所以这个方法也不可行了。

下面就开始上本文的重头软件了,Karbiner。

Karabiner

Karabiner在改名之前叫KeyboardRemap4Mac(好像是,这会没去百度),就是用来更改键盘映射的专用软件,并且是免费的良心软件。

在网上搜索改键的时候,发现了这个软件,确实功能强大,强大到我看着这个软件的设置都发憷!这个软件,结合系统设置,可以实现更改键位,如果你可以盲打符号和数字键上的符号,那么这个软件的效果比较理想,然而,由于我在mac也安装了搜狗输入法,而在搜狗输入法是没有办法更改”输入源“的,因此,就算在英文输入输入状态下实现了键位更改,但是一旦切换到了搜狗中文输入法之下,又变成了日文键位,简直是让人操碎了心,有一种蛋疼的感觉。

安装Karabiner

安装过后,Karabiner会自动常驻内存并在MAC上方的任务栏中多出一个图标,点开之后,会发现里面有PreferencesDefault Profiles以及Launch EverntViewer等选项,其他都能看得出来,这里重点要说一下EventViewer,这个是最重要的功能之一,可以查看所有按键对应的“键盘码”,这样软件才知道你要把某个按键修改成其他的哪个按键。

在软件里,每按下一个键,表格里都会出现相应的键的信息,注意我们这里需要的KeyCode不在『code』栏中,而是『misc』栏中显示的内容。如上图显示,左ctrl的代码就是CONTROL_L。我按个键按了一遍,然后把上面那个日本键盘位打印了出来,直接在每个键位上标记了KeyCode。

在纸上写了keycode

怎么样?是不是看着毫无违和感?经过挨个测试发现,F11和F12直接引起了系统时间,在EVENTVIEWER里没有捕捉到,其他按键都成功捕捉到了KEYCODE,在日文键盘上,有几个KEYCODE是JIS_开头的,都是日文键盘才特有的按键,这些按键,正好给自己订制快捷键留下了很大的余地。这几个键分别是 JIS_EISUU(空格键左侧)、JIS_KANA(空格键右侧)、JIS_YEN(删除键旁边)、JIS_UNDERSCORE(右SHIFT旁边)。

Karabiner private.xml设置方法

先列出一个简单的private代码。

<?xml version="1.0"?>
<root>
	<item>
		<name>Name of Setting</name>
		<appendix>Optional Description of Setting</appendix>
		<identifier>Unique Identifier of Setting</identifier>
		<autogen>Behavior Definition</autogen>
		<autogen>Behavior Definition</autogen>
	</item>
	<item>...</item>
	<item>...</item>
</root>

这是基本的格式,如果想增加一个新的项目,直接增加新的<item>...</item>即可。

其中的name是必须的,appendix不是必须的,identifier貌似需要用private.开头,后面接一个变量名。autogen用来描述定义的行动。

比较复杂的是autogen部分,其中需要定义原功能按键以及新按键的功能,比较详细的配置,大家可以看Karabiner的官方教程,地址在这里

<?xml version="1.0"?>
<root>
	<item>
		<name>* to "</name>
		<identifier>private.TIMEStoQUOTE</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::QUOTE, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT,
  KeyCode::2, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT
		</autogen>
	</item>
	<item>
		<name>SHIFT+2 to @</name>
		<identifier>private.shift22at</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::2, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT,
  KeyCode::BRACKET_LEFT
		</autogen>
	</item>
	<item>
		<name>SHIFT+6 to ^</name>
		<identifier>private.shift6toJIECHENG</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::6, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT,
  KeyCode::EQUAL
		</autogen>
	</item>
	<item>
		<name>SHIFT+7 to &</name>
		<identifier>private.shift7toand</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::7, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT,
  KeyCode::6, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT
		</autogen>
	</item>
	<item>
		<name>SHIFT+8 to *</name>
		<identifier>private.shift8totimes</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::8, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT,
  KeyCode::QUOTE, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT
		</autogen>
	</item>
	<item>
		<name>SHIFT+9 to (</name>
		<identifier>private.shift9tobraceletleft</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::9, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT,
  KeyCode::8, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT
		</autogen>
	</item>
	<item>
		<name>SHIFT+0 to )</name>
		<identifier>private.shift0tobraceletright</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::0, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT,
  KeyCode::9, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT
		</autogen>
	</item>
	<item>
		<name>= to _</name>
		<identifier>private.equaltoUNDERSCORE</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::MINUS, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT,
  KeyCode::JIS_UNDERSCORE
		</autogen>
	</item>
	<item>
		<name>~ to +</name>
		<identifier>private.PIAOFUHAOtoADD</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::EQUAL, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT,
  KeyCode::SEMICOLON, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT
		</autogen>
	</item>
	<item>
		<name>^ to =</name>
		<identifier>private.SHANGJIANtoEQUALS</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::EQUAL,
  KeyCode::MINUS, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT
		</autogen>
	</item>
	<item>
		<name>@ to [</name>
		<identifier>private.ATtoBRACKETLEFT</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::BRACKET_LEFT,
  KeyCode::BRACKET_RIGHT
		</autogen>
	</item>
	<item>
		<name>` to {</name>
		<identifier>private.DIANDIANDIANtoDAKUOHAOLEFT</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::BRACKET_LEFT, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT,
  KeyCode::BRACKET_RIGHT, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT
		</autogen>
	</item>
	<item>
		<name>[ to ]</name>
		<identifier>private.ZHONGKUOHAOLEFTtoZHONGKUOHAORIGHT</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::BRACKET_RIGHT,
  KeyCode::BACKSLASH
		</autogen>
	</item>
	<item>
		<name>{ to }</name>
		<identifier>private.DAKUOHAOLEFTtoDAKUOHAORIGHT</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::BRACKET_RIGHT, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT,
  KeyCode::BACKSLASH, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT
		</autogen>
	</item>
	<item>
		<name>+ to :</name>
		<identifier>private.ADDtoCOLON</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::SEMICOLON, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT,
  KeyCode::QUOTE
		</autogen>
	</item>
	<item>
		<name>: to '</name>
		<identifier>private.COLONtoSINGLEQUOTE</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::QUOTE,
  KeyCode::7, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT
		</autogen>
	</item>
	<item>
		<name>] to \</name>
		<identifier>private.ZHONGKUOHAOtoBACKSLASH</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::BACKSLASH,
  KeyCode::JIS_YEN, ModifierFlag::OPTION_L
		</autogen>
	</item>
	<item>
		<name>} to |</name>
		<identifier>private.DAKUOHAORIGHTtoSEPARATOR</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::BACKSLASH, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT,
  KeyCode::JIS_YEN, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT
		</autogen>
	</item>
</root>

上面这份代码让我整整花了1个多小时,眼睛都快花了。然后有花了2个小时填坑,这里有2个大坑。

一是比如想把左右SHIFT+2都改成其他的键位,语法上,并不是

KeyCode::BACKSLASH, ModifierFlag::SHIFT_L | ModifierFlag::SHIFT_R

而是

KeyCode::BACKSLASH, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT

二是设置的顺序问题,直接上图

这两个ITEM有顺序问题

这两个item如果设置的顺序搞反了,是不能成功定义前一个的,这个大家千万注意。原则比较好记,就是如果你要同时修改一个键以及上档键按下的两个MAPPING,请先定义上档的MAPPING,否则上档键的修改就失效了。

其他键位的修改

mbp键盘的日本版相比国际键盘,在数字1左侧少了 漂浮号,在enter键上方,少了反斜杠,目前我用enter左下角的那个键当了 反斜杠和分隔符,用空格右侧的KANA当了 飘符号,同时,把右侧shift键左边的改成了,shift为home,单独按为end,因为写代码的时候,或者码字的时候,总需要在一行之中快速定位。

代码在下面,有需要可以直接拿走

'英数’一键切换输入法

<?xml version="1.0"?>
<root>
	<item>
		<name>JIS_EISUU to INPUT CHANGE</name>
		<identifier>private.EISUU2INPUTCHANGE</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::JIS_EISUU,
  KeyCode::SPACE, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_COMMAND
		</autogen>
	</item>
</root>

KANA改为飘符号

<?xml version="1.0"?>
<root>
	<item>
		<name>JIS_KANA up to PIAOFUHAO</name>
		<identifier>private.KANA2PIAOFUHAO</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::JIS_KANA, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT,
  KeyCode::EQUAL, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT
		</autogen>
	</item>
	<item>
		<name>JIS_KANA down to DIANDIANDIAN</name>
		<identifier>private.KANA2DIANDIANDIAN</identifier>
		<autogen>
			__KeyToKey__
  KeyCode::JIS_KANA,
  KeyCode::BRACKET_LEFT, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT
		</autogen>
	</item>
</root>

ps:特别说明,这段代码中来源于网络并且修改,原本的ModifierFlag::COMMAND被我修改成了MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_COMMAND,同时我看了一下我的karabiner的版本,10.18.0,大家请注意这个版本的问题。

参考资料

知乎上关于KANA和英数的修改 让你加速让你飞 Mac键盘玩法 第二季:键位改造