VIM编程

VIM编程(1)
进行基本设置
1)先创立三个个人基本配置路径
~/.vim/plugin~/.vim/doc~/.vim/syntax$ mkdir ./.vim/{plugin,doc,syntax} –p
$touch ~/.vimrc

2) 中文帮助手册的安装
http://vimcdoc.sf.net (English)http://vcd.gro.clinux.org (中文)下载的文件包应该是类似这样的: vimcdoc-1.5.0.tar.gz
$tar xvf vimcdoc-1.6.0.tar.tar
$ cd vimcdoc-1.6.0/
$ ./vimcdoc.sh –i
$ echo "set helplang=cn" >> ./.vimrc

3)修改~/.vimrc
"基本配置
set wildmenu
"增强模式中的命令行自动完成操作
set foldmethod=manual
"设定折叠方式为手动
set helplang=cn
"设置帮助的语言为中文
set cin
"实现C程序的缩进
set sw=4
"设计(自动) 缩进使用4个空格
set sta
"插入时使用'shiftwidth'
set backspace=2
"指明在插入模式下可以使用删除光标前面的字符
syntax enable
"设置高亮关键字显示
set nocompatible
"去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
set number
""显示行号
filetype on
"检测文件的类型
map :q
set history=1000
""记录历史的行数
set background=dark
"背景使用黑色
syntax on
""语法高亮度显示
set autoindent
set smartindent
"上面两行在进行编写代码时,在格式对起上很有用;
""第一行,vim使用自动对起,也就是把当前行的对起格式应用到下一行;
"第二行,依据上面的对起格式,智能的选择对起方式,对于类似C语言编写上很有用
""第一行设置tab键为4个空格,第二行设置当行之间交错时使用4个空格
set tabstop=4
set shiftwidth=4
set showmatch
"设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
set ruler
""在编辑过程中,在右下角显示光标位置的状态行
set incsearch
"查询时非常方便,如要查找book单词,当输入到/b时,会自动找到第一
""个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的单词,依
"次类推,进行查找时,使用此设置会快速找到答案,当你找要匹配的单词
""时,别忘记回车。


"设置全选快捷键
map ggVG

"设置tab的快捷键
map :tabnew .
map :tabnext

"F11为新建一个标签,Shirt+F11为跳转标签
"F12是注释掉改行,S-F12是去掉改行的注释
map :A
map I//
map! I//i
map 02x
map! 02x

"设置格式化源代码快捷键
map :call FormartSrc()

"设置编译快捷键
map :make
map :make clean
map :cw
map :ccl
map :cn
map :cp
map :call CompileRun()
map :call Debug()
"F5为make,Crtl+F5为make clean
"F6为quickfix,查看详细信息, Ctrl+F6关闭详细信息
"F7为下一个结果,Ctrl+F7为上一个结果
"F8为编译和运行单个C程序、Shift+F8为调试

map o
"设置建立新行但是不插入
""""""""""""""""""""""""""""""
" Tag list (ctags)
""""""""""""""""""""""""""""""
set tags=./tags
let g:winManagerWindowLayout='FileExplorerTagList'
map :WMToggle:q
map :WMToggle
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" cscope setting
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if has("cscope")
set csprg=/usr/local/bin/cscope
"设置cscope程序的位置
set csto=1
"选项决定是先查找tag文件还是先查找cscope数据库。设置为0则先查找cscope数据库,设置为1先查找tag文件。我通常设置为1,因为在tag文
"件中查找到的结果,会把最佳匹配列在第一位。
set cst
"如果你想VIM同时搜索tag文件以及cscope数据库,设置cscopetag选项
set nocsverb
set cscopequickfix=s-,c-,d-,i-,t-,e-
"这个是设定是否使用 quickfix 窗口来显示 cscope 结果。
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
endif
set csverb
endif
"设置快捷键:
nmap s :cs find s =expand("")
nmap g :cs find g =expand("")
nmap c :cs find c =expand("")
nmap t :cs find t =expand("")
nmap e :cs find e =expand("")
nmap f :cs find f =expand("")
nmap i :cs find i ^=expand("")$
nmap d :cs find d =expand("")
filetype plugin indent on
:inoremap ( ()i
:inoremap ) =ClosePair(')')
:inoremap { {}i
:inoremap } =ClosePair('}')
:inoremap [ []i
:inoremap ] =ClosePair(']')

autocmd BufNewFile * normal G
"新建文件后,自动定位到文件末尾
autocmd BufNewFile *.cpp,*.sh,*.java exec ":call SetTitle()"
"新建.cpp,.java,.sh,
"定义函数SetTitle,自动插入文件头
func SetTitle()
"如果文件类型为.sh文件
if &filetype == 'sh'
call setline(1, "/#########################################################################")
call append(line("."), "/# Author: Futuredaemon")
call append(line(".")+1, "/# Created Time: ".strftime("%c"))
call append(line(".")+2, "/# File Name: ".expand("%"))
call append(line(".")+3, "/# Description: ")
call append(line(".")+4, "/#########################################################################")
call append(line(".")+5, "/#!/bin/bash")
call append(line(".")+6, "")
else
call setline(1, "/*************************************************************************")
call append(line("."), " Author: Futuredaemon")
call append(line(".")+1, " Created Time: ".strftime("%c"))
call append(line(".")+2, " File Name: ".expand("%"))
call append(line(".")+3, " Description: ")
call append(line(".")+4, " ************************************************************************/")
call append(line(".")+5, "")
endif
endfunc

"定义CompileRun函数,用来调用进行编译和运行
func CompileRun()
exec "w"
"C程序
if &filetype == 'c'
exec "!gcc % -g -o %<"
exec "!.//%<"
endif
endfunc
"结束定义CompileRun

"定义Debug函数,用来调试程序
func Debug()
exec "w"
"C程序
if &filetype == 'c'
exec "!del %<"
exec "!gcc % -g -o %<"
exec "!gdb %<"
elseif &filetype == 'cpp'
exec "!del %<"
exec "!g++ % -g -o %<"
exec "!gdb %<"
"Java程序
exec "!del %<.class"
elseif &filetype == 'java'
exec "!javac %"
exec "!jdb %<"
endif
endfunc
"定义dubug结束


"定义FormartSrc()
func FormartSrc()
exec "w"
"C程序,Perl程序,Python程序
if &filetype == 'c'
exec "!astyle --style=gnu --suffix=none %"
exec "e! %"
elseif &filetype == 'cpp'
exec "!astyle --style=gnu --suffix=none %"
exec "e! %"
elseif &filetype == 'perl'
exec "!astyle --style=gnu --suffix=none %"
exec "e! %"
elseif &filetype == 'py'
exec "!astyle --style=gnu --suffix=none %"
exec "e! %"
"Java程序
elseif &filetype == 'java'
exec "!astyle --style=java --suffix=none %"
exec "e! %"
elseif &filetype == 'jsp'
exec "!astyle --style=gnu --suffix=none %"
exec "e! %"
elseif &filetype == 'xml'
exec "!astyle --style=gnu --suffix=none %"
exec "e! %"
elseif &filetype == 'html'
exec "!astyle --style=gnu --suffix=none %"
exec "e! %"
elseif &filetype == 'htm'
exec "!astyle --style=gnu --suffix=none %"
exec "e! %"
endif
endfunc
"结束定义FormartSrc


"使用e打开当前文件同目录中的文件
if has("unix")
map :e =expand("%:p:h") . "/"
else
map :e =expand("%:p:h") . "/"
endif
autocmd BufWinEnter *.* silent loadview


4)配置C/C++个性化配置文件——c.vim(C-support)C/Cpp开发的助推器
(基本操作见csupport操作小节)
http://www.vim.org/scripts/script.php?script_id=213下载
解压后进入目录,然后进行
$cp * ~/.vim/ -R
将所有文件复制到我们的配置文件夹中。
在C或者CPP文件新建时加入的文件说明默认信息在template目录的Template

5)自动Tag文件(标签文件)的安装:
http://ctags.sourceforge.net, 下载一个类似 ctags-5.6.tar.gz 的文件下来
$ tar -xzvf ctags-5.6.tar.gz
$ cd ctags-5.6
$ make
$ sudo make install // 需要root权限
使用的时候去你的源码目录,
在该目录下运行命令: ctags –R,这个命令会在本目录下生成一个文件tags.
基本操作:
将光标放在XXXX()函数上按, 光标会自动跳到XXXX()函数的定义处。
再跳回刚才的位置, 你还可以按, 这样又跳回到setmouse()函数被调用的地方了, 变量,
结构, 宏, 等等, 都可以的。

6)高效地浏览源码 -- 插件: TagList
http://www.vim.org/scripts/script.php?script_id=273
下载后将解压的文件都拷贝到~/.vim/下
使用时候在命令模式下按F4就可以打开或者关闭Tlist了。
按ctrl+w,w(或者连按两下ctrl+w)可以 在taglist和代码窗口间切换

7) 文件浏览器和窗口管理器 -- 插件: WinManager
http://www.vim.org/scripts/script.php?script_id=95
下载后将文件解压后放在~/.vim下

8) 超过频的ctags——Cscope
下载 http://archive.ubuntu.com/ubuntu/pool/universe/c/cscope/cscope_15.6.orig.tar.gz
安装:
$make distclean
$./configure --with-flex
$make

使用其功能必须先为你的代码生成一个cscope的数据库, 在项目的根目录运行下面的命令:
$ find . –type f > cscope.files
$cscope –bq
这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。其中cscope.out是基本
符号索引,后两个文件是使用"-q"选项生成的,可以加快cscope的索引速度。在缺省情况下
cscope在生成数据库后就会进入它自己的查询界面,我们一般不用这个界面,所以使用
“-b”选项。

9)c/h文件间相互切换 -- 插件: A
下载:http://www.vim.org/scripts/script.php?script_id=31
将a.vim 放到 ~/.vim/plugin 文件夹中

10)自动补全
~/.vimrc文件中增加下面两句:
请确定你的Ctags 5.6已经安装好, 并且生成的tags文件已经可以用了,用vim打开一个
程主源文件后任意变量、宏、函数、API等都可以自动补全(用Tab键)

11)astyle代码格式整理软件
$sudo apt-get install astyle

VIM编程(2)
1.移动光标
在当前行里面有效的移动光标,注意这些字母都可以配合删除、移动等操作。
fx:移动光标到当前行的下一个 x 处。很明显,x 可以是任意一个字母,而且你可以使用 ; 来重复你的上一个 f 命令。
tx:和上面的命令类似,但是是移动到 x 的左边一个位置。(这真的很有用)
Fx:和 fx 类似,不过是往回找。
w:光标往前移动一个词。
b:光标往后移动一个词。
0:移动光标到当前行首。
^:移动光标到当前行的第一个字母位置。
$:移动光标到行尾。
):移动光标到下一个句子。
( :移动光标到上一个句子。
在整个文件里面有效移动光标
:向下移动一屏。
:向上移动一屏。
G:到文件尾
numG:移动光标到指定的行(num)。(比如 10G 就是到第 10 行)
gg:到文件首
H:移动光标到屏幕上面
M:移动光标到屏幕中间
L:移动光标到屏幕下面
*:读取光标处的字符串,并且移动光标到它再次出现的地方。
#:和上面的类似,但是是往反方向寻找。
j 向下
k 向上 k
l 向右 h l
h 向左 j


2.查找
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
:s/源串/目标串/g 替换当前行中所有符合条件的字符串
:行号1,行号2s/源串/目标串/g 在指定行中进行替换
:%s/源串/目标串/g 全文替换
ma:在当前光标的位置标记一个书签,名字为 a。书签名只能是小写字母。你看不见书签的存在,但它确实已经在那里了。
`a:到书签 a 处。注意这个不是单引号,它一般位于大部分键盘的 1 的左边。
`.:到你上次编辑文件的地方。这个命令很有用,而且你不用自己去标记它。
:marks 查看标记列表


vim中常用的找出行数的命令:
Ctrl+g 在最后一行中显示光标所在位置的行数及文章的总行数
nG 将光标移至n行
r 修改光标所在字符
R 修改光标所在位置的字符,可以一直替换字符,知道按下ESC键
u 表示复原功能
U 取消对行所作的所有改变
重复执行上一命令
Z+Z 连续按下两次Z,文件将保存并退出vim
重做

3.复制粘贴剪切
有效的移动大段的文本
v:按字符选择。
V:按行选择。这在你想拷贝或者移动很多行的文本的时候特别有用。
:按块选择。
在选择模式的时候使用上面所述的方向键和命令(motion)。比如,vwww,会高亮光标前面的三个词。Vjj 将会高亮当前行以及下面两行。
一旦你高亮了选区,你或许想进行一些操作:
d:剪贴选择的内容到剪贴板。
y:拷贝选择的内容到剪贴板。
c:剪贴选择的内容到剪贴板并且进入插入模式。
如果你很清楚的知道你想拷贝或者剪切什么,那你根本就不需要进入可视选择模式。这样也会节省时间:
d{motion}:剪切 motion 命令跨过的字符到剪贴板。比如,dw 会剪切一个词而 dfS 会将从当前光标到下一个 S 之间的字符剪切至剪贴板。
y{motion}:和上面类似,不过是拷贝。
c{motion}:和 d{motion} 类似,不过最后进入插入模式。
dd:剪切当前行。
yy:拷贝当前行。
cc:剪切当前行并且进入插入模式。
D:剪切从光标位置到行尾到剪贴板。
C:和 D 类似,最后进入插入模式。
x:剪切当前字符到剪贴板。
:和x类似,不过最后进入插入模式。
y+w 复制光标所在的位置到整个单词所在的位置

使用多重剪贴板
很 多编辑器都只提供了一个剪贴板。VIM 有很多。剪贴板在 VIM 里面被称为寄存器(Registers)。你可以列出当前定义的所有寄存器名和它们的内容,命令为":reg"。最好使用小写字母来作为寄存器的名称,因 为大写的有些被 VIM 占用了。使用寄存器的命令为双引号 "。
比如:我们要拷贝当前行到寄存器 k。你应该按 "kyy。(你也可以使用 V"ky。为什么这样也可以呢?)现在当前行应该已经存在了寄存器 k 里面直到你又拷贝了一些东西进入寄存器 k。现在你可以使用命令 "kp 来粘贴寄存器 k 里面的内容到你想要的位置。
"ayy 将当前行复制到寄存器 a 中
"ap 将寄存器 a 中的内容粘贴到光标之后
l :registers 查看所有寄存器的内容
l 通常情况下,寄存器 + ( " + Shift+= )对应X下的剪贴板。您在其它程序中复制的内容,可以使用 "+p 粘贴到Vim中;您在Vim中,可以使用 "+y 将内容复制到剪贴板,再粘贴到其它程序中
l 没有指定寄存器时,Vim使用“无名寄存器”存储内容

4.删除
vim中常用的删除文本命令:
d+d 连按两次d,可将光标所在的行删除,若连续删除,可以按住d不放
d+w 删除光标所在的单词,若是光标在两字之间,则删光标后的一个词
D 将光标所在行后面所有的单词删除
x 将光标所在位置后一个字符删除
X 将光标所在位置前一个字符删除

5.插入
vim中命令行模式切换到输入模式,进行插入:
* i:在当前字符的左边插入
* I:在当前行首插入
* a:在当前字符的右边插入
* A:在当前行尾插入
* o:在当前行下面插入一个新行
* O:在当前行上面插入一个新行
* c{motion}:删除 motion 命令跨过的字符,并且进入插入模式。比如:c$,这将会删除从光标位置到行尾的字符并且进入插入模式。ct!,这会删除从光标位置到下一个叹号(但不包 括),然后进入插入模式。被删除的字符被存在了剪贴板里面,并且可以再粘贴出来。
例如:cw:删除光标所在处的词并插入。(c —— change)
* d{motion}:和上面差不多,但是不进入插入模式。

6.文件操作
vim最后行模式主要的操作命令:
e 创建新的文件
n 加载新的文件
w 写文件,它是保存到临时文件中,直接退出,并没有保存到文件中的
w! 如果想写只读文件,使用它强制写入文件
q! 不问你是否保存文件,强制退出
set 可以设置vim的某些特性。取消设置,使用 set none

7.宏
您可以将一系列的操作录制为一个宏,然后执行它
q<宏名称> 开始录制宏。宏名称为一个字符
q 录制中按下“q”键,结束录制
@<宏名称> 执行宏
可以使用 :registers(寄存器列表) 命令查看已记录的宏
VIM编程(3)
准备标签
$ctags -R
生成一个cscope的数据库, 在项目的根目录运行下面的命令:
$ find . –type f > cscope.files
$cscope –bq

Winmanager文件操作技巧:
Winmannager:
打开关闭
显示帮助
如果光标下是目录, 则进入该目录; 如果光标下文件, 则打开该文件
- 返回上级目录
c 切换vim 当前工作目录正在浏览的目录
d 创建目录
D 删除目录或文件
i 切换显示方式
R 文件或目录重命名
s 选择排序方式
x 定制浏览方式, 使用你指定的程序打开该文件

Cscope帮助阅读代码
进入vim后第一件事是要把刚才生成的cscope文件导入到vim中来, 用下面的命令:

:cs add /XXX/cscope.out /XXX

以调用“F1+字母”命令进行查找了。VIM支持8种cscope的查询功能,如下:
s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找egrep模式,相当于egrep功能,但查找速度快多了
f: 查找并打开文件,类似vim的find功能
i: 查找包含本文件的文件
如果自动跳转的位置你不满意, 想看其他的结果, 可以用F6打开QuickFix窗口:
Shift+F6关闭QuickFix窗口,Crtl+o返回上一级。

Taglist的基本操作
按下F3就会打开taglist窗口了,在其中可以使用下面的快捷键:
跳到光标下tag所定义的位置,用鼠标双击此tag功能也一样
o 在一个新打开的窗口中显示光标下tag
显示光标下tag的原型定义
u 更新taglist窗口中的tag
s 更改排序方式,在按名字排序和按出现顺序排序间切换
x taglist窗口放大和缩小,方便查看较长的tag
+ 打开一个折叠,同zo
- 将tag折叠起来,同zc
* 打开所有的折叠,同zR
= 将所有tag折叠起来,同zM
[[ 跳到前一个文件
]] 跳到后一个文件
q 关闭taglist窗口
显示帮助

编程常用技巧:
Tab 自动补全
Ctrl+A 全选
Shift+o 建立新行但是不插入
% 跳转到配对的括号去
[[ 跳转到代码块的开头去(但要求代码块中'{'必须单独占一行)
>> 缩进所有选择的代码
<< 和上面类似,但是反缩进
gd 到达光标所在处函数或者变量的定义处。
K 在 Man 里面查找光标当前所在处的词。
'' 跳转到光标上次停靠的地方, 是两个', 而不是一个"
:1,20s/^/#/g 连续行注释,注释第1行到第20行。(其中"^"表示在行首插入,"#"为要插
的字符,"g"表示执行替换时不确认)
/cl 在结尾处加注/*XXX*/
/c* 将选中块加注释
F12 在行首加注释符 //
Shift+F12 去掉行首两个字符,用于去掉注释符
F2 看与源文件同名的头文件
/cfr 写文件文档说明头
/cfu 写函数说明头
/cme 写方法说明头
/ccl 写类说明头
/cd 加入日期
/ct 加入日期和时间
F11 新建一个标签
Shift+F11 跳转标签
:r 文件名 直接将其他文件或命令执行内容导入当前文件中
(在注释中写入当前系统内核信息,只需:r !uname -a)
v% = 在一遍的括号处按此组合键,括号中内容选定并按照C语言格式缩排,
光标会自动跳到XXXX()函数的定义处。
, 跳回到函数被调用的地方了, 变量, 结构, 宏, 等等, 都可以的。
Shift+qq 快速不保存退出vi(所有的标签都会关闭)
F10 快速打开同文件夹下的源文件,查找文件名可以用/

编译:
F5 Make
Shift+F5 Make clean
F6 列出所有编译信息
Shift+F6 关闭调试信息
F7 切换到下一个结果
Shift+F7 切换到上一个结果
F8 编译并运行单个文件
Shift+F8 调试源代码
/rc 保存并且编译
/rl 链接
/rr 运行
/ra 输入运行时的参数
/rm make
/rg 输入make时的参数
/rp 代码检查 splint
/ri 输入代码检查splint的参数
/rd或者Ctrl+F5 源代码
/rs 查看这个Csupport的设置

自动补全:
Ctrl+X Ctrl+L
整行补全
Ctrl+X Ctrl+N
根据当前文件里关键字补全
Ctrl+X Ctrl+K
根据字典补全
Ctrl+X Ctrl+T
根据同义词字典补全
Ctrl+X Ctrl+I
根据头文件内关键字补全
Ctrl+X Ctrl+]
根据标签补全
Ctrl+X Ctrl+F
补全文件名
Ctrl+X Ctrl+D
补全宏定义
Ctrl+X Ctrl+V
补全vim命令
Ctrl+X Ctrl+U
用户自定义补全方式
Ctrl+X Ctrl+S
拼写建议

Csupport(c.vim)的常用结构补全操作:
-- 常用结构 ---------------------------------------------------------
/sd do { } while
/sf for
/sfo for { }
/sif if { }
/sife if { } else { }
/swh while { } (n,v,i)
/ss switch (n,v,i)
/sc case (n,i)
/s{ { } (n,v,i)

-- 预处理命令 -------------------------------------------------------
/p< #include <> (n,i)
/p" #include "" (n,i)
/pd #define (n,i)
/pu #undef (n,i)
/pie #if #else #endif (n,v,i)
/pid #ifdef #else #endif (n,v,i)
/pin #ifndef #else #endif (n,v,i)
/pind #ifndef #def #endif (n,v,i)
/pi0 #if 0 #endif (n,v,i)
/pr0 remove #if 0 #endif (n,i)
/pe #error (n,i)
/pl #line (n,i)
/pp #pragma (n,i)

-- 常用短语 -------------------------------------------------------------
/im main() (n,v,i)
/i0 for( x=0; x
/in for( x=n-1; x>=0; x-=1 ) (n,v,i)
/ie enum + typedef (n,i)
/is struct + typedef (n,i)
/iu union + typedef (n,i)
/ip printf() (n,i)
/isc scanf() (n,i)
/ica p=calloc() (n,i)
/ima p=malloc() (n,i)
/isi sizeof() (n,v,i)
/ias assert() (n,v)

-- C++ ----------------------------------------------------------------
/+c class (n,i)
/+cn class (using new) (n,i)
/+ci class implementation (n,i)
/+cni class (using new) implementation (n,i)
/+mi method implementation (n,i)
/+ai accessor implementation (n,i)

/+tc template class (n,i)
/+tcn template class (using new) (n,i)
/+tci template class implementation (n,i)
/+tcni template class (using new) impl. (n,i)
/+tmi template method implementation (n,i)
/+tai template accessor implementation (n,i)

/+tf template function (n,i)
/+ec error class (n,i)
/+tr try ... catch (n,v,i)
/+ca catch (n,v,i)
/+c. catch(...) (n,v,i)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值