vim
2010-03-21 22:40:27| 分类: linux misc|字号 订阅
//
那么,给你一个最简单的方法:
sudo apt-get install vim-scripts
vim-addons install taglist
想要打开taglist,只需在vim里输入":Tlist"即可,当然你要确保你已经安装了ctags
//seven habits for effective editing:
*==>快速搜索
/pattern
% ==> 用于匹配括号 {} [] ()
[{ ==>跳到本代码块是用"{}"括起来的程序段的 开始的 : {
gd==> go to defition 跳到定义
.==> 重复刚才的运行
qa==> 开始记录成宏(每一个动作),会记录进 a 寄存器中, 按下 q 可以完成记录。 调用该宏:@a
:abbr==>简写。
:grep==>
:make
养成习惯。
//
进行编辑时,注意发现自已要重复的动作。
找可用的命令,对自己来说很有用的命令
训练熟练使用命令(without thinking)
执行sudo apt-get install vim-full这个啊!!
1:
//可视块:
先ctrl + v
然后移动之,形成块,最后 按y 复制。
然后回到一般模式: 按p.
2:
在命令模式下,
:r filename,可以//把整个文件读入到当前位置。
3://移动
按『 G 』到最後一行
按『 u 』可以复原。即取消刚才的改变。 == ctrl + z
j :下
k:上
l:右
h:左
e: 下一个单词的后面。
w: 下一个单词的前面。
0: 行头
$: 行尾。
4:
在一般模式下,输入 4yy 可以从当前位置开始复制4行。
5:
同时编辑多个文件: vi xx.txt yy.txt.
然后在里面可以使用 :n 进入下一个文件, :N 进入上一个文件。
6:
多视窗口功能。
:sp 使同一个文件分开两个窗口中同时显示
:sp filename 使用在另一个窗口中显示以对比。
然后使用
ctrl + w + 上 可以操作上面那个窗口
ctrl + w + 下 可以操作下面的那个窗口。
ctrl + 双击w 可以在两个窗口间切换
在那个窗口 :q 就是退出那个窗口。
7:
查看所有设置
:set all
8:
查看行号 :set nu, :set nonu
高亮查找结果: :set hlsearch :set nohlsearch
自动缩排: :set autoindent :set noautoindent
自动备份: :set backup
显示不显示状态值: :set ruler
显示模式 :set showmode
:set backspace=0/1/2 设定当进入插入模式后,按下backspace时可不可以删除原来就存在的字符。
:syntax on 根据语法显示不同的颜色。
:syntax off
:set bg=dark / bg=light 设置背景色。
9:
文件字符码的转换: iconv -f utf8 -t gb2312 xx.txt
10: //**************** 撤消 重做 *****************************************//
重复: ctrl + r
撤消: u
重复做上一步: .
11:
//进入编辑模式:
a: 要当前光标"前"插入
i: 在当前光标"后"插入
o: 在当前行的"下一行插入"一行
O: 在当前行的"上一行插入"一行。
R: 进入replace模式进行编辑。
12:
//****************************查找************************************************//
set hlsearch: 打开高亮查找匹配。
/xxx 向下查找。 "然后n 表示再向下查找。 而N表示向上查找。
?xxx 向上查找,
* : 搜索里最最有用的快捷方式是“*”(向下完整匹配光标下的单词)。
"把光标移动到你要搜索的词(变量名、函数名等)上,比如“test”,然后按“*”,Vim 将自动产生一个对“\<test\>”
/\<abc\> 表示完全匹配abc这个单词的查找。
# :(向上完整匹配光标下的单词)、
g*(向下部分匹配光标下的单词),请自行查看(“:help #”等)。
nmap <F2> :nohlsearch<CR> 。Vim 专门提供一个命令取消这种加亮(直到用户再一次使用搜索或替换命令
13:
//**************查找并替换:****************************//
:n1,n2s/ori/replace/g ,即在n1行与n2行之间找到ori并用replace替换。
:1,$s/word1/word2/g 從第一行到最後一行尋找
再看几个搜索替换的实用例子。
1:去掉所有的行尾空格:“:%s/\s\+$//”。
“%”表示在整个文件范围内进行替换,“\s”表示空白字符(空格和制表符),“\+”对前面的字符匹配一次或多次(越多越好),“$”匹配行尾(使用“\$”表示单纯的“$”字符);
被替换的内容为空;由于一行最多只需替换一次,不需要特殊标志。这个还是比较简单的。
2:去掉所有的空白行:“:%s/\(\s*\n\)\+/\r/”。
这回多了“\(”、“\)”、“\n”、“\r”和“*”。“*”代表对前面的字符(此处为“\s”)匹配零次或多次(越多越好;使用“\*”表示单纯的“*”字符),“\n”代表换行
符,“\r”代表回车符,“\(”和“\)”对表达式进行分组,使其被视作一个不可分割的整体。因此,这个表达式的完整意义是,把连续的换行符(包含换行符前面可能有的连续空白字符)替换成为一个单个的换行符。
唯一很特殊的地方是,在模式中使用的是“\n”,
而被替换的内容中却不能使用“\n”,而只能使用“\r”。原因是历史造成的,详情如果有兴趣的话可以查看“:help NL-used-for-Nul”。
3:去掉所有的“//”注释:“:%s!\s*//.*!!”。
首先可以注意到,这儿分隔符改用了“!”,原因是在模式或字符串部分使用了“/”字符,不换用其他分隔符的话就得在每次使用“/”字符本身时写成“\/”,上面的命令得写成“:
%s/\s*\/\/.*//”,可读性较低。命令本身倒是相当简单,用过正则表达式的人估计都知道“.”匹配表示除换行符之外的任何字符吧。
4:去掉所有的“/* */”注释:“:%s!\s*/\*\_.\{-}\*/\s*! !g”。
这个略有点复杂了,用到了几个不太常用的 Vim 正则表达式特性。“\_.”匹配包含换行在内的所有字符;“\{-}”表示前一个字符可出现零次或多次,
但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好;标志“g”表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像“int/* space not necessary around comments */
main()”这样的表达式在替换之后仍然是合法的。
14:
//****************删除:*******************************//
dd: 删除当前行
ndd 删除当前以下n行
d1G: 从当前行到第一行,全删。
dG: 从当前行到最后一行全删。
dw: 删除当前光标到下一个分隔处的所有字母。
d$: 删除当前光标到本行最后一个字母。
d0: 删除当前光标到本行最前一个字母。
d2G: 删除本行到第二行所有。
dG: 删除本行到最后一行所有。
15:
tabnew
tabfirst
16:
//*********************** 自定义 快捷方式 ***********************//
let mapleader = "," //先设置先置命令,leaper
map <silent> <leader>ee :e "~/.vimrc"<cr> // 设置命令。 映射: ,ee ==> e ~/.vimrc
17:
//*******************自动执行命令****************************//
autocmd! bufwritepost .vimrc source ~/.vimrc
18:跳转
多次/*使用 nG 跳转后。会生成一个跳转表*/, 使用命令”:jumps“可以查看跳转表(:help :jumps)。
例如,当前光标位于文件中第1234行,然后我使用”4321G“命令跳转到第4321行;这时如果我按””“或”““,就会跳回到1234行。
跳到更老的位置:”CTRL-O“;
跳到较新的位置:”CTRL-I“
19:
标记(mark)是vim提供的精确定位技术,其功能相当于GPS技术,只要你知道标记的名字,就可以使用命令直接跳转到该标记所在的位置。手册(:help mark-motions)。
小写字母标记局限于缓冲区,也就是说,每个缓冲区都可以定义自己的小写字母标记,各缓冲区间的小写字母标记彼此不干扰。
大写字母标记是全局的,它在文件间都有效。如果在文件A中定义一个标记T,那么当使用命令”‘T“时,就会跳到文件A的标记T位置,不管你当前处于哪个文件中。
设定一个标记很简单,使用命令”m{a-zA-Z}“就可以了。例如,命令”mt“在把当前光标位置设定为标记t;命令”mT“把当前光标位置设定为标记T。
要跳转到指定的标记,使用命令”‘{a-zA-Z}“或”{a-zA-Z}“。例如,命令”‘t“会跳转到标记t;命令”‘T“会跳转到标记T。( :help ‘)
单引号和反引号的区别和上面所讲的一样,”`“在跳转时会精确到列,而”‘“不会回到跳转时光标所在的那一列,而是把光标放在第一个非空白字符上。
标记也可以被删除,使用命令”:delmarks“可以删除指定标记。命令”:marks“列出所有的标记
关于标记,有两个非常有用的插件,一个是ShowMarks,另外一个叫marks browser。.
20: 搜索 替换
:100,200s/abc/cde/g 把100行到200行间的 abc 换成 cde, 不是只换单词的。。。
:1,$s/abc/cde/g 把第1行到最后一行的。。。。
:1,$s/abee/df/gc gc, 表示 要在替换前 要确认。
:s/old/new 只替换第一个匹配的。
:s/old/new/g 替换整行中匹配的。
:%s/old/new/g 全文件替换所有匹配的。
:%s/old/new/gc 全文件替换匹配的,同时要用户确认。
:n,ms/old/new/gc 从n行 到m替换。
set ic ignore case
21:
J: 合并本行与下一行为同一行。
c[we$]: 可用于 删除对应的字母,并进入插入模式。 w,多个字母及空格。 e, 多个字母。$,行未。
22:
% : 用于去找"当前行下一个位置上的括号"的 匹配括号。
23:
:!ls 执行外部的ls命令。
:!command 执行外部的command。
24:
set so 8 : 表示 设置在光标垂直移动时,光标以下最少显示多少(8)行。
25://模式行: modeline
/* vim: set tabstop=4 shiftwidth=4 expandtab: */
以上这行在代码中,最前面几行或最后几行中出现,当vim读取时,会识别并完成上面 的设置。
行首的“/*”和尾部的“*/”告诉 C 编译器这是一行注释,不是代码的一部分;
而 Vim 可通过后面的“vim:”识别出模式行的开始(必须出现在行首或前面有一个空白字符);后面则是“set”和空格间隔开的一串 Vim 选项;“:”表示模式行结束。
模式行中的选项只影响当前文件
26://寄存器 即 剪贴板
"+p :从X WINODW 的剪贴板中 粘贴
"*p :从 VIM 的 *寄存器中粘贴。
:reg 查看所有register的内容。 或ctrl + shift + r
:help " 查看register的帮助。
通常的编辑器有一个剪贴板,以存储复制和剪切的内容。Vim 中的类似概念叫做寄存器(register)。
有一个无名寄存器: "
和一大堆有名的寄存器
无名: "
在使用了x windows 注意:"* 访问的寄存器是 X 的主选择区域(primary selection),
"+ 访问的寄存器是 X 的剪贴板(clipboard)。
如果你要在 Vim 和其它的 X 应用程序之间复制文本内容,你可以试一下这两个寄存器。
还有一个很特殊的“寄存器”:“=”。在插入模式或命令模式中,键入“Ctrl-R=”,Vim 会提示你输入一个表达式,普通的整数运算在此完全有效。如果想要进行浮点运算,
”ayy: 把当前行复制到 寄存器 a 中。
“ap: 把寄存器a 中的内容 粘贴。
可先用v,ctrl+v,V选择一块,然后用y复制,再用p粘贴
也可以"ay[motion]: "ay$(复制光标位置到行末保存在a寄存器),"ayft(复制光标位置到当前行第一个t字母出并保存在a寄存器),然后用"ap粘贴
选中: 冒号提示下,按v,移动光标选中区域
剪切: d
复制: y
粘贴: p
27:// 自动完成和路径设定
CTRL + p: 编程中。当打下 部分字母后,按 CTRL + p,则会自动补全。补全是从path 及 include 中找。
gf :设置了合适的 path 后,另外带来的一个便利就是可以使用“gf”命令方便地跳转到光标下的文件名所代表的文件中。
在上面的例子中,把光标移到“stdio.h”的任一字符上,键入“gf”,则 Vim 会自动打开 /usr/include/stdio.h 文件。使用“Ctrl-O”(参见“:help CTRL-O”)可返回到原先的文件中。
28: //ctags
ctags -R . :简单介绍如何在一个典型的多文件、多层目录的项目中使用其基本功能:
"我们只需在项目的根目录处键入“ctags -R .”,
Ctags 即可自动在文件中查找、识别支持的文件格式、生成 tags 文件。
CTRL + ]: 跳转 到定义处。
CTRL + o: 返回上一个位置
g]: 显示多个定义的列表,让用户去选择。
:tn(跳转到下一个匹配的标记处)
:tp(跳转到上一个匹配的标记处)
但是由于进入到对应目录下,只有该目录下有tags文件才会成功执行,这时就要在对应的项目的 vimrc 下添加对应的:
u BufEnter /home/my/proj1/* setlocal tags+=/home/my/proj1/tags */
au BufEnter /home/my/proj2/* setlocal tags+=/home/my/proj2/tags */
29: make grep
:grep foo *.c 这个会直接执行 grep 。
:cn(显示下一个错误)
:cp(显示上一个错误)
:cl(列出所有的错误及其编号)
:cc(跳转到指定编号的错误)
:copen(打开快速修订窗口,
:cclose(关闭快速修订窗口)
30:// 列块编辑
ctrl + v : 进入列选择模式,然后按大写 I ,然后就可以输入要在每列输入的内容, 最后按 ESC即可。
按 x 也可以删除。
30:其它小技巧
也许你会觉得这些很有用:
% (跳转到与之匹配的括号处)
. (重复上次的修改命令)
`. (跳转到最近修改过的位置)
ZQ (无条件退出)
ZZ (存盘退出)
ga (显示光标下的字符在当前使用的 encoding 下的内码)
guw (光标下的单词变为小写)
gUw (光标下的单词变为大写)
:TOhtml (根据 Vim 的语法加亮的方式生成 HTML 代码;在图形界面中也可以使用菜单“Syntax—Convert to HTML”达到同样效果)
无聊的时候,还可以试试(呵呵!):
:help!
:help 42
:help holy-grail
31: 支持中文
如果你的系统你自己的主目录中有.vimrc就加入下面二行,如果没有,就建一个这个文件.
let &termencoding=&encoding
set fileencodings=utf-8,gbk,ucs-bom,cp936
32:
在windows用ultraedit写了一堆cp的script文件, 然后上传到Linux下运行,发现出错. 在VI下看文件,原来是换行符变成了 ^M.
用PICO打开文件,然后重新存储.^M消除,文件能正常执行了.
//**************************************//
本节所用命令的帮助入口:
:help mksession
:help 'sessionoptions'
:help source
:help wviminfo
:help rviminfo
:help 'viminfo'
要恢复上次的编辑环境,我们需要保存两种不同的信息,一种是会话(session)信息,另外一种是viminfo信息。
//会话信息 中保存了所有窗口的视图,外加全局设置。
//viminfo信息 中保存了命令行历史(history)、搜索字符串历史(search)、输入行历史、非空的寄存器内容(register)、文件的位置标记(mark)、最近搜索/替换的模式、缓冲区
列表、全局变量等信息。
:mksession [file]命令来创建一个会话文件,如果省略文件名的话,会自动创建一个名为Session.vim的会话文件。
:source session-file来导入会话文件。因为会话文件是一个脚本,里面保存的是Ex命令,所以”source“命令只是把会话文件中的Ex命令执行一遍。
:wviminfo [file]命令,可以手动创建一个viminfo文件。
:rviminfo [file]命令。读入你所保存的viminfo文件
//**********************************************************//
本节所用命令的帮助入口:
:help compatible
:help mapleader
:help map
:help autocmd
vim中自带了一个vimrc例子,让我们从这个例子开始吧。
下面我以Linux下的vim为例,windows版本的vim,会在后面提到。
示例的vimrc(名为vimrc_example.vim)通常位于/usr/share/vim/vimXXX/目录下,其中vimXXX与你所使用的vim版本有关。
首先把这个示例的vimrc拷贝到相应的目录,在Linux下,应该把它拷贝到你的home目录下,名字为”.vimrc”,下面是shell命令:
cp /usr/share/vim/vim70/vimrc_example.vim ~/.vimrc
把下面这段内容拷贝到你的vimrc中:
1 "Set mapleader
2 let mapleader = ","
3
4 "Fast reloading of the .vimrc
5 map <silent> <leader>ss :source ~/.vimrc<cr>
6 "Fast editing of .vimrc
7 map <silent> <leader>ee :e ~/.vimrc<cr>
8 "When .vimrc is edited, reload it
9 autocmd! bufwritepost .vimrc source ~/.vimrc
为了方便解释,我给每一行都加了一个行号。
在vimrc中,双引号开头的行,将被当作注释忽略。
第2行,用来设置mapleader变量,当mapleader为未设置或为空时,使用缺省的”\”来作为mapleader。
mapleader变量是作用是什么呢?看下面的介绍。
第5行定义了一个映射(map),这个映射把<leader>ss,映射为命令:source ~/.vimrc<cr>。当定义一个映射时,可以使用<leader>前缀。而在映射生效时,vim会把<leader>替换成mapleader变量的值。也就是说,我们这里定义的<leader>ss在使用时就变成了”,ss“,当输入这一快捷方式时,就会source一次~/.vimrc文件(也就是重新执行一遍.vimrc文件)。
第7行,定义了<leader>ee快捷键,当输入,ee时,会打开~/.vimrc进行编辑。
第9行,定义了一个自动命令,每次写入.vimrc后,都会执行这个自动命令,source一次~/.vimrc文件。
vim自带的示例vimrc中,只定义最基本的配置。
在http://www.amix.dk/vim/vimrc.html有一个非常强大的vimrc,有人戏称为”史上最强的vimrc”,或许有些言过其实。不过,如果你通读了这个vimrc,相信能从中学到很多……
//****************vim 函数 ***调用: call SwitchToBuf("./xx.txt")******************************//
" Platform
function! MySys()
if has("win32")
return "windows"
else
return "linux"
endif
endfunction
function! SwitchToBuf(filename)
"let fullfn = substitute(a:filename, "^\\~/", $HOME . "/", "")
" find in current tab
let bufwinnr = bufwinnr(a:filename)
if bufwinnr != -1
exec bufwinnr . "wincmd w"
return
else
" find in each tab
tabfirst
let tab = 1
while tab <= tabpagenr("$")
let bufwinnr = bufwinnr(a:filename)
if bufwinnr != -1
exec "normal " . tab . "gt"
exec bufwinnr . "wincmd w"
return
endif
tabnext
let tab = tab + 1
endwhile
" not exist, new tab
exec "tabnew " . a:filename
endif
endfunction
"Fast edit vimrc
if MySys() == 'linux'
"Fast reloading of the .vimrc
map <silent> <leader>ss :source ~/.vimrc<cr>
"Fast editing of .vimrc
map <silent> <leader>ee :call SwitchToBuf("~/.vimrc")<cr>
"When .vimrc is edited, reload it
autocmd! bufwritepost .vimrc source ~/.vimrc
elseif MySys() == 'windows'
" Set helplang
set helplang=cn
"Fast reloading of the _vimrc
map <silent> <leader>ss :source ~/_vimrc<cr>
"Fast editing of _vimrc
map <silent> <leader>ee :call SwitchToBuf("~/_vimrc")<cr>
"When _vimrc is edited, reload it
autocmd! bufwritepost _vimrc source ~/_vimrc
endif
" For windows version
if MySys() == 'windows'
source $VIMRUNTIME/mswin.vim
behave mswin
endif
字母表顺序的命令速查手册
) 下一句
( 上一句
} 下一段
{ 上一段
]] 下一节
[[ 上一节
0 行的开头
$ 行的末尾
^ 行的第一个非空白字符
+ 下一行的开头
- 上一行的开
(空格) 下一个字符
(回车) 下一行
/ 向前搜索
? 向后搜索
% 查找当前小(中,大)括号的匹配字符
, 逆向重复上一个f,F,t或T操作
; 重复上一个f,F,t或T操作
. 重复上一个操作
` 转到标记处
' 转到标记所在行的开头
`` 查找前回到上一个做标记的地方
'' 查找前回到上一个做标记所在行的开头
~ 切换字符的大小写
" 保存到寄存器中
!! 重复上一次SHELL命令
! 把后面的文本送给命令, 取代输出(例如, !}fmt把当前的段落
送给命令fmt处理,然后用fmt返回的东西替换输出.)
>> 右移当前段落一个移动宽度(shiftwidth)
<< 左移当前段落一个移动宽(shiftwidth)
>% 从当前到匹配小(中,大)括号之间的文本右移
<% 从当前到匹配小(中,大)括号之间的文本左移
(似乎漏了一个符号|, 移动到某一列----译注)
a 在当前位置之后添加
A 在当前行的末尾添加
^a 没有使用
b 上一个单词的开头
B 上一个单词的开头,忽略标点符号
^b 上移一屏
c 覆盖...
C 覆盖到行末尾
^c 终止插入模式,在命令模式没有用
d 删除...
D 删除到行末尾
^d 下移半屏,如果在插入模式下则移到上一个移动宽度(ShiftTab)处
e 单词的末尾
E 单词的末尾,忽略标点符号
^e 屏幕下卷一行
f 查找...
F 向后查找...
^f 下移一屏
g 未用
G ...跳至[缺省是到文件末尾]
^g 显示状态栏
h 左移
H 屏幕上的第一行
^h 在插入模式下是退格,命令模式下是左移
i 在当前的位置前面插入
I 在本行的第一个非空白字符前面插入
^i 插入模式下是制表键,命令模式下未用
j 下移
J 把下一行合并到本行
^j 命令模式下是下移,插入模式下是建一个新行
k 上移
K 未用
^k 未用
l 右移
L 屏幕中的最后一行
^l 重绘屏
m 把当前位置标记到寄存器中
M 屏幕的中间行
^m 回车
n 重复上次查找
N 逆向重复上次查找
^n 命令模式下是下移
o 在当前行的下面建一个新行
O 在当前行的上面建一个新行
^o 未用
p 在当前行的下面粘贴
(译注--应为在当前位置的后面粘贴)
P 在当前行的上面粘贴
(译注--应为在当前位置的前面粘贴)
^p 命令模式下是上移
q 未用
Q 退出并且启动ex
^q 未用
r 覆盖当前的字符
R 在插入模式下一直覆盖字符
^r 在命令模式下面重绘屏幕
s 替换
S 替换整行
t 到...
T 向后到...
^t 移到下一个移动宽度(shifttab)处
u 撤消上一次操
U 撤消对本行的所有修改
^u 上移半屏
v 未用
V 未用
^v 未用
w 下一个单词的开头
W 下一个单词的开头,忽略标点符号
^w 命令模式下未用,在插入模式下是到上一个单词的开头处
x 删除当前字符
X 删除前一个字符
^x 未用
y 复制...
Y 复制整行
^y 屏幕上卷一行
z 重新配置当前行周围的屏幕
ZZ 保存之后退出
^z 未用
-------------------------------------------------------------------------------------------------------------------------------
/string 向前搜索指定字符串
?string 向后搜索指定字符串
n 搜索指定字符串的下一个出现位置
N 搜索指定字符串的上一个出现位置
:%s/old/new/g 全文替换指定字符串