程序员的七种武器之Editors

编辑器之神 - Vim

VIM is "Vi IMproved"

介绍vim之前,先介绍下vi

vi

vi是一款由加州大学伯克利分校,Bill Joy 研究开发的文本编辑器

如果再往前追根溯源,能从vi的操作中看出流编辑器ed的身影

vi是一款模式编辑器,有一下三种模式:

  1. Command mode
  2. Visual mode
  3. Insert mode

vim

vim 是vi的衍生版本,在vi的基础上改进和增加了很多特性 vi的衍生版本有很多,但是vim是这些版本中易用性最好,可扩展度高,用户基础最大的 一个版本

介绍

Link-org: vim.org Link-wikipedia: Vim(text editor)

如何学习

学习vim最便捷、最高效的方式,就是在阅读vim的文档

在vim输入:help或者:h 查看帮助

模式

vim是模式编辑器,有以下几种不同的模式

Normal mode

打开之后就处于正常模式 用于浏览和修改文本(插入除外),主要是删除、粘贴等

Insert mode

插入模式 这个模式用于正常的写入字符。 在这个模式下,vim的行为和普通的文本编辑器没有太大区别

Visual mode

可视模式 也可以理解为选中模式,相当于选中的高亮的文本处于正常模式下

行选中

V

自由选中

v -> h j k l....

块选中

Ctrl-v

vim块选中

Command-Line mode

按: 进入,一般用于高级的用于操作文件的,比如打开、关闭...

还可以用于高级的编辑

还可以用于设置编辑的选项等等

模式间的转换

Normal->Insert

在normal模式下按下这些键可以进入 insert模式

下面是这些按下这些键,进入insert模式之后光标的位置说明

  • i 光标前
  • I 行首
  • a 光标后
  • A 在行末尾
  • o 在当前行下面新建行进入插入状态
  • O 在当前行之上新建行进入插入状态
  • s 删除光标下的字符进入插入状态
  • S 删除所在行
Normal->Visual

v V C-v

Normal->Command-Line


Visual->Command-Line


Other-mode -> Normal

ESC

编辑

大部分的编辑技巧在于normal状态,Insert状态下

做好提示的配置就可以了

这里只做简单介绍,具体可参考vim的帮助文件

移动

:h usr_03.txt

Normal 模式下的光标移动

- h j k l: 光标往左、下、上、右移动
w b e ge

w 移动到下一个单词的开头 b 上一个单词的开头 e 移动到下一个单词的末尾 ge 移动到上一个单词的末尾

W B E gE

跟w/b/e/ge 的移动方向相同 只不过这里的移动单位不一样,W/B/E/gE将不包含空格的 一串字符认为是一个移动单位 举例:1bcd;abcd;abc9 光标在9的位置时按下B就会跳转到1位置,中间略过了分号

t T f F
0 ^ $
% parenthesis

配对的括号间相互移动

修改 - Making some changes

:h usr_04.txt

oprators

一般大小写之间区别就是:作用范围大小,作用区域相反(一个向前一个向后...)

d D
  • dd 删除一行
  • diw 删除一个单词,不包括单词靠着的空格、括号等
  • D 删除光标到行尾的字符
c C
  • ciw 删除一个单词并进入插入状态
  • C 删除光标到行尾的字符
s S
  • s 删除光标所在字符并进入插入状态
  • S 删除光标所在行并进入插入状态
x X
  • x 删除光标下的字符
  • X 删除光标前的字符
copy and paste

v p ; V p

文本对象

:h objects

命令计数

4w 光标向后移动四个单词的位置

d2w 删除2单词

搜索及替换

这部分涉及到正则表达式的内容

Search

Normal 模式下 按 / 就可以Search :h pattern

Replace

全局替换 :%s/origin/new/options 选中之后替换 :'<,'>s/origin/new/options

高阶使用

:g vimcast

配合ctags

配置部署

cd ~/dotfiles && ./deploy vim

编辑器定制及扩展

files: ~/.vimrc ~/.vim

setting

:h vimrc ~/.vimrc

Plugin
Plugins System

个人推荐使用Vundle,具体可参见我的dotfiles/config_vim/vimrc文件

Writting Plugins

:h usr_41.txt

关于正则表达式

使用vim一定要了解正则表达式,这样会让自己的编辑更有效率 :h pattern

神之编辑器 - Emacs

我个人刚刚接触Emacs编辑器不到半年,所以此处只简单介绍下 我了解的Emacs的特点

学习Emacs的初衷

Emacs 有个模式,org-mode,结构性很强,我发现用它记笔记很方便 于是我就踏上了学习Emacs的不归路

Emacs的学习曲线很陡,而且它的理念跟我用了3~4年的vim截然不同, 因为是无模式的编辑器,要实现某个操作必须按着Ctrl Alt 组合键才能做到,这让我 很不适应,所以,刚接触Emacs,我的内心其实是拒绝的,但是为了org-mode,我艰难 的存活了下来,并且在这过程中学了点Emacs-lisp的编程经验

Ctrl到死的编辑器

Emacs的快捷键很复杂,大多数需要Ctrl Alt Shift 的组合 所以我给它起了个名字,叫Ctrl到死的编辑器

Evil-mode

Emacs下模拟vim操作的包有很多,Evil-mode是目前最流行,我个人认为功能比较 全面的Emacs vim插件。

基于Evil-mode,开源社区衍生出了好多插件,比如evil-leader......

Evil-mode 支持vim的模式编辑、查找替换、快捷键映射等等初级、中级的功能

神神编辑器 - Spacemacs(Emacs + Evil-mode and more)

刚在Emacs中存活下来,我就急不可耐的去找有没有在Emacs中模拟vim 操作的插件,果不其然,已经有人做了这个大轮子:Evil-mode 在使用Spacemacs这套配置之前,我一直是用evil-mode,然后其他功能 依然用Emacs的快捷键,Ctrl到死的操作

如果没有Evil-mode,我学习使用Emacs没有那么快 它是我在Emacs中存活的关键

与Spacemacs邂逅

在我的Emacs配置稳定下来之后,我开始逐渐了解Emacs,为了配置Emacs 我专门花时间学了下common lisp,声明不止,折腾不息。

在github上浏览Emacs相关的内容,高级搜索,按照star从高到低排序这么看, 很快我就发现了Spacemacs 这个git仓库

Spacemacs原理

引用一句名言:

计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决 Any problem in computer science can be solved by another layer of indirection

Spacemacs中很多配置是通过layer来实现的,每层layer约定自己的如下文件:

  1. packages.el --约定layer引用了Emacs哪些package(相当于vim中的plugin)
  2. config.el --顾名思义,选项配置文件
  3. funcs.el --自定义函数
  4. keybindings.el --快捷键绑定
  5. README.org --该layer的说明

而使用Spacemacs这套配置只需要指定自己使用那些layer就可以了。 当然也能够自己创建layer

分层的结果是,配置起来更加规范,如果想禁用或者开启某些功能不用在 很多配置文件中查找了。还有就是Spacemacs对Emacs启动速度做了优化,增加了 缓存和延迟加载,比如启动的时候并不是加载所有layer,而是按照需求来加载相关 的layer,尤其是在Emacs daemon模式下,启动速度更快

Spacemacs使用简单介绍

Spacemacs中有一个key sequences的概念,利用它,我们就可以像 访问应用程序的菜单一样,一级一级的拿到自己想要的功能

比如,在应用里,通常有File->OpenRecentFiles 这个菜单 那么在Spacemacs中就有这样的快捷键:<space>fr,依次按下 空格、f、r,Spacemacs就会在底部打开一个helm buffer,里面是 最近打开的文件。而<space>ff 则代表要打开文件,会让你输入 文件的路径。

通过上面简单的两个例子,Spacemacs的使用跟用鼠标点击菜单栏 的功能是很类似的:

<space> --1.告诉Emacs我要使用菜单了

f --2.告诉Emacs我要使用一级菜单下的Files 菜单项

r --3.告诉Emacs我要使用Files->OpenRecentFiles菜单项,请给我一份最近打开的文件列表

虽然和鼠标操作原理很类似,但是比鼠标操作高效很多很多,而且这些key sequences都是有意义的 很容易记住

当然,这些快捷键菜单是自己可以配置的,具体配置请翻阅spacemace的官方文档

examples

<space>sj --jump in buffer <space>pf --search file in project for open

Spacemacs Asciinema 录屏