Skip to content

Instantly share code, notes, and snippets.

@flyfire
Last active December 21, 2015 01:19
Show Gist options
  • Save flyfire/6227245 to your computer and use it in GitHub Desktop.
Save flyfire/6227245 to your computer and use it in GitHub Desktop.
vimrc,gvimrc
"http://anduo.iteye.com/blog/1867212
"http://lok.me/a/1337.html
"http://www.pythonclub.org/vim/gui-font
"http://www.oschina.net/code/snippet_574132_13357
"vim gvim windows 字体设置 github
"https://github.com/ruchee/vim
"https://github.com/hooluupog/TestLanguagePerformance/tree/master/vim
# Vim User Manual
##VIM第一步
+ ``U``一次撤销一行的全部操作。第二次使用该命令会撤销前一个``U``的操作。
+ ``u``和``CTRL_R``撤销和重做
+ ``ctrl_]``跳转到一个标签,``ctrl_t``弹出标签可以回到前一个位置,``ctrl_o``跳转到较早的位置。
+ ``help``
+ ``help {subject}``
+ ``help ctrl-a`` ``help i_ctrl-a``
+ ``help -t``命令行选项
+ ``help i_<Up>``
+ ``help 'number'``
+ ``help``
* ``help 'subject'``选项
* ``help subject()``函数
* ``help -subject``命令行参数
* ``help +subject``编译选项
* ``help eventname``引发自动命令的事件
* ``help digraphs.txt``帮助文件
* ``help pattern<Tab>``
* ``help pattern<ctrl-d>``同时列出匹配``pattern``的所有可能的帮助主题
* ``helpgrep pattern``在所有帮助文件中搜索全部文本查找指定的``pattern``并定位到第一个匹配的位置,用``cn``跳转到下一个匹配项,``cprev``或``cN``跳转到前一个匹配项,``cfirst`` ``clast``分别跳转到第一个/最后一个匹配项。``copen`` ``cclose``打开/关闭快速修改窗口,在该窗口按``<enter>``可以跳到当前光标所意指条目。
##移动
* ``w``向前移动一个word,到下一个word的首字符上,``b``向后移动到前一个word的首字符上。``e``向前移动到下一个word的最后一个字符上,``ge``向后移动到前一个word的最后一个字符上。
* 有一些被认为是`non-word`的特殊字符,比如`.`, `-`或`)`充当了word边界的作用。要改变Vim对word边界的定义,请查看`iskeyword`选项。还可以以空白为分界的WORDs为单位进行移动。这种WORD与通常意义上的word的边界不同。所以此处用了大写的WORD来区分于word. 它的移动命令也是相应字母的大写形式。<img src='file:///F:\pics\vim-moving.jpg' alt='vim-moving'>
* `$`命令将光标移动到当前行行尾。如果你的键盘上有一个`<End>`键,它的作用也一样。`^`命令将光标移动到当前行的第一个非空白字符上`0`命令则总是把光标移动到当前行的第一个字符上。`<Home>`键也是如此。
* 一个最有用的移动命令是单字符搜索命令。命令`fx`在当前行上查找下一个字符x. 提示:`f`意为`find`.`F`命令向左方向搜索。`tx`命令形同`fx`命令,只不过它不是把光标停留在被搜索字符上,而是在它之前的一个字符上。提示:`t`意为`To`. 该命令的反方向版是`Tx`。这4个命令都可以用`;`来重复。以`,`也是重复同样的命令,但是方向与原命令的方向相反。
* 写程序的时候很容易被层层嵌套的()给弄糊涂。此时使用命令`%`就太方便了:它跳转到与当前光标下的括号相匹配的那一个括号上去。这对方括号[]和花括号fg同样适用。(具体可以处理哪些括号可以由`matchpairs`选项来定义)。如果当前光标并没有停留在一个可用的括号字符上,`%`也会向前为它找到一个。所以如果当前光标位于上例中的行首,`%`命令还是会向前先找到第一个`(`,然后找到与它匹配的`)`。
* `G`命令。指定一个命令计数,这个命令就会把光标定位到由命令计数指定的行上。比如`33G`就会把光标置于第33行上。另一个移动到某行的方法是在命令`%`之前指定一个命令计数. 比如`50%`将会把光标定位在文件的中间. `90%`跳到接近文件尾的地方。Vim对百分比的计算是以行为单位,不是字节数,如何跳转到以字节数为百分比或为偏移的字符上去?`:goto 3`。上面的这些命令都假设你只是想跳转到文件中的某一行上,不管该行当前是否显示在屏幕上。但如果你只是想移动到目前显示在屏幕上的那些行呢?`H`意为Home, `M`为Middle, `L`为Last.
* CTRL-U命令会使文本向下滚动半屏。也可以想象为在显示文本的窗口向上滚动了半屏。CTRL-D命令将窗口向下移动半屏,所以相当于文本向上滚动了半屏。要向前滚动一整屏(实际上是整屏去两行)使用命令CTRL-F(forward). 另外CTRL-B(backward)是它的反向版。很幸运CTRL-F是向前,CTRL-B是向后。
* `zz`命令会把当前行置为屏幕正中央。`zt`命令会把当前行置于屏幕顶端,`zb`则把当前行置于屏幕低端。
* `/string`命令可用于搜索一个字符串。字符`.*[]^%/?~$` 有特殊意义,如果你要找的东西包括这些内容,要在这些字符前面放置一个反斜杠。`?`命令与`/`的工作相同,只是搜索方向相反。
* 把光标定位于这个word上,然后按下`*`键。Vim将会取当前光标所在的word并以它为目标字符串进行搜索。`#`命令是`*`的反向版。还可以在这两个命令前加一个命令计数:`3*`查找当前光标下的word的第三次出现。
* 查找整个word,如果你用`/the`来查找Vim也会匹配到`there`. 要查找作为独立单词的`the`使用如下命令:`/the\>`。`\>`是一个特殊的记法,它只匹配一个word的结束处。近似地,`\<`匹配到一个word的开始处。这样查找作为一个word的`the`就可以用:`/\<the\>`。这个命令就不会匹配到`there`或`soothe`.注意`*`和`#`命令会在内部使用这些标记word开始和结束的特殊标记来查找整个的word(你可以用`g*`和`g#`命令来同时匹配那些包含在其它word中的字串。)
* 如果你在编辑一段源程序时看到了一个叫`nr`的变量。你想查看一下这个变量都被用在了哪些地方。简单的办法是把光标移到`nr`上然后用`*`命令和`n`命令一个一个地查找所有的匹配。`:set hlsearch`现在你要再查找`nr`, Vim就会以某种形式高亮显示所有符合的匹配。对于想查看一个变量被用在哪些地方,这个办法太棒了,不需任何其它的命令。如何排除函数外别处同名变量的干扰呢?答:`/\%<3l `限定。
* `:set incsearch`使得你在键入目标字符串的过程中Vim就同时开始了搜索工作。使用这种方法可以让你在尚未完全键入字串时就能找到目标。`set nowrapscan`该设置会使搜索过程在文件结束时就停止。或者,在你反向搜索时在到达文件开头时停止。`wrapscan`选项的默认值是开,这样搜索在到达文件的头尾时都会绕向另一个方向继续进行。
* 当你用`G`命令从一个地方跳转到另一个地方时,Vim会记得你起跳的位置。这个位置在Vim中是一个标记。使用下面的命令可以使你跳回到你刚才的出发点:````。再次使用上面的这个命令你就会又跳回来了。这是因为`也是一个跳转命令,所以上次跳转时的起跳位置现在被标记为了`。更一般地说,只要你执行一个命令使光标定位于当前行之外的某行上去,这都叫一个跳转。包括`/`和`n`这些搜索命令(不管被找到的东西离当前位置有多远). 但是字符搜索命令`fx`和`tx`, 或者是以word为单位的移动光标位置的命令`w`和`e`不叫跳转。同时,`j`和`k`命令并不被视为一个跳转,即使你在它们之前加了命令计数让当前光标跳到老远的地方也是如此。``命令可以在两点之间来回跳转。`CTRL-O`命令是跳转到你更早些时间停置光标的位置(提示:O意为older). `CTRL-I`则是跳回到后来停置光标的更新的位置(提示:I在键盘上位于O前面).使用`CTRL-I `与按下`<Tab>`键一样。`:jumps`命令会列出关于你曾经跳转过的位置的列表。你最后一个跳转的位置被特别以一个`>`号标记。
* Vim允许你在文本中定义你自己的标记。命令`ma`将当前光标下的位置名之为标记`a`. 从a到z一共可以使用26个自定义的标记。定义后的标记在屏幕上也看不出来。不过Vim在内部记录了它们所代表的位置。要跳转到一个你定义过的标记,使用命令<code>`{mark}</code>, {mark}就是你定义的标记的名字。命令<code>'mark</code>(单引号,或者叫呼应单引号)会使你跳转到mark所在行的行首。这与`mark略有不同,`mark会精准地把你带到你定义mark时所在的行和列。
* 可以使用`:marks`查看关于标记的列表。列表里会有一些特别的标记。`'`进行此次跳转之前的起跳点,```上次编辑该文件时光标最后停留的位置,`[`最后一次修改的起始位置,`]`最后一次修改的结束位置。
##小幅改动
* 就象`dd`命令可以删除整行一样,`cc`命令可以改变整行。不过仍保持原来的缩进(一行打头的空白).也正如`d$`删除到行尾为止的内容,`c$`改变当前光标到行尾的内容。就好象是用`d$`删除然后又以`a`进入Insert模式追加新的文本一样。有一些操作符+位移命令使用率是如此之高以至于它们以一个单独的字符作为其快捷方式:`x`代表dl(删除当前光标下的字符),`X`代表dh(删除当前光标左边的字符),`D`代表d$(删除到行尾的内容),`C`代表c$(修改到行尾的内容),`s`代表cl(修改一个字符),`S`代表cc(修改一整行)。`3d2w`是删除两个word, 重复执行3次,总共是6个word.
* `r`命令不是一个操作符命令。它等待你键入下一个字符用以替换当前光标下的那个字符。你也可以用`cl`或`s`完成同样的事情,但用`r`的话就不需要再用<Esc>键回到Normal模式了。要把一个字符替换为一个换行符使用`r<Enter>`. 它会删除一个字符并插入一个换行符。在此处使用命令记数只会删除指定个数的字符:`4r<Enter>`将把4个字符替换为一个换行符。
* `.`命令是Vim中一个简单而强大的命令。它会重复上一次做出的改动。`.`命令会重复你做出的所有修改,除了`u`命令CTRL-R和以冒号开头的命令。`.`需要在Normal模式下执行,它重复的是命令,而不是被改动的内容。
* 如果你想整行整行地操纵文本,使用`V`进入Visual模式。你会看到被选中的文本是一整行为最小选择单位。此时左右移动命令毫无意义。而上下位移命令则会整行整行地选择文本。
* 如果你想以一个矩形的文本块为对象进行操作,你需要用CTRL-V进入Visual模式(在MS-Windows下使用CTRL-Q代替,CTRL-V保留原来的粘贴功能)。在编辑表格时这可就派上用场了。
* 如果你已经在Visual模式下选中了一些文本,但此时发现还要改变另一头的被选择区域,`o`命令(提示:o代表other end另一头)会让光标置于被选中文本的另一头,这样你就可以通过控制光标移动来决定被选文本将从何处开始。再按`o`又会让光标置于被选文本的末端。当你进行矩形文本块内容的选择时,你有4个角都可以改变。`o`只会把你带到对角的位置去,使用`O`命令可以让你在同一行的左右两个角之间移动。
* `P`命令与`p`一样取回被删除的内容,不过它把被取回的内容置于光标之前。对于以`dd`删除的整行内容,`P`会把它置于当前行的上一行。对于以`dw`删除的部分内容,`P`会把它放回到光标之前。也可以对命令`p`和`P`命令使用命令记数。它的效果是同样的内容被取回指定的次数。这样一来`dd`之后的`3p`就可以把被删除行的3份副本放到当前位置。
* `y`操作符命令会把文本复制到一个寄存器中(指默认的寄存器`)。然后可以用`p`命令把它取回。因为`y`是一个操作符命令,所以你可以用`yw`来复制一个word. 同样可以使用命令记数。注意`yw`复制的内容中包括了word之后的空白字符。如果你不想要它们,那就用`ye`.`yy`命令复制一整行,就象`dd`是删除一整行一样。不过并不象`D`删除当前光标至行尾的内容那样,`Y`也是复制整行的内容。注意这种规律中的例外!复制当前光标至行尾的命令是`y$`.
* 如果你用的是Vim的GUI版本(gvim),你会在`Edit`菜单中发现`Copy`命令。首先在Visual模式下选择一些文本,然后用Edit/Copy菜单。现在被选择的文本就被复制到了剪贴板。这样你就可以在其它程序里粘贴这些内容了。当然也可以在Vim里面使用(从技术上说,此处的Copy命令与Normal模式下的yank命令区别在于工具栏或菜单中的Copy是把内容复制到了各应用程序共享的公用剪贴板上,Vim中对应的寄存器是*,而y命令则把文本对象复制到了Vim内部的默认寄存器上`上,它是Vim私有的)。如果你在其它应用程序里把文本内容复制到了剪贴板,也可以用Vim的Edit/Paste菜单把它粘贴过来。这在Normal模式和Insert模式下都可以。在Visual模式下被选中的文本就会被粘贴进来的内容给替换掉。
* 如果你没用GUI, 或者你不喜欢用菜单,你也可以用另一种方法来做同样的事。使用通常的`y`(yank)和`p`(put)命令,不过在命令之前附加一个`*(一个双引号,紧挨着是一个星). 要把一行内容复制到剪贴板:``*yy`,要把剪贴板的内容复制过来:``*p`。这些功能只有Vim支持剪贴板操作时才可用。
* 如果光标位于一个单词的中间而你要删除这个单词,通常你需要把光标移到该单词的开头然后用`dw`命令。不过有一个更简单的办法:`daw`。`daw`中的`d`还是操作符命令。`aw`是一个文本对象。提示:`aw`意为`A Word`. 这样`daw`的完整意思是`Delete A Word`, 更准确地说,该Word之后的空白字符也被删除了(即位于行末尾的单词之前的空白).
* `cis`由操作符`c`和文本对象`is`组成。它是`Inner Sentence`的缩写。相应地还有一个叫`as`(a sentence)的。如果你想删除一个句子,你会希望把它后面的空白也给删除,所以此时最好用`das`.如果你是想以新的文本替代它,空白就可以留下来,使用`cis`好了。
* 你也可以在Visual模式使用文本对象。它将把指定的文本对象选进Visual模式的文本选择区域中。当前模式仍是Visual模式,所以你可以多次使用该命令。例如,以`v`开始Visual模式,以`as`选取一个句子。现在你可以重复使用`as`来包括进更多的句子。最后你可以用一个操作符命令来作用于最终被选中的范围。查看文本对象列表`:help text-objects`。
* `R`命令会让Vim进入replace模式。在此模式下,每个键入的字符都会替换掉当前光标下的字符。直到你键入<Esc>结束该模式。`R`命令会在无字符可替换时继续拓展该行以容纳更多你要键入的内容。不过并不会延续到下一行。
* 可以在`:help operator`中找到一个操作符命令的列表。`I` 将光标置于当前行第一个非空白字符处并进入Insert模式。`~`改变当前光标下字符的大小写,并将光标移至下一个字符。`A`当光标置于当前行尾并进入Insert模式。
##定制vim
* `:version`命令会列出vim是在哪些目录中寻找vimrc的。
* 对某种文件类型来说最常用的选项可以放在一个Vim中叫文件类型plugin的脚本里。你还可以加上你自己写的,请参考`:help write-filetype-plain`.
* Vim为 众 多 不 同 的 文 件 类 型 提 供 了 相 应 的 缩 进 方 案。请 参考`filetype-indent-on`和`indentexpr`选项。
* `:map`命令(不带参数)会列出当前已定义的映射。它至少会包括定义在Normal模式下的映射。
* 当你启动Vim时,它会自动载入一些全局的plugin,你不必额外地做任何事情。这些plugin定义了使用率很高的一些功能,但它们是以一个Vim脚本的形式而不是通过内建于Vim可执行文件内来提供。你可以在`standard-plugin-list`发现一个此类plugin的列表。另外请参考`load-plugins`.你可以通过添加一个全局的plugin来获得额外的功能,这只需两步:1.得到这个plugin文件。2. 把它放到指定的目录下。
* 自己写plugin,参考`write-plugin`。
* 与全局plugin所在的目录一样,通过查看这个plugin是否提到了某个文件类型,就可以知道它是全局的还是专用于某种文件类型的,在`$VIMRUNTIME/macros`下的脚本是全局的,而在`$VIMRUNTIME/ftplugin`目录下的则是专用于特定文件类型的。
* 你可以通过把一个文件类型plugin脚本放入相应的目录来完成对它的添加。路径跟添加全局plugin时的一样,不过最后一个目录名是`ftplugin`. 假设你找到了用于`stuff`文件类型的plugin,目前你在Unix系统上,那么你可以这样加入该文件:`mv thefile ~/.vim/ftplugin/stuff.vim`。如果这个目录下已经有了一个同名文件。你就要停下来仔细检查一下两个文件是否会引起冲突,如果没问题,你可以把要加入的新文件更名一下:`mv thefile ~/.vim/ftplugin/stuff_too.vim`。下划线用于分隔用于标识文件类型的部分和其它部分,下划线其后的部分可以自由命名。如果你用`otherstuff.vim`这样的名字,Vim可不能识别它,它只会在文件类型是`otherstuff`时被载入。在MS-DOS上你不能使用长文件名。如果你要用一个辅助的plugin但是文件类型字符串已经超过了6个字符(MS-DOS文件名部分限制为小于等于8个字符,所以这里说文件类型字符串不能超过6个字符,因为下划线本身要占用一个字符,辅助plugin的其余部分至少会有一个字符)这就会有麻烦,不过你还可以通过一个额外的目录来处理这种情况:`mkdir $VIM/vimfiles/ftplugin/fortran` `copy thefile $VIM/vimfiles/ftplugin/fortran/too.vim`。文件类型plugin的文件名一般形式是:`ftplugin/<filetype>.vim`,`ftplugin/<filetype>_<name>.vim`,`ftplugin/<filetype>/<name>.vim`。`<filetype>`部分是plugin所服务的目标文件类型。只有相应类型的文件才能应用到这个plugin. plugin文件中的`<name>`部分对Vim的识别工作并不起使用,你可以对几种不同的plugin都使用一样的`<name>`部分也没问题。注意这些文件必需以`.vim`为扩展名。
* 推荐阅读`filetype-plugins`关于文件类型plugin的文档以及如何避免映射引起冲突的信息,`load-plugins`关于Vim启动过程中何时载入全局plugin,`ftplugin-overrule`如何强制改变全局plugin中的设置,`write-plugin`如何写一个plugin脚本,`plugin-details`关于如何使用plugin或者解决你的plugin出现的bug,`new-filetype`如何检测新文件类型。
* 在`runtimepath`选项里列出的目录列表中选一个目录,建立它的一个子目录`doc`,`:!mkdir ~/.vim/doc`。把帮助文件copy到这个`doc`目录下,`:!cp $VIMRUNTIME/macros/matchit.txt ~/.vim/doc`。用`:helptags`命令生成一个本地化的tags文件,`:helptags ~/.vim/doc`。参考`write-local-help`了解更多关于写一个本地化的帮助文件的信息。
* 在`:options`中查找vim设置选项。
* 随时可以用`:help`命令来获得关于它们的更详细解释,记住在选项关键字的前后放上一个单引号。万一你把一个选项值改到自己难以收拾残局,还可以在该选项的后面放一个&符号使它恢复其默认值,如:`:set iskeyword&`。
* Vim中多数移动光标的命令会在遇到行首或行尾时停止不动。`whichwrap`选项可以用来控制这些移动光标的命令此时的行为规则。下面的设置是它的默认值`set whichwrap=b,s`。这样光标位于行首时按退格键会往回移动到上一行的行尾。同时在行尾按空格键也会移动到下一行的行首。要让左右箭头键在遇到行的边界时也能智能地上上下下,使用命令:`:set whichwrap=b,s,<,>`。这些都是只针对于Normal模式。要让左右箭头键在Insert模式下也能如此:`:set whcihwrap=b,s,<,>,[,]`。对h, l命令无效,要使h, l命令也能绕到当前行之外,需要`:set whichwrap+= l,h`。
* 文件中含有制表符时,你并不能看到它们。要让这些制表符成为可见的字符:`:set list`。现在每个制表符都会以`^I`显示。同时每行行尾会有一个`$`字符,以便你能一眼看出那些位于一行尾部的多余空格。这样做的缺点是文件中制表符很多时整个屏幕看起来就很抱歉了。如果你的终端支持彩色显示,或者使用的是GUI, Vim就可以把制表符和空白字符高亮起来显示。这要配合使用下面的`listchars`选项:`:set listchars=tab:>-,trail:-`。现在每个制表符会以`>---`显示,同时行尾空格以`-`显示。
* `iskeyword`选项定义了一个word中可以包含哪些字符:`:set iskeyword` `iskeyword=@,48-57,_,128-167,224-235`,`@`在这里代指所有的字母,`48-57`指ASCII码从48到57的那些字符,即0到9。其余的是可打印拉丁字母。有时候你可以想把连字符也视为word的一部分,这样象`w`命令就会把`upper-case`看作是一个word了:`:set iskeyword+=-`,要把一个字符清理出去使用操作符`-=`.
* Vim启动时会在窗口最底部留下一行用于显示信息。要显示的信息太长时,Vim或者把它截短让你只能看到部分内容,或者多出来的信息需要你按下回车键以滚动显示。你可以设置°cmdheight°选项来控制拿出几行来显示这些信息`:set cmdheight=3`。
@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Original file.Changes later sucks.
WTF

@flyfire
Copy link
Author

flyfire commented Aug 19, 2013

Oops,网络真他妈给力。。。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment