初级篇

很多基本的vim命令,能够在网上找到教程,这里就不啰嗦了,直接给链接。对于初级水平的VIm练习者,可以从 简明Vim 练习攻略 <http://coolshell.cn/articles/5426.html>`_开始,包含了简单的晋级练习. 如果英语好,也可以直接看原文 `Learn-Vim-Progressively . vim 自身也有很好的教程, 直接查询usermanual中 getStarted 教程,从user_01.txt ~ user_45.txt 逐节练习就行了。这里只介绍网上很难找到或者找不到的、原理理解与提高,以及常见的困惑。

练习vim 的第一个要适应的是 hjkl 的使用。网上已有热心的vim fan提供了一个小游戏来练习了,http://vim-adventures.com/ 当然如果你觉得自己一的vim水平还可以,也可以来自测一下自己的VIm水平 Best of Vim Tips . 这是一个用了vim 22年 老法师的总结,看看你能看懂会用多少。如果能看懂40% 说明你已经过了初级了.

安装

对于ubuntu用户来说直接 apt-get install vim 就可以了。对于window用户需要从 www.vim.org 下载安装。

:version 可以给出这个版本的详细信息

vim 工作模式与原理

入门问题

这里要解决就是如何修改阶段,的快速精处处理。

工作模式

vim 主要模式有以几种,为什么要区别这些模式,给你一个notepad,然后你想实现一些功能,不是通过菜单项来实现(这个是常见的windows模式),另一种那快捷键模式,emacs/vim都是采用快捷键的模式,功能众多,如何组织这些快捷键,vim 采用模式+单字符的快速键,emacs采用的组合键的模式。相比较而言,vim的按键次数要少于emacs.

vim mode
mode abbr remark      
Normal mode n 默认的模式,不可以编辑,但可以上下左右移动以及跳转      
Visual mode v 编辑选择模式,把它翻译成选择模式会有助于理解 这个对于块操作会特别有用,可以按行选,也可以按列选,以及按照字符选择      
Insert mode i 这个就是一般编辑器可以输入文字了      
Command-line mode c 就是那些Ex commands(”:”) 以及搜索/ ? filter command(!).

当你学会了基本了 hjkl 之后,以及简单的编辑之后,你并不会觉得这样操作与别的编辑器有什么区别呢。并且你也会觉得这样会也没有多快。

vim 的字词句

字词句是一个抽象说法,vim主要擅长英语字符的处理,还是按照英语的单位来讲。也正是因为有了这些逻辑结构才使vim 变得强大。一般的编辑器是没有这些概念的。例如Word里才有了段落的概念。一些类似word的处理都是需要标记语言来实现格式排版的。vim仅依靠这些基本的概念就能够一些基础的排版了。具体的排版指令见 help = . 并且逻辑块的概念之后,可以用有 折行 的功能。 但是vim 没有页的概念,所以也不能显示页号的操作。 学习这一部分同时参考 user_03.txt .

vim 的文本单位
Name Abbr Remark
字母letter l 单个字母
单词 w 以空格
( ) 与标点符为分隔符
{ } 以空行为分隔符
  以换行符为分隔符
  窗口屏幕的大小 的为单位

更多的文本的单位可以参考 h objects. 现在能看懂这些了吧。

Text object motions/selection aw,iw,aW,iW,as,is,ap,ip,],),ab,<,at,....

以后移动编辑都是这些单位的,除了字母本身,没有头与尾之外。其他几个单位都是有的。 以前都是按行操作,结构化,定义好分界符是可以 按块操作 ,:g,:v都可以。

edit command :header:”Name”, “Remark”
修改 c C s S
插入 i/I
跳转 [ ‘ %
查找 / ? * # f t
删除 x d
复制 y Y
粘贴 p P

有了这些,就可以精确的跳转。再加上Visusal mode 就可以精确的选择了。 vim 命令操作标准模式。

range:command:parameter

  1. 在不同场景模式range会不同默认值
  2. 大部分命令的会有大小写两种,意义是不一样的

命令分类

光标的移动

下面仅以移动为例,其他的命令以此类推

字母的移动

h l 是默认是按照letter移动, 如何一次移动 5字符呢,试试 5h . 是不是向前移动了5个字符,参考上面的命令格式去理解。 下面各种逻辑单位的移动也都是这样的加前缀的来重复的。

单词的移动

w e b, 是单词移动,w 是移到下一个单词,b 是移动单词的开头, e 移动单词的结尾

句子的移动

W 是句子移动, 同上 W 是移到下一个句子,B 是移动句子的开头, E 移动句子的结尾

段落的移动

{ 向前移一个段落 ,} 向后移一段落

在跳转指令 [ { 就会跳到最近的{ 里。这在类c语言的编程语言里直接代码块的开始与结尾的非常方便。

行的移动

jk 是默认单行移动,10j 向下移10行。 0 行首, $ 行尾, ^ 行首第一个非空字符, _ 行尾最后一个非空字符

屏的移动

ctrl+F 向下滚一整屏,ctrl+B 向上滚一整屏,ctrl+D 向下滚半屏, ctrl+U 向上滚半屏,ctrl+Y 向下滚一行,ctrl+E 向上滚一行。

因为vim没有页的概念,你可以把屏当做页来用吧。

跳转
行内跳转

f 正向找, t 是反向找,当然前面也是可以加数字的。例如 2fa 打到当前行中第二个a. 这些命令什么会用到,当一行特别长的时候就会用到,直接跳转你又怕弄错了行。 当一行不不超过20字符时,可能用途不大了。

行的跳转

gg 跳到第一行,G 到最后一行。 100gg 跳到第100行。 50% 跳到50%处,这个是行数计算的百分比。

对于:ed 命令都是基于行来操作。:ed 命令后面会有专门的讲。

块的跳转

% 跳转匹配的括号,这个是对于查找括号缺失的时候非常的方便。 [{ 跳到块首,[} 跳转到块尾。 当然 [ 在不同的编程言下有不同的用途,可以查看各种tag,具体可以查看 help [.

屏内的跳转

zt 跳到屏幕的首行,zb 跳到屏幕的尾行,zz 跳到屏幕中央,这个一条最有常用。

另一条常用的命令那就是打开折行 zr 具体可以参考教程 :help user_28.txt.

任意的跳转

/ 通过搜索来跳转,至于正则表式放在正则表达式来讲。这里后些特殊特别有用法。这个命令前面同样可以加数字,例如 2/abc 从当前位置开始搜索第二个 abc. /abc/;/123/, 找到abc之后再找123. 其实个是特定位置的升级端,前面指定位置要靠行号,现在可以利用正则表达式来指定起始位置。

/test/e 跳到匹配的词尾 ,再试一试 /test/+1, /test/s+2, /test/b-3. /%>199l%<300llimit 在199行与300行之间找limit

注解

当然跳转不仅这些,例如 buffer 之间的跳转,以及文件的之间的跳转,以及基于tag的跳转。

对于修改指令简单说一下,也都是可以操作这些逻辑单位为基础的 caw, 修这个单词,同时对比 cw c3w 以及 c/abc. 以及这些以上命令混合使用。

dd 删除一行, d3l 删除三个字符,3dd 删除三行。

g ctl+G 对于复制粘贴 类似于删除,自行去试一试。 yy 复制一行, y3l 复制三个字符 3yy 复制三行。 pp 粘贴一行, p3l 粘贴三个字符 3pp 粘贴三行。

在vim是没有剪切命令,是由删除命令与粘贴复制组合的。因为vim 的删除命令自动把删除的内容放在ring buffer中,这个ring buffer,保存最近十次的删除,分别用0-9表示。关于寄存器的具体用法会在中级篇里详细的讲。

注解

paste :set paste Put Vim in Paste mode. This is useful if you want to cut or copy
some text from one window and paste it in Vim. This will avoid unexpected effects. Setting this option is useful when using Vim in a terminal, where Vim cannot distinguish between typed text and pasted text.
选择操作

前面所讲的移动与跳转命令都在 Vsiual Mode 都是适用的。在 Visual Mode 下还有几个特殊的操作 '< 代表选中块的块首,command:‘>`代表选中块的块尾。 :command:`ctrl+o 可以选中块的块首与块尾之间跳转。

按字符选 v. 按行选 V. 按列选 ctrl+V. 如何精确选列 \%<20c 前20列

如何知道自己选择了多少行呢。 :set showcmd 就可以在状态栏看到了。

vim 配置管理

玩Vim的人都会改vim 配置,但是做的好没有几个。大部分都是在网上抄一段,直接放在.vimrc文件里,最后这个文件奇大无比,vim的启动也变得很慢。这个还是还好的,更烦的是配置冲突,例如对.c文件的配置与.java是冲突的,(这里有两个假如,假如这些.c 用四个字符缩进的,而.java是用3字符缩进的)。于是有人就每次手工去改vimrc,每切换一次环境就重写一次。很是麻烦,其实vim早就解决了这个问题,只是大部分人没有深入了解而己。 这一节的主要内容

引用各节标题(这是什么?)

vim 配制文件路径

要知道配置在哪里, 直接 :help vimrc 就可以找到,vim的配置文件分两层,global and local。 linux 中的 global 文件一般在 /etc/vim/vimrc 或者 /usr/share/vim. local 文件一般都在:file:$HOME/.vim/vimrc 下面。 Windows 中 global 一般在 $VIM/vimrc 路径一般是在 C:Program Files (x86)Vim, local同linux一样,不过 windows下的$HOME指的是 C:Users<userName>. (这里应该讲讲怎么打开这个文件,我感觉我使用 $VIM/vimrc , 并不能打开文件)

注解

如果你需要自定义你的配置文件的位置时,你可以配置 vim的编译选项.

make CPPFLAGS=-DSYS_VIMRC_FILE=\\\"/etc/vim/vimrc\\\"   # setting this cause vim to look for the /etc/vimrc file that containts the global vim settings. Normally this file is looked for in /usr/share/vim.

每个目录里都会有一个 README.txt ,如果使用直接查看这个文档就可以了。 (这里不连贯,是什么)

Vim configuration director:
Name Content Remark
doc, 所有vim的帮助文档,几乎所有你需要的信息都可以在这里找到,命令 :help XXXX.    
colors, 这里是所有配色文件,如果改变默认的配色可以用 : colorscheme XXX 我最常用那就是darkblue    
compiler,这里是vim为各种编程语言配置compiler的地方,具体可以查看 help write-compiler-plugin    
ftdetect, 文件类型检测配置,vim启动会自动加载这个下面的脚本, 手工设置:command:set filetype=XXfiletype detect 就会加载这个下面的脚本(这个是什么作用?)    
ftplugin,各种与文件类相关的plugin,例如cpp.vim,c.vim ant.vim等等(是不是latex也有这样的插件??)。  
indent, 各种类型文件缩进的配置,如果你想自定义自己的缩进文件可以来这里操作。具体可以查看 http://man.chinaunix.net/newsoft/vi/doc/indent.html    
keymap, 不同语言的键盘配置,一般情况很少用到。    
plugin, 通用功能插件都放在这里,例如BGrep插件都是放在里。    
syntax, 所有的语法高效文件都是放在里(这是什么?),如果你想自定义语法文件可以在这里用你熟悉的语法文件为参考来修改。    

注解

ft -> file type

写配置文件正确的做法,例如一个新的XXX类型添加各种配置

  1. 在ftdetect目录下创建一个 XXX.vim 并且写入如下内容

    au BufReadBufNewFile *.XXX       set filetype=XXX
    

    注解

    这里不仅可以提指文件名,还可以通配文件路径(后面是什么?)

  2. 在ftplugin目录下创建 XXX.vim, 需要的配置都放在这里,例如缩进、常用快捷键的map定义、以及自定义的小函数。

  3. 简单配置都可以在ftplugin/XXX.vim完成,复杂的配置例如语法文件等,可以自己一个语法文件实现,保存为 syntax/XXX.vim. 也可以直接在 ftplugin/XXX.vim 采用现成语法文件,例如C语言的语法文件。其主要通过如下命令加载:

    runtime! syntax/C.vim
    
  4. 进一步地可以把这些配置文件用git管理起来,放在github上面这样出了错可以随时恢复。

mode line

另一种自动识别的机制那就是用mode line. 那就是开头或者结尾用注释的方式来写vim mode line. 如下

vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab

插件安装方法

通过上述的讲解,现在明白了插件的原理,你自己下载的插件直放在对应的目标里就可以了,一般每一个插件自带的README都告诉你放在哪个目录里。 一般都是在www.vim.org 下载插件,现在有往github移的趋势。

vim 配置文件是如何加载的

具体可以查看 :help starting.txt 这个在 :help syntax.txt 里更详细的描述。

Vim 的窗口管理

Vim 的初始介面看上去很简单了,就像notepad. 但功能没有notepad那样简单的,可以说Vim本身就是功能很强的IDE。build,edit,debug. 都是支持的。 只是方式现在的IDE方式略有不同罢了。当然你可以把它打造各种现代的IDE,网上这样的配置很多,插见还也很多。 但是都以vim的窗口管理为基础的。而vim 窗口管理又是以buffer,window,tab page为是基础。 但是很大一部分人并不知道自身就支持tab page.有些人为使用tab page,还要额外的装插件。

在学习篇的时候同时参考 :help windows.txt , :help usr_07.txt 以及 :help usr_08.txt

buffer,window,tab

明白了Vim的窗口管理,就会明白了各种IDE的原理。 各种窗口管理的时候经常用的MVC结构。 M 指的就是buffer,而View就是各个Window,而Vim 就是那个Controller. tab page是可以多个view. 也就是多个window. 从官方的定义:

  1. A buffer is in-memory text of a file.
  2. A window is a viewport of on a buffer.
  3. A tab page is collection of windows.

简单地说那就是显示与数据分开的。你可以用windows查看同一buffer. 最常用的分屏查看了. 先来试一试吧,看看 :sp 会看有什么效果。 水平分成两屏了,不但可以水平的分。还可以垂直的分,就像diff时也要一样, :vsp . 并且可以这样不断的分下去。同样在分配的还可指窗口的大小 :2sp 看看是什么效果,分出一个只有两行的window的。 垂直分屏同样如此。 知道这些你想分多少窗口,就分多少。就是现在Visual studio 也只是支持只两屏,并且只能是水平的。

另外解释一下,很少用到vim tab page呢,原因是vim 的这种MVC结构已经做的灵活了。一般编辑需求根本不需要这么用到tab page. 那为什么别的编辑却要需要那么多的tab page呢。因为它做不到Vim的这中窗口管理水平。

分屏的能力上面已经说了,一般编辑器也就支持水平两屏的能力,而vim支持水平与垂直的任意的分。进一步呢,正因为显示与数据分开的,在一个window里可以查看任意一个buffer的内容。而一个buffer里内容可在任意多个window里显示。 而一般的编辑器window与buffer是不分的,并且绑定在一起的。想打开buffer的内容就只能开多个window了,也用了所谓的tab page了。 并且少数的编辑器 Visual Studio里OutputsWindow里多个子窗口,例如build,debug等窗口。 再回看到 vim 的tab page的定义。是不是突然明白了一些。原来这些所谓的高级的功能,Vim早就有了。

只要明白了熟悉这些,所谓的那些IDE不像就是多一些自定义的buffer,window而己。很少还需要用tab pages.当你非得在vim中使用 tab page 才能完成的你的功能,要么你没有掌握Vim,要么就是需求真的有那么的复杂。

buffer

一般情况一下, 可以这么理解一个文件对应buffer, 当你用 vim 当然打开多个文件的时候

vim a.txt b.txt c.txt

就相应的会有三个buffer产生分别对应 三个文件。你可以通过 :ls 来查看打开了多少个buffer. 当然还有特殊的 buffer用于特殊的用途。

Vim wiki Buffer FAQ

buffer type

vim 五种类型可以通过 :help buffertype 查看。

这里只说经常用buffer,以及常用buffer操作。

我们正常打开文件的buffer,自不必说。另外特殊buffer我们用到。

command line buffer, 在编辑 :XX 这些命令,要查看记录,也想像正常的文本编辑那样编辑 命令呢。 在 command::XX 之后再按一下 ctrl+f 就看到这个buffer了。 你可以看到所有命令的历史记录,并且还可以编辑修改那些命令。 然后你按一下 Enter 就执行了。

unlisted 这个buffer的不可见,不用来编辑,主要用记录一些file name以及marks. 你用 mark 书签的就会用到。 vim 是支持书签功能的,但是只能是单字符的书签。所以最多只能有26个,a-z . 在 Normal modem 来建立书签。例如 ma 就是在当前行插入书签a. 然后用 ' 来进行书签的跳转。 例如 'a 跳转书签a 处,这个功能是分析代码的时候特别的有用。 但是这些书签存在哪里,就是在 unlisted buffer里。

direcotry 目录buffer, vim 也是可以做文件浏览器的打开目录的。 直接用 Vim 打开一个目录 试一试便知。

quickfix 就像类似于IDE中那个error windows. 一般写代码的模式 都是edit-compile-edit 模式。 当你编译好,他会编译显示错误的信息。 例如 BGrep 插件就是利用这个来实现的。这个buffer是不能像正常的文件那样直接读写的。是需要 :cwindow 以及 lwindow. 详细的用法 :help quickfix.txt .

help buffer 主要是用查看help文档的,是不能修改的。 当然也会支持一些特珠格式与语法。 这个你以通过 help文档就可以看出来。

buffer的常用操作

:ls :files :buffers 查看已经打开的buffer :file 显示当前buffer的文件全名 :bn 在当前窗口显示下一个buffer :bp 前一个 :b XXX 显示 xxxx bufffer. 并且支持tab 自动补齐。 :badd 打开一个新buffer :bdelete 删除一个buffer :sb 在新窗口编辑buffer. :bufdo 在所有buffer中 执行命令

注解

在用 bufdo 时候,一般在切换buffer时,Vim 会去检查你是否保存改动,如果没有保存,会拒绝切换。 可以通过设置 buffer属性来解决这个问题。 :set hidden 就可以了。

改变swap文件路径 通过设置 &dir的值。

quickfix buffer 常用操作

:cc n 跳到 error n 处 :cn 跳到下一个错误处 :cp 跳到上一个错误处 :cl 显示错误例表 经常修改的时候经常会这个模式,知道这些命令可以大大的提高你的效率。

Window 的常见操作

对于window的操作有两种模式一种命令模式 如 :sp 另外是在 Normal Mode 下的Emacs风格的组合键 与 Ctrl-W 当前缀的。 所以 Ctrl-W s 也是分屏的意思。 个人常用command 模式,组合键模式可以参考 :help opening-windows.

:vs 垂直分屏 :sp 水平分屏 :new 打一个新window :vne 垂直打开新window :q 退出当前窗口 当然也支持 all 关键字 , 试一试 qall. :only 只留当前窗口

:lefabove :abo :rightb :bel :top 这些都打开窗的操作 分别表示上下左右。 另如在打左上角打开一个新window 来编辑 a.txt :top edit a.txt.

如何在一个新窗口查看一个文件

CTRL-W_CTRL-F 就可以了。

如何另外的打开窗口

vim 支持窗口的任意切开,其实所谓taglist也就是么干的。主要 是`ctrl-W`来控制,上下左右的切,并且交换buffer,以及位置都是很方便的。并且例如VS2013中的Peek也是很容易的。 sfind 直接开窗口 top {cmd} 可以打开一个新窗口执行命令。 并且还有preview的功能。

光标在窗口间的切换

一般采用组合键 ctrl-W 加上 hjkl 来进行移动, 例如移到上面一个空口。 ctrl-W k 当然也可以用命令 :winc[md] 来实现。

窗口的本身的移动

ctrl-W r 向下或向右移 ctrl-W R 向上或者向左移 ctrl-W x 与下一个window互换 ctrl-W K 把当前window移到顶部 ctrl-W J 移到底步 ctrl-W H 移到最左 ctrl-W L 移到最右 ctrl-W T 移到新tab page.

窗口大小不常用不写在这里,具体可以查看 :help window-resize.

scrolling 屏幕的滚动 之前那些zz,zl,zh,zt以及ctrl-e/d,F,Y,u等等,以及多屏同步滚动问题都是在这里的。设置scrollingbind,以及syncbind功能。所有的说明都:help scroll.txt 就可以查到了。或者:help CTRL-D。 Vim scrolling功能也是极强的,目前我们差不能够想到了方式它都有了。同时现在对于Emacs自己也有了新的认识,那就是当你只专注一个方面的时候用Vim就比较好,但是当你经常在不同系统之间进行切换的时候,你就会发现在利用Emacs会更好,就像XWindows一样。

tab page 操作

其实需要用到地方不多,简单的列举最可能用到一些命令吧. 它哪有类似于window的大部分操作查看,编辑,移动等等,用到的话可以查看 :help tabpage.txt :tabe :tabnew 打开一个新 tab page. :tabc 关闭tab page. :tabo[nly] 关闭其他 tab page.

项目文件与tag文件

另外感觉Vim 不像IDE的原因,就是Vim 没有项目文件,例如 .vcxproj 等。 其实是Vim也是有的,并且最加强大与通用。 第一个误区可能就是不知道 vim是支持一次多开多个 文件。 并且还可以UtraEdit那样可以远程编辑,并且还支持各种网络协议具体可以参考 :help remote.txt , 同时一个机器上的多个vim进程还可以就相互发消息与命令的,具体可以查看 vim 的 server client mode.

vim session

Vim虽然项目文件,但是有一个session文件。它可以保存当前的vim所有的状态,另如mark,register,以及打开的文件和窗口的部局。 下一次打开的就可以继续当前工作,就像没有关闭过一样。 mkseesion 生成 session 文件。 下次打开的时候 vim -S t.session 就可以了。 不想每一次保存可以用 au VimLeave 实现每一次自动保存session功能。

tags

vim 是支持 ctags以及cscope的,只要生成tags, 并用 set tags= 加载了你 tags 文件。 可以查询tag. 详细的用法可以查看 :help tags:help tagsrch.txt . 常用命令如下: tags 查看tags列表 Ctrl-] 跳转到 tag的定义 ctrl-T 或者 ctl-O 跳回上级tag, Vim tag 支持 tag stack中。 ts[elect tag 选择功能 。

另一个好玩的功能那就是 :ptag 类似于VS2013中Peek Definition的功能。 当然你要以用 map 来映射一个快捷键来操作。

关于自动补全

就光自带的 ctrl+nctrl+p 功能就靠你了。 你用插件来增强一下,那就更强了。大部分情况下自带就功能靠。

vim 可以基于字典补全 set dictionary= 来设置字典, 并且用 ctrl-x ctrl-k 来补全。

还有行补全 ctrl-x ctrl-l. 以及从一行补全 ctrl-y,以及从下一行补全 ctl-e .

build 与debug

build 可以参考 :help :make

如何在vim 中debug 可以查看 :help debugger.txt:help debug.txt

各种IDE的打造

网络上这种文档到处都是。这里简单取几个例子吧。

对于个语言支持最基本就是 comments 的支持,而vim 是能够自动实别的大部分的语言的comments,主要是通过 comments 格式,有的时候可以借用某种语言的注释格式,vim支持最好的那就是C。

IDE的功能之一那就是语法检查。

状态栏

你可以使用 &statusline, rulerformat 来定制它。

– Main.GangweiLi - 16 Sep 2012

Make vim as IDE for python

  1. pydiction 使用tab键来进行字典匹配,并且可以自己生成自己。
  2. python语法文件
  3. ctags的增强版本,自动生成tags 文件
  4. vim-as-your-ide for python
  5. pythoncomplete omni-completion
  6. pydoc 命令
  7. vim debugger python 下一个目标把vim 打造一个调试前端。 vimgdb

Make vim as IDE for C

程序设计时常用的几个参见 taglist,A,WinManager,echofunc,complete

Make vim as IDE for perl

如何用perldoc在vim里

其实也很简单,直接另开一个窗口

..code-block:: vim

:function Mfunc(myarg) :let s:text = a:myarg :if exists(s:text)||strlen(s:text)!=0 :top new “perl help” :let s:doc = system(“perldoc -t ”.s:text) :put! = s:doc :else :echo “no topic” :endif :endfunction

:command -nargs=? My :call Mfunc(‘<args>’) :map <F2> :execute ”:My ” . expand(“<cWORD>”)<CR>gg :map <F3> :q!<CR>

Make vim as terminal

  1. Conque Shell : Run interactive commands inside a Vim buffer 自己也开始让vim走上emacs之路了

浏览器

  1. UTL.VIM 可以根据URL 打开各种文件,就像浏览器一样。可以打开.pdf,.jpg,.doc等
  2. TxtBrowser&#34; plugin is a pla
  3. xml.vim 插件 编辑xml文件的利器,主要实现机制就是 &#42;omnifunc&#42; 的补全功能
  4. vim 离合器 利用脚来实现键盘操作
  5. vim latex 插件
  6. fuzzyfinder VIM中的文件查找利器
  7. csv.vim vim超强的插件,用它之后就像在使用excel一样,但是同时具有Vim的各种功能
  8. vim debugger for perl
  9. vimgvim支持对齐线.html :set cc=61;1,3,5 就直接出现标尺了
  10. 给 vim 增加查字典功能 这个很实用在写与看文档的时候
  11. Vim 中文输入法 VimIM 是一个基于Vim的嵌入式中文输入法。 不启动中文输入法,不换模式,就可以输入中文。 不打开弹出式菜单,不敲中文,也可以搜索中文。      中文输入与英文输入不再相互折腾。 中文搜索与英文搜索不再分为彼此。并且有云输入

设置标题

:set title titlestring=%F%y%m%r

远程编辑

网速慢的时候,以及想充分利用自己本地vim环境时,可以直接像untralEdit一样远程编辑。edit remote file by vim .

这个功能来自己来说,也是很重要的,这样可以避免搭建更多的vim环境。

但是如vimserver是什么还是没有搞明白。 现在明白了,可以给已经打开vim发送命令。另外查看原始字符可以使用`set list`来查看

数据库的IDE

  1. dbtext.vim 可以通过这个插件去访问各种数据库

vim 跨两个显示器显示

. Run "gvim -N -u NONE -i NONE"
. Put the Application window across the boundary between
  the two monitors
. Enter command ":vsplit"
Workaround is :set guioptions+=l, :set guioptions-=L, :set guioptions+=r
or :set guioptions-=R.

When splitting window vertically, Vim shows scrollbar.  It causes window
resize.  When resizing window, Vim try to keep window completely on
screen.  And currently it is performed by comparing window position with
workarea (not entire screen).  Therefore, Vim window always moves when
it is across the boundary the two monitors.

正则表达式

简介

正则表达式是进阶高级的文本处理的基础。并且正则表达式是程序员七大武器老大长生剑。可见其重要性。 并且在linux下大部分的工作都是支持正则表达式,grep,sed,awk等等。

并且正则表式是编译原理中,词法分析中用的最多的方法。如果再把正则表式的功能扩展一些,例如条件正则表式就具备了语法分析的功能。

文本处理的中快速,精确,灵活。中灵活就是通过正则表达式来实现。 正则表式的关键是熟练。本身的理解的是没有任何难度的。要想高效,就必须熟练。

简单的正则表达式基础,网上的各种文档很多,这么不讲了,基础可以参考网上的。 或者 vim 自带的 :help pattern.txt

:modifier:type:num:

基本语法就是这样

  1. modifier, 位置的修饰符,^ 行首,$行尾等。
  2. type 字母的类型,[a-Z],[0-9], 直接列举的方式,或者缩写符号。这些都无所谓的。
  3. num 字母的个数,例如 ? 代表0或者1个,* 代表任意多个,\{m,n} m-n 之间个。

另外就是分组,group, ()的概念。有了分组就可以引用了。 传统的是分9组。 0 代表匹配到的整个字符串,1-9代表字符串组。 有些语言是支持嵌套分组,例如perl,这样的话是从外往内数 , 例如

a(b(cd)e)f 第一组就是bcde,而第二组就是cd.

正则表达式主要是查找与替换上。

剩下那些转义字符了,基本上大同小异

vim 是练习正则表达式的最佳地方

  1. vim的正表式的语法与标准语法大部分相同
  2. 熟悉之后,是可以直接应用中平时的文本处理之中

后面主要是基于vim 的一些高级功能

贪婪与非贪婪

vim 默认是贪婪模式(最长匹配) ,非贪婪模式(最短匹配) 可以用 {-} 表示。比如要对于字符:abcfae, abcae输入”abc.*”,将会匹配所有,直到行尾。

abcfae
.*     //match abcae
.\{-}  //match a

跨行与不跨行

Vim 中默认的匹配是按行处理的,如果遇到复杂的处理,文本块不是按行分隔的,而是用空行来分隔的,跨行怎么办呢,_. 代替 . 就可以跨行了。

/.*
/\_.*

条件正则式

有两种做法简单的可以用offset来实现例如这些:

/abc/e-2
/abc/s+1

而在替换的时候可以这样用: ze 以结尾 zs 以什么开头

%s/abc\zs(hello) (.*)\zefafa/\2 \1/gc

正则表达式中的与或非

一些基本命令只要再加一个与或非操作,就可以复杂的操作。与或非是逻辑运算的基本集,所有逻辑去算都是化成与或非。 正则表式中与或非

这个是默认的行为, 例如:command:a.*b 就是字母中同时要包含a,b,比如abroad,或者是ajjgd. 也对于英文环境,也可以是成为从a开始,到b结束。如果出现多个b,比如abkkjb,匹配到最后,也就是后面所谓的贪婪模式(这里是不是可以加个连接??)。

这个要用 | 例如 lgw |zgg 就是 lgw 或者 zgg.

这个要用 @! 例如 @!abc 就是不包含abc

分隔符替换

%s 命令默认分隔符是 /,当遇到需要匹配的模式有大量 的:command:/ 或者 时就会很头疼了。这个时候可以通过改变分隔符,这样 /就可以用了。 例如 %s#pattern#replace#gc 分隔符变替换成了 #。

对于位置限定词

除了 ^$ 的行首与行尾之外还有这些。

% 这是一个range限定词, @ 是一个条件词作用相当于ze zs 但是它有一个不同那就是它可以使用反逻辑。@! Match with zero width if the preceding atoms does not match at the current position.

\%$  \%$     end of file |/zero-width|
\%V  \%V     inside Visual area |/zero-width|
\%#  \%#     cursor position |/zero-width|
\%'m \%'m    mark m position |/zero-width|
\%23l        \%23l   in line 23 |/zero-width|
\%23c        \%23c   in column 23 |/zero-width|
\%23v        \%23v   in virtual column 23 |/zero-width|
\%(\)   A pattern enclosed by escaped parentheses.   */\%(\)* */\%(* *E53*
Just like \(\), but without counting it as a sub-expression.  This
allows using more groups and it's a little bit faster.

参见

:help % or :help @

常见应用

我们经常做的作法,查找与排序

查找

在修改编辑之前,我们经常先看一下我们有哪些需要修改 你可以用 :ilist /pattern/ 来查看。 并且还可以匹配到了多少行。

如果想精确的知道匹配了多少个 可以用 %s/pattern//n 当然你想进一步,利用quick-fix 窗口 来像error list 那样查看的话,你可以 安装一个 Bgrep 插件 来实现。 使用方法 :Bgrep /pattern/ .

再进一步,查看到每pattern的上下文呢,对于改代码的时候很有用,例如pattern周围上下5行 g/pattern/z#5 |echo "---------------"

z# 用法可以查看 :help :z.

同时还可以把vim 当做 less or more 来使用 cat log.txt |vim - 或者只需要读的可以用 cat log.txt |view - view 是vim -R

随时随地打开高亮 在看一些东西的时候,会很方便,例如t 时就会很方便,set hls(highlightsearch) 或者使用:hl 命令打开各种高亮。对于查错的时候很方便。 当然关闭高亮 :noh

排序

根据 /pattern/ 进行排序 :sort /pattern/, 例外 :sort 还有剔除重复的功能。 更多的功能 查看 :help :sort

highlighting search results from within a function The problem is that the search register is saved before a function call and restored after, so when your function returns the search register no longer contains “this”. See ”:help function-search-undo”.

see gmail

提取XML或者HTML中文本

%s/<.{-}>/r/gc 是非常的高效。

快速折行

%s/.{36}/&r/gc 每36个字符一行。

– Main.GangweiLi - 22 Jun 2012

vim 的命令

vim 的大部分命令都是来自于ex,而ex 是 ed 的改进版。包括sed的命令集基于ed。所以也就会发现这几个工具的命令集都差不多。并且RCS的版本格式也这样的,并且diff的输出也支持ex命令,其实patch也是利用ex的命令集的。

基本命令行前面都已经讲过了,都在 :exu 中. 或者直接查看 :help index.tx

本书只讲一些经常会用到,但是前面又没有提到命令, 按照模式来讲吧

Vim经常被人吐槽的各种模式的切换。特别一个小的改动就来回切换切回来。vim 针对这些也有了一些改进,在每一种模式都会通过组合键提供临时执行其他模式的命令,执行完自动切回当前模式。

各个模式下的命令

Insert mode

CTRL-D 缩进的,是按照 tab长度来走的。 CTRL-Y 自动复制上行对应列的字母 CTRL-E 自动复制下行对应列的字符 CTRL-O 临时切到normal mode 执行一条命令,再自动切回insert mode,相反过程是 r 替换当前的字母然后切回到Nomral模式。 CTRL-X submode 自动补行,就是用它实现的 CTRL-X CTRL-L. CTRL-X s 自动拼写检查 CTRL-X CTRL-U 按照自定义的补全函数来补全

另外那就是通过定义 缩小来加速输入 inoreabbr,iabbr 在case的时候如何用上这些功能,能够快速打出不,而不是去搜索。

Normal mode

CTRL-A N 自动当前光标下数字加N 默认是加1. CTRL-X N 就是加 CTRL-T 是tag stack返上一个。 CTRL-O 是跳回上一次 CTRL-] 的地方。 CTRL-V 是列选择模式 CTRL-Z 挂起 vim. 可以fg 返回。 ! !! filter 命令,把选中text传回filter命令,可以是系统命令然后结果保存在当前位置 << 与:command:>> 是Normal模式的下缩进同 insert下的缩进一样的 q: 或者 : CTRL-F 快速打开命令行窗口

注解

若想用 CTRL-X, CTRL-C 和 CTRL-V, 这些标准的 MS-Windows 操作方式怎么办?有办法! 用 $VIMRUNTIMEmswin.vim 这个脚本解决。你可以把下面这条命令放到你的 _vimrc 文 件里:

source $VIMRUNTIME/mswin.vim

这样一来 CTRL-C 就变成”复制”命令了,但是原先的 CTRL-C 是中止操作的命令呀,没 办法,用 CTRL-Break 来结束任务吧。

因为 CTRL-V 被用做”粘贴”,所以你不能用它来启动”可视 块”的选择模式,不过可 以用 CTRL-Q 代替。你也可以在”插入”模式和”命令”模式中用 CTRL-Q 代替 CTRL-V。 但是 CTRL-Q 常常被用作控制流,这时候它在某些终端下就不好用了。

窗口的操作

CTRL-W 为前缀 CTRL-W f 另开一个窗口打开当前光标下文件名 CTRL-W z 关掉预览窗口 CTRL-W | 设置窗口的宽度

更全面的命令可以见 :h CTRL-W

一些有用的查询命令

g CTRL-G 查看光标的位置信息,在第几行,第几列,第几个char,第几个word,第几个byte. gv 重新选中最近一次选择对象 ga 查看当前字符的编码的十进制,十六进制,八进制显示 gm 跳到这一行的中间 gq 格式化 gx 执行当前光标下的命令 gs sleep 函数默认是1秒 g~[motion] 翻转当前行大小写 gU[motion] 变大写, gu[motion] 变小写

一些有用的z 命令 zr 打开折行 z= 给出拼写提示

visual mode

command:a” 高亮一个双引号字符串,同理还的有 a'a( 等等 这在代码除错的时候非常用。 command:J 当前所选所有行,拼接成一行,这个在字符串与列表之间的转换时非常的方便,直接用替换就可以实现split的功能。

ex 命令

前面大部分命令都有对应的 ex 命令。 全部的ex 命令可以查看:command::h holy-grail

这里只讲最有用命令

ex 命令管道

:help :| 查看多行命令同行的问题。

let i = i | let a=3

命令 :g

:[range]g[lobal]{pattern}/[cmd]
help g:来查看命令的说明,工作原理,两遍的scan,第一次标记,第二次执行命令,并且支持:g!反逻辑。

当你想条件式的替换的时候,利用 :g 是再合适不过了。 这个会在后面的例子体现出来,这个命令再加上宏录制功能,就无非强大了。 另外那就是用查询了,例如

命令 :t

例如把自把标题一下自动添加=号呢

header1
  ||
  \/
header1
=======

:t.|s/./=/g 就可以了,如果标题是中文 t.|s/./==/g

  1. 就是复印当前行,然后把任意字符替换成=
处理偶数行处理

perform a substitute on every other line

:g/^/ if line('.')%2|s/^/zz /

display prettily
:g/<pattern>/z#.5           : display with context
:g/<pattern>/z#.5|echo "=========="  : display beautifully

如何在ex 执行其他模式的命令

Combining g// with normal mode commands

:g/|/norm 2f|r*     " replace 2nd | with a star

Vim 重定向 example

When I print result of the execution of global command into register:
:redir @a
:g/pattern/
:redir END
and then insert the register in buffer
"ap

与外部shell的交互

vim 默认使用的shell 是可以通过 shell 得到, 想在vim 加载不同shell, 设置不同&shell值就可以了。

!!, ! 可以 external cmd 交互。

vim 本身也是可以当做sed,或者awk 一样的命令来用的。 首先要看一下其 启动参数 #. - 可以直接从stdin接受输入的,可以直接接受管道来的值。 #. + 可直接加行号打开就直接跳到目标行。

  • , 行号
+/ , 正则表表达式
+{} , 命令 相当于-c
  1. -oOp 可以同时打开多个窗口与tab pages.
  2. vim -dev 直接当做串口使用。 根据自己的应用场景来挖掘吧。

这个功能在代码移值的时候特别有用,你要不断去对比,查找问题,最后输入你可以输入到vim 中来这样可以大大的加快你的速度。另外那就是 find -iname 不区分大小,然后 find . -iname "xfadfa" |xargs |grep af | vim 这样大大加快的自己的速度。 并且在添加几个系统命令,例如常用地址,变成变量,就会很方便。

vim -E -s -c "let g:html_no_progress=1" -c "syntax on" -c "set ft=c" -c "runtime syntax/2html.vim" -cwqa myfile.c

转换成html.

另外那就是录制

qa 开始录制,q 停止录制 @a 调用寄存品中宏

格式化

vim 本身支持排版的,vim 自身的help文档就都是 vim 直接排版的。

:ce 中间 对齐 :ri 右对齐 :le 左对齐

gq 执行 formatexpr

echon/echoerr/echoh/echom/ 这一系列的命令可以控制输出的各种格式。

– Main.GangweiLi - 22 Jun 2012

  • vim edit tables %IF{” ‘现在再看这个文档,也明白了gq的意义,vim 的各种排版命令的意义了’ = ‘’ ” then=”” else=”- “}%现在再看这个文档,也明白了gq的意义,vim 的各种排版命令的意义了

既然说到格式排版,就不得不说 打印了,vim 直接打印了。

:hardcopy 就打印整个文档了 :Tohtml 输出成HTML

并且都还支持部分的输出

:10,40harcopy 只打印 10-40行,同理对于 :TOhtml 也是一样的。

diff 下的命令

如何比较两个不同的文件,如何比较同一个文件两部分,或者不同文件的两部分。

基本命令

]c 跳转到下一个差异处 ]c 跳转到上一个差异处 do 当前的差异merge到另方 dg 把差异merge到自己

两个文本部分内容的对比

可以借助 g:html_diff_one_file.

how to display the total number of differences between the files?

– Main.GangweiLi - 22 Jun 2012

如何添加一条命令

两种方式,直接用keymapping 来完成 ex 命令的调用 另一种直接调用vim的函数来实现一个命令行命令 具体参考中级篇的内容

切换目录到当前编辑目录

:cd %:p:h

Vim options

vim 的简单的定制化都是通过设置option的。 常见的options,有自动的缩进。

set autoindent 来自动对齐。

快速编辑

How to get insert date or time

  1. one is use strftime(“%y-%m-%d”) [VimWiki]
  2. use the python time and calendar module time and calendar

How to replace tab with blank:

set autoindent
set shiftwidth=4
set tabstop=4
:%retab  //to replace the tab

14-07-10

如何跳转文件go to file(gf)

简单配置一下,可以直接find,grep,并且goto file,vim自身的文档就是利用这个。 这个就是vim file searching rule. 这个可以参考 editing.txt这个可以参考 `editing.txt. 设置一下suffixes, set suffixesadd=.rst

如何统计选中多少字,词,行,以及字节数

这个特别是在统计查看文本的统计数据的特别有用。{Visual}g CTRG-G. 就可以显示了。

如何改当前的文件名

:file {name} 就会改当前文件名。

如何打开搜索后文件

用`就可以了,并且`=就执行函数。

14-07-14

如何列式操作

直接ctrl-v就变成例模式,并且在搜索的时候/%<23v 就是例模式可以通过`:help %`得到。

如何重定向的命令的输出

利用`:redir`来进行控制,或者直接通过quifix window操作:

cexpr system("ls -al") |copen
:redir @a
:g//
:redir END
:new
:put! a

2014-07-25

如何执行shell

这个直接使用conque_term就行了,并且直接利用python为vim开发插件还是容易的,并且`musicbox.vim` 利用gstrem 的python 库直接来实现mp3 播放器。 并且vim 的python中也有vim接口。例如 b=vim.buffer[0] 并且还可以pyfile加载python的模块,并且pydo执行过滤操作。

easytags 非常慢的问题

直接升级到新版本就好了。这也是解决问题最简单与常用的办法。

sort in vim

自己想要功能,过滤,数字,十六进制,反序,去重复等等功能,这里都有,这样自己以后不需要每一次多步去做了。并且自己经常用的表达式给记录一下。并做成快捷键。 但是shell的排序功能没有分字段与分组的功能,这个可以通过正则表达式来解决。所以功能可以通过`:help sort` 来得到。

to do

  1. repeat.vim 当需要重复一些操作的时候,最简单的那就是 ”.”操作。还有一种那就是 * :undojoin* 命令。另外就是看 vim repeat documentation .如果功能更复杂,这个插件可能适合你。
  2. Vim 7.3正式版:新功能介绍 conceal text Vim支持语法高亮,有的语法高亮需要一些额外的标注符,它们并不是文本内容的一部分。但是实现各种折叠功能,但是这些标记符号如何显示,就可以conceal text 功能。另外更重要的功能,那就是 rnu 相对行号。用于计算距离的时候是非常方便的。
  3. vim encoding 文件乱码的问题