vim 快速入门

作者:

王然 kxxoling@gmail.com

vim 简介

在这个蔚蓝色的星球上,流传着两大神器的传说:Emacs是神的编辑器,而Vim是编辑器之神。

VIM , 全称 Vi Improved , Vi的增强版 。

Vi 在 1976 年发布,奉行 Unix 传统的“Do one thing and do it well”哲学,每个程序只做一件事但做到最好,通过程序之间的配合得到强大的功能。

Emacs则奉行“Everything at reach”设计哲学,通过强大的扩展性,达到在一个软件里做所有的事。Emacs可以用来编辑文档、时间管理、浏览图片、阅读pdf、听音乐、写程序、运行程序、调试程序、接受发送邮件、看新闻组、玩游戏、管理系统、Telnet/FTP、版本控制、写LaTex…被称为“伪装成编辑器的操作系统”。

江湖中有一句话: “ 世界上的程序员分三种,一种使用Emacs,一种使用Vim,剩余的是其它” 。

基本概念

Vim 有两种模式——Normal 模式和 Insert 模,所有命令都是在 Normal 模式下执行。启动 Vim 后,默认进入 Normal 模式, 可以按 i 键进入 Insert 模式,或者 s 删除当前字符并进入 Insert 模式,退出 Insert 模式进入 Normal 按 ESC 。

下面的教程中约定 + 表示同时按其左右的按键,小写字母(如 i)表示按该字母一次,大写字母(如 G)表示同时按 shift+g。

基本用法

  • i insert 输入

  • v 行选中

  • ctrl+v 列选中

  • G 至文末

  • gg 至文首

  • :q 未修改退出

  • :q! 强制不保存退出

  • :x / :wq 保存并退出

  • J 合并多行

  • d 删除当前所选

  • dd 删除多行并存在剪贴板中(剪切)

  • y 复制当前所选

  • yy 复制整行

  • p 粘贴

  • u 撤销操作

  • w 光标移动到下一个单词处

  • b 光标移动到上一个单词处

  • ^ 光标移动到行首

  • $ 光标移动到行尾

  • kjhl 或者上下左右键移动光标

  • shift+上下键 翻页

  • shift+左右 光标乙至上/下一个单词(以空格/标点区分单词)词首

  • u 撤销上一步操作

  • zo/zn/zc 折叠/展开代码块

  • :vsp 新建工作区

  • ctrl+w 松手后再按 方向键 切换工作区

  • :MR 选择最近打开的文件(需安装插件)

  • F12 运行当前文件

  • # 搜索光标处短语

  • :set paste 进入粘贴模式

  • :%s/target/something/g 替换全部 target 字段

  • :s/target/something/g 替换选中区域 target 字段

组合用法

注释大段文字

  • 光标移至行首

  • I 进入插入模式

  • 输入注释符号

  • 双击 ESC

如何配置

VIM as an IDE

进阶文档

简明 Vim 练级攻略

vim名词解释

模式

vim有5中基本模式,分别是

  • Normal Mode 也就是最一般的普通模式,默认进入vim之后,处于这种模式。

  • Visual Mode 一般译作可视模式,在这种模式下选定一些字符、行、多列。 在普通模式下,可以按v进入。

  • Insert Mode 插入模式,其实就是指处在编辑输入的状态。普通模式下,可以按i进入。

  • Select Mode 在gvim下常用的模式,可以叫作选择模式吧。用鼠标拖选区域的时候,就进入了选择模式。 和可视模式不同的是,在这个模式下,选择完了高亮区域后,敲任何按键就直接输入并替换选择的文本了。 和windows下的编辑器选定编辑的效果一致。普通模式下,可以按gh进入。 ps:这种模式好无用啊

  • Command-Line/Ex Mode 就叫命令行模式和Ex模式吧。两者略有不同,普通模式下按冒号(:)进入Command-Line模式,可以输入各种命令, 使用vim的各种强大功能。普通模式下按Q进入Ex模式,其实就是多行的Command-Line模式。 ps:经常使用EX模式的都是神阶vimer

注:本文中所说的快捷键若无特殊说明则是Normal Mode下的模式

Windows/窗口

vim可以将窗口分成好多个独立的块来显示不同的文件,我们把这些块叫做窗口。当然你可以选择竖着分或者横着分,横着分的叫做split window,竖着分的叫做vsplit window。

Tab/标签页

就像chrome的标签页一样。

Buffer/缓冲区

缓冲区(Buffer)是一块内存区域,里面存储着正在编辑的文件。如果没有把缓冲区里的文件存盘,那么原始文件不会被更改。 可以通过:ls或:buffer命令查看缓冲区


插件

Vundle插件管理器

Vundle的功能是用于安装和管理其他插件,它能够直接从github上下载并自动安装置顶的插件。其本身也托管在github上,我们可以使用下面的命令快捷的安装它。

git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim

然后只需要在.vimrc文件中写入要安装的插件然后在vim中运行Vundle的插件安装命令就可以自动下载安装指定的插件了。 更详细的使用方法可参考Vundle的文档

MRU最近打开的文件

MRU的功能是从底部弹出一个最近打开的插件列表,其默认启动命令是:MRU,为了使用方便我将其设为mr。

nerdtree文件目录树

nerdtree是一个用于显示目录树的工具默认启动方式是:NERDtree,好难打的样子,所以我把它设成了nt。

关于这个插件有一个非常实用的设置是它可以忽略指定类型的文件,例如我们希望将所有的pyc或者其他没用的文件从目录树中过滤调的时候就可以使用它的这个功能,就像这样

let NERDTreeIgnore=['\.pyc$', '\~$']

它在github上的readme比较渣,没有介绍什么具体的用法和功能,我这里列出一些我用过的,还有一些大家可以通过:help Nerdtree查看。

  • o.......打开文件并将焦点移动到打开的文件或展开当前文件夹

  • Enter...跟o一样

  • go......跟o一样,但将焦点留在NerdTree

  • t.......在新tab中打开文件

  • T.......同t,但保留焦点

  • i.......在一个新的 split window中打开文件

  • gi......同i,保留焦点

  • s.......在新的 vsplit 窗口打开文件

  • gs......同s保留焦点

  • O.......递归打开当前文件夹

  • x.......关闭当前文件夹的父文件夹

  • X.......递归关闭当前文件夹

  • P.......跳到根目录

  • p.......跳到当前目录的父目录

  • q.......退出NerdTree

CtrlP模糊搜索文件

CtrlP是一个用于模糊搜索文件的插件,其文档比较健全看看它的readme就能学会其用法,而且其默认启动快捷键就是Ctrl+p。

其跟NerdTree一样,也可以在split(Ctrl+s)和vsplit(Ctrl+v)窗口以及新tab(Ctrl+t)打开文件。

还有一个使用的设置就是忽略指定类型文件,像这样

let g:ctrlp_custom_ignore = {
    \'file' : '\v\.(pyc|html\.py)$',
    \}

ag和CtrlSF

ag是一个linux下非常好用的代码搜索工具(代码在github上需要手动安装),它可以快速搜索你的代码内容。vim的ag插件允许我们在vim中使用ag命令搜索代码,CtrlSF插件跟ag插件的不同在于前者可以显示代码的上下文,显然是CtrlSF更为强大。

CtrlSF的默认命令就是:CtrlSF,然后输入要搜索的字符再敲回车。好难打,好难用,所以我设置了下面的快捷键:

nmap <C-S>f :CtrlSF
nmap <C-S>o :CtrlSFOpen<CR>
nmap ss :CtrlSF <C-R><C-W><CR>
vnoremap ss y:CtrlSF <C-R>"<CR>
  • Ctrl+s+f................适用于normal模式,就跟:CtrlSF一样

  • Ctrl+s+o................适用于normal模式,打开搜索结果的窗口

  • ss......................适用于normal模式,搜索当前光标所在的单词

  • ss......................适用于visual模式,搜索当前选中的文字

tpope/vim-commentary 批量注释

这货可以批量注释代码,就像eclipse的Ctrl+j一样。当然你以可以使用选中再批量插入的方式开实现批量注释,但你需要按5个键(Ctrl,v,Shift,I,Est)而commentry只需三个键就可以了。

首先,我们设个快捷键以及将python的注释符设为#

vnoremap <Backspace> :Commentary <CR>
autocmd FileType python set commentstring=#\ %s

这样在可视模式选中要注释的内容后可以按退格键批量注释,再次选中按退格键就解除注释。

Syntastic语法检查

该插件的功能是检查和标记语法错误及不规范的问题,在我们的项目下

supertab,补全插件

vim-coffee-script,CoffeeScript语法高亮

mako.vim,mako语法高亮

vim-mercenary 支持hg blame和diff

vim-colors-solarized 漂亮的颜色主题

luochen1990/rainbow 彩虹括号,匹配的括号显示为同一颜色

godlygeek/tabular 自动对齐

hynek/vim-python-pep8-indent python自动缩进

indentLine垂直缩进对齐线

MatchTag高亮显示匹配的html标签

移动

  1. :[n] 移动光标当第n行。

  2. H,M,L 分别移动光标到当前屏幕首行,中间行和尾行。

  3. Ctrl+f和Ctrl+b向下和向上翻页,相当于pageup和pagedown。

  4. h,j,k,l向左下上右移动一个字符。

  5. f和F加字符,将光标移动到下一个或上一个该字符的位置,例如fa会将光标移动到下一个a的位置。

  6. m设定标记,`跳转到指定标记。例如可以用ma在某行设定标记,再使用`a跳转到改行。

  7. shift+左右 光标移至上/下一个单词(以空格/标点区分单词)词首。

  8. w 光标移动到下一个单词处

  9. b 光标移动到上一个单词处

  10. ^ 光标移动到行首

  11. $ 光标移动到行尾

插入

  1. a和i分别在当前字符前和后插入。

  2. A和I分别在当前行尾和行首插入。

  3. 批量插入。首先在可视模式下选中要插入的行,然后按I可在选中处之前批量插入字符

复制、粘贴、替换和删除

  1. r可以替换当前字符。

  2. yy和dd可以分别复制和剪切当前行。

  3. y2y和d2d可以分别复制和剪切当前行开始的2行。

  4. :3,8y和:3,8d可以分别复制和剪切第3到第8行。

  5. yw和dw可以分别复制和剪切光标所在的单词。

  6. d(可视模式) 删除当前所选

  7. dd 删除多行并存在剪贴板中(剪切)

  8. y 复制当前所选

  9. p 粘贴

分屏相关

  1. :vsp和:sp分别竖着和横着分割当前窗口。

  2. Ctrl + v和Ctrl + s也可以竖向和横向分屏。

  3. Ctrl + w + 箭头键(hjkl)在不同窗口键移动。

  4. Ctrl + = 将所有的窗口大小调成相同大。

查找和替换

  1. / + 要搜索的内容搜索。

  2. n和N跳到下一个或上一个搜索结果。

  3. # 搜索当前光标所在的单词。

折叠代码

  1. zc,zC,zo,zO折叠或打开折叠当前行的代码,其中大写Z和O表示折叠或打开折叠所有层。

  2. zn,zm折叠或打开折叠当前文件的所有代码。

定制的快捷键

  • F12..................运行python文件或使用zencode补全html

  • F11..................格式化代码

  • F5,F6,F7,F8..........调整窗口大小

  • Ctrl+s+f.............使用ag搜索

  • Ctrl+s+o.............打开ag搜索结果

  • ss...................使用ag搜索光标所在的单词

  • ss(可视模式).........搜索选中的单词

  • Backspace(可视模式)..注释/解除注释代码

  • nt...................打开NerdTree

  • mr...................打开MRU

  • tl...................打开taglist

  • bn...................打开下一个buffer

  • bp...................打开上一个buffer

其他

  1. u和CTRL+r分别是undo和redo的功能。

  2. :set nu和:set nonu分别为显示和不显示行号。

  3. Shift + < 或 >分表表示向左或向右缩进一层,也可以选中后批量缩进。

  4. n + Shift + < 或 >可批量缩进n层。

  • i insert 输入

  • v 行选中

  • ctrl+v 列选中

  • :q 未修改退出

  • :q! 强制不保存退出

  • :x / :wq 保存并退出

  • J 合并多行

  • shift+上下键 翻页

  • :set paste 进入粘贴模式

  • :%s/target/something/g 替换全部 target 字段

Vim 实用技巧

http://segmentfault.com/q/1010000000166577 文字

vim-multiple-cursors Sublime Text 支持多个光标选择功能,在重构时非常有用。这个插件将 Sublime Text 中的这个邪恶功能引入了 Vim。想要修改变量名时,只需要将光标放在变量名内,然后多次敲击 Ctrl + n,即可将多个同名变量选中,此时再按 s 就能同时将这些变量重命名了。

http://doc.42qu.com/school/vim.html?highlight=vim