名校课程推荐 | MIT《CS 实用工具课程》-编辑器
编辑器
编辑器的重要性
对于技术工程师来说,我们大部分时间都在编辑明文文件,所以花点时间掌握一个适合自己需求的编辑器是很值得的。
你一般如何学习使用一个新的编辑器?你会强迫自己使用这个编辑器一段时间,即使它会暂时影响你的工作效率,但很快就会适应它(两周时间足够学习基本知识了)。
我们这里会讲Vim编辑器,同时也鼓励你们体验其他编辑器,这取决于你们自己的选择。程序员们对自己使用的编辑器也都有着非常强的执念。
由于不可能在50分钟内教你学会一个编辑器的所有功能,我们会主要专注解释它的基础知识,并展示部分高级功能,然后告诉你们掌握这个工具所需要的资源。我们这堂课讲的是Vim编辑器,但大部分思想都可以转换到你目前使用的其他编辑器上(如果不能适用到你的编辑器上,那你可以考虑弃用它了)。
上图编辑器们的学习曲线就很迷。学习一个编辑器的基础知识很简单(尽管可能需要几年的时间才能掌握)。
目前什么编辑器比较流行?看一下这个 Stack Overflow调查(可能会有失偏颇,因为Stack Overflow的用户并不能代表所有程序员)。
命令行编辑器
即使你最终决定使用GUI编辑器,也值得花时间学习一下命令行编辑器,以便在远程机器上轻松编辑文件。
Nano
Nano是一个简易上手的命令行编辑器。
用方向键移动
底部显示所有其他快捷方式(保存、退出等)
Vim
Vi/Vim是一个功能很强大的文本编辑器。它是一个命令行程序,通常在任何地方都有安装,有了它在远程设备上编辑文件就会很方便。
Vim还有图形版本,比如GVim和MacVim。它们有额外的功能,比如24位颜色、菜单和弹出窗口。
Vim的设计逻辑
在进行编程时,大部分时间都花在阅读/编辑而不是写代码
- Vim是一个多模态编辑器,它对于插入文本和操纵文本有不同的模式
Vim是可编程的(可以用Vimscript以及类似Python的其他语言进行编程)
Vim的接口本身就像一种编程语言
用键入输入(以及其助记名)命令
命令是可组合的
不要使用鼠标:太慢了
编辑器应该能跟得上你的思维速度
Vim入门
模式
Vim在左下角显示当前模式。
普通模式:用于在文件中移动和编辑
- 大部分时间都是这个模式
插入模式:用于插入文本
可视(一般、行或块)模式:用于选择文本块
你可以按<ESC>
从任何其他模式切换回普通模式。在普通模式下,输入i
进入插入模式,输入v
进入可视(一般)模式,输入大写V
进入可视行模式,输入<C-v>
进入可视块模式。
使用Vim时你会经常用到<ESC>
键,可以考虑把CapsLk(大小写锁定键)重映射成<ESC>
键。
基础操作
在普通模式下Vim ex命令通过:{command}
的形式发布
:q
退出(关闭窗口):w
保存:wq
保存并退出:e {文件名}
打开要编辑的文件:ls
显示打开的buffer:help {标题}
打开帮助文档:help :w
打开:w
ex命令的帮助文档:help w
打开w
移动的帮助文档
移动
Vim中的移动是很高效的。在普通模式下使用移动命令浏览文件。
禁用方向键避免习惯干扰
nnoremap <Left> :echoe "Use h"<CR> nnoremap <Right> :echoe "Use l"<CR> nnoremap <Up> :echoe "Use k"<CR> nnoremap <Down> :echoe "Use j"<CR>
基本移动:
hjkl
(左,下,上,右)词:
w
(下一个词),b
(词首),e
(词尾)行:
0
(行首),^
(第一个非空字符),$
(行尾)屏幕:
H
(屏幕首行),M
(屏幕中间),L
(屏幕底部)文件:
gg
(文件头),G
(文件尾)行数:
:{行数}<CR>
或者{行数}G
(行{数})杂项:
%
(对应项)查找:
f{字符}
,t{字符}
,F{字符}
,T{字符}
- 在当前行中向前/向后查找(find/Find)/前往(to/To){字符}的位置
重复N次:
{number}{movement}
, 比如10j
向下移动10行搜索:
/{regex}
,用n
/N
在结果中切换
选择
可视模式:
可视化
可视化行
可视化块
可以使用移动按键来选中文本
操纵文本
所有以前需要用鼠标做的事,现在都可以用键盘(以及强大的命令组合)来完成。
i
进入插入模式- 但是对于操纵/删除文本,除了退格之外还有更多方法
o
/O
在上一行/下一行插入行d{motion}
删除{motion}- 例如,
dw
删除词,d$
删除到行尾,d0
删除到行首。
- 例如,
c{motion}
修改{motion}例如,
cw
是修改词相当于把
d{motion}
之后接i
x
删除字符(等同于dl
)s
替换字符(等同于xi
)可视化模式+ 操作
- 选中文本,用
d
删除或者用c
修改
- 选中文本,用
u
撤销,<C-r>
恢复还有更多: 比如
~
改变字符的大小写
资源
vimtutor
是Vim 安装时自带的教程Vim Adventures 是学习使用Vim的一个游戏
自定义Vim
Vim 通过一个位于 ~/.vimrc
的文本配置文件(包含Vimscript命令)进行自定义。可能有很多你想启用的基础设置。
你可以在GitHub上参考其他人的配置文件,但不要直接复制粘贴别人的整个配置文件。看完他们的配置文件之后自己消化理解,然后取你需要的部分。
一些可以考虑的自定义:
语法高亮显示:
syntax on
配色方案
行号:
set nu / set rnu
退格键何时可以删除光标之前的字符:
set backspace=indent,eol,start
Vim进阶
下面的几个例子可以进一步展示Vim编辑器的厉害之处。我们不能把所有内容都教授给你们,你们可以自己在使用过程中慢慢学习。如果你在使用编辑器的过程中认为"一定有更好的方法来实现这个",很可能真的就有,方法就是上网查找。
搜索和替换
:s
命令用来查找和替换字符串。
:%s/foo/bar/g
- 在全局范围(%)查找foo 并替换成bar
%s/\[.\*\](\(.\*\))/\1/g
- 将命名的Markdown 链接替换成简单URLs
多窗口
用
sp
/vsp
拆分窗口同一个buffer可以在多个窗口中显示
鼠标支持
set mouse+=a
- 可以点击、滑动选择
宏命令
q{character}
开始在寄存器{character}
中录制宏q
停止录制@{character}
重放宏宏命令遇错会停止
{number}@{character}
将宏执行{number}次宏可以是递归的
首先用
q{character}q
清空宏录制宏时,用
@{character}
来递归调用宏(在录制完成之前不会有任何操作)
例子:将xml 转成json (文件)
一个对象数组,键为"name"/"email"
要使用Python 吗?
还是用sed /regexes?
g/people/d
%s/<person>/{/g
%s/<name>\(.\*\)<\/name>/"name": "\1",/g
…
Vim 命令/宏
Gdd
,ggdd
删除第一行和最后一行格式化一个元素的宏(使用寄存器
e
)跳转到有
<name>
的行qe^r"f>s": "<ESC>f<C"<ESC>q
格式化一个对象的宏
跳转到有
<person>
的行qpS{<ESC>j@eA,<ESC>j@ejS},<ESC>q
格式化一个对象然后跳转到下一个对象的宏
跳转到有
<person>
的行qq@pjq
执行宏到文件尾
999@q
手动删除最后的
,
然后加上[
和]
分隔符
扩展Vim
Vim有很多扩展插件。
首先,设置一个插件管理器比如 vim-plug, Vundle, or pathogen.vim
一些插件:
ctrlp.vim:文件模糊查找
vim-fugitive:git集成
vim-surround:操纵"环境"
gundo.vim:撤销树
nerdtree:文件浏览器
syntastic:语法检查
vim-easymotion:魔术操作
vim-over:替换预览
插件列表:
其他程序的Vim模式
对于很多流行的编辑器(如vim和emacs),很多其他工具都支持编辑器模拟。
Shell
如果你是Bash 用户,用
set -o vi
如果你用Zsh,用
bindkey -v
export EDITOR=vim
(git
等程序使用的环境变量)
~/.inputrc
set editing-mode vi
网络浏览器也有vim按键绑定扩展,一些流行的扩展:谷歌Chrome的Viimium和火狐的Tridactyl。
资源
Vim Advent Calendar:各种Vim 技巧
Neovim is a modern vim reimplementation with more active development.
Vim Golf:各种Vim难题
练习
尝试一些编辑器。尝试至少一个命令行编辑器(如Vim)以及一个GUI编辑器(如Atom)。通过
vimtutor
(或其他编辑器的同样教程)这类教程学习使用编辑器。要对一个新编辑器有感觉,你需要连续几天使用这个编辑器进行你的任务。定制你的编辑器。参照在线的提示和技巧,以及其他人的配置(通常他们都有详细的文档)。
尝试为你的编辑器添加插件。
使用一个功能强大的编辑器至少几个星期,使用几个星期后你就应该能看到它的好处了。在某些情况下,你应该让编辑器的工作速度跟得上你的速度。
安装一个代码分析包(例如python的三方包pyflakes)链接到你的编辑器,并测试它是否工作。