注解

工欲善其事,必先利其器。

注解

我的 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
      

VIM插件学习

NERD Commenter

常用功能:

  • \cc 加逐行注释
  • \cu 取消注释
  • \cm 添加块注释