Chinaunix
标题:
VIM编程(1)(2)(3)
[打印本页]
作者:
jcodeer
时间:
2008-12-16 22:12
标题:
VIM编程(1)(2)(3)
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 % 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 建立新行但是不插入
% 跳转到配对的括号去
[[ 跳转到代码块的开头去(但要求代码块中'{'必须单独占一行)
>> 缩进所有选择的代码
光标会自动跳到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 (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)
本文来自ChinaUnix博客,如果查看原文请点:
http://blog.chinaunix.net/u/19742/showart_1724351.html
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2