注解
工欲善其事,必先利其器。
注解
我的 IDE 定为Eclipse+Vim,前者用于大规模的项目,后者用于除大规模项目外的所有情况。
我选择IDE的标准为:”开源、跨平台、近乎标准工具、好用”,Eclipse+Vim 足以满足我的需求。
Vim¶
Vim 学习笔记¶
基础操作¶
- 下面记一些常用的命令,都是必须要会的:
.: 首要就是要记住神奇的.,重复上一次的协作,熟练使用能实现很多方便的操作 u: 撤销上一次操作 U: 撤销当前行的所有操作 <C-R>: 重做一次撤销的操作 :set path+=xxx: 设置项目的path,非常多的功能依赖于path
移动¶
- 移动命令:
f F t T: f移动光标到当前行的下一个 x 处; F往回找; 对应的t,T是光标跳到相应字母的后一个、前一个字母 ; ,: ;重复f,F,t,T的搜索 ,与;反方向的重复f,F,t,T的搜索 w b e: w光标往前移动一个词; b向前移动一个词; e移动到当前单词的结尾处 0 ^ $: 0移动光标到当前行首; ^移动光标到当前行的第一个字母位置; $移动光标到行尾。 )(: 下一个或当前句子的开头 }{: 下一个或当前段落的开关 <C-F> <C-B>: 向下(上)移动一屏。 (先输入:到命令行中,再使用<C-F>,显示所有输入过的ex命令的历史列表) <C-E> <C-Y>: 向下(上)滚动一行,同时光标的位置不变。 G xG gg: 到文件尾; 到指定的x行; 到文件头 H M L: 移动光标到屏幕上方;中间;下方 /xx ?xx: /向后搜索字符串xx; ?向前搜索;如果想重复上次的搜索的话,按 n/N z<cr> z. z-: 把当前行置到屏幕的顶端;中央;低端 <C-左右>: 按单词移动光标,与b,w类似,但是可以在插入模式下使用。 gt gT: 跳转到后(前)一个Tab页
跳转¶
<C-I>: 跳转到历史记录中的上一个位置(注意与<C-T>的区别在于是否基于tag堆栈) <C-O>: 跳转到历史记录中的下一个位置 %: 匹配花括号、方括号、括号等。在一个括号的上面,然后按 %,鼠标就会出现在匹配的另外一半括号处。 [{ ]}: 跳转到上一个、下一个{}号处 [( ]): 跳转到上一个、下一个()号处 >} <}: 从本行起,下面的N行(至段落结尾)向右(左)移动 >% <%: 从本行起,至成对的(圆、花、方)括号为止,向右(左)移动 gd gD: 查找局部(全局)标识符 # *: 与gd类似,但是会直接跳到上(下)一个定义处 [I: 强大的“查找全局标识符”,不仅在当前文件内查找,还会在所有包含文件中查找(依赖于:set path) 3[<Tab>: 在[I的查找结果中跳转到第3项,默认为第1项,<C+o>返回原处。 K: 在 Man 里面查找光标当前所在处的词。
- 我们经常用到的tag跳转命令见下:
- :tag {ident} “跳转到指定的标签
- :tags “显示标签栈
- <C-]> “跳转到当前光标下的标签
- <C-T> “跳到标签栈中较早的标签
- <C+W ]> “在新窗口中打开当前光标下的标签
- <C+W }> “在预览窗口中打开当前光标下的标签
- :pclose “关闭预览窗口,以及一系列的预览窗口命令:pedit xxx, :psearch popen
编辑¶
常用的进入插入模式的方法:
- i:在当前字符的左边插入
- I:在当前行首插入
- a:在当前字符的右边插入
- A:在当前行尾插入
- r:覆盖当前字母
- R:开始覆盖多个文本
- o:在当前行下面插入一个新行
- O:在当前行上面插入一个新行
- c{motion}:删除 motion 命令跨过的字符,并且进入插入模式。
- C:相当于c$,改变从当前位置到行尾的文本(这个很方便啊)
- d{motion}:和上面差不多,但是不进入插入模式。
- D:相当于d$,删除当前位置到行尾的文本
- s:替换一个字符并进入插入模式(相当于xi)
- S:替换整行并进入插入模式(相当于dd O或cc)
三种可视选择模式:
- v:按字符选择。经常使用的模式,所以亲自尝试一下它。
- V:按行选择。这在你想拷贝或者移动很多行的文本的时候特别有用。
- <C-V>:按块选择。非常强大,只在很少的编辑器中才有这样的功能。你可以选择一个矩形块,并且在这个矩形里面的文本会被高亮。
- gv: 选中前一次可视化模式时选择的文本
- o: 光标移动到选中文本的对角线
- O: 光标移动到选中文本的的另一侧(同一行的)
复制&拷贝&粘贴 操作:
- d:剪贴选择的内容到剪贴板。
- y:拷贝选择的内容到剪贴板。
- c:剪贴选择的内容到剪贴板并且进入插入模式。
- 在非可视选择模式下剪切和拷贝
- d{motion}:剪切 motion 命令跨过的字符到剪贴板。比如,dw 会剪切一个词而 dfS 会将从当前光标到下一个 S 之间的字符剪切至剪贴板。
- y{motion}:和上面类似,不过是拷贝。
- c{motion}:和 d{motion} 类似,不过最后进入插入模式。
- dd:剪切当前行。
- yy:拷贝当前行。
- cc:剪切当前行并且进入插入模式。
- D:剪切从光标位置到行尾到剪贴板。
- Y:拷贝当前行。
- C:和 D 类似,最后进入插入模式。
- x:剪切当前字符到剪贴板。
- s:和x类似,不过最后进入插入模式。
- p:粘贴到光标后(P粘贴到当前光标位置)
- ]p: 和 p 的功能差不多,但是它会自动调整被粘贴的文本的缩进去适应当前代码的位置。试一下!
替换操作
- :%s/old/new/gc 在全局查找old并替换为new,每次替换之前需要确认。
%表示范围,可以使用所有表示范围的符号代替,不写范围表示为当前行 s表示substitute替换;c表示confirm每次替换时需要进行确认 g表示global全局(但是指前面范围符号所表示的所有内容,没有g则表示仅仅是第一次匹配进行替换)
- :g/{pattern} :g是VIM中最强大的命令之一(:h :g), Usage: :[range]g[lobal]/{pattern}/[cmd]
选取{pattern}的行,来执行cmd命令。 Eg:
:g/{pattern}/s/old/new/g
在包含{pattern}的行进行old->new的替换:g/text/d
删除包含text的行
- 正则表达式 替换和查找操作的{old}{pattern}都支持正则表达式,注意{new}中不是正则表达式,但是也支持与匹配相关的元字符。
{old}{pattern}中的常用元字符:
- ( ) 模式组,其中的匹配会被保存到特殊的缓存区中
- < > 单词的开始与结束
- ~ 上一次使用的正则表达式
- [:alnum:] 字母与数字字符(还有一堆这样的POSIX字符类型)
- {new}中的特殊字符:
- n 表示匹配时利用(.)存储的第n段匹配
- & 会被替换成搜索模式匹配出的完整文本
- ul 使替换的下一个字符变成大写或小写,类似的还有U,L,e,E
- 除了/字符外,分隔符还可以是任何非字母、非数值、非空格的字符,但是反斜线、双引号”、竖线|除外(更改路径名时非常有用)
使用命名寄存器==
- :reg:列出所有寄存器,命名寄存器的使用方法为双引号 “
- ” x yy:复制当前行到寄存器x
- ” x dd:删除当前行到寄存器x
- ” x p :粘贴寄存器x的内容
- 系统剪贴板是命名寄存器+,所以”+y复制到系统剪贴板、”+p从系统剪贴板粘贴(也可以Ctrl+Shift+V键)
排版¶
]I,]i,[i: [I的系列命令,]打头的表示列出当前文件后面查找出的当前单词,i结尾的表示只显示一条 >>: 缩进所有选择的代码 <<: 和上面类似,但是反缩进 <C-T>: 在插入模式把当前行向后移动一个缩排 (类型插入模式时使用的<<) <C-D>: 与上面类似,但是向后移动 (类型插入模式时使用的>>) ==: 以C语言的风格缩排文本 <C-i>: 插入一个Tab(Tab被映射为补全后需要用到)
折叠¶
zi: 启用/关闭 折叠 (注:针对折叠下达的命令会循环应用于折叠里的每一行) zo: 打开一处折叠 zc: 关闭一处折叠 za: Toggle当前的折叠状态
补全¶
- 自动补全(所有的补全命令均以<C-X>开始):
- <C-P> 向前补全
- <C-N> 向后补全
- <C-X,C-L> 以行进行补全
- <C-X,C-F> 以文件名进行补全
- <C-X,C-D> 以字典进行补全 :set dictionary=”file”
- <C-X,C-T> 以词典进行补全 :set thesaurus=”file”
- <C-X,C-O> 全能补全
- <C-E> 取消补全
- <C-Y> 结束补全,接受当前的选择
系统交互¶
- 与系统交互:
- :r file 在光标后读取file文件的内容
- :[num] r !command 运行command命令,将输出放在num行后,默认为当前行后
- :![motion] command 把motion覆盖的文本给command,并用输出替换之
- :n,m|command 把第n - m行的文本传递给command并用输出替换之,例如:96,99|sort
- :num!!command 把第num行的文本传递给command并用输出替换之(num为空时表示当前行)
- <C-Z> 把vim暂时置于后端运行并回到shell,使用fg命令返回vim
- quickfix:
cw: 如有错误打开quickfix窗口 make: 调用make cnext: 移动光标到下一个编译错误 (类似的有cprevious)缩写为cp, cn
记录¶
- VIM的记录功能
- 命令模式下按q,接下来需要按一个小写字母,表示该记录的名字,eg: qa
- 进行记录模式后,用户所有的操作都会被记录下来,直到再次按q键会退出记录模式
- 回放:在命令模式中按@a,可以@前加数字表示回放次数
标记¶
- 标记的使用=====
- marks: 列出所有的标签,都可以使用`{x}进行跳转
- ma: 在当前光标的位置标记一个书签,名字为 a。你看不见书签的存在(:tags),但它确实已经在那里了。
- 书签名只能是单个的字母:小写字母(a-z)意味着当前文件有效;而大写字母(A-Z)意味着全局生效。
- `a: 反引号)到书签 a 处。
- `.: 反引号)到你上次编辑文件的地方。这个命令很有用,而且你不用自己去标记它。 ===记住是上次“编辑”的地方!===
- ``: 反引号)回到最近一次移动前的位置。
- 上面几条以(反引号)开始的命令都可以把反引号替换为单引号’,跳到目标行的开头去
杂项¶
VIM的假死:按下Ctrl + s后,你会发现不能输入任何东西了,像死掉了一般,其实vim并没有死掉,这时vim只是停止向终端输出而已,要想退出这种状态,只需按Ctrl + q 即可恢复正常。
- 输入希腊字母:希腊字母的输入非常常见,尤其是在数学公式中,因此知道这个技巧非常有用!希腊字母能用相对应的拉丁字母后接星号来创建:例如Ctrl-K p *可输入小写的π;Ctrl-k (a,b,c,d,e) *可输出小写的α,β,ξ,δ,ε等等数学里的常用字符。
把Vim打造成IDE¶
把VIM配置成IDE 参考 :
先给VIM安装中文帮助:从这里 http://vimcdoc.sourceforge.net 下载vim_cdoc_x.x.x.tar.gz,解压后$sudo ./vimcdoc.sh -i 就完成了,如果默认没有启动,就要.vimrc中添加:
set helplang=cn set encoding=utf-8 “因为中文帮助文件是uft-8编码的
- 然后第一步就是要先安装上ctags,然后给代码目录生成相应的ctags -R,再在vim中用:set tags=./xxx/tags加载进来,就可以使用<C+]>,<C+w ]>进行函数定义的跳转了,当然用<C+t>可以返回原处。
:help usr_29里有详细的介绍
omnicppcomplete的自动补全需要用ctags生成cpp格式的tags文件,命令如下:
>>> ctags -R --c++-kinds=+p --fields=+iaS --extra=+q