vim学习

This item was filled under [ vim, 一步一步学习中 ]

/*
* vim 基本使用
*
* 作者: 钱善海 <qianshanhai At hotmail Dot com>
* 创建时间: 2006.03.21
* 最后修改时间: 2007.08.30
*/

1.  什么是 vim

2.  vim 的基本操作
2.1 基本指令
2.2 多文件编辑
2.3 十六进制编辑
2.4 查找
2.5 替换

3.  编辑代码的设置和操作
3.1 ~/.vimrc 配置
3.2 使用 tag

4.  语法高亮
5.  文档
6.  参考文档

VIM 基本使用

1. 什么是 vim

vim 是一款编辑器, 是 Vi IMproved 的缩写. 也即 vi 的扩展版本.
(vi 的扩展版有很多, vim 是其中一种, 应该是最接近 vi 的一个扩展版)
主要作者是 Bram Moolenaar, 他编写了 Vim 的核心功能.
官方主页: www.vim.org , 使用与 GPL 兼容的协议发布, 可以获得(如下载)源代码.
(什么是 GPL ?  请看 http://www.gnu.org/copyleft/gpl.html )

那 vi 又是什么呢?  vi 也是一款编辑器, 起源于 1977 年, 作者是 Bill Joy.
vi 即 visual 的意思, 意指可视化编辑器, 非可视化编辑器有如 ed sed 等.

vim 是编辑器, 但更像是一个工具, 使用它可以高效的完成很多事情,
既然是一个工具, 我们就应该先学习再使用, 高效是在有一定的基础之上的.

vim 继承了 Unix 和 vi 的哲学: 简单, 高效.

1.1 使用 vim 的三大理由

a) vim 是用 c 语言写的, 可以移植到几乎任何操作系统
b) vim 是最接近于 vi 的一个扩展版本
c) 语法高亮, 很适合于编写各种代码

2. vim 的基本操作

2.1 基本指令

在 vim 中, 光标的移动是基础, 只有熟练光标的移动才能体会 vim 的高效,
并且, 很多操作都是和光标移动有关的. 另外, 使用 vim 时, 应该只使用
下面这个区域中的按键:

~         …         <- (即 BackSpace 键)
…       …         …
Ctrl      …         Ctrl

建议: 每天使用 vim 一个小时熟悉指令, 连续七天即可.

** 下面除了特别说明外, 使用 ^X 表示 Ctrl-X , X 为任意字符.

vim  有六种模式, 为了弄混, 先假定有三种:

a. Normal mode(common mode, c-mode)  称为普通模式
进入 vim 后的就是处于 c-mode , 只能下下按键指令, 不能输入文字.

b. Insert mode(i-mode)  称为编辑模式
按 i 就会进入 i-mode, 此时才可以输入, 按 ^[ 又会回到 c-mode

c. Ed mode(common-line mode, e-mode)   命令行模式
按冒号 :  就会进入 e-mode

e-mode (命令行模式): (简单命令, 复杂的在后面)
:q  退出文件  :q!  强制退出  :w  写入文件  :w!  强制写入   :wq  写入并退出
:w foo  写入文件 foo         :r foo  读入文件 foo

c-mode (普通模式):

进入 i-mode:
i  在光标前编辑    I  在行首编辑    o  在光标所在行下开启新行
a  在光标后编辑    A  在行尾编辑    O  在光标所在行上开启新行
s  删除当前光标所在字符后编辑       S  删除当前行(不包括行前空白)后编辑
s 和 S 并不常用.

光标移动和删除:                       k            H  屏幕左上角非空白处
h  左  j  下  k  上  l  右       h     l         M  屏幕中间非空白处
j            L  屏幕左下角非空白处
w  右移下一个字的开始处,  e  移到所在字的末端  b  移到上一个字开始处
W E B 与上面一样, 不同的是以空白区分字(word)
gg 文件首   G  文件尾  x  删除光标所在字符  X 删除光标前的字符
0  行前        ^  行前非空白处   $  行尾
d  删除指令,与其它指令组合, 如 dw  删除一个字  d0  删至行首
dd 删除当前行     D  删至行尾
** 删除的内容会放到缓冲区, 使用后面的 p 可以粘贴

以上指令可以和数字组合, 如:
50l 表示向后移 50 个单元,   d5w  删除后面 5 个字
dL  删除到屏幕底端          100gg  跳至文件的第 100 行, 或者 100G

另外一些基本操作:
K  查找当前的字的 man 页, 相当于执行 :! man <cword>, 写 C 代码非常有用.
.  重复上一个改变, 这里的改变是插入, 删除或替换操.作
u  撤销
^R 反撤销
%  当光标位于小中大括号时, 移动到小中大括号相对应的左右括号,
J  把一行连接到当前行
=  重新排版指令, 如   =% , =L 等等
>> 向右缩进,   3>>                     ^F  向后翻页
<< 向左缩进                            ^B  向前翻页
zz 使当前位置成为屏幕的中间      [I  显示包含当前字的所有行

标签 mark  --  方便跳来跳去

m   标签指令,  mx  把当前位置标为 x , x 可为 a-zA-Z
'x  跳至标签为 x 所在行的行首非空白处
`x  跳至标签为 x 所在行标签时的位置

选中:

v   按行选中, 以单元为单位
V   按行选中, 以行为单位
ctrl-v  按列选中
v%   vL  v$
选中后可以进行一些操作:
u   转成小写   U  转成大写   y  拷贝  >  向右缩进    <   向左缩进

yank & paste:
y  拷贝指令    p   粘贴指令, 粘贴由 x, X, d, D, y 引起的缓冲区
yy 拷贝当前行  y4j 拷贝当前行和后 4 行
y`a  拷贝至标签 a , 以行为单位
y'a  拷贝至标签 a , 以字符为单位
2p   粘贴 2 次,  xp  对换当前字符和下一字符, ddp 对换当前行和下一行

替换(r):

rx  把当前字符替换为 x, x 为任意字符
R   替换 n 个字符, 直到按 Esc 或 ^[ 为止
例子:  05l^V3jra  把当前行向后开始的 4 行的第 6 列换成 a

查找:

/   向后查找               ?   向前查找
*   向后查找光标所在字     #   向前查找光标所在字
n   下一个                 N   上一个

查找时在 e-mode 下的相关设置:
:set hls   显示查找高亮        :set nohls  取消查找高亮

文件和当前信息:
^G         g^G

记录和重复操作: (这类功能极少用到, 用到时再来查找)
q  记录指令         @   重复操作指令
qx...q   x 为 a-zA-Z , ... 表示一系列的操作, 最后的 q 表示结束这个记录.
@x  重复标签为 x 的记录,  n@x  表示重复 n 次.

两类指令:
1.  与区域无关, 像 h, j, k, l ^F ^B 这些基本的光标移动指令和 m 等等
2.  与区域有关:
a)  d  y  =
这一类的操作与当前光标和最后的光标有关, 所以称做与区域有关,
如 dG 将删到文件尾, 当然是从当前位置开始的了,
又如  d%  =100j yL , 并且这几个指令在选中块之后也能使用
b)  > < u U  指令在选中块之后使用

折叠:
zf  后加上移动指令, 就能折叠这个区域, 如 zf%  zfG  等等,
通常在看代码时使用. 对着折叠的行按 0 展开.

快速移动:
a.  ^F ^B w W  %  30j 等
b.  /  ?
c.  fo  移到行中第一个字符 o 的位置

列编辑:
a. ^V3jISTRING^[    在选中的三列插入 STRING
b. ^V3j$ASTRING^[   在选中的三列的行尾添加 STRING
c.  请看 :h  中的 visual.txt

大小写:
~  大小写互换  g~~  把该行的大小写互换
guu  把当前行换成小写     gUU  把当前行换成大写   gUw  ??

更多的删除和变换见 :h 中的 change.txt

i-mode (编辑模式):

^P  自动补全,或 ^N        ^[   进入 c-mode 模式

2.2 多文件编辑

a. 命令行
$ vim file1 file2

:n 下一个文件,  :N 上一个文件
:first  第一个文件    :last 最后一个文件

b. e-mode
:sp foo  打开文件 foo      :vsp foo     :res +10  增加窗口高度

^WW  切换文件   ^Wj   ^Wk

编辑包括所有 word 的文件:
$ vim `grep -l word */*.c`

在 vim 7.0 后的版本, 还可以使用多 Tab 的模式编辑, 例如:

:tabedit file2.cpp

或者在命令行加上 -p 使用:

$ vim -p  *.cpp

全部退出:

:qa

2.3  16 进制编辑

vim 本身不支持 16 进制编辑, 也建议不要使用 vim 进行十六进制编辑,
但偶尔想简单编辑时, 可以通过外部命令 xxd 来编辑:

:% !xxd   编辑     :% !xxd -r   恢复

2.4  查找

默认情况下查找是大小写敏感的, 可以  :set ignorecase 使之忽略大小写,
执行  :set noignorecase  又变成大小写敏感了.

2.5  替换

:%s/a/b/g   把文件当中的所有的 a 换成 b , % 表示整个文件内容, g 表示全部替换
s/a/b/g 可以写成 s|a|b|g  等等
:%s/^/  /g  每一行前面加上两个空格, 还记得 ^ 嘛?
:n,m s/$/ ,/g   在第 n 行和第 m 行的每一行的行尾加上" ,"
:% s/^M//g  当中的 ^M 为 ^VM , 即回车符, 意即把回车符替换为空

:g /^$/d    删除掉所有空行:

2.6  调用外部命令

:! cmd   执行命令 cmd                 :sh  暂时退出 vim, 执行 $SHELL

例如, 调用 sort 排序:

:%!sort

3.  编辑代码的设置和操作
3.1 ~/.vimrc 配置
vim 在启动时会先读取文件 ~/.vimrc , 因为可以把一些设置写到该文件中:
如我的 ~/.vimrc 文件内容为:

"set term=vt100
set ts=4
set sw=4
set fileencoding=cp936
set fileencodings=cp936
set encoding=cp936
set autoindent
set showcmd
set nocompatible
set smartindent
set showmatch
set t_Co=8
set t_Sf=^[[1;3%p1%dm
set t_Sb=^[[1;4%p1%dm
map <C-J> :set filetype=cpp<CR>
set hls
set incsearch

set path=.,/usr/include,include,inc,../include,../inc
set path+=/usr/local/SRBC2.0/include

set tags+=tags;

"set wrap
syntax on
highlight Comment ctermfg=cyan
highlight Macro   ctermfg=gray
highlight Include ctermfg=magenta

if has("autocmd")
filetype plugin indent on
augroup vimrcEx
au!
autocmd FileType text setlocal textwidth=78
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\   exe "normal g`\"" |
\ endif
augroup END
endif

map <C-K> gt  "在多 TAb 编辑时方便跳转
map <C-H> gT
map <Tab> gt

** 注意上面的 ^[ 是这样输入的: ^V[
注释使用双引号.

3.2 使用 tag

tag 是什么? 那是一个索引文件, 能够在 vim 或多种编辑器中使用.
使用 tag 分两步, 一是制作 tag 文件, 二是在编辑器中使用.

3.2.1 制作 tag

3.2.1.1 生成 tags 文件

制作 tag 是个简单的过程, 需要使用外部命令 ctags 完成, 需要注意的是,
这里的 ctags 是 GNU ctags, 如果发现当前系统的 ctags 使用不了, 请找
系统管理员或者本文作者帮忙解决.

在 vim 中, 只需要在最上层的目录生成 tags 文件即可,
这时在 .vimrc 中加入:  set tags+=tags;  表示如果当前目录找不到文件 tags,
那么往上一层目录查找, 直到找到为此.

当然了, 可以在任意一个目录下生成 tags 文件.

生成 tags 文件最简单的方法是在 ctags 中使用 -R 参数, 表示包括所有子目录
中的文件, 如:

ctags -R .

或者指定文件: ctags *.cpp *.h

有时候源代码中包括了如 esqlc 或 proc 的代码, 这时可加上 --language-force
参数, 让 ctags 强制认成某种语言, 如认成 c++ 语言:

ctags -R --language-force=C++ .

3.2.1.2 svn 问题

使用 svn checkout 出来的代码, 会有一份相同的在目录 .svn 下, 这时如果用 -R
参数制作 tags 文件, 会包含多份一样的标记, 可用 --exclude 把它排除掉:

ctags -R --language-force=C++ --exclude=.svn .

3.2.2 使用 tag

在 vim 中, 可按下面的命令使用 tag :

^]   跳至该 tag 处, 如果存在多个一样的 tag, 跳至第一个, 可用 g] 显示全部.
^T  返回
g]   显示该 tag 的所有信息, 这时可按数字加回车选择.

如果找不到 tags 文件, 可以直接使用 set tag=/path/to/tags 指定.

4.  语法高亮

使用   :syntax on   就能够激活语法高亮显示了, 如果还没有显示颜色,
可能需要  :set filetype=cpp  表示使用 cpp.vim 作为语法高亮显示.
使用不同颜色方案:
:colorscheme default
如果没有设置环境变量 VIMRUNTIME 可能也会没有显示语法高亮

[qsh@thai src]$ ls /usr/local/share/vim/vim64/colors/
README.txt     default.vim    elflord.vim    morning.vim    peachpuff.vim
blue.vim       delek.vim      evening.vim    murphy.vim     ron.vim
darkblue.vim   desert.vim     koehler.vim    pablo.vim      shine.vim
[qsh@thai src]$ echo $VIMRUNTIME
/usr/local/share/vim/vim64

还可以使用自己的配色方案:

$ mkdir ~/.vim/colors
$ cp $VIMRUNTIME/colors/morning.vim ~/.vim/colors/mine.vim

然后这样使用:       :colo  mine

一般来说, 默认的配色方案就已经很好看了.

有时想自己定义关键字颜色:

:highlight Comment ctermfg=cyan guifg=cyan

这句在写代码时很管用的, 表示注释用蓝色显示.
其它具体使用可参考 vim 自带的文档(见后面)

5.  文档

5.1 查看帮助

———————————————————————–
条目                          前缀                      例子
———————————————————————–
Normal模式命令                  无                     :h k
CRTL控制字符                    CRTL_                  :h CRTL_r
Visual视图模式                  v                      :h v_u
Insert插入模式命令              i                      :h i_CRTL-o
ex-模式命令                     :                      :h :set
Command-line命令行编辑          c                      :h c_<BS>
命令参数                        -                      :h -m
选项                            ‘                      :h ‘winminwidth’
———————————————————————–

:h <Left>
:h <CR>
:h <Up>
:helpg[rep] {pattern}  搜索所有的帮助文本并给出一个匹配 {pattern} 行的列表.

5.2  入门文档

a. $ vimtutor
在 shell 下执行 vimtutor 就会进会 vim 的入门教程.

b.  进入 vim 后输入 :h 就进入 vim 的帮助, 蓝色如下面的这些

|usr_22.txt|  Finding the file to edit
|usr_23.txt|  Editing other files
|usr_24.txt|  Inserting quickly

的两竖线之间的文档都已经作了 tag , 把光标移到相应位置就可以用 ^] 跳转了.

c.  若想看指令 f 的帮助, 输入 :h f 即可.

d.  可以到 www.vim.org 查看

6.  参考文档

参考了 vim 自带的文档: 即进入 vim 后, 按 :h

Bookmark and Share
Tagged with: [ ]

喜欢这篇文章的人还喜欢。。。

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

Leave a Comment