说,谁才是最帅的编程工具?

说,谁才是最帅的编程工具?

最近微信后台总收到 Vim 相关的提问,这让我怀疑是不是新一代 Vim 程序员又成长起来了。Vim 是一款非常神奇的编程工具,我从2000年开始使用,历经16载,差不多是杨过苦等小龙女的岁月,几乎每天都会打开这款工具。计算机编程历史持续了数十年,诞生了无数的编程工具,Vim 在其中独树一帜,历久弥新,穿透时光的迷雾,在今天依然闪耀着迷人的光芒,无数技术天才基于 Vim 开发出了伟大的软件产品。

可以说,Vim 是最简朴的编辑器,也可以说 Vim 是最繁复的编程工具,还可以说,Vim 是一款史诗般的编程软件。我们部门编写 PHP、Go 和 Lua 的程序员依然在用 Vim 编程,对有些人来说,Vim 甚至是他们唯一的编程工具,对于运维人员来说,Vim 也是必不可少的工具之一。

以前我在 MacTalk 中零零散散写过一些 Vim 的内容,后来放到了《MacTalk·人生元编程》这本书里,周末拿出来重新整理编排完善,发现居然有近2万字的内容,于是去掉了插件篇和一些「废话」,形成了今天的文章。

想看 Vim 插件篇的,去微信读书搜索 MacTalk,就能找到。

历史

Vim 源于 Vi,但不是 Vi,Vi 作为计算机的文本编辑器历史极为悠远,它是由美国计算机科学家比尔·乔伊编写并于1976年发布的,同年苹果公司成立。我在「传统的黑客——史蒂夫·沃兹」中提到过比尔·乔伊,他是 Sun 公司的联合创始人和首席科学家,一位传奇的技术天才,我个人以为他最伟大的贡献是独立编写 BSD 操作系统,开发 Vi 编辑器,创立 Sun 公司,当然,他还是 Java 语言的主要贡献者之一,任何人有幸完成其中一项工作已经足以名垂计算机发展史,而乔伊则通过一己之力完成了这些科技成果,推动了整个计算机科技的发展。

Vim 诞生的要晚一些,它的第一个版本由布莱姆·米勒在1991年发布,这个兄弟也是一位声名显赫的程序员,80年代买了一台 Amiga 电脑,打开电脑一看,米勒鼻子差点气歪了,居然没有他最常用的 Vi 编辑器!对于米勒来说这是不可接受的。

愤怒的米勒决定自己开发一个文本编辑器,完全复制 Vi 的功能,并起名为Vi IMitation(模拟)。事实证明,天才程序员都具备这种德行,伐开心,就会写个东西出来,要么完善一下,要么创新一下,要么是你写,要么是我写,于是很多伟大的软件程序就发明出来了。随着 Vim 的不断发展,更多更好的功能被加了进来,正式名称改成了 Vi IMproved(增强),也就形成了现代的 Vim,目前最新的稳定版本是7.4,Vim 的开发语言是 C 和 VimScript(后续我们还会谈到这门语言)。

场景

在不同的场景下采用最合适的工具,永远是最佳选择。这时就会有人问,Vim 适合什么场景呢?简单说来,Vim 比较适合 Unix/Linux 服务器端编程,当然,这因人而异。我自己用 Vim 写过 Java、Perl、Python、Lua、Go 等程序,当然编写 Java 程序使用 Intellij IDEA 更多一些。在 Unix/Linux 服务器端编辑和修改文件也离不开Vim,另外,由于我一直用 Mac,所以改个文本读读代码的,也就用 Vim 顺手做了。

很多人觉得不用 Vim 一样一身正气,是的,编写 JavaEE、HTML/CSS/JS、Objective-C,最优方案可能是 Intellij IDEA 和 XCode等,这些优秀的工具可以帮助我们提升效率,减少错误,但是如果你还想更进一步,Vim 值得拥有。

Vim 本身开箱即用,什么都不配置也可以使用其基本功能。如果大家已经掌握了基本操作,以下内容可以帮助你提升效率,打造你的专属 Vim。

编辑模式

Vim 是一款完全面向程序员的软件,活了这么多年我还没有见到过用 Vim 编辑文字的普通用户,如果你是,你一定要告诉我。

写过程序的人都知道,编程的时候双手大部分时间都放在键盘上,或编码、或插入、或移动、或定位、或查找,这种连续操作的时间和频率远远大于阅读、翻页、设置字体、摆弄样式等文案工作,而二者往往产生很多停顿和间隙,而编程时的停顿是非常影响编程效率的,所以 Vim 的设计理念就是通过模式的转换、命令的组合和不计其数的插件,保证程序员在编程的过程中,双手尽可能保留在键盘中央的区域,并且,不需要鼠标。

想用好 Vim,先要理解 Vim 的模式转换。Vim 常用的模式有四种:

  1. 普通模式:Vim 启动后的默认模式,用来移动光标、删除文本、覆盖输入文本、恢复操作、粘贴文本等等。
  2. 插入模式:输入 i 或 a 进入插入模式,在这个模式下敲击键盘会往文字缓冲区增加文字,相当于普通编辑器的编辑模式。
  3. 可视模式:选择文本,可以行选、块选和依次选择,选择后可以进行复制、删除、排序等操作。
  4. 命令模式:执行内部和外部命令,通过「: / ? !」可以进入命令模式,分别对应的是:执行内部命令、向上或向下搜索、执行外部命令。

Vim 的模式和普通的编辑器有所不同,而且命令繁多千变万化,所以初期的学习曲线较高,一旦你坚持练习并且度过了最早的平台期,就会领略 Vim 的妙和全键盘的好。事实上 Vim 除了能够快速编辑文本文件之外,还能够通过简单的命令做更多的事情,所以,「如果你认为Vim只是一个文本编辑器,你就输了!」

举几个例子,大家领略一下 Vim 的风采:

1、如果你想在 Vim 打开的文本中插入一个1到100的序列,执行如下命令:

:r!seq 100

2、如果你想在当前的每一行文字前面增加“序号. ”,那么执行如下命令:

:let i=1 | g /^/ s//=i.". "/ | let i+=1

3、如果你想把当前目录下(包括子文件夹)所有后缀为 java 的文件中的 apache 替换成 eclipse,那么依次执行如下命令: 在当前目录下执行:

vim :n **/*.java :argdo %s/apache/eclipse/ge | update  

使用帮助

Vim 本身提供了非常详细的帮助系统,初学者可以通过帮助手册学习Vim的基础内容。在Vim中输入命令:help,即可进入帮助页面,默认是英文帮助,如果你喜欢看中文,可以通过以下方式安装中文帮助内容:

  • 下载中文帮助的文件压缩包(网上找去)
  • 解压,把doc目录下的文件复制到~/.vim/doc下
  • 确认在.vimrc中设置了set helplang=cn
  • 输入命令:help即可进入中文帮助
  • 输入命令:help user-manual直接进入用户手册

用户手册的界面是这样的:

《说,谁才是最帅的编程工具?》

如何浏览帮助呢?请牢记如下秘籍:

  • 移动: 使用光标键,或者用 h 向左,j 向下,k 向上,l 向右。
  • 退出: 使用 :q<Enter>
  • 跳转到一个主题: 将光标置于标签 (例如 usr_01.txt) 上然后输入 CTRL-]。
  • 跳回: 键入 CTRL-T。
  • 翻页:键入 CTRL-F/B

当然,大家也可以从网上下载 PDF 版本的户手册和帮助文档。

配置

Vim以简洁的方式提供了丰富的配置功能,主要配置体系由一个文件和文件夹组成。在一台安装了Vim的 OS X/Linux/Unix 机器上,进入用户主目录,可以找到.vimrc文件和.vim文件夹,这就是Vim所有的配置信息。

1、.vimrc

用户目录下的.vimrc文件就是Vim针对当前用户的主配置文件,该文件不是必备的,没有的话就创建它。文件位于当前用户的主目录下,可以用 ~/.vimrc 找到,Vim启动时会自动运行文件中的每条命令。

通过.vimrc我们可以为Vim进行个性化配置,包括使用方式、显示风格、编写函数和运行插件等,.vimrc中所有的命令都可以在Vim运行时通过类似 :comm args[=args1] 的方式动态运行,即时生效。

以下是一个.vimrc的样例脚本,包含了一些常用配置,后面的注释是简要说明。

.vimrc的注释用双引号(”)表示 ,样例中的大括号仅表示功能区,属于注释的一部分,无其他含义

.vimrc的配置非常丰富,可以定义各种宏、函数、插件和映射,我见过最长的.vimrc配置有1000多行,这里的示例比较简单,适合入门级用户

syn on                      "语法支持  "common conf {{             通用配置 set ai                      "自动缩进 set bs=2                    "在insert模式下用退格键删除 set showmatch               "代码匹配 set laststatus=2            "总是显示状态行 set expandtab               "以下三个配置配合使用,设置tab和缩进空格数 set shiftwidth=4 set tabstop=4 set cursorline              "为光标所在行加下划线 set number                  "显示行号 set autoread                "文件在Vim之外修改过,自动重新读入  set ignorecase              "检索时忽略大小写 set fileencodings=uft-8,gbk "使用utf-8或gbk打开文件 set hls                     "检索时高亮显示匹配项 set helplang=cn             "帮助系统设置为中文 set foldmethod=syntax       "代码折叠 "}}  " conf for tabs, 为标签页进行的配置,通过ctrl h/l切换标签等 let mapleader = ',' nnoremap <C-l> gt nnoremap <C-h> gT nnoremap <leader>t : tabe<CR>  "conf for plugins {{ 插件相关的配置 "状态栏的配置  "powerline{ set guifont=PowerlineSymbols for Powerline set nocompatible set t_Co=256 let g:Powerline_symbols = 'fancy' "} "pathogen是Vim用来管理插件的插件 "pathogen{ call pathogen#infect() "}  "}}

2、 .vim

.vim是Vim的主配置文件夹,位于当前用户的主目录下,可以用 cd ~/.vim 进入。该文件夹一般用来放置插件和相关的帮助文档,常用的目录结构包括:

doc                           //帮助文档目录 autoload                      //Vim启动时自动加载的插件目录 plugin                        //插件目录,一般在使用Vim时通过命令呼出

当然,如果你已经安装了足够多插件,那么这个目录下就会变得五花八门,syntax、snippets、indent等文件夹都会冒出来了。一个插件所包含的文件往往会分布在多个文件夹下,管理起来比较麻烦,稍后我们会介绍两个管理插件的插件,让这个目录变得干净整洁,容易管理,这两个插件的名字叫 pathogen 和 Vundle

基本概念

下面我们来介绍一下Vim中的几个基本概念:Buffer(缓冲区)、Window(窗口)和Tab-page(标签页)。

1、Buffer:很多读者问,用 Vim 打开文件后,文件内容存哪了,每次修改都要读写硬盘吗?显然不会每次编辑都写硬盘,事实上Vim打开的文件都会被加载到内存中,在内存中我们使用 Buffer 来描述正在编辑的文件,一个Buffer对应一个被编辑的文件副本。当我们在完成了一个Buffer的编辑后就可以保存该文件。Buffer不仅包含了文件的内容,也记录了该文件的编辑状态等配置信息,比如激活、隐藏、上次编辑行数等。

用Vim可以打开多个文件同时编辑,也可以把不需要的文件关掉,但这时文件副本依然保存在缓冲区中,我们可以通过 :ls 或 :buffers 查看这些Buffer,还可以通过类似 :buffer n 的方式重新打开文件(n表示Buffer的序号)。当然,我们有更好的方式来处理这些Buffer,那就是 CommandTBuffer,要想使用 CommandTBuffer,先要安装 CommandT 插件,请大家记住这个插件的名字,我们以后会用到。

2、Window:是对应Buffer的一个展示窗口。一个Buffer可以对应多个窗口,比如我们可以通过 :split filename 或 :vsplit filename 命令在多个窗口打开一个文件,当修改某一个窗口的文件时,其他窗口都会同步更新。当然我们也可以在多个窗口打开多个文件,编辑后用 :wq 保存退出,但是记住,只要没有最终退出 Vim 进程,那么这些打开的文件 Buffer 依然保存在缓存区中,可以随时再次打开。

3、Tab-page:Tab-page 就比较容易理解,对应一组窗口,我们可以通过 :tabedit filename 在另一个标签页中打开一个文件,在这个标签页中又可以打开多个窗口。

下图清晰的表达出 Buffer、Window 和 Tab-page 的关系。

《说,谁才是最帅的编程工具?》

理解了这三个概念和三者之间的关系,对我们用好 Vim 有非常大的帮助。

几个小技巧

1、打开 Vim之后,可以用 :split filename 或 :vsplit filename 或 new filename 横向或纵向切割窗口,使用 ctrl + w 可以在个窗口之间跳转,使用 ctrl + 方向键可以按照方向切换窗口。

2、用 Vim 打开一个文件,如果我们想实现所有文本行翻转,那么可以执行如下命令:

:g/^/m 0

3、在 Vim 中统计文本行数和当前光标的位置,可以使用 ctrl + g,统计字节数,可以使用 g + ctrl + g

4、对文本进行简单排序:

用 shift v 选中多行文本,输入 : !sort,看看效果如何。

5、如果你想把当前目录下(包括子文件夹)所有后缀为 java 的文件中的 apache 替换成 eclipse,那么依次执行如下命令: 在当前目录下执行:

vim
:n */.java
:argdo %s/apache/eclipse/ge | update

第四个技巧之前提到过,解释一下,这就用到了 buffer 的概念,通过正则表达式在内存中打开多个文件,argdo 表示在内存中执行 Vim 的命令,%s/apache/eclipse/ge 表示在内存中执行字符串替换,g 表示全局替换,e 表示如果文件中没有可替换字符串不报错继续执行,| 是管道标识符,update 表示替换完之后更新并写入文件。

Vim 是一款越用越爱的编辑器,看了这篇文章,希望你也能爱上 Vim,它的名字叫做「唯快不破」。

整理完这篇文章,已经周六下午4点多了,不过距天黑尚有不少时间,所以我去睡了个午觉。

那么,你用过哪些好用的编程工具呢?可以在评论里说说。

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据