Vim

Table of Contents

1. Vim 简介

Vim is a highly configurable text editor built to enable efficient text editing. It is an improved version of the vi editor distributed with most UNIX systems. Vim stands for Vi IMproved.

Vim Official Site: http://www.vim.org
Vim FAQ: http://vimdoc.sourceforge.net/htmldoc/vimfaq.html
Vim Documentation: http://vimdoc.sourceforge.net
Vim User Manual: http://vimdoc.sourceforge.net/htmldoc/usr_toc.html
无插件 Vim 编程技巧:http://coolshell.cn/articles/11312.html

1.1. Vim Cheat Sheet for Programmers

1 是一个 Vim 备忘单。

vim_cheat_sheet_for_programmers.gif

Figure 1: Vim Cheat Sheet for Programmers

参考:http://michael.peopleofhonoronly.com/vim/

2. Vim 基本使用

2.1. 打开保存文件

Vim 中,打开保存文件的基本命令如表 1 所示。

Table 1: Vim 中打开保存文件
keystroke 描述
:e[dit] filename 打开文件
:tabe[dit] filename 在 tab 中打开文件
:w[rite] 保存文件(不管文件有没有更改都会更新时间戳)
:up 如果有更改才保存文件
:wq 保存并退出
:x 当文件有更改时,保存并退出,否则直接退出
ZZ 同:x
:bd 或者 :bw (buffer delete/buffer wipeout) 关闭当前 buffer

2.1.1. 以只读方式打开文件

以只读方式打开 file1,使用下面任一方法都行:

$ vim -R file1
$ view file1

2.1.2. 忽略配置文件启动 vim

启动 vim 时忽略配置文件的办法如表 2 所示。

Table 2: 忽略配置文件启动 vim(摘自':help --noplugin')
argument load vimrc files load plugins
(nothing) yes yes
-u NONE no no
-u NORC no yes
--noplugin yes no

比如,想不加载任何配置打开文件 file1,可以执行: vim -u NONE file1

2.2. 光标移动

Vim 中,移动光标的相关命令如表 3 所示。

Table 3: Vim 中移动光标
keystroke 描述
w/b 向前/向后移动到 word 的开始
e/ge 向前/向后移动到 word 的结束
W/B 向前/向后移动到以空白为边界的 word 的开始
E/gE 向前/向后移动到以空白为边界的 word 的结束
Ctrl+o 移动光标到更旧的位置
Ctrl+i 移动光标到更新的位置
0 移动光标到本行最开头
^ 移动光标到本行第一个非空白字符上
$ 移动光标到本行结尾处
Ctrl+b Move page up
Ctrl+f Move page down
Ctrl+d Move half-page down
Ctrl+u Move half-page up
gg 移动光标到第一行
G 移动光标到最后一行
:50 移动光标到指定行,如第 50 行
50gg 同上
50G 同上
H 移动光标到屏幕的首行(不是文件的首行)
M 移动光标到屏幕的中间一行
L 移动光标到屏幕的尾行
Ctrl+e 不移动光标,屏幕上移一行
Ctrl+y 不移动光标,屏幕下移一行

注: W,B,E,gE——以空白为 word 边界进行移动,有时很方便。 比如,移动到一个网址的结束或开始位置。htt://www.xxx.com/abc/123.html,假设光标在 x 上,按下 E/B,则一次就移动到了结尾处/开头处。

2.3. 复制,删除与粘贴

在 Vim 中,y 表示复制,d 表示删除,p 表示粘贴。

Table 4: Vim 中进行复制,删除与粘贴
keystroke 描述
yy 拷贝光标所在行
dd 删除光标所在行
yw 拷贝从当前光标到光标所在单词结尾的内容
dw 删除从当前光标到光标所在单词结尾的内容
y0 拷贝从当前光标到光标所在行首的内容
d0 删除从当前光标到光标所在行首的内容
y$ 拷贝从当前光标到光标所在行尾的内容
d$ 删除从当前光标到光标所在行尾的内容
D 同上
yfa 拷贝从当前光标到光标后面的第一个 a 字符之间的内容
dfa 删除从当前光标到光标后面的第一个 a 字符之间的内容
:12,24y 拷贝第 12 行到第 24 行之间的内容(y换为 d,即可变为删除)
:12,y 拷贝第 12 行到光标所在行之间的内容(y换为 d,即可变为删除)
:,24y 拷贝光标所在行到第 24 行之间的内容(y换为 d,即可变为删除)

2.4. 修改

Vim 文件修改基本命令如表 5 所示。

Table 5: Vim 中修改内容
keystroke 描述
cc 删除整行,并进入插入模式。
S 同上
C 从当前位置删除到行尾,并进入插入模式

2.5. 查找

Vim 关键字查找命令如表 6 所示。

Table 6: Vim 中查找
keystroke 描述
/XXX 向下搜索 XXX 关键字, 输入 n 查找下一个匹配处, 输入 N 反方向查找
?XXX 向上搜索 XXX 关键字, 输入 n 查找上一个匹配处, 输入 N 反方向查找
* 当光标停留在某个单词上时, 输入这条命令可查找与该单词匹配的下一个单词
# 当光标停留在某个单词上时, 输入这条命令可查找与该单词匹配的上一个单词
g* like "*", but without using "\<" and "\>"
g# like "#", but without using "\<" and "\>"
gd 查找与光标所在单词相匹配的单词, 并将光标停留在文档的非注释段中第一次出现这个单词的地方(用来查找变量的定义非常有用)
% 查找与光标所在处相匹配的反括号, 包括 () [] {}
f(F)x 在光标所在行进行查找, 查找光标右(左)方第一个 x 字符。找到后输入分号;表示继续往下找,输入逗号,表示反方向查找。

如何查找时不区分大小写?
方法 1, :set ignorecase ,或 :set ic
方法 2,在查找关键字 word 后面加 \c ,即: /word\c

2.6. 替换

Vim 中可用 substitute 命令进行替换,其语法为:

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

其中,分隔符 / 也可以是 = 或者 + 等其它符号。如果省略 range,则替换命令只作用于当前行;range 处如果使用 % 则表示命令作用于所有行。

flags 有下面可选项:

  1. c 需要 confirm 替换
  2. g 替换所有找到的模式
  3. i 大小写不敏感

Vim 替换实例可参考表 7

Table 7: Vim 替换实例
keystroke 说明
:s/aa/bb/g 将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb。
:s/\<aa\>/bb/g 和上面类似,但只替换单词 aa。
:%s/aa/bb/g 将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb。
:12,23s/aa/bb/g 将从 12 行到 23 行中出现的所有包含 aa 的字符串中的 aa 替换为 bb。
:12,23s/^/#/ 将从 12 行到 23 行的行首加入 # 字符。
:%s/ *$// 将文件中所有的行尾空格删除(:%s/\s\+$//能删除行尾 tab)。

2.7. 撤消和重做(undo, redo)

u 为 undo,U 为 undo 所有修改。
Ctrl+r 为 redo,也可以直接用命令 :redo

2.8. 标记

Table 8: Vim 中使用标记
keystroke 描述
m name 定义标记(name 为单字母,可以自定义 26 个标记,如定义标记 a,用 ma 即可)
:delmarks name 删除名为 name 的标记
:marks 查看所有标记
'name (单引号)移动到标记 name 所定义的行(如 'a 移动到标记 a 定义的行)
`name (反引号)移动到标记 name 所定义的行和列(如 `a ,移动到标记 a 定义的行和列)

常用内置标记:
"——(双引号)上次打开文件时光标最后停留的位置;
.——(一个点)上次修改的位置;

从而有:
'"——(单引号接双引号)移动光标到上次打开文件时光标最后停留行;
'.——(单引号接点号)此命令相当实用, 它移动光标到上一次的修改行;
如果要定位到行和列,则使用 `"`. 即可。

2.9. 自动补全(Ctrl+p/n)

Table 9: Vim 中自动补全
keystroke 描述
Ctrl+n 在后面部分找一个合适的匹配进行补全
Ctrl+p 在前面部分找一个合适的匹配进行补全
Ctrl+x+l (Ctrl+x Ctrl+l)此命令快速补齐整行内容(仅在本窗口中出现的文档中进行匹配)
Ctrl+x+f 这个命令表示补齐文件名。如输入:/usr/local/tom 后再输入此命令则它会自动匹配出:/usr/local/tomcat/

注:使用 Ctrl+x+f 时,路径或者位于行的开头,或者前面有一个空格。
也就是说,如果想输入 path=/home/,输入到 path=/hom 时按 Ctrl+x+f 并不会自动补全到/home,要使其自动补全 home。必须在/home 前留一空格。

2.10. 查看选项的设置(:set xx?)

Vim 中用 :set all 可以查看所有选项的当前值。如:

:set all
--- Options ---
  aleph=224         nofkmap               modelines=5       nosplitright
noarabic              foldclose=          modifiable          startofline
  arabicshape         foldcolumn=0        modified            statusline=
noallowrevins         foldenable          more                suffixesadd=
noaltkeymap           foldexpr=0          mouse=              swapfile
  ambiwidth=single    foldignore=#      nomousefocus          swapsync=fsync
noautochdir           foldlevel=0         mousehide           switchbuf=
noautoindent          foldlevelstart=-1   mousemodel=extend   synmaxcol=3000
noautoread            foldmethod=manual   mousetime=500       syntax=cpp
noautowrite           foldminlines=1    nonumber              tabline=
noautowriteall        foldnestmax=20      numberwidth=4       tabpagemax=10
  background=dark     formatexpr=         operatorfunc=       tabstop=4
  backspace=          formatprg=        nopaste               tagbsearch
nobackup              fsync               pastetoggle=        taglength=0
  backupcopy=auto   nogdefault            patchexpr=          tagrelative
  backupext=~         guifont=            patchmode=          tagstack
  backupskip=/tmp/*   guifontset=       nopreserveindent    notermbidi
  balloondelay=600    guifontwide=        previewheight=12    termencoding=
  ballooneval         guiheadroom=50    nopreviewwindow     noterse
nobinary              guipty              printdevice=        textauto
nobomb                helpheight=20       printencoding=    notextmode
  browsedir=last      helplang=en         printfont=courier   textwidth=0
  bufhidden=        nohidden              printmbcharset=     thesaurus=
  buflisted           history=20          printmbfont=      notildeop
  buftype=          nohkmap               printoptions=       timeout
  cdpath=,,         nohkmapp              prompt              timeoutlen=1000
  cedit=^F          nohlsearch            pumheight=0       notitle
  charconvert=      noicon                quoteescape=\       titlelen=85
  cindent             iconstring=       noreadonly            titlestring=
  cinoptions=       noignorecase          redrawtime=2000   nottimeout
  cmdheight=1       noimcmdline           remap               ttimeoutlen=-1
  cmdwinheight=7    noimdisable           report=2            ttybuiltin
  columns=95          iminsert=2        norevins              ttyfast
nocompatible          imsearch=2        norightleft           ttymouse=xterm2
......

要查看某个选项的值,可以使用 :set xx? (即在选项后面加一个问号)。
如: :set autoindent? 将显示 autoindent 或者 noautoindent。
又如: :set tabstop? 将显示当前配置,如 tabstop=4。

参考:
http://stackoverflow.com/questions/12060462/display-value-of-set-option

3. Vim 高级使用

3.1.

在命令模式下,输入 qa 则定义了一个名字为 a 的宏,a可以换成其他 25 个英文字母。再次输入 q 后记录结束。然后可以使用 @a 来执行 a 记录的操作,也可以用 3@a 来执行 3 次 q 记录的操作。

宏的使用实例:
假如我们有这样几行

stdio.h
fcntl.h
unistd.h
stdlib.h

我们想把他们改成下面的样子:

#include "stdio.h"
#include "fcntl.h"
#include "unistd.h"
#include "stdlib.h"

可用下面步骤完成任务:
移动到第一行,然后执行命令 qa 开始记录宏操作。
^ 移动行首
i#include "<Esc> 在行首处输入#include", 然后敲击 Esc 回到命令行模式。
$ 移动到行尾。
a" <Esc> 在行末插入",然后敲击 Esc 回到命令行模式。
j 移动到下一行。
q 停止记录宏。
现在可以敲击命令 @a, 或者 3@a 来执行宏中的操作。

3.2. 插入模式下进行快速编辑

Table 10: Vim 插入模式下进行快速编辑
keystroke 描述
Ctrl+w 删除单词(光标前的部分)
Ctrl+a 插入上一次在插入模式下录入的内容
Ctrl+@ 插入上一次在插入模式下录入的内容,并退出插入模式
Ctrl+y 插入当前光标上一行中相同位置字符
Ctrl+e 插入当前光标下一行中相同位置字符

3.3. Vim 转换大小写

Table 11: Vim 转换大小写
keystroke 描述
~ 将光标下的字母改变大小写
3~ 将光标位置开始的 3 个字母改变其大小写
g~~ 改变当前行字母的大小写
V~ 同上
U 将可视模式下选择的字母全改成大写字母
gUU 将当前行的字母改成大写
VU 同上
3gUU 将从光标开始到下面 3 行字母改成大写
gUw 将光标下的单词改成大写
u 将可视模式下选择的字母全改成小写
guu 将当前行的字母全改成小写
Vu 同上
guw 将光标下的单词改成小写

更多帮助请在 Vim 查看 :h ~

3.4. 复制(或移动)多行到指定行

复制(或移动)多行到指定行,除了先用 y,再用 p 去操作外,还有更直接的方法。

:[range]co[py] {address}

Copy the lines given by [range] to below the line given by {address}.
注:copy 也可以写为 t

:[range]m[ove] {address}

Move the lines given by [range] to below the line given by {address}.

3.5. Vim 多文件多窗口编辑

Table 12: Vim 多文件多窗口编辑
keystroke 描述
:sp(:vsp) file vim 将分割出一个横(纵)向窗口, 并在该窗口中打开新文件
:e file vim 将在原窗口中打开新的文件, 若旧文件编辑过, 会要求保存
c-w-w vim 分割了好几个窗口怎么办? 输入此命令可以将光标循环定位到各个窗口之中(切换窗口)
c-w hjkl 在多个分割的窗口中上下左右切换
:ls 查看 vim 程序已经打开了多少个文件
:only 仅显示当前窗口

3.6. Vim 中执行 shell 命令

Table 13: Vim 中执行 shell 命令
keystroke 描述
:!program 执行 program
:r !program 执行 program,并读取(插入)它的输出
:w !program 执行 program,并把当前缓冲区的内容作为它的输入
:[range]!program 以 program 过滤指定的行

参考:Vim7.2 用户手册 21.2 节

3.6.1. 实例:插入当前目录的文件清单

如何插入当前目录的文件清单?直接运行下面命令即可:

:r !ls

3.6.2. 实例:排序文本

makefile 中有下面内容,我们需要对.o 文件进行排序。

OBJS = \
       version.o \
       pch.o \
       getopt.o \
       util.o \
       getopt1.o \
       inp.o \
       patch.o \

操作如下:
在 Visual line 模式下选择要排序的行,然后执行 !sort 命令。

3.7. Vim modes

Here a short overview of each mode available in vim:

Table 14: Vim available modes
Name Description help page
normal For navigation and manipulation of text. This is the mode that vim will usually start in, which you can usually get back to with ESC. :help Normal-mode
insert For inserting new text. The main difference from vi is that many important "normal" commands are also available in insert mode - provided you have a keyboard with enough meta keys (such as Ctrl, Alt, Windows-key, etc.). :help Insert-mode
visual For navigation and manipulation of text selections, this mode allows you to perform most normal commands, and a few extra commands, on selected text. :help Visual-mode
select Similar to visual but with a more MS-Window like behavior. :help Select-mode
command-line For entering editor commands - like the help command in the 3rd column. :help Command-line-mode
Ex-mode Similar to the command-line mode but optimized for batch processing. :help Ex-mode

参考:https://en.wikibooks.org/wiki/Learning_the_vi_Editor/Vim/Modes#Ex-mode

3.7.1. Visual mode

v 普通的 visual 模式
V 面向行的 visual 模式
Ctrl+v 面向块的 visual 模式

3.8. 空格和 tab

3.8.1. 显示 tab 字符(:set list)

用命令 :set list 可以显示 tab 字符为'^I'。

3.8.2. 自动转换 tab 为空格(:set expandtab)

用命令 :set expandtab 可以自动转换 tab 为空格。

参考:
http://tedlogan.com/techblog3.html

4. Vim 附带工具

4.1. vimdiff (gvimdiff)

vimdiff 相当于 vim -d,用来对比多个文件,相关文档可查阅 :help diff

4.1.1. 在 diff 间移动

[c 移到上一处不同
]c 移动下一处不同

4.1.2. merge 改动

:[range]diffg[et] [bufspec]
Modify the current buffer to undo difference with another buffer.

:[range]diffpu[t] [bufspec]
Modify another buffer to undo difference with the current buffer.

4.1.3. 更方便地 merge 改动

do 相当于不带 range 和 bufspec 的 diffget
dp 相当于不带 range 和 bufspec 的 diffput

4.1.4. 设置打开 vimdiff 时自动换行

方法 1:
:set wrap
C-w-w 切换到另一个窗口后,再运行一次:set wrap

方法 2:
:windo set wrap

方法 3:
alias vimdiff='vimdiff -c"windo set wrap" $*'

参考:
http://stackoverflow.com/questions/7244910/applying-an-option-to-all-opened-files-in-vim

4.2. xxd

xxd 是十六进制查看工具,它是 vim-common 的一个组件。

-p 选项,显示 plain 格式,即不显示左边的位置信息及右边的 ASCII 码信息。
-c 选项,控制每行显示字节数。

参考:http://blog.csdn.net/lcz_ptr/article/details/7737359

实例:查看 EBCDIC 码的文件
xxd -E file

5. 其它

5.1. Vim 的文件编码

在 Vim 中,有四个与编码有关的选项,它们是: fileencodings、 fileencoding、 encoding 和 termencoding。在实际使用中,任何一个选项配置不对都会导致出现乱码。
请重点关注 fileencodings 和 fileencoding。
如何查看当前的设置?运行下面命令即可。
:set fileencoding
:set fileencodings

参考:http://blog.csdn.net/yu829/article/details/6891853

5.1.1. fileencoding

当 Vim 从磁盘上读取文件的时候,会对文件的编码进行探测。如果文件的编码方式和 Vim 的内部编码方式不同,Vim 就会对编码进行转换。转换完毕后,Vim 会将 fileencoding 选项设置为文件的编码。当 Vim 存盘的时候, 如果 encoding 和 fileencoding 不一样,Vim 就会进行编码转换。因此,通过打开文件后设置 fileencoding,我们可以将文件由一种编码转换为另一种编码(前提是 Vim 自动识别正确)。由前面的介绍可以看出,fileencoding 是在打开文件的时候, 由 Vim 进行探测后自动设置的。因此,如果出现乱码,我们无法通过在打开文件后重新设置 fileencoding 来纠正乱码。

5.1.2. fileencodings

编码的自动识别是通过设置 fileencodings 实现的,注意是复数形式。fileencodings 是一个用逗号分隔的列表,列表中的每一项是一种编码的名称。当我们打开文件的时候,Vim 按顺序使用 fileencodings 中的编码进行尝试解码,如果成功的话,就使用该编码方式进行解码,并将 fileencoding 设置为这个值,如果失败的话,就继续试验下一个编码。

因此,我们在设置 fileencodings 的时候,一定要把要求严格的、当文件不是这个编码的时候更容易出现解码失败的编码方式放在前面,把宽松的编码方式放在后面。

例如,latin1 是一种非常宽松的编码方式,任何一种编码方式得到的文本,用 latin1 进行解码,都不会发生解码失败 —— 当然,解码得到的结果自然也就是理所当然的“乱码”。因此,如果你把 latin1 放到了 fileencodings 的第一位的话,打开任何中文文件都是乱码也就是理所当然的了。

网友滇狐推荐的一个 fileencodings 设置:

set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1

其中,ucs-bom 是一种非常严格的编码,非该编码的文件几乎没有可能被误判为 ucs-bom,因此放在第一位。utf-8 也相当严格,除了很短的文件外(例如许多人津津乐道的 GBK 编码的“联通”被误判为 UTF-8 编码的经典错误),现实生活中一般文件是几乎不可能被误判的,因此放在第二位。接下来是 cp936 和 gb18030,这两种编码相对宽松,如果放前面的话,会出现大量误判,所以就让它们靠后一些。cp936 的编码空间比 gb18030 小,所以把 cp936 放在 gb18030 前面。至于 big5、euc-jp 和 euc-kr,它们的严格程度和 cp936 差不多,把它们放在后面,在编辑这些编码的文件的时候必然出现大量误判,但这是 Vim 内置编码探测机制没有办法解决的事。由于中国用户很少有机会编辑这些编码的文件,因此我们还是决定把 cp936 和 gb18030 前提以保证这些编码的识别。最后就是 latin1 了。它是一种极其宽松的编码,以至于我们不得不把它放在最后一位。不过可惜的是,当你碰到一个真的 latin1 编码的文件时,绝大部分情况下,它没有机会 fall-back 到 latin1,往往在前面的编码中就被误判了。不过,正如前面所说的,中国用户没有太多机会接触这样的文件。

5.1.3. encoding

encoding 是 Vim 内部使用的字符编码方式。当我们设置了 encoding 之后,Vim 内部所有的 buffer、寄存器、脚本中的字符串等,全都使用这个编码。Vim 在工作的时候,如果编码方式与它的内部编码不一致,它会先把编码转换成内部编码。如果工作用的编码中含有无法转换为内部编码的字符,在这些字符就会丢失。因此,在选择 Vim 的内部编码的时候,一定要使用一种表现能力足够强的编码,以免影响正常工作。

由于 encoding 选项涉及到 Vim 中所有字符的内部表示,因此只能在 Vim 启动的时候设置一次。在 Vim 工作过程中修改 encoding 会造成非常多的问题。如果没有特别的理由,请始终将 encoding 设置为 utf-8。为了避免在非 UTF-8 的系统如 Windows 下,菜单和系统提示出现乱码,可同时做这几项设置:
set encoding=utf-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8

5.1.4. termencoding

termencoding 是 Vim 用于屏幕显示的编码,在显示的时候,Vim 会把内部编码转换为屏幕编码,再用于输出。内部编码中含有无法转换为屏幕编码的字符时,该字符会变成问号,但不会影响对它的编辑操作。如果 termencoding 没有设置,则直接使用 encoding 不进行转换。

举个例子,当你在 Windows 下通过 telnet 登录 Linux 工作站时,由于 Windows 的 telnet 是 GBK 编码的,而 Linux 下使用 UTF-8 编码,你在 telnet 下的 Vim 中就会乱码。此时有两种消除乱码的方式:一是把 Vim 的 encoding 改为 gbk,另一种方法是保持 encoding 为 utf-8,把 termencoding 改为 gbk,让 Vim 在显示的时候转码。显然,使用前一种方法时,如果遇到编辑的文件中含有 GBK 无法表示的字符时,这些字符就会丢失。但如果使用后一种方法,虽然由于终端所限,这些字符无法显示,但在编辑过程中这些字符是不会丢失的。

对于图形界面下的 GVim,它的显示不依赖 TERM,因此 termencoding 对于它没有意义。在 GTK2 下的 GVim 中,termencoding 永远是 utf-8,并且不能修改。而 Windows 下的 GVim 则忽略 termencoding 的存在。

5.1.5. 以指定的编码打开文件

如果你知道这个文件的正确编码的话,可以在打开文件的时候指定 ++enc=encoding 来打开文件,如:
:e ++enc=gb18030 myfile.txt
vim example.txt -c "e ++enc=gb18030"

5.2. Vim 使用系统剪切板(终端方式下)

从系统剪切板中粘帖内容到 vim 中,在插入模式下,直接 Shift+Insert(或者 Ctrl+Shift+v)即可。

如果是把 vim 中的所选内容复制到系统粘贴板,则比较麻烦!
前提是必须安装 vim-gnome。
系统剪切板在 vim 中的名称是「"+」,可以通过:reg 看到(如果没有安装 vim-gnome 则无法看到「"+」剪切板)。
复制所选内容到系统剪切板:「"+y」

注:默认 Ubuntu 12.04 仅安装了 vim-tiny,通过 sudo apt-get install vim 命令可以安装 vim-basic。这时还不能把所选内容复制到系统剪切板,必须执行下面命令安装 vim-gnome 后才行:sudo apt-get install vim-gnome

5.3. Vim 关联语法文件

以 JCL 为例,假设它的语法文件为 jcl.vim

First step:
Put your syntax file into ~/.vim/syntax/jcl.vim

Second step:
Add following line into ~/.vimrc
au BufRead,BufNewFile *.jcl set filetype=jcl

5.4. Vim 当前文件相关变量

在底部命令窗口中,有几个符号可以方便地表示当前文件名。

Table 15: Vim 当前文件相关变量
变量名 含义
% 当前文件名
%:h 文件名的头部.例如./path/test.c 就会为./path
%:t 文件名的尾部.例如./path/test.c 就会为 test.c
%:r 无扩展名的文件名.例如./path/test.c 就会成为./path/test
%:e 扩展名.例如./path/test.c 就会成为 c

5.4.1. 变量%使用实例

在编辑 perl 文件时,想检查一下语法错误,又不想退出 vim。怎么办?
可以直接运行
:!perl -cWT %

5.5. 插件 SrcExpl(模拟 SI 中的 Context Window)

SrcExpl (Source Explorer) is a source code explorer that provides context for the currently selected keyword by displaying the function or type definition or declaration in a separate window. This plugin aims to recreate the context window available in the IDE known as "Source Insight".

参考:https://github.com/wesleyche/SrcExpl

6. Vim Tips

6.1. 避免按 Backspace 键时输入特殊字符'^?'

如果发现在 Vim 中按 Backspace 键时没有删除字符,而是输入特殊字符'^?'。要解决这个问题可把下面内容放入 .bashrc 中:

stty erase '^?'

参考:
man stty
http://vim.wikia.com/wiki/Backspace_and_delete_problems

6.2. 注释多行

如何在 Vim 中注释多行?可采用下面方法:

  1. Ctrl+V,进入 VISUAL BLOCK 模式
  2. 使用上下的方向键移动光标,选择你需要注释的行
  3. I(shift+i)
  4. 输入注释符号,如#
  5. Esc,退出 visual block 模式,

稍微等待一下(其他行的注释可能会有一些延迟),会看到已经将多行注释掉了。

参考:http://www.straw-dogs.co.uk/01/05/comment-multiple-lines-in-vim/

如何取消多行注释?可采用下面方法:

  1. Ctrl+V,进入 VISUAL BLOCK 模式
  2. 使用上下的方向键移动光标,选择你需要取消注释的行
  3. 输入 x,会删除所有的 #,同时将退出 visual block 模式

参考:http://stackoverflow.com/questions/1676632/whats-a-quick-way-to-comment-uncomment-lines-in-vim

6.3. 快速输入 80 个字符#

如何快速地输入 80 个字符#呢?
在命令模式下,键入 80i# ,再按一下 Esc 键即可。

6.4. 以 root 权限保存文件

有时在保存文件时有如下提示:
"Can't open file for writing."

解决办法:

:w !sudo tee %

其中, ! 表示执行外部命令; sudo tee 表示以 root 权限执行 tee; % 表示当前文件名。

注:要成功执行上面命令,当前用户必须在 sodoers file 中。

参考:
http://www.cyberciti.biz/faq/vim-vi-text-editor-save-file-without-root-permission/

6.5. 在终端模式下使用鼠标

set mouse=a

但在设置 mouse=a 后,终端模式中,无法用鼠标进行文本的复制操作,怎么办?
很简单:选择文本的同时按住 shift 键!

参考:http://stackoverflow.com/questions/4608161/copy-text-out-of-vim-with-set-mouse-a-enabled

6.6. 加载内置 vimrc 示例文件

和 vim 一起发布的 vimrc 示例文件位于:
$VIMRUNTIME/vimrc_example.vim

在文件~/.vimrc 中加入下行内容,即可使用内置示例文件:
source $VIMRUNTIME/vimrc_example.vim

6.7. 禁止插入模式下箭头输入 ABCD

有时在插入模式下,按方向箭,会输入 ABCD。这是因为当前环境在兼容模式中,可以用下面的命令取消兼容模式:
set nocompatible
or
set nocp

参考:
http://stackoverflow.com/questions/16858208/vim-maps-directional-keys-to-the-letters-abcd

6.8. 格式化整个文件

用下面命令可格式化整个文件:
gg=G

Explanation: gg goes to the top of the file, = is a command to fix the indentation and G tells it to perform the operation to the end of the file.

6.9. 保存多行到另一文件

要保存当前文件的 2 至 5 行到 file1.txt,可执行下面命令:

:2,5 w file1.txt

6.10. 检测当前使用的语法文件

To find out which files Vim has actually loaded, execute :scriptnames.
To see the syntax currently in effect, execute :echo b:current_syntax.
To see the syntax items currently in effect, execute :syntax list.

http://superuser.com/questions/686241/how-do-i-tell-what-syntax-file-is-being-used

Author: cig01

Created: <2010-11-06 Sat>

Last updated: <2017-12-18 Mon>

Creator: Emacs 27.1 (Org mode 9.4)