Vim学习笔记

Vim基本配置(vimrc文件):

” 不要使用vi的键盘模式,而是vim自己的
set nocompatible

” 语法高亮
syntax on
colorscheme oceandeep

” 去掉输入错误的提示声音
set noeb

” 在处理未保存或只读文件的时候,弹出确认
set confirm

” 自动缩进
set autoindent
set cindent

” Tab键的宽度
set tabstop=4

” 统一缩进为4
set softtabstop=4
set shiftwidth=4

” 不要用空格代替制表符
set noexpandtab

” 在行和段开始处使用制表符
set smarttab

” 显示行号
set number

” 历史记录数
set history=1000

“禁止生成临时文件
set nobackup
set noswapfile

“搜索忽略大小写
set ignorecase

“搜索逐字符高亮
set hlsearch
set incsearch

“行内替换
set gdefault

“编码设置
set enc=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936

“语言设置
set langmenu=zh_CN.UTF-8
set helplang=cn

” 我的状态行显示的内容(包括文件类型和解码)
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\”%d/%m/%y\ -\ %H:%M\”)}
“set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]

” 总是显示状态行
set laststatus=2

” 在编辑过程中,在右下角显示光标位置的状态行
set ruler

” 命令行(在状态行下)的高度,默认为1,这里是2
set cmdheight=2

” 侦测文件类型
filetype on

” 载入文件类型插件
filetype plugin on

” 为特定文件类型载入相关缩进文件
filetype indent on

” 保存全局变量
set viminfo+=!

” 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-

” 字符间插入的像素行数目
set linespace=0

” 增强模式中的命令行自动完成操作
set wildmenu

” 使回格键(backspace)正常处理indent, eol, start等
set backspace=2

” 允许backspace和光标键跨越行边界
set whichwrap+=<,>,h,l

” 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
set mouse=a
set selection=exclusive
set selectmode=mouse,key

” 通过使用: commands命令,告诉我们文件的哪一行被改变过
set report=0

” 启动的时候不显示那个援助索马里儿童的提示
set shortmess=atI

” 在被分割的窗口间显示空白,便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\

” 高亮显示匹配的括号
set showmatch

” 匹配括号高亮的时间(单位是十分之一秒)
set matchtime=5

” 光标移动到buffer的顶部和底部时保持3行距离
set scrolloff=3

” 设定字体
set guifont=Consolas:h11:cANSI

Vim款字符集文件处理:

if has(“multi_byte”)
set encoding=utf-8
set termencoding=utf-8
set formatoptions+=mM
set fencs=utf-8,gbk

if v:lang =~? ‘^(zh)\|(ja)\|(ko)’
set ambiwidth=double
endif

if has(“win32″)
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
language messages zhCN.utf-8
endif
else
echoerr “Sorry, this version of (g)vim was not compiled with +multi
byte”
endif

Vim字符串替换:

:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
n 为数字,若 n 为 .,表示从当前行开始到最后一行
:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/


1.:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
2. :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
(n 为数字,若 n 为 .,表示从当前行开始到最后一行)
3. :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
4. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
5. 删除文本中的^M
问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M.请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。
· 使用命令:cat filename1 | tr -d “^V^M” >newfile;
· 使用命令:sed -e “s/^V^M//” filename >outputfilename。需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M。你必须要手工进行输入,而不是粘贴。
· 在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:%s/^V^M//。
· :%s/^M$//g
如果上述方法无用,则正确的解决办法是:
· tr -d “r” dest
· tr -d “5″ dest
· strings A>B
6. 其它
利用 :s 命令可以实现字符串的替换。具体的用法包括:
:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
:g/str1/s//str2/g 功能同上
从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索
字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。

Vim分割窗口

显示两个不同的文件;或者同时显示一个文件的两个不同地方;又或者并排比较两个文
件。这一切都可以通过分割窗口实现。

|08.1| 分割窗口
|08.2| 用另一个文件分割窗口
|08.3| 窗口大小
|08.4| 垂直分割
|08.5| 移动窗口
|08.6| 对所有窗口执行命令
|08.7| 用 vimdiff 显示区别
|08.8| 杂项

下一章:|usr09.txt| 使用 GUI 版本
前一章:|usr
07.txt| 编辑多个文件
目录:|usr_toc.txt|

08.1 分割窗口

最简单的打开新窗口命令是如下:

:split

这个命令把屏幕分解成两个窗口并把光标置于上面的窗口中:

+———————————-+
|/* file one.c /             |
|~                       |
|~                       |
|one.c===========================|
|/
file one.c */             |
|~                       |
|one.c=========================|
|                       |
+———————————-+

你可以看到显示同一个文件的两个窗口。带 “” 的行是状态条,用来显示它上面的窗
口的信息。(在实际的屏幕上,状态条用反色显示)
这两个窗口允许你同时显示一个文件的两个部分。例如,你可以让上面的窗口显示
变量定义而下面的窗口显示使用这些变量的代码。

CTRL-W w 命令可以用于在窗口间跳转。如果你在上面的窗口,它会跳转到下面的窗口,
如果你在下面的窗口,它会跳转到上面的窗口。(CTRL-W CTRL-W 可以完成相同的功能
这是为了避免你有时按第二次的时候从 CTRL 键上缩手晚了。)

关 闭 窗 口

以下命令用于关闭窗口:

:close

实际上,任何退出编辑的命令都可以关闭窗口,象 “:quit” 和 “ZZ” 等。但 “close”
可以避免你在剩下一个窗口的时候不小心退出 Vim 了。

关 闭 所 有 其 它 窗 口

如果你已经打开了一整套窗口,但现在只想编辑其中一个,如下命令可以完成这个功能:

:o nly

这个命令关闭除当前窗口外的所有窗口。如果要关闭的窗口中有一个没有存盘,Vim 会
显示一个错误信息,并且那个窗口不会被关闭。

08.2 用另一个文件分割窗口

下面命令打开另一个窗口并用该窗口编辑另一个指定的文件:

:split two.c

如果你在编辑 one.c,则命令执行的结果是:

+———————————-+
|/* file two.c /             |
|~                       |
|~                       |
|two.c=========================|
|/
file one.c */             |
|~                       |
|one.c=========================|
|                       |
+———————————-+

要打开窗口编辑一个新文件,可以使用如下命令:

:new

你可以重复使用 “:split” 和 “:new” 命令建立任意多的窗口。

08.3 窗口大小

:split 命令可以接受个数前缀。如果指定了这个前缀,这个数将作为窗口的高度。例如
如下命令可以打开一个三行的窗口并编辑文件 alpha.c:

:3split alpha.c

对于已经打开的窗口,你可以用有几种方法改变它的大小。如果你有鼠标,很简单:把
鼠标指针移到分割两个窗口的状态栏上,上下拖动即可。

要扩大窗口:

CTRL-W +

要缩小窗口:

CTRL-W -

这两个命令接受个数前缀用于指定扩大和缩小的行数。所以 “4 CTRL-W +” 会使窗口增
高4行。

要把一个窗口设置为指定的高度,可以用这个命令:

{height}CTRL-W _

就是先输入一个数值,然后输入 CTRL-W 和一个下划线(在美式英语键盘中就是 Shift
加上 “-”)。
要把一个窗口扩展到尽可能大,可以使用无个数前缀的 CTRL-W _ 命令。

使 用 鼠 标

在 Vim 中,你可以用键盘很快完成很多工作。但很不幸,改变窗口大小要敲不少键。在
这种情况下,使用鼠标会更快一些。把鼠标指针移到状态条上,按住左键并拖动。状态
条会随之移动,这会使一个窗口更大一个更小。

选 项

‘winheight’ 选项设置最小的期望窗口高度而 ‘winminheight’ 选项设置最小的 “硬性”
高度。
同样,’winwidth’ 设置最小期望宽度而 ‘winminwidth’ 设置为最小硬性宽度。
‘equalalways’ 选项使所有的窗口在关闭或者打开新窗口的时候总保持相同大小。

08.4 垂直分割

“:split”命令在当前窗口的上面建立窗口。要在窗口左边打开新窗口,用这个命令:

:vsplit

或者

:vsplit two.c

这个命令的结果如下:

+————————————–+
|/* file two.c /   |/ file one.c */ |
|~             |~           |
|~             |~           |
|~             |~           |
|two.c===========one.c===========|
|                         |
+————————————–+

实际中,中间的竖线会以反色显示。这称为垂直分割线。它左右分割一个窗口。

还有一个 “vnew” 命令,用于打开一个垂直分割的新窗口。还有一种方法是:

:vertical new

“vertical” 命令可以放在任何分割窗口的命令的前面。这会在分割窗口的时候用垂直
分割取代水平分割。(如果命令不分割窗口,这个前缀不起作用)。

在 窗 口 间 跳 转

由于你可以用垂直分割和水平分割命令打开任意多的窗口,你就能够任意设置窗口的布局。
接着,你可以用下面的命令在窗口之间跳转:

CTRL-W h     跳转到左边的窗口
CTRL-W j     跳转到下面的窗口
CTRL-W k     跳转到上面的窗口
CTRL-W l     跳转到右边的窗口

CTRL-W t     跳转到最顶上的窗口
CTRL-W b     跳转到最底下的窗口

你可能已经注意到这里使用移动光标一样的命令用于跳转窗口。如果你喜欢,改用方向
键也行。
还有其它命令可以跳转到别的窗口,参见:|Q_wi|。

08.5 移动窗口

你已经分割了一些窗口,但现在的位置不正确。这时,你需要一个命令用于移动窗口。
例如,你已经打开了三个窗口,象这样:

+———————————-+
|/* file two.c /             |
|~                       |
|~                       |
|two.c===========================|
|/
file three.c /           |
|~                       |
|~                       |
|three.c=========================|
|/
file one.c */             |
|~                       |
|one.c===========================|
|                       |
+———————————-+

显然,最后一个窗口应该在最上面。移动到那个窗口 (用 CTRL-W w)并输入如下命令:

CTRL-W K

这里使用大写的 K。这样窗口将被移到最上面。你可以注意到,这里有用 K 表示向上
移动了。
如果你用的是垂直分割,CTRL-W K 会使当前窗口移动到上面并扩展到整屏的宽度。
假设你的布局如下:

+——————————————-+
|/* two.c / |/ three.c / |/ one.c */ |
|~         |~         |~         |
|~         |~         |~         |
|~         |~         |~         |
|~         |~         |~         |
|~         |~         |~         |
|two.c=====three.c=====one.c======|
|                             |
+——————————————-+

当你在中间的窗口(three.c)中使用 CTRL-W K 后,结果会是:

+——————————————-+
|/* three.c /                     |
|~                             |
|~                             |
|three.c====================================|
|/
two.c /       |/ one.c */       |
|~               |~             |
|two.c================one.c===========|
|                             |
+——————————————-+

还有三个相似的命令(估计你已经猜出来了):

CTRL-W H     把当前窗口移到最左边
CTRL-W J     把当前窗口移到最下边
CTRL-W L     把当前窗口移到最右边

08.6 对所有窗口执行命令

你打开了几个窗口,现在你想退出 Vim,你可以分别关闭每一个窗口。更快的方法是:

:qall

这表示 “quit all”(全部退出)。如果任何一个窗口没有存盘,Vim 都不会退出。同时
光标会自动跳到那个窗口,你可以用 “:write” 命令保存该文件或者 “:quit!” 放弃修改。

如果你知道有窗口被改了,而你想全部保存,则执行如下命令:

:wall

这表示 “write all”(全部保存)。但实际上,它只会保存修改过的文件。Vim 知道保
存一个没有修改过的文件是没有意义的。
另外,还有 “:qall” 和 “wall” 的组合命令:

:wqall

这会保存所有修改过的文件并退出 Vim 。
最后,下面的命令由于退出 Vim 并放弃所有修改:

:qall!

注意,这个命令是不能撤消的。

为 所 有 的 参 数 打 开 窗 口

要让 Vim 为每个文件打开一个窗口,可以使用 “-o” 参数:

vim -o one.txt two.txt three.txt

这个结果会是:

+——————————-+
|file one.txt             |
|~                     |
|one.txt====================|
|file two.txt             |
|~                     |
|two.txt
====================|
|file three.txt           |
|~                     |
|three.txt
====================|
|                     |
+——————————-+

“-o” 参数用于垂直分割窗口。
如果 Vim 已经启动了,可以使用 “:all” 命令为参数列表中的每个文件打开一个窗
口。”:vertical all” 以垂直分割的方法打开窗口。

08.7 用 vimdiff 显示区别

有一种特殊的启动 Vim 的方法可以用来显示两个文件的区别。让我们打开一个 “main.c”
并插入一些字符。在设置了 ‘backup’ 选项的情况下保存这个文件,以便产生 “main.c~”
备份文件。
在命令行中输入如下命令:(不是在Vim中)

vimdiff main.c~ main.c

Vim 会用垂直分割的方式打开两个文件。你只能看到你修改过的地方和上下几行的地方。

VV             VV
+—————————————–+
|+ +–123 lines: /* a|+ +–123 lines: /* a| <- 折叠
| text         | text         |
| text         | text         |
| text         | text         |
| text         | changed text     | <- 修改过的行
| text         | text         |
| text         | ——————| <- 删除的行
| text         | text         |
| text         | text         |
| text         | text         |
|+ +–432 lines: text|+ +–432 lines: text| <- 折叠
| ~           | ~           |
| ~           | ~           |
|main.c~============main.c============|
|                           |
+—————————————–+

(这幅图没有显示出加亮效果,可以使用 vimdiff 命令看到更好的效果)

那些没有修改的行会被折叠成一行,这称为 “关闭的折叠”(closed fold)。上图
中由 “<- 折起” 标记的行就是一个用一行表示123行的折叠。这些行在两个文件中完全
相同。
标记为 “<- 修改过的行” 被高亮显示,而增加的行被用另一种颜色表示。这可以
很清楚地表示出两个文件间的不同。
被删除的行在 main.c 窗口中用 “—” 显示,如图中用 “<- 删除的行” 标记的行。
这些字符并不是真的存在。它们只是用于填充 main.c,以便与另一个窗口对齐。

折 叠 栏

每个窗口在左边都有一个颜色略有不同的显示栏,图中标识为 “VV”。你会发现每个折叠
在那个位置都有一个加号。把鼠标移到那里并按左键可以打开那个折起,从而让你看到
里面的内容。
对于打开的折叠,折叠栏上会出现一个减号。如果你单击那个减号,折叠会被重新关
闭。
当然,这只能在你有鼠标的情况下使用。如果你没有,可以用 “zo” 打开一个折叠。
关闭使用 “zc”。

用 Vim 做 比 较

启动比较模式的另一种方法是从 Vim 内部开始:编辑 “main.c” 文件,然后分割窗口
显示区别:

:edit main.c
:vertical diffsplit main.c

“:vertical” 命令使窗口用垂直的方式分割。如果你不写这个命令,结果会变成水平分
割。

如果你有一个当前文件的补丁或者 diff 文件,你可以有第三种方法启动比较模式:
先编辑这个文件,然后告诉 Vim 补丁文件的名称:

:edit main.c
:vertical diffpatch main.c diff

警告:补丁文件中必须仅包括为一个目标文件所做的补丁,否则你可能会得到一大堆错
误信息。还可能有些你没打算打补丁的文件被打了补丁。
补丁功能只改变你内存中的文件,不会修改你硬盘上的文件(除非你决定写入改动)。

滚 屏 绑 定

当文件中有很多改动时,你可以用通常的方式滚动屏幕。Vim 会尽可能保持两个文件对
齐,以便你可以并排看到文件的区别。
如果暂时想关闭这个特性,使用如下命令:

:set noscrollbind

跳 转 到 修 改 的 地 方

如果你通过某种方法取消了折叠功能,可能很难找到有改动的地方。使用如下命令可以跳
转到下一个修改点:

]c

反向跳转为:

[c

加上一个个数前缀可以跳得更远。

消 除 差 异

你可以把文本从一个窗口移到另一个,并以此来消除差异,或者为其中一个文件中增加
几行。Vim 有时可能无法及时更新高亮显示。要修正这种问题,使用如下命令:

:diffupdate

要消除差异,你可以把一个高亮显示的块从一个窗口移动到另一个窗口。以上面的
“main.c” 和 “main.c~” 为例,把光标移到左边的窗口,在另一个窗口中被删除的行
的位置,执行如下命令:

:dp

这将把文字从左边拷到右边,从而消除两边的差异。”dp” 代表 “diff put”。
你也可以反过来做:把光标移到右边的窗口,移到被 “改动” 了的行上,然后执行
如下命令:

:do

这把文本从左边拷到右边,从而消除差异。由于两个文件已经没有区别了,Vim 会把所有
文字全部折叠起来。”do” 代表 “diff obtain”。本来用 “dg” (diff get) 会更好。可是
它已经有另外的意思了 (“dgg” 删除从光标为止到首行的所有文本 )。

要了解更多的比较模式的内容,参见 |vimdiff| 。

08.8 杂项

‘laststatus’ 选项用于指定什么时候对最后一个窗口显示状态条:

0     永远不
1     只有用分割窗口的时候(默认)
2     永远有

很多编辑另一个文件的命令都有一个使用分割窗口的变体。对于命令行命令,这通过前置
一个 “s” 实现。例如 “:tag” 用来跳到一个标记,”stag” 就会分割出一个新窗口并跳到
那个标记。
对于普通模式,前置一个 CTRL-W 可以完成这个功能。例如,CTRL-^ 跳到备选文
件,而 CTRL-W CTRL-^ 打开一个新窗口并编辑备选文件。

‘splitbelow’ 选项可以让新的窗口出现在当前窗口的下面。’splitright’ 选项让垂直
分割的窗口出现在当前窗口的右边。

打开一个新窗口时可以在命令前加上一个修饰符说明新窗口应该出现在什么地方:

:leftabove {cmd}     当前窗口的左上方
:aboveleft {cmd}     同上
:rightbelow {cmd}     当前窗口的右下方
:belowright {cmd}     同上
:topleft {cmd}       整个 Vim 窗口的最上面或者最左边
:botright {cmd}       整个 Vim 窗口的最下面或者最右边