键盘布局的改进之道


原文地址:http://www.cppblog.com/huaxiazhihuo/archive/2013/06/29/201380.html


好久没上博客了,自己的那么一点微末道行也不敢拿出来丢人现眼。实际上,过去的几年,真的是让C++和MFC害惨了,一直自个儿固步自封,说什么没有透彻掌握它们,绝不碰其他的玩意,结果就悲剧了,眼界相当重要,再怎么夸张都不为过。显然,MFC是垃圾,但实际上,C++也不是什么好菜,嗯,不吐槽了。还是做点更具实际意义的事情吧,今天的主角是键盘布局。
      由于历史的原因,当今流行的26字母的qwerty键盘布局并不是很科学,甚至有种说法,随便弄一个布局,都要比qwerty好,只因qwerty当初的设计意图就是为了最大限度的降低打字速度,这么说就有点过分了。不过,后来重新发明的布局,特别是DVORAK,的确比qwerty更具优势。但是,不管DVORAK的先天设计多么合理,如何在市场上如何造势,都不能撼动qwerty的主流地位。这很让人无语,由此可见,技术并不是决定市场的首要因素,关键是先占领市场,形成标准,不管这个标准有多差,只要有很多人遵守执行就行了,好比XX红色政党,又好比MFC,现在VC2012上居然还有他的一席之地,中国计算机图书还有那么多的VC书籍,实在令人疼心疾首。不过,本文的目的并非推荐DVORAK,当然,DVORAK键盘布局还是很值得广泛使用,但是既然已经如此的熟悉qwerty键盘了,那么也没有必要再训练了,实际上,qwerty已经足够日常使用了,我们平时打字,最大的限制在于大脑的速度,键盘布局到不是瓶颈。
      我要说的是,对于码农来说,键盘的另一不合理之处在于,小指的压力过大,左小指还好,只需负责Esc、~、……、A、Z等11个键位,先不论esc太远,这让vim情何以堪,而无关紧要的大小写切换键居然占据了那么优势明显好用之要地,等等无理设计。右小指表示压力更大,起码打了两倍,因为它的掌管比左小指的大了一倍之多,几乎是主键盘的1/4之多的键位,而且这些键,使用率都相当的频繁,如果再加上上下左右方向键还有delete,这实在太无天理了。可怜的两只小指,弱不禁风,娇怯怯,却要承受着生命难以承受之痛。相比之下,平时最能干的大拇指,居然只负责长长的空格键和两只alt这三个,这种不合理不公平的待遇,不禁让人怒从心头起,恶向胆边生,必须改革,彻底改革。给小指减负,给大拇指加负。
      当然,改革之前,先介绍windows下两大偷天换日的键盘修改利器,autohotkey和keytweak,其性能和使用说明,请各位自行百度谷歌。为了达到目的,老夫真的是挖空心思,无所不用其极。方法如下:
      1、借助autohotkey,将右手的所有键位都往右挪一格,也就是说,原来的7ujm这4个键,被发配到8ik,上,而8ik,就到了9ol.上,其他的以此类推,至于最右边的=\'/就只好屈居于开始时的7ujm上了。这样一来,小指起码少按了4个键位。右拇指只要愿意,可以不费力的按到右win键了,现在,两只拇指终于可以掌控四个键位了,四个很重要的键位,恩,目前除了space,其他三个似乎没啥特别,但很快,就会看到剩下来的三个中的其中一个,将发光发热,照耀整个键盘,最有作用。
      2、众所周知,上下左右home end 和翻页,这些键,其实也很重要,但是要按到它们,必须跑大老远,挥动右手做大幅度的机械运动。以至于,在vim和emacs中,都有各自的快捷方式来实现同样的功能。什么hjkl,什么ctrl+n,ctrl+p等等,不一而足,这种快捷方式,居然是其优于其他编辑器的亮点之一。但是,上下左右等键位可以配上ctrl、shift、win修饰键,然后马上就可以做出很多种组合,当然,emacs和vim也真是神通广大,针对每种组合,基本上都有对应的快捷键,只是记忆起来,实在麻烦。而区区在下,还曾经吭哧吭哧的拼命记忆过。好吧,好不容易习惯了vim和emacs那套逆天指法,却发现只能在vim或者emacs的环境下使用,屠龙之技,屠龙之技。我们要求的是,能够有一套放之于四海而皆准的指法,可以在所有的软件下,所有的场合下都发光发热。
      可能吗?确实有办法,就是在新键盘布局下,将右拇指能比之前轻松的按到的alt,摇身一变,变成换挡键,只要此键一按,马上wsad(游戏模式下的上下左右方向键)就变成上下左右了,配合jkl就可以组合出ctrl shift alt等效果。ec为home、end,rv则是上下翻页,f为esc键,各种各样,何其方便哉!剩下来的问题,就是右alt该何去该从,很简单,鹊巢鸠占,老实不客气,就占到右win键上,至于右win键怎么办,该怎么方便就怎么方便,甚至不存在,也没关系。制造换挡键,必须用到keytweak,autohotkey是不行的,鉴于数字小键盘上的除号实在很少用到,因此就拿他来当牺牲品了。其他的种种,请大家参考随文附上的ahk脚本。
      这样一来,只要稍加训练,键盘用起来将会很爽了。不爽的是,用别人的电脑,将特别的不习惯,各种难受。
      此外,右ctrl,可以用右掌腹来按,不必烦劳小指,他已经够累了。然后,汉字输入,要用拼音,最好是双拼,切记切记。不要在用什么五笔了,那是特别落后的输入法,其令人发指之处,可以和mfc值得一拼。在下曾经是五笔高手,下过苦功夫,多少个夏天夜晚,挥汗如雨,苦练五笔,一分钟达到百多字,绝对有资格说五笔的不是。现在我用双拼很高兴,已经不记得五笔的很多字根了,才不到半年的时间。
      其实,我都努力过,只是,都把汗水和精力,放在垃圾上了。C++是垃圾吗,当然不是了,但实际上,……,我觉得C++可以和粪便有得一比,作为肥料,还是很好地。


7::=
8::7
9::8
0::9
-::0
=::-


u::y
i::u
o::i
p::o
[::p
]::[
\::]


j::h
k::j
l::k
SC27::l
'::SC27


m::n
,::m
.::,
/::.


y::\
h::'
n::/


NumpadAdd::=
Shift & NumpadDel:: Send, {Backspace}


NumpadDiv & a:: Send, {Left}
NumpadDiv & d:: Send, {Right}
NumpadDiv & w:: Send, {Up}
NumpadDiv & s:: Send, {Down}


NumpadDiv & e:: Send, {Home}
NumpadDiv & c:: Send, {End}
NumpadDiv & r:: Send, {PGUP}
NumpadDiv & v:: Send, {PGDN}


NumpadDiv & z:: Send, {BackSpace}
NumpadDiv & x:: Send, {Delete}
NumpadDiv & f:: Send, {Escape}


CapsLock::LControl
LControl::Esc
Esc::CapsLock


NumpadDiv & k:: 
    Send {Control down} 
KeyWait k  ; 等待用户释放按键.
    Send {Control up} 
return


NumpadDiv & Shift:: 
    Send {Shift down} 
KeyWait Shift  ; 等待用户释放按键.
    Send {Shift up} 
return


NumpadDiv & Control:: 
    Send {Control down} 
KeyWait Control  ; 等待用户释放按键.
    Send {Control up} 
return


NumpadDiv & Alt:: 
    Send {Alt down} 
KeyWait Alt  ; 等待用户释放按键.
    Send {Alt up} 
return


NumpadDiv & #:: 
    Send {Win down} 
KeyWait #  ; 等待用户释放按键.
    Send {Win up} 
return


NumpadDiv & l:: 
    Send {Shift down} 
KeyWait l  ; 等待用户释放按键.
    Send {Shift up} 
return


NumpadDiv & SC27:: 
    Send {Alt down} 
KeyWait SC27  ; 等待用户释放按键.
    Send {Alt up} 
return


NumpadDiv & ':: 
    Send {LWin down} 
KeyWait '  ; 等待用户释放按键.
    Send {LWin up} 
return

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将二维数组作为函数的参数传递

如何将二维数组作为函数的参数传递声明:如果你是得道的大侠,这篇文章可能浪费你的时间,如果你坚持要看,我当然感觉很高兴,但是希望你看完了别骂我!如果你发现我这篇文章有错误的话,你可以提出批…

鼠标爱心显示

/**爱心start**/(function(window,document,undefined){var hearts [];window.requestAnimationFrame (function(){return window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||window.oRequestAnimationFrame ||window…

多台电脑共用一个耳机、音箱

台式机电脑声卡一般有三个插孔,一个是麦克风,一个是耳机,另一个就是LineIn输入口了,买一根AUX线,一头插入笔记本的耳机插口,另一头插入台式机linein口;在控制面板的声音中选择线路输入&#xff…

liferay开发文档_Liferay –简单主题开发

liferay开发文档实际上,Liferay的6.1版本已经走了很长一段路,该版本完全支持JSF和IceFaces。 我一直在努力学习它的绳索,因为我希望使其成为我们团队中的标准协作工具。 好的软件应用程序可以解决问题,但是好的软件应用程序不仅可…

ACRush 楼天城回忆录

利用假期空闲之时,将这几年 GCJ , ACM , TopCoder 参加的一些重要比赛作个回顾。首先是 GCJ2006 的回忆。 Google Code Jam 2006 一波三折: Google Code Jam 2006 是我第一次到美国参加现场的程序设计比赛。 Google Code Jam 2006…

Matlab计时函数

1. cputime 显示Matlab启动后所占用的CPU时间;eg: t0 cputime; 你的程序;timecputime-t0;2. tic,toc 秒表计时,tic是开始,toc是结束;eg: tic; 你的程序;toc;3. clock,etime 前者显示…

列表,字典表达式以及三元表达式

1.三元表达式条件成立时的返回值 if 条件 else 条件不成立时的返回值三元表达式的意义就是让一些简单的if判断写成一行,减少代码量def max2(x,y): if x > y: return x else: return yx10y20res x if x > y else yprint(res)2.列表生成式…

JUnit 5 –条件

最近,我们了解了JUnit的新扩展模型以及它如何使我们能够将自定义行为注入测试引擎。 我向你保证要看情况。 现在就开始吧! 条件允许我们在应该执行或不应该执行测试时定义灵活的标准。 它们的正式名称是“ 条件测试执行” 。 总览 本系列中有关JUnit 5…

我的编程竞赛之路 ——中国大学生计算机编程第一人楼天城访谈

记者/陈秋歌 25岁的楼天城有“中国大学生计算机编程第一人”的称号,也被参加竞赛的学子们敬称为“楼教主”。他的传奇经历一直激励着众多年轻学子:从2001年开始参加计算机编程竞赛,并连获全国一等奖;2004年入选国家集训队&#xf…

MATLAB集合运算

intersect求两个集合的交集ismember检测集合中的元素setdiff求两个集合的差setxor求两个集合交集的非(异或)union求两个集合的并集unique取集合的单值元素注:交并等操作会对操作结果进行排序

IE8兼容性问题的解决方案

前几天,面试到Ie8的一些兼容问题,傻眼了,回想自己做了将近2年的移动端项目,ie兼容似乎没怎么做过。所以私下便开始找找ie兼容的视频或者文章学习,唉,还是不买书了,家里那么多书,都没…

jenkins部署_Jenkins:部署JEE工件

jenkins部署随着持续集成和持续交付的出现 ,我们的构建被分为不同的步骤,以创建部署管道。 这些步骤中的一些步骤可以是例如编译和运行快速测试,运行慢速测试,运行自动验收测试或发布应用程序等。 部署流程的最后步骤意味着将我们…

2013年3月编程语言排行榜:有毒的Java

2013年3月12日,Tiobe公布了新一期编程语言排行榜。Java依旧是占据第一的位置,C语言紧随其后。值得注意的Objective-C持续发力,已经占到了第三的位置。咋一看榜单,前5条中C#下滑最快,从第3名下降到第五名。而其他语言都…

MATLAB各种判断

1. isempty();%判断是否为空2. isnan();%判断是否为NaN3. iscell();%判断是否为元胞数组4. ischar();%判断是否为字符数组5. ismatrix();%判断是否为矩阵6. isrow();%Determine whether input is row vector7. ismember();

js 自定义类Android吐司提示框

(function(){var mouseX 0;var mouseY 0;//定义一个全局toaslist用来存在新建的吐司var toastLsit [];window.Toast function(content,duration,positon){return new Toast(content,duration,positon);}function Toast(content,duration,positon){//显示的内容this.content…

学习Lucene

我目前正在与一个团队合作,开始一个基于Lucene的新项目。 虽然大多数时候我会争论使用Solr还是Elasticsearch而不是简单的Lucene,但这是一个有意识的决定。 在这篇文章中,我正在整理一些学习Lucene的资源–希望您对他们有所帮助,或…

MATLAB递归程序的调试方法

MATLAB具有和VC类似的调试功能,各功能的按钮图标和VC也很相似,基本可以使用VC的调试思想。MATLAB自己的特点:一. 查看中间变量。1. 在调试状态下,鼠标放在变量上就可以显示变量的基本信息。2. 在调试状态下,在命令行输…

DHCP服务(dhcpd)

DHCP动态分配主机地址(Dynamic Host Configuration Protocol) 动态主机配置协议(DHCP)是一种基于UDP协议且仅限于在局域网内部使用的网络协议,主要用于大型的局域网环境或者存在较多移动办公设备的局域网环境中&#x…

最健康的睡眠时间究竟是多少?

我每天都睡足8个小时,怎么还是这么困啊?”很多男性朋友都有这样的疑问。不是说每天8个小时的睡眠是最健康的,为什么那些一天睡5、6个小时的人看上去反而更生龙活虎、精力充沛呢? 怪8小时不如6小时的精神 睡眠不足会导致精力不济、…

Matlab Compiler路径

Matlab Compiler run-time找了半天就在自己的安装目录下D:\Program Files\MATLAB\R2011b\toolbox\compiler\deploy\win32\MCRInstaller.ex