当前位置: 首页 > news >正文

纯键盘开发实战(Mouseless Programming)

作为一个践行Mouseless Programming的开发者,来谈谈自己在日常工作中是如何做到「几乎」不用鼠标的。

在说具体的「技巧」之前,先聊一聊纯键盘开发的几个原则:

  1. 动机, 动机要单纯,纯键盘开发不是为了耍酷, 你的动机应该是提高「效率」:)
  2. 键盘只是工具,思想才是关键, 代码和问题先想清楚再下手,想清楚远比写的快重要!
  3. 键盘不要经常换, 选择一款适合自己的,然后用熟它就好!什么黑轴、茶轴,filco、cheryy等等的都是浮云啊,折腾这些是在浪费生命啊。
  4. 使用统一的一套快捷键, 快捷键一致,可以无缝切换,减少不同软件不同快捷键的记忆成本。比如vi的一套快捷键,各种IDE和文本编辑器都会有vi模式或插件,chrome也有插件支持vi快捷键浏览网页。
  5. 快捷键不要刻意去记, 经常用到的功能,才去查它的快捷键,在使用过程中去记,记住常用的即可。

下面就来聊聊具体的(奇)技(淫)巧吧:

键盘设置

  1. 原则:双手不要离开主键区。也就是双手几乎一直在asdf,jkl;键区。 比如你去按方向键,这样就是双手离开了主键区。
  2. 重新映射方向键: 上一条提到不要去按键盘上的方向键(太远了),所以需要重新映射一下方向键,使用hammerspoon工具,可以全局重新映射方向键,我倾向使用 【ctrl-hjkl】来作为方向键,相信大部分vim党都会这么映射吧,用熟之后还是很舒服的。
  3. ctrl键和Cap键的键位互换:Cap键占据了一个很好的位子(左手小拇指一划就能碰到),然而却没什么卵用(大写用Shift+字母啊)。而Ctrl键使用的频率太高了,却藏的太远,所以强烈强烈建议互换ctrl和Cap按键的位置,换完之后熟悉一天你就不会再想换回来的,相信我。mac上提供了很便捷的方式修改这两个按键,入口在 【系统设置】-> 【键盘】:kdd-1.gif

    • 说下题外话,其实早期的一些键盘的ctrl键就是在现在的Caps键的位置的,特别是Unix/Linux系统的键盘,因为重度使用Ctrl键,如Ctrl-c:终止命令,Ctrl-d:EOF等,所以ctrl键必须要在一个很方便按到的位置。
      2.jpg
    • 如果你使用的是这款键盘---HHKB,那么恭喜,你就不用设置了,它压根儿就没有Caps键。另外安利一下这款键盘,它非常小巧,携带方便,而且可以直接架在笔记本的键盘区替换笔记本键盘。 唯一的缺点就是: 贵
      123.png
  4. 可以设置多个keyboard-profile。不同的profile下,按键的意义不同。举个例子,hhkb没有F1-F12按键,需要用Fn+1-12 才能表示F1-F12,程序员调试,经常用F6--F12 的,所以用组合键非常麻烦。此时就可以建另外一个debug-keyboard-profile,让1-12表示F1-F12的含义,这样就不用每次调试都按组合键了。可以借助Karabiner工具来实现多个profile的定义

常用操作

下面介绍 Mac上的常用操作怎么使用键盘来做到。

  • 打开应用、打开文件、查找文件等: Alfred。普通的打开应用、打开文件,基本上都能满足,再也不用鼠标点击底下的Dock来打开应用,也几乎不用点击Finder来打开文件了。重度用户可能会编写一些工作流,比如直接搜stackoverflow,搜maven中央仓库等等。
  • 窗口管理:Spectacle。经常需要用鼠标移动窗口,调整窗口大小? 有了Spectacal之后几乎不会在手动鼠标调整窗口。看一下快捷键就一目了然了。
    4.jpg
  • Ternimal管理:tmux(当然iterm,zsh等是标配啦)。tmux的一个好处是可以管理多个会话,保存会话以便后续再重连,以及方便的复制模式,在复制模式下可以用vi快捷键移动指标选中频幕内容,然后复制选中的内容。
    5.jpg
  • 浏览网页:Cvim 或 Vimium。 上手非常简单:https://youtu.be/t67Sn0RGK54
  • 钉钉聊天:抱歉,这个目前无能为力。。。。钉钉快捷键设置只提供了最基本的几个功能。。
    456.png

Vim

这是个很大的话题,就不展开讲了,总之学vim贵在坚持。稍微提几点:

  1. 要整体性地了解vim中的一些概念:编辑模式、移动命令、文件管理、文件间跳转、缓冲区列表、寄存器、宏、查找替换等等。
  2. 学会使用帮助。 在vim中输入 :h help, 好好看一下vim中的help应该如何使用。
  3. 一些插件

    • vimwiki, 个人首推,可以搭建自己的一个wiki知识库, 纯vim环境书写文档,语法类似markdown。并且创建文档,文档之间的跳转都非常非常方便。而且文档可以渲染成html,可以自己写一些CSS样式定制渲染。
    • ctrl-p: 快速查找文件
    • nerdTree: 目录
    • 插件推荐、排名: https://vimawesome.com/
  4. 强烈推荐书籍:《Practical Vim》 https://book.douban.com/subject/10599776/ ,书写的很好,看中文版的即可,因为是实操性的东西,很好理解。每天看5个Item,一个月即可看完。

IntelliJ

Jetbrain系列的IDE的快捷键还是设计的非常好的,而且他们家不同类型的IDE使用的快捷键是同一套,不管你用IntelliJ 写Java,Pycharm写Python 还是Goland 写Go或者其他的系列,他们的很多快捷键都是相通的。下面重点说说IntelliJ中的常用操作如何做到无鼠标。

  1. 首先装上IdeaVim插件,这样大部分的文件内编辑就可以纯键盘了。
  2. Navigation:

    • ⌘+o, ⌘+⇧+o: 定位文件
    • ⌘+E, ⌘+⇧+E:最近浏览编辑过的文件
    • ⌘-1,2,3,4...: 不同panel间切换
    • ⌘+⇧+F12: 编辑页全频展示
    • ⌘+⇧+a: 查找action
    • ⌘+⌥+b: 从接口向下跳到实现
    • ⌘+u: 从实现向上跳回接口
  3. 编辑

    • ⌥+⏎:修改提示,还可以自动声明变量
    • ⌘+n: 在 project-panel 中,新建文件
    • ⌘+shift+n: 临时测试可以使用 scratch-file, 不会放入到项目,会自动删除
    • ⌘+n:在文件内,可以生成 setter、getter、toString 等
    • ⌘+⏎+L: 格式化code
    • ⌘+-: 收起当前方法实现
    • ⌘+⇧+-:收起期所有方法实现
    • ⌘+y: quick definition, 不离开编辑页
  4. 代码提交

    • ⌘+K: commit代码
    • ⌘+⇧+K:push代码。
      另外需要说明的一点是,提交代码会出现多个button让你选择,这时候可以使用Tab来切换选中的button,用空格来确认选择,这样整个提交代码的过程就都能纯键盘操作了。

当然IntelliJ的快捷键还有很多很多,我的建议是不用刻意去记,使用过程中经常用到的功能,可以去查询一下对应的快捷键,如果没有的话,也可以自己去定义相应的快捷键,比如我自己设置的两个常用的快捷键,一个是定位当前编辑文件所在的目录:
7.jpg
这样我就能在Project这个panel中使用⌘+⌃+S 快速定位到我目前在编辑的文件

另外一个很常用的快捷键是重新导入jar包:8.jpg
这样每次我编辑完pom之后,只要按一下⌘+I,就可以重新导入依赖了(不开auto import是因为自动import它不知道我何时编辑完了,就一直再重新导入,严重拖慢速度)

对于哪些是自己经常使用的功能,可以查看IntelliJ中的 【Help】 -> 【Productivity Guide】, 会列出你最近常用的功能,以及使用次数,这样就能根据自己使用情况去 KeyMap里搜一搜对应的快捷键啦
9.jpg

总结

最后还是要强调一下,纯键盘开发的目的是效率,不要为了纯键盘而纯键盘,就像很多人投入太多精力研究Vim或者Emacs一样,其实说到底它只是一个编辑器,没必要花费太多的精力在上面,玩的再溜又如何,能帮你升职加薪吗,能解决实际业务问题吗? 磨刀不误砍柴工,使用好自己的工具,产出有价值的结果,不要陷入到研究工具的误区里去。

相关文章:

  • 关于spring和ibatis的整合
  • mybatis java.lang.NumberFormatException: For input string: D
  • 初识 beanstalkd
  • Oracle Apps AutoConfig
  • 用以太坊开发框架Truffle开发智能合约实践攻略(代码详解)
  • javascript解汉诺塔问题
  • RIP 漏打 no auto-summary 造成环路故障
  • oracle Like模糊查询与带有关键字Reverse的索引应用
  • JQuery EasyUI 动态隐藏
  • 安装OpenStack Queens版本的教程推荐
  • [leetcode]Flatten Binary Tree to Linked List
  • 深度学习中常见问题
  • 华为云:如何解除数据库高并发场景下的达摩克利斯之剑?
  • Tomcat的参数配置及一般问题的解决
  • node.js来爬取智联全国的竞争最激烈的前十岗位
  • 深入了解以太坊
  • 【译】JS基础算法脚本:字符串结尾
  • AHK 中 = 和 == 等比较运算符的用法
  • Git同步原始仓库到Fork仓库中
  • go append函数以及写入
  • javascript从右向左截取指定位数字符的3种方法
  • js算法-归并排序(merge_sort)
  • Logstash 参考指南(目录)
  • MobX
  • python学习笔记 - ThreadLocal
  • 阿里云应用高可用服务公测发布
  • 精彩代码 vue.js
  • 前端技术周刊 2019-02-11 Serverless
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 数组的操作
  • 算法-图和图算法
  • 我建了一个叫Hello World的项目
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 阿里云移动端播放器高级功能介绍
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 昨天1024程序员节,我故意写了个死循环~
  • #if和#ifdef区别
  • #mysql 8.0 踩坑日记
  • $forceUpdate()函数
  • (poj1.2.1)1970(筛选法模拟)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (南京观海微电子)——COF介绍
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (一)kafka实战——kafka源码编译启动
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .net/c# memcached 获取所有缓存键(keys)
  • .Net6 Api Swagger配置
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET面试题(二)