vim 常用操作

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 全文替换指定字符串

posted on 2013-01-05 10:45  brainworm  阅读(424)  评论(0编辑  收藏  举报

导航