zoukankan      html  css  js  c++  java
  • 必须熟悉的vim快捷键操作

    转载请表明出处http://www.dabu.info/?p=801

    Vim/Vi 没有菜单,只有命令

    Vim/Vi 工作模式介绍:
    插入模式 和  命令模式 是vi的两个基本模式。
    ——插入模式 ,是用来编写文本内容的。
    ——命令模式,是用来编辑文本,如上下翻页等,复制粘贴,跳转到指定行等操作
    当前编辑的顶部或者底部会显示vim处于何种模式下。如:mode:COMMAND!

    进入和退出vim编辑器:
    进入   vi filename(要编辑的文件名字)———>进入了命令模式
    命令模式——>输入  :wq——>退出

    保存退出
    :wq      保存修改并退出
    ZZ      快捷键,保存修改并退出(前面没有冒号)
    :q!        不保存退出

    :wq!    强行保存退出,(文件所属者科忽略文件的制度属性)
    :w        保存不退出
    :wqa     保存所有文件
    :w  new_filename  另存为指定文件

    vim配置文件    所在目录~/.vimrc
    1.修改配置文件时,可以不用加:
    2.可将编辑模式下的命令写在里面,每个命令单独一行,这样每次启动时,会自动执行里面的命令。

    ~   home directory
    root   /root
    users  /home     zhangsan   /home/zhamgsan

    命令模式——>输入i(或者ao) ——> 插入模式
    i     insert

    还可以输入其他的字母,来进入插入模式:

    ___________________________________________________________________________-
    插入命令
    命令                    作用
    a                     在光标后附加文本
    A                     在本行行末附加文本
    i                     在光标前插入文本
    I                     在本行开始插入文本
    o (字母)              在光标下插入新行
    O (字母)              在光标上插入新行

    插入模式———> ESc键———>命令模式          http://www.dabu.info/?p=801
    如果要保存文件,就要从插入模式切换为命令模式才行

    命令模式——>: ——> 编辑模式
    编辑模式———>命令行回车结束运行——>命令模式
    在编辑模式执行完命令后,会自动回到命令模式

    ——————————————————————————————
    定位命令
    命令                        作用
    h、方向左键            左移一个字符
    j、 方向下键            下移一行
    k、方向上键            上移一行
    l、 方向右键            右移一个字符
    $                           移至行尾
    0                            移至行首
    _______________________________________
    H                            移至屏幕上端
    M                            移至屏幕中央
    L                            移至屏幕下端
    (                        (左小括号)移动到上一个句子首
    )                        (右小括号)移动到下一个句子首
    {                        (左大括号)移动到上一个段落首
    }                        (右大括号)移动到下一个段落首

    快速定位,括号匹配, %
    在command模式下。当文本中存在  (  ,{  ,[  ,等符号时可以通过输入  % (就是按shift键和数字5键)  来跳到括号对应的位置

    [[                        光标跳转到代码块开头即{处,要求{独占一行
    gD                        光标跳转到局部变量定义处
    ''                        (两个单引号)光标跳转到上次停靠处

    ————————————————————————————
    快速定位   ,行头与行尾 0 与 $
    在command模式下,
    命令                                作用

    0(数字0键)                            移至行首(把光标移至当前行的起始位置,第一个非空白字符之前,简单点说就是^ 的前面)
    ^(尖角号)                               把光标移至当前行的起始位置,也即当前行的第一个非空白字符位置
    <HOME> 移动到本行第一个字符。同0健。

    $(就是按shift键和数字4键)            移至行尾
    n$         移动到下面(包括光标所在行)n行的行尾。

    —————————————————————————-
    单个词组操作光标移动命令:

    命令                        作用

    W (大写)                       移动到下一个单词的首位置(如果连个单词直接有 逗号连接,则认为是一个单词)
    w(小写)                            将光标右移一个单词的首位置。光标停留在下一个单词的首位置(两单词有逗号相连,则认为逗号也是一个单词),注意:如果已到行尾,则转至下一行行首
    nw                    向左移动n个单词,光标停在单词的首位置
    e                        移动到单词末尾(把光标移至当前所在单词(或下一个单词)的最后一个字符位置)
    ne                    和nw类似,只不过光标停留在单词的尾部
    E                            和小写用法一样,只是以空格字符作为字的分隔符。
    nE
    b                        移动到单词的头部(如果光标已经在单词的头部,则将光标左移一个单词。光标停留在下一个单词的字首位置)
    nb                    和nw类似,只不过这是向右移动
    B         将光标左移一个单词,只是以空格字符作为字的分隔符。光标停留在下一个单词的单词首位置位置(如果连个单词直接有 逗号连接,则认为是一个单词)
    nB

    注意:上面这些命令都使用’iskeyword‘选项中的字符来确定单词的分界,还有几个命令,只把空白字符当做”单词“的分界。当然,这里说的” 单词“已经不是传统意义上的单词了,而是由非空白字符构成一串字串。命令”W“移动光标到下个字串的开始,命令”B“移动到上个字串的开始;命令”E“移 动到下个字串的结尾,命令”gE“移动到上个字串的结尾。和上面的命令比较一下,发现什么规律没有?

    ————————————————————————————
    多个词组光标移动:
    上面我们掌握了单个词组的移动,如果需要移动多个词组的光标,只需要在使用前加上要移动的词组的个数即可。一个英文字母的宽度是1,两个字母的宽度等于一个汉字的宽度。
    举例如下:
    Example : ABC   DEF   GHI   JKL   MNO   PQR   STUVW
    假设光标现在处于Example的E处。并且vim处于command模式。那么我们先按 数字3键 ,再按w键。光标就会跳到JKL的J处。

    ————————————————————————-
    vim重复输入文本:
    举例:我们要输入gogogo。
    方法如下:
    vim在COMMAND模式下,先按数字3键,然后按 i键,在输入go,再按Esc键。就可以输入gogogo了。

    还有,如将数字加在命令前,标示该命令处理几次,如5dd标示执行5次dd(删除光标所在整行)操作。
    .   (英文句号)为命令重复命令,按下一次执行一次上一次执行过的命令。

    ————————————————————————————
    快速定位,行头与行尾 0 与 $
    在command模式下,
    命令                                作用
    $(就是按shift键和数字4键)            移至行尾
    0(数字0键)                            移至行首(把光标移至当前行的起始位置,第一个非空白字符之前,简单点说就是^ 的前面)
    ^(尖角号)                               把光标移至当前行的起始位置,也即当前行的第一个非空白字符位置

    ————————————————————————————————
    快速行定位,跳到指定的行, g 与 G

    命令                        作用
    :set nu                设置行号
    :set nonu            去想行号

    :set nu!                        取消显示行号
    gg                        到第一行
    G                            到最后一行
    nG                        到第n行
    :n                        到第n行

    Ctrl + e 向下滚动一行

    Ctrl + y 向上滚动一行

    Ctrl + d 向下滚动半屏

    Ctrl + u 向上滚动半屏

    Ctrl + f 向下滚动一屏

    Ctrl + b 向上滚动一屏

    —————————————————————————-
    快速定位,字母查找 f 与 F:
    在command模式下,通过按  f 或者 F   快速定位内容。(不需要输入冒号)
    命令                        作用
    f                            想后查找
    F                            向前查找
    可以结合数字来进行多次查找,如按下  3fq   ,就会放下查找第三个q
    如果不加数字,如   fq    ,就会向后查找第一个q

    ——————————————————--——————
    查找光标下的相同词组, * 与 #
    通过  *  ,可以往后查找光标停留位置相同的词组。  #  是向前超找
    举例:假设光标停留在第一个if处
    if  we are god   if you are human

    我们在command模式下,输入  *  ,光标就会跳到“if you are human”的那个if上去

    ——————————————————————————————————————————————————————

    字符替换
    命令模式下
    r                        (小写)替换光标所在处一个字符,如ra,就是将当前光标所在处字符替换为a
    R                        (大写)开始替换,直到按ESC键退出替换,相当于按下键盘上到insert键
    cc                        (小写)取代光标所在整行
    S                        (大写)与ss(小写)效果相同
    C                        (大写)取代到行尾,包括光标处字符
    c0                        (小写,数字0)取代到行首,不包括光标处字符
    c^                        (小写)与c0(小写,数字0)效果相同

    ___字符串单词搜索和替换命令______________________________________

    #命令模式下

    命令                            作用
    /string                        向前搜索指定字符串

    ?string        从光标处开始向上开始查找字符从string
    vim中有一些特殊字符在查找时需要转义  .*[]^%/?~$
    set  ic              查找时,忽略大小写
    set noic         查找时,不忽略大小写
    :nohlsearch  关闭当前的高亮显示,如果再次搜索或者按下n或N键,则会再次高亮。

    :set incsearch  逐步搜索模式,对当前键入的字符进行搜索而不必等待键入完成。

    :set wrapscan  重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启。

    n                                查找模式下,搜索指定字符串的下一个出现位置
    N                                查找模式下,往上找指定字符串出现的位置
    s/old/new/ 用old替换new,替换当前行的第一个匹配
    s/old/new/g 用old替换new,替换当前行的所有匹配
    :%s/old/new/                 用old替换new,替换所有行的第一个匹配
    :%s/old/new/g            全文替换指定字符串
    :n1 ,n2s/old/new/g    在一定范围内替换指定字符串
    若将g改为c,就会询问是否替换。在替换文本old或new中有特殊字符,如“/”等,都需要用进行转义

    贴上两篇关于vim替换的文章:

    语法为 :[addr]s/源字符串/目的字符串/[option]
    全局替换命令为::%s/源字符串/目的字符串/g
    [addr] 表示检索范围,省略时表示当前行。
    如:“1,20” :表示从第1行到20行;
    “%” :表示整个文件,同“1,$”;
    “. ,$” :从当前行到文件尾;
    s : 表示替换操作
    [option] : 表示操作类型
    如:g 表示全局替换;
    c 表示进行确认
    p 表示替代结果逐行显示(Ctrl + L恢复屏幕);
    省略option时仅对每行第一个匹配串进行替换;
    如果在源字符串和目的字符串中出现特殊字符,需要用””转义
    下面是一些例子:
    #将That or this 换成 This or that
    :%s/(That) or (this)/u2 or l1/
    —-
    #将句尾的child换成children
    :%s/child([ ,.;!:?])/children1/g
    —-
    #将mgi/r/abox换成mgi/r/asquare
    :g/mg([ira])box/s//mg//my1square/g    <=>  :g/mg[ira]box/s/box/square/g
    —-
    #将多个空格换成一个空格
    :%s/  */ /g
    —-
    #使用空格替换句号或者冒号后面的一个或者多个空格
    :%s/([:.])  */1 /g
    —-
    #删除所有空行
    :g/^$/d
    —-
    #删除所有的空白行和空行
    :g/^[  ][  ]*$/d
    —-
    #在每行的开始插入两个空白
    :%s/^/>  /
    —-
    #在接下来的6行末尾加入.
    :.,5/$/./
    —-
    #颠倒文件的行序
    :g/.*/m0O  <=> :g/^/m0O
    —-
    #寻找不是数字的开始行,并将其移到文件尾部
    :g!/^[0-9]/m$ <=> g/^[^0-9]/m$
    —-
    #将文件的第12到17行内容复制10词放到当前文件的尾部
    :1,10g/^/12,17t$
    ~~~~重复次数的作用
    —-
    #将chapter开始行下面的第二行的内容写道begin文件中
    :g/^chapter/.+2w>>begin
    —-
    :/^part2/,/^part3/g/^chapter/.+2w>>begin
    —-
    :/^part2/,/^part3/g/^chapter/.+2w>>begin|+t$第二篇:vi/vim 中可以使用 :s 命令来替换字符串。该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询。:s/vivian/sky/ 替换当前行第一个 vivian 为 sky:s/vivian/sky/g 替换当前行所有 vivian 为 sky:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky

    n 为数字,若 n 为 .,表示从当前行开始到最后一行

    :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky

    :%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky

    可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符

    :s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/

    :%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/

    1.:s/vivian/sky/ 替换当前行第一个 vivian 为 sky

    :s/vivian/sky/g 替换当前行所有 vivian 为 sky

    2. :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky

    :n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky

    (n 为数字,若 n 为 .,表示从当前行开始到最后一行)

    3. :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky

    :%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky

    4. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符

    :s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/

    5. 删除文本中的^M

    问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M.请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。

    。 使用命令:cat filename1 | tr -d “^V^M” > newfile;

    。 使用命令:sed -e “s/^V^M//” filename > outputfilename.需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M.你必须要手工进行输入,而不是粘贴。

    。 在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:%s/^V^M//.

    。 :%s/^M$//g

    如果上述方法无用,则正确的解决办法是: [Page]

    。 tr -d "\r" < src >dest

    。 tr -d "\015" dest

    。 strings A>B
    6. 替换确认
    我们有很多时候会需要某个字符(串)在文章中某些位置出现时被替换,而其它位置不被替换的有选择的操作,这就需要用户来进行确认,vi的查找替换同样支持
    例如
    :s/vivian/sky/g 替换当前行所有 vivian 为 sky
    在命令后面加上一个字母c就可以实现,即:s/vivian/sky/gc
    顾名思意,c是confirm的缩写

    7. 其它

    利用 :s 命令可以实现字符串的替换。具体的用法包括:

    :s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1

    :s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1

    :。,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1

    :1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1

    :g/str1/s//str2/g 功能同上

    从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索

    字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作

    (原文地址: http://wzgyantai.blogbus.com/logs/28117977.html)

    ddp                     交换光标所在行和其下紧邻的一行(dd剪切当前行,p粘贴)

    *                        向下完整匹配 光标所在处  的单词
    #                        向上完整匹配 光标所在处 的单词
    g*                        向下部分匹配 光标所在处  的单词
    g#                        向上部分匹配 光标所在处  的单词

    转载请表明出处http://www.dabu.info/?p=801

    _________________________________________
    命令                        作用
    r                         取代光标所在处字符
    R                         从光标所在处开始替换字符,按Esc结束

    R命令会将键盘所输入内容逐个覆盖光标所在处以后的字符

    ___________________________________________________
    删除命令/剪切命令
    命令                        作用
    x                       删除光标右边的字符
    nx                      删除光标所在处左边n个字符
    X                        删除光标左边的字符
    nX                        删除光标左边n个文字
    d                         用于剪切删除文字
    dl                         删除当前字符, dl=x
    dh                     删除前一个字符
    dw                        删除光标之后的单词剩余部分,如果光标在单词字首位置,则删除光标右边第一个单词
    dnw                        删除光标之后的单词剩余部分和n个单词。如果光标在单词字首位置,则删除光标后面n个单词
    db                        删除到某个单词的开始位置
    de                        删除一个单词
    dne                        删除光标后面n个单词
    dd                      删除光标所在行,ndd删除n行
    ndd                     删除光标所在行向下 n 行,例如 20dd 则是删除 20 行(常用)
    dj                           删除上一行
    dk                        删除下一行
    dG                      删除光标所在行到文件末尾的内容
    d1G                    删除光标所在行到第一行的所有数据
    dgg                        删除当前行到文件首部的所有行(包括当前行)
    jdG                     删除当前行之后所有行(包括当前行)

    D                       删除当前字符至行尾,D=d$
    d$                          与D效果相同
    d0                           是数字0)删除到行首,不包含光标处的字符
    d^                                与d0效果相同
    :n,$d                     删除n行及以后所有的行
    :1,$d                     删除所有行

    : n1,n2d                删除n1行到n2行之间的行
    范例:
    :6655,6665d

    dl    删除字符 (缩写: "x")
    diw    删除内含单词
    daw    删除一个单词
    diW    删除内含字串 (见 |WORD|)

    daW    删除一个字串 (见 |WORD|)
    dis   删除内含句子
    das"   删除一个句子
    dib  删除内含 '(' ')' 块
    dab   删除一个 '(' ')' 块
    dip   删除内含段落
    dap   删除一个段落
    diB    删除内含 '{ ' ' }' 大块
    "daB"    删除一个 '{ ' ' }' 大块

    ___________复制剪切粘贴命令______________________________x
    命令                        作用
    yy、Y                        复制当前行
    nyy,nY                        复制当前行一下n行(包括当前行)
    p、P                        粘贴在当前光标所在行下或行上
    ddp                            交换当前行和其下一行
    dd                            剪切当前行
    ndd                            剪切当前行一下n行(包括当前行)
    :1,10d             将1-10行剪切。利用p命令可将剪切后的内容进行粘贴。
    :1, 10 m 20 将第1-10行移动到第20行之后。

    _____________________________________________________________________________

    块编辑

    Ctrl+V 进入块选择/块编辑模式/块选择
    LINUX下是Ctrl-v,但是在windows下的GVIM,Ctril-v是粘贴。所以,windows下按 Ctrl-q 进入块(列)编辑

    v:字符选择,会将光标经过的地方反白选择
    V:行选择,会将光标经过的行反白选择
    [ctrl]+v:块选择,可以用长方形的方式来选择数据
    y:复制反白的地方
    d:删除反白的地方
    p   粘贴到上一行
    P(大写的)   粘贴到下一行

    $  将块选择中的每一行都扩展至行尾
    h  停止上面的状态

    Ixxx<Esc>  在被选中的块的前面插入xxx

    0Ixxx<Esc>  在被选中的块的每一行的行首插入xxx
    Axxx<Esc>  在被选中的块的后面追加xxx

    $Axxx<Esc> 在被选中的块的每一行的行尾追加xxx

    cxxx<Esc>  在被选中的块中删除被选中的块并以xxx替代
    Cxxx<Esc>  在被选中的块中删除被选中的块一直到第一行行尾,并以xxx替代
    rx    把被选中的块中的所有字符都替换成x

    ~  交换大小写
    U  小写变大写
    u  大写变小写

    >  将被选中的块向右移动一个shift单位,空出来的地方填补空格
    <  同上,但是是向左移动,但是移动的单位同时受限于左边的边界

    J  将下一行附在当前行的末尾,本行的尾空格与下一行的头空格全都只用一个空格代替
    gJ  同上,但是不对原文本内容做任何改动

    :read a.txt将a.txt读入并放在当前行的下一行
    :$r  a.txt将a.txt读入并放在当前文件的最后
    :0r  a.txt将a.txt读入并放在当前文件的最开始

    :.,$w tmp将当前行到最后一行写入tmp文件中
    :.,$w! tmp将当前行到最后一行写入tmp文件中,即使tmp已存在
    :.write >>tmp将当前行追加到tmp文件

    gU  将字符变大写
    gUl  将当前字符变大写
    gUw  将当前字符至该word结束变大写
    gU$  将当前字符至行尾变大写
    gUgU 将当前整行变大写,可省略为gUU

    gu  将字符变小写
    gul  将当前字符变小写
    guw  将当前字符至该word结束变小写
    gu$  将当前字符至行尾变小写
    gugu 将当前整行变小写,可省略为guu

    g~  改变字符大小写
    g~l  改变当前字符大小写
    g~w  改变当前字符至该word结束大小写
    g~$  改变当前字符至行尾大小写
    g~g~ 改变整行字符大小写,可省略为g~~

    :[range]![shell command] 以range范围内的文本作为输入去执行command命令,并将结果覆盖写回range中
    或者用光标移动符代替:[range]

    :read ![shell command] 运行command并将输出写到当前行的下面
    :0r ![shell command]  同上,输出被写入文件开头
    :write ![shell command] 运行command并将整个文件写入到command的输入
    :.w ![shell command]  同上,只会将当前行输入给command

    Ctrl+L 重绘屏幕

    :%s/<four>/4/g 将文件中所有的单词four替换成4

    vim *.cpp
    qq:%s/<GetResp>/GetAnswer/ge<Esc>:wnq9999@q 将所有cpp文件打开并把所有的GetResp单词换成GetAnswer

    :%s/([^,]*), (.*)/2 1/ 将文件中所有的First, Last形式替换成Last First形式

    g Ctrl+g 统计字数(要统计某一块具体的字数可以使用visual模式)

    K  查找man页

    :%s/s+$//  删除所有行末空白

    ————————————————————————————————
    WINDOWS下的GVIM的块选择命令是:

    在gvim(windows版)中,块选择的快捷键不是<Ctrl-v>,此快捷键为粘贴。
    先按V(貌似可以不按v),在按组合键Ctrl-q,然后使用hjkl来移动光标选择块。

    快速选择多行,如果用 hjkl慢慢移动就太慢了,所以,我们选择多行,可以先输入行号,然后输入G(就是shift+g)。

    一般的选择模式为:v(小写),此时会显示:可视。

    行选择模式为:V(大写),此时会显示:可视-行。

    最凶残的块选择模式则为:<Ctrl-q>,此时会显示:可视-块。

    如果希望批量插入注释,则为以下操作顺序:

    1、移动光标到注释块的第一行。

    2、按Esc进入Normal模式。

    3、按<Ctrl-q>进入块选择模式。

    4、用h、j、k、l 键向下移动光标(注意:这里只能用这四个键移动,不支持方向键)。

    5、选中相应的行后,按I(大写)键。

    6、输入//,并按Esc键,完成注释。

    注意:gvim中ctrl +v 变成粘贴,如果你按下 Ctrl + v 没能进入列选择模式,请看这里)是因为vim的设计者用了个mswin.vim,以此能够使用windows的快捷键粘贴,撤销等。但是这又会和vim本 身的快捷键冲突。http://edyfox.codecarver.org/html/vimrc_mswin.html  。
    我们还可以通过注销gvim的vimrc配置文件注销与 mswin.vim相关的行,则可以直接使用ctrl+v进入块选择模式

    ————————————————————————————-
    重复执行操作
    很多时候一个操作,我们要执行几遍。通过   .    来进行重复的操作
    举例:假设光标在abc处。我们来重复删除2个单词:
    abc  bdf   sdfe   erwer   eete   wer  uty

    在command模式下,先输入  d2w  ,然后   输入  . (英文的句号)  ,就会不断执行删除两个单词的操作,按多少次  .   就重复多少次

    ————————————————————————————————————————————
    撤销操作:
    如果编辑文本输错了,可在命令模式下按  u键  撤销  和 ctrl+R  返回撤销
    u                         取消上一步操作(最多连续取消500次)

    Ctrl+r                 恢复上一步被撤销的操作
    U              撤销当前一行的操作

    —————————————————————————————————
    自动补齐

    C-n      匹配下一个关键字
    C-p      匹配上一个关键字

    ———————————————---------------------------
    简单排版
    :ce(nter)                居中显示光标所在行
    :ri(ght)                靠右显示光标所在行
    :le(ft)                        靠左显示光标所在行
    J                                将光标所在下一行合并到光标所在行
    >>                                光标所在行增加缩进(一个tab)
    <<                                光标所在行减少缩进(一个tab)
    n>>                        光标所在行开始的n行增加缩进
    n<<                        光标所在行开始的n行减少缩进

    ——————————————————————————————————————————————
    多tab|窗口拆分
    :tabnew [++opt选项] [+cmd] 文件            建立对指定文件新的tab
    :tabc       关闭当前的tab
    :tabo       关闭所有其他的tab
    :tabs       查看所有打开的tab
    :tabp      前一个
    :tabn      后一个
    关闭窗口
    :close             最后一个窗口不能使用此命令,可以防止意外退出vim。
    :q 如果是最后一个被关闭的窗口,那么将退出vim。

    标准模式下:
    gt , gT 可以直接在tab之间切换。
    还有很多他命令, 看官大人自己, :help table 吧。

    :new    水平切割窗口
    :split    水平切割窗口(或者直接输入   :sp  也可以)
    :vsplit   垂直切割( 也可以  :vs  )
    Ctrl+ww 移动到下一个窗口
    或者 先按组合键ctrl+w ,然后都松开,然后通过j/k/h/l(等于vim移动的方向键) 来移动大哦哦左/上/下/右的窗口
    Ctrl+wj 移动到下方的窗口

    Ctrl+wk 移动到上方的窗口

    vim -o a.txt b.txt c.txt为每一个文件打开一个水平分割窗口
    vim -O a.txt b.txt c.txt为每一个文件打开一个垂直分割窗口

    :only  录制宏。按q键加任意字母开始录制,再按q键结束录制(这意味着vim中的宏不可嵌套),使用的时候@加宏名,比如qa。。。q录制名为a的宏,@a使用这个宏。

    vim中的几个文本对象:aw 一个单词;  as 一个句子;  ap 一个段落

    zfap 创建一个段落的折行

    zc 关闭折行

    zo 打开折行

    ———————————————————————————————————
    vimdiff a.txt b.txt打开a.txt和b.txt并进行比较(这个是shell中的命令)

    :vertical diffsplit a.txt打开分割窗口用于比较当前文件和a.txt
    :set scrollbind同步滚动 noscrollbind不同步滚动

    qa  将后续命令录制在寄存器a中(从a到z有26个可用)
    q  停止录制
    @a  执行寄存器a中录制的命令
    @@  执行刚刚执行过的寄存器中的命令
    qA  向寄存器a中追加命令

    "Ayy 将当前行追加复制到寄存器A中

    :[range]s+from+to+[flags] 把range范围内的from替换成to
    :[range]s=from=to=[flags] 把range范围内的from替换成to
    :[range]s/from/to/[flags] 把range范围内的from替换成to
    range为空时,只对当前行有效
    range为%时,对所有行都有效
    flags为空时,只替换指定行的第一个from
    flags有g时,替换指定行的所有from
    flags有c时,要求用户对每次替换进行确认
    flags有p时,要求:s命令列出所有改变的行
    flags有e时,要求:s命令在没有找到任何匹配时也不要报错

    :1,5s/from/to/g 把第1行到第5行中所有的from替换成to
    :3s/from/to/g 把第3行中所有的from替换成to
    :.write a.txt 把当前行写入a.txt
    :.,$s/from/to/g 把当前行到文件结束所有的from替换成to

    :?^Chapter?,/^Chapter/s/from/to/g 把上一个Chapter到下一个Chapter之间的所有from替换成to
    :.+3,$-5s/from/to/g 把当前+3行到倒数第5行的全部from替换成to
    :'a,'bs/from/to/g 把从a标记的行到b标记的行(包含a和b行)中全部from替换成to,注意是单引号不是倒引号

    :[range]g/{pattern}/{command} 在range范围内找到匹配pattern的行然后执行command命令
    这里的command必须是:开头的命令,而不能直接使用normal模式下的命令,除非使用|:normal|

    ————————————————————————————————————————--
    ~  改变光标所在字符的大小写,并将光标移动到下一个字符上

    :edit foo.txt在vim中开始编辑另一个文件
    :edit! foo.txt强制丢弃当前未保存的修改
    :next 转到下一个文件,可以缩写为:n
    :next! 强制丢弃未保存的修改并转到下一个文件
    :wnext 保存当前文件的修改并转到下一个文件
    :previous 转到上一个文件
    :wprevious 保存当前文件的修改并转到上一个文件
    :last 转到最后一个文件
    :first 转到第一个文件
    :2next 转到下面第二个文件

    :bn  转到下一个文件,若到最后一个文件,则转到第一个文件

    :bp  转到上一个文件,若到第一个文件,则转到最后一个文件

    :args 查看整个列表中有哪些文件
    :args a.txt b.txt c.txt重新定义一个文件列表
    :args *.txt打开所有txt文件

    Ctrl+^ 快速切换到上一个文件
    `"  移动光标到上一次离开该文件时光标所在的位置
    `.  移动光标到最后一次对文件做出修改的位置

    mA  设置当前位置为全局标记A(大写字母)
    `A  跳转到全局位置A,即使它不在当前文件内

    :set backup生成备份文件

    "fy  把选中的内容复制到寄存器f中
    "fp  把寄存器f中的内容粘贴出来
    "wdaw 把光标所在的word删除并放入寄存器w中

    :write >> logfile把当前文件写入(追加)到logfile中

    vim -R 只读打开
    vim -M 强制禁止修改打开

    :edit a.txt打开文件a.txt
    :saveas b.txt把当前缓冲区存入b.txt并同时打开b.txt进行编辑
    :file c.txt把当前文件的名字改为c.txt

    ———————————————————————————————————————————————
    书签
    mx                设定书签,x是任意一个字母,通常小写(a-z),x为小写字母时,局限在一个文件之间切换;大写字母时,可在文件之间切换.
    `x                (`位于数字键1旁边)跳转到书签x
    :marks                        查看标签

    #############################################实例#########################################
    应用实例
    导入文件或shell执行结果到正在编辑的文件中
    :r 文件名
    :r /etc/issue    将issue内容导入正在编辑的文件中
    :!shell命令                在vim中执行shell命令,执行完后按回车会到vim界面
    :r !shell命令        (r与!之间有空格)将shell命令执行的结果导入到本文件中

    在Vi中执行命令   :!命令
    :!ls /root            在编辑文件同时查看/root下的文件情况
    不用退出vim
    :r !date                在vim下将date命令的结果导入编辑文件中

    定义快捷键          :map  快捷键 触发命令
    ctrl+v  再ctrl+p             或者直接ctrl+v+p ,
    不要把^当做尖角号,
    :map ^x 命令        (map与^之间、x与命令之间有空格,此处到^并非键盘上的^,而是按下ctrl+v出现到快捷键,表示ctrl键,后面到x为任意字母)按下ctrl+x后会执行对应到命令
    例:
    :map ^p I#<ESC> 当按下ctrl+p快捷组合键时,在光标所在行行首添加一个#号,并回到命令模式

    范例:       :map ^P I#<ESC>
    ctrl+p=插入#号然后回到命令模式
    I表示vim的插入命令

    :map ^E iksharpdabu@qq.com
    ctrl+E=插入,i表示当前光标处插入
    :map ^B 0x
    ctrl+B=将光标移至行首删除光标所在字符
    0表示移至行首,x表示删除光标所在字符

    连续行注释  :n1 ,n2s/^/#/g
    在行首加#,^表示行首
    :n1 ,n2s/^#//g
    将行首的#号删除
    :n1 ,n2s/^////g
    表示转义符

    替换             :ab ksharp  ksharpdabu@qq.com
    输入ksharp,回车或者空格后,就变成了
    ksharpdabu@qq.com
    :unab    ksharp  ksharpdabu@qq.com
    取消替换

    连续行注释
    :n1,n2/^/#/g                (#号为注释符号,在shell中注释符号为#,C++中为//)
    :n1,n2/^////g        C++源文件多行连续注释

    ——————————————————————————————————————————————-

    相关插件设置
    ########################################
    phpcomplete插件

    如何使用:
    vi index.php
    插入一段php代码后比如:
    htmlsp
    先按下 Ctrl+x进入^X模式,再按下 Ctrl+o, 就能看到提示列表框,以及对应的function,还有对应的函数定义比如参数等等
    Ctrl+n, Ctrl+p 来上下选择,ESC 来取消提示

    在Insert模式下:

    <backspace> 删除光标前的一个字符

    <del> 删除光标所在的一个字符

    Ctrl+W 删除光标前的一个单词

    Ctrl+U 删除光标前的一个行(按照输入顺序,不一定直接删到行首)

    Ctrl+p  补全单词
    Ctrl+n  补全单词(向前查找)
    Ctrl+x Ctrl+f 补全文件名
    Ctrl+x Ctrl+l 补全整行内容
    Ctrl+a 补全上一次insert模式下插入的内容

    Ctrl+v 插入一个由ascii码表示的符号,三位ascii码或者遇到第一个非数字时生效

    ————————————————————————————————————————————------
    ########################################
    auto pair插件(自动封闭括号等)     关闭/开启  ctrl+p

    ##########################################
    netrw.vim插件
    vim中查看到文件的目录结构
    :e  /home/zebra/myprogram/src
    附带的操作目录文件快捷键如下:
    <F1>     显示帮助
    <cr>     如果光标下是目录, 则进入该目录; 如果光标下文件, 则打开该文件
    -            返回上级目录
    c            切换vim 当前工作目录正在浏览的目录
    d            创建目录
    D            删除目录或文件
    i            切换显示方式
    R            文件或目录重命名
    s            选择排序方式
    x            定制浏览方式, 使用你指定的程序打开该文件

    ###################################################
    "taglist插件
    :TlistOpen
    :TlistClose
    ################################################

    "NERDTree 插件
    map <F6> :NERDTreeToggle<CR>
    按键
    C(大写 C 键)
    将光标所在目录设置为根目录

    u(小写 u 键)
    转到上一级目录

    o(小写 o 键,不是“零”)
    展开(或折叠)光标所在目录的子目录。如果光标所在位置是一个文件,则在编辑窗口中打开该文件

    此外在目录树窗口中输入目录 :Bookmark 收藏名 还可以将光标所在目录添加到收藏夹中。下次使用 :BookmarkToRoot 收藏名 可以直接转到该目录,并且以该目录作为根目录。更多命令可以参考 NERDTree 的帮助文档。

    ############################################################################
    NERD Commenter插件设置
    下载安装后,修改vim的配置文件,在下面加入
    " NERD_commenter.vim

    " <Leader>ca 在/*...*/与//这两种注释方式中切换(其它语言可能不一样了)
    let mapleader=","     "leader默认是    ,为了方便,改为  逗号
    map  <F7>   <leader>c$  "注视到行尾
    map <F8> <leader>cc   ”单行注释
    map <F9> <leader>cu   "取消注释
    map <F12> <leader>ca   "sexy多行代码注释

    /*

    */

    这种

    注意:leader默认符号是    ,我这里用let来修改leader 符号为逗号 ,即便如此,注释时也要同时按好几个键,比如:
    注释3行代码,要依次输入    3 ,  c  空格键       四个按键。  同时速度要快,否则就不是注释,而变成了修改文档的内容了。我当时安装NERD Commenter试了半天,都没注释成功。后来看了比人的文章,飞快的按下这几个按键,就注释成功了。但是还是太繁琐了,就修改为一个按键,就可以注释 /取消注释。按我的这样修改后,
    F7                        注视到行尾
    F8                         单行注释
    先按x,后按F8     即注释x行的代码,记得按的速度要快
    F9                        取消注释 ,也可以与数字搭配
    F12                      sexy的代码注释  ,也可以与数字搭配

    依次按    ,  c   a                表示//  和/*   */ 两种注释间切换。这个我就没设置一键操作 ,大家个以根据自己的情况改成某个按键

    ###########################################################
    txtBrowser 插件

    <Leader>s: 用搜索引擎(可定制, 默认为google)搜索光标下的单词或选中的文本.
    <Leader>f: 用网络字典(可定制, 默认为google.cn)对光标下的单词或选中的文本查字典.
    <Leader>g: 打开光标下或选中的URL.
    <Leader>h: 高亮光标下的单词或选中的文本(可跨行).
    *:                 向前搜索光标下的单词或选中的文本(可跨行)

    ?:                 向后搜索光标下的单词或选中的文本(可跨行)

    ########################相关vim技巧#################################3
    1.用:set list来查看所有不可见字符,反之用:set nolist关闭
    2.vim操作ftp,打开:
    :e ftp://192.168.0.1/1.txt
    保存(如果不存在则创建):
    :w ftp://192.168.0.1/1.txt
    读取:
    :r ftp://192.168.0.1/1.txt
    以上操作第一次打开时需要输入用户名和密码,
    以后就不用了,vim 会记住的。
    3.Ctrl+R 是在编辑时或者命令行界面下调入寄存器值的热键,Ctrl+R+/ 会得到上一次查询的条件,Ctrl+R+<寄存器名>; 相当于 Normal 模式下的 "<寄存器名>;p 命令
    4.vim在编辑一个文件时如果打开多个文件,:args <CTRL-R>;% file2 file3
    5.如何删除连续两行之间的回车符,使连续的两行成为一行,Jx
    6.想显示行号,可以用 :set nu
    7.vim中光标在C函数和系统调用上时,按K进入man手册页
    8.V 打开"可视模式"(不是虚拟模式,虚拟是 virtual)后,可以有很多种办法移动光标的,不一定非得用 h j k l , 比如可以搜索定位, 也可以用 [[ ]] ][ [] } { 等段落定位的命令. v]] v[[ v} 这样就可以选中一大块,而不用一行一行地选 还有 H L 这些都可以用. 详细请 help motion 另外, vim 内置了很多以 a 打头的文本对象, 如 a{ 表示一个 {} 块, ap 表示一个段落等等。=a{ 就可以重排当前语法块.
    9.全选的命令是 ggVG gg表示到第一行第一个字母, V进入visual line G则到文件尾。
    10.vim是否支持将语法高亮度显示的结果保存为一个html文档,:TOhtml
    11.用:split new | r!ls 来获得外部命令的输入,其中r !ls 则表示执行外部命令 ls,并且捕获(读入)它的输出。
    12.vi中用``就可以回到刚才的位置,vim中用ctrl+o
    13.用:set ai的命令来启动自动缩进。用:syntax on命令来启动语法着色
    14.在"插入模式"下删除光标到行尾的字符,^od$,^o 表示同时按住 Ctrl 和 O 键,其实也可以是^oD,还有就是如果要删除到某个字符位置的话,就用^odfx,x表示要删除到的字符
    15.自动缩进set autoindent 和set cindent
    16.括号自动补全:iab ( ()
    17.删除所有偶数行<ESC>;ggqajddq10000@a
    18.排版代码gg=G
    19.:args查看正在编辑的文件名或者用ctrl+g
    20.gj gk 分别可以向下、向上移动一个物理行

    切换vim目录:

    :cd   目录路径

    修改当前vim编辑的文件的文件名

    :f    新文件名

    关于代码折叠相关的快捷键,大家其实可以自己在vim中输入 :help zo  来查看打开和关闭折叠的相关解释:

    你可以在用户手册的第 28 章找到有关折叠的序论。|usr_28.txt|

    1. 折叠方法        |fold-methods|
    2. 折叠命令        |fold-commands|
    3. 折叠选项        |fold-options|
    4. 折叠行为        |fold-behavior|

    {Vi 没有折叠}
    {仅当编译时加入 |+folding| 特性才有效}

    ==============================================================================
    1. 折叠方法                    *fold-methods*

    可用选项 'foldmethod' 来设定折叠方法。

    设置选项 'foldmethod' 为非 "manual" 的其它值时,所有的折叠都会被删除并且创建新
    的。如果设置成 "manual",将不去除已有的折叠。可以利用这一点来先自动定义折叠,
    然后手工调整。

    有 6 种方法来选定折叠:
    manual        手工定义折叠
    indent        更多的缩进表示更高级别的折叠
    expr        用表达式来定义折叠
    syntax        用语法高亮来定义折叠
    diff        对没有更改的文本进行折叠
    marker        对文中的标志折叠

    手 工                        *fold-manual*

    使用命令来手工定义要折叠的范围。分析文本并发现折叠的脚本也可用这种方法。

    折叠的级别仅由嵌套次数来定义。要对一定行数的折叠增加级别,可以对相同的行反复定
    义折叠。

    当你退出文件编辑时,手工折叠会被遗弃。要保存折叠,使用 |:mkview| 命令。之后要
    恢复可以使用 |:loadview|。

    缩 进                        *fold-indent*

    由缩进行自动定义折叠。

    折叠级别由行的缩进除以 'shiftwidth' (向下取整) 计算而得。连续的,有同样或更高
    的折叠级别的行,形成一个折叠。在其中,有更高折叠级别的行形成嵌套的折叠。

    嵌套的级别数受 'foldnestmax' 选项限制。

    某些行会被忽略并得到上一行或下一行的折叠级别 (取较小值)。符合条件的这样的行要
    么是空行,要么以 'foldignore' 选项里包含的字符开始。在查找 'foldignore' 里包含
    的字符时,空白字符会被忽略。对于 C,该选项使用 "#" 来略过要预处理的那些行。

    当你想用另一种方式来略过行时,使用 'expr' 方法。在 'foldexpr' 中 |indent()| 函
    数被用来取得一行的缩进。

    表 达 式                        *fold-expr*

    就象用 "indent" 方式一样,表达式方式的折叠也是由折叠级别自动定义的。对每行,通
    过计算选项 'foldexpr' 的值来并得到它的折叠级别。如:
    对所有以制表符开始的连续的几行,创建折叠: >
    :set foldexpr=getline(v:lnum)[0]=="\t"
    调用一函数来计算折叠级别:   >
    :set foldexpr=MyFoldLevel(v:lnum)
    用空白行分开的段落构成折叠:   >
    :set foldexpr=getline(v:lnum)=~'^\s*$'&&getline(v:lnum+1)=~'\S'?'<1':1
    同上:   >
    :set foldexpr=getline(v:lnum-1)=~'^\s*$'&&getline(v:lnum)=~'\S'?'>1':1
    备注: ":set" 要特殊处理的字符必须用反斜杠转义。(空格,反斜杠,双引号等等,参考
    |option-backslash|)

    这些是表达式的计算条件:
    - 当前缓冲区和窗口值依所在行而定
    - 变量 "v:lnum" 被定为该行行号
    - 计算结果将用以下方式解释:
    值            代表 ~
    0            这行不折叠
    1, 2, ..        这行的折叠级别 1,2 等
    -1            折叠级别没有定义,使用这行之前或之后一行的级别值,取其
    中较小的一个。
    "="            使用上一行的折叠级别。
    "a1", "a2", ..    上一行的折叠级别加 1,2,..
    "s1", "s2", ..    上一行的折叠级别减 1,2,..
    "<1", "<2", ..    此折叠级别在本行结束
    ">1", ">2", ..    此折叠级别在本行开始

    不需要用 ">1" ("<1") 标志折叠的开始 (结束)。当这行折叠级别高于 (低于) 上一行的
    级别时,折叠将开始 (结束)。

    表达式必须没有副作用。在缓冲区里的文字,光标位置,查找模式,选项等等,不能被改
    动。如果你非常小心,改动并恢复这些设置还是可以的。

    表达式中有错误或者计算结果不能识别时,Vim 不会产生错误消息,而是将折叠级别设为
    0。所以当需要调试时,可将 'debug' 选项设为 "msg",错误消息就可以被见到了。

    备注: 由于每一行关于表达式的值都要被计算,这一折叠方式可能会很慢!

    最好避免使用 "=" , "a" 和 "s" 作为返回值,因为 Vim 不得不经常向后回溯以得到折
    叠级别。这会降低执行速度。

    |foldlevel()| 计算相对于上一折叠级别的折叠级别。但要注意,如果该级别未知,
    foidlevel() 返回 -1。它返回的级别对应于该行开始的位置,尽管折叠本身可能在该行
    结束。

    折叠可能会没有及时更新。用 |zx| 或者 |zX| 可以强制折叠更新。

    语 法                        *fold-syntax*

    由带有 "fold" 参数的语法项来定义折叠。|:syn-fold|

    折叠级别由嵌套的折叠层数来定义。嵌套数由 'foldnestmax' 限定。

    要小心指定合适的语法同步方式。如果这里有问题,折叠和显示高亮可能会不一致。尤其
    在使用可能跨越多行的模式时更要小心。如果有疑问,不妨尝试如下的强制同步: >
    :syn sync fromstart
    <

    比 较                        *fold-diff*

    对没有改动的文本或靠近改动的文本自动定义折叠。

    这个方法仅适用于当前窗口设定 'diff' 选项来显示不同之处时才有效。不然,整个缓冲
    区就是一个大的折叠。

    选项 'diffopt' 可以指定上下文。即折叠和不被折叠包括的改变之间相距的行数。比
    如,设定上下文为 8: >
    :set diffopt=filler,context:8
    默认值是 6。

    当设定了 'scrollbind' 选项时,Vim 会试图在其它比较窗口中打开相同的折叠,这样这
    些窗口就会显示同一处文本。

    标 志                        *fold-marker*

    在文本中可以加入标志来指明折叠开始和结束的地方。这可以让你精确的定义折叠。这也
    让你可以放心地删除和复制折叠而不用担心错误包括了某些行。选项 'foldtext' 通常设
    置为使折叠行显示折叠标志之前的文本。这样做可以为折叠命名。

    标志可以包含级别数,也可以使用匹配对。包含级别数较简单,你无须添加结束标志,并
    可以避免标志不配对的问题。如: >
    /* global variables {{{1 */
    int varA, varB;

    /* functions {{{1 */
    /* funcA() {{{2 */
    void funcA() {}

    /* funcB() {{{2 */
    void funcB() {}

    折叠开始于 "{{{" 标志。接下去的数字决定了折叠级别。产生的效果依当前折叠级别和
    该折叠标志给定的级别的大小关系而定:
    1. 如果遇到级别相同的标志,上一个折叠结束,另一个有同样级别的折叠开始。
    2. 如果遇到级别更高的标志,开始一个嵌套的折叠。
    3. 如果遇到级别更低的标志,所有大于或等于当前级别的折叠结束,且指定级别的折叠
    开始。

    数字指定了折叠级别。不能使用 0 (忽略级别为 0 的标志)。你可以使用 "}}}" 带上一
    个数字来表示这个级别的折叠结束。此行以下的折叠级别将比当前级别小一。备注: Vim
    不会回溯匹配的标志 (这将耗费太多的时间)。如: >

    {{{1
    fold level here is 1
    {{{3
    fold level here is 3
    }}}3
    fold level here is 2

    你也可以用一对匹配标志 "{{{" 和 "}}}" 来定义折叠。每个 "{{{" 使折叠级别加 1,
    "}}}" 使折叠级别减 1。注意一定要使标志匹配!如: >

    {{{
    fold level here is 1
    {{{
    fold level here is 2
    }}}
    fold level here is 1

    带数字的标志和没有带数字的标志可以混合使用。对于一个大折叠我们可以使用带数字的
    标志,在函数的内部我们可以使用不带数字的。如对文件中的 "结构定义","局部变量"
    和 "函数原型" 各个部分,使用级别 1 的折叠。对定义和函数体使用级别 2 的标志。而
    在函数内部可以使用不带数字的标志。当你在一函数中作更改以分割折叠时,你无须记着
    标志在哪里。

    选项 'foldmarker' 可设定所用的标志。建议保留默认值 "{{{,}}}"。这样在 Vim 用户
    间交换文件时就不会出问题。有时为了要编辑的文件必须改变该选项 (如,文件包含了来
    自另一个编辑器的折叠标志,或对于当前文件的语法而言,折叠标志会产生歧义等)。

    *fold-create-marker*
    "zf" 可通过标志来创建一个折叠。 Vim 将为你插入开始和结束标志。这些标志由
    'foldmarker' 指定。标志会被添加在行末。如果 'commentstring' 不为空,使用之。
    以下情况下可能无法正常工作:
    - 此行已有一个带级别的标志了。Vim 无法判断该如何做。
    - 在附近的折叠里使用了带级别的标志,使添加无法进行。
    - 这行包含在一注释中,且 'commentstring' 不为空,且嵌套的注释是非法的。如,在
    C 的注释中加入 /* {{{ */ ,这将使现有的注释中断。你可以在注释之前或之后添加
    标志,或手工添加。
    总的来说,当你已有带级别的标志时,再让 Vim 为你创建标志不是个好主意。

    *fold-delete-marker*
    "zd" 可用来删除一个用标志定义的折叠。 Vim 将为你删除标志。Vim 将在折叠的开始和
    结束处根据 'foldmarker' 查找开始和结束标志。如果标志周围文字和 'commentstring'
    匹配,这些文字也会被删除。
    但在以下情况下无法正确执行:
    - 当一行包含有多于一个的标志且其中一个指定了级别。Vim 不考虑结果是不是真能删除
    折叠,而仅删除第一个标志。
    - 当这个标志带有级别且同时被用来开始或结束几个折叠时。

    ==============================================================================
    2. 折叠命令                    *fold-commands* *E490*

    所有的折叠命令用 "z" 开头。提示: 如果你从侧面看 "z" 象一张叠起来的纸。

    创 建 和 删 除 折 叠 ~
    *zf* *E350*
    zf{motion}  或
    {Visual}zf    创建折叠操作符。
    仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
    用 "manual" 方式,新建的折叠会被关闭。同时 'foldenable' 会被设
    定。
    参考 |fold-create-marker|。

    *zF*
    zF        对 [count] 行创建折叠。其余同 "zf" 。

    :{range}fo[ld]                        *:fold* *:fo*
    对 {range} 内的行创建折叠。其余同 "zf" 。

    *zd* *E351*
    zd        删除 (delete) 在光标下的折叠。当光标在被折叠的行上,该折叠被删
    除。嵌套的折叠上移一级。在可视模式下所选区域 (部分) 涵盖的折叠
    都被删除。注意: 这种一次删除多个折叠的简单方法不可撤销。
    仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
    参考 |fold-delete-marker|。

    *zD*
    zD        循环删除 (Delete) 光标下的折叠。在可视模式下所选区域 (部分) 涵
    盖的折叠和嵌套的折叠都被删除。
    仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
    参考 |fold-delete-marker|。

    *zE* *E352*
    zE        除去 (Eliminate) 窗口里所有的折叠。
    仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
    参考 |fold-delete-marker|。

    打 开 和 关 闭 折 叠 ~

    一个小于 'foldminlines' 的折叠的显示就象它被打开时一样。所以,以下的命令对于小
    折叠所起的作用与描述不同。

    *zo*
    zo        打开 (open) 在光标下的折叠。当给定计数时,相应深度的折叠被打
    开。在可视模式下,所选区域的所有行的折叠被打开一级。

    *zO*
    zO        循环打开 (Open) 光标下的折叠。不在光标下的折叠不改变。
    在可视模式下,打开所有的在选中区域里的折叠,包括被部分选中的。

    *zc*
    zc        关闭 (close) 在光标下的折叠。当给定计数时,相应深度的折叠被关
    闭。在可视模式下,所选区域里的所有行的折叠被关闭一级。
    'foldenable' 被设定。

    *zC*
    zC        循环关闭 (Close) 在光标下的所有折叠。不在光标下的折叠不改变。
    在可视模式下,关闭所有的在选中区域里的折叠,包括被部分选中的。
    'foldenable' 被设定。

    *za*
    za        当光标位于一关闭的折叠上时,打开之。当折叠嵌套时,你可能需要用
    "za" 数次。当给定计数时,打开相应数量的被关闭的折叠。
    当光标位于一打开的折叠上时,关闭之且设定 'foldenable' 。这仅关
    闭一级折叠,因为再次使用 "za" 将再次打开折叠。当给定计数时,关
    闭相应数量的折叠 (这不同于重复 "za" 许多次)。

    *zA*
    zA        当处在一关闭的折叠上时,循环地打开折叠。
    当处在一打开的折叠上时,循环地关闭折叠且设定 'foldenable'。

    *zv*
    zv        查看 (view) 光标所在的行: 仅打开足够的折叠使光标所在的行不被折
    叠。

    *zx*
    zx        更新折叠: 撤消被手工打开和关闭的折叠: 再次应用 'foldlevel'。
    然后使用 "zv" : 查看光标所在行。
    同时强制重新计算折叠。使用 "foldexpr" 并且缓冲区发生改变但折叠
    不能正确地更新时,这会有用。

    *zX*
    zX        手工恢复被打开和关闭的折叠: 再次应用 'foldlevel'。
    也同时强制重新计算折叠,同 |zx|。

    *zm*
    zm        折起更多 (more): 'foldlevel' 减 1。如果 'foldlevel' 已经为 0,
    则不会被减小。
    'foldenable' 被设定。

    *zM*
    zM        关闭所有折叠: 'foldlevel' 设为 0。
    'foldenable' 被设定。

    *zr*
    zr        减少 (reduce) 折叠: 'foldlevel' 加 1。

    *zR*
    zR        打开所有的折叠。'foldlevel' 设为最高级别。

    *:foldo* *:foldopen*
    :{range}foldo[pen][!]
    在 {range} 内打开折叠。当加上 [!] 时,所有的折叠都被打开。对查
    看在 {range} 内的所有文本很有用。没有 [!] 时,打开一级折叠。

    *:foldc* *:foldclose*
    :{range}foldc[lose][!]
    在 {range} 内关闭折叠。当加上 [!] 时,所有的折叠都被关闭。对隐
    藏在 {range} 内的所有文本很有用。没有 [!] 时,关闭一级折叠。

    *zn*
    zn        不折叠 (none): 复位 'foldenable'。所有的折叠被打开。

    *zN*
    zN        正常折叠 (normal): 设定 'foldenable'。所有的折叠都展现它们之前
    的样子。

    *zi*
    zi        翻转 'foldenable' 的值。

    在 折 叠 间 移 动 ~

    *[z*
    [z        到当前打开的折叠的开始。如果已在开始处,移到包含这个折叠的折叠
    开始处。如果没有包含它的折叠,命令执行失败。
    当给定计数,重复此命令 [count] 次。

    *]z*
    ]z        到当前打开的折叠的结束。如果已在结束处,移到包含这个折叠的折叠
    结束处。如果没有包含它的折叠,命令执行失败。
    当给定计数,重复此命令 [count] 次。

    *zj*
    zj        向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。
    当给定计数,重复此命令 [count] 次。
    此命令可在 |operator| 后使用。

    *zk*
    zk        向上移动到前一折叠的结束处。关闭的折叠也被计入。
    当给定计数,重复此命令 [count] 次。
    此命令可在 |operator| 后使用。

    对 折 叠 执 行 命 令 ~

    :[range]foldd[oopen] {cmd}            *:foldd* *:folddoopen*
    对所有不在关闭的折叠中的行执行 {cmd}。
    给定 [range] 时,仅对范围内那些行起作用。
    每次命令被执行时,光标会被定位在要被操作的行上。
    就如 ":global" 命令: 首先标记出所有不在关闭的折叠中的行。然后
    对所有标记过的行,执行 {cmd}。所以当 {cmd} 改变了文本的折叠
    时,对命令执行的位置没有影响 (当然,删除行例外)。
    如: >
    :folddoopen s/end/loop_end/ge
    <        使用标志位 "e" 避免了当 "end" 不匹配时得到错误消息。

    :[range]folddoc[losed] {cmd}            *:folddoc* *:folddoclosed*
    对所有在关闭的折叠里的行,执行 {cmd}。
    其它同 ":folddoopen" 命令。

    ==============================================================================
    3. 折叠选项                    *fold-options*

    颜 色                            *fold-colors*

    对关闭的折叠的颜色的设定由 Folded 高亮组 |hl-Folded| 决定。对折叠栏的颜色的设
    定由 FolderColumn 高亮组 |hl-FoldColumn| 决定。
    下面是设定颜色的例子: >

    :highlight Folded guibg=grey guifg=blue
    :highlight FoldColumn guibg=darkgrey guifg=white
    <

    折 叠 级 别                        *fold-foldlevel*

    'foldlevel' 是个数值选项: 数字越大则打开的折叠更多。
    当 'foldlevel' 为 0 时,所有的折叠关闭。
    当 'foldlevel' 为正数时,一些折叠关闭。
    当 'foldlevel' 很大时,所有的折叠打开。
    'foldlevel' 的改变后立即生效。之后,折叠可以被手动地打开和关闭。
    当其值增大,在新级别 (译者注: 旧级别?) 之上的折叠被打开。手工打开的折叠不会被
    关闭。
    当其值减小,在新级别之上的折叠被关闭。手工关闭的折叠不会被打开。

    折 叠 文 本                        *fold-foldtext*

    'folftext' 是个字符串选项,定义了一个表达式。这个表达式被用来求得关闭折叠所显
    示的文字。如: >

    :set foldtext=v:folddashes.substitute(getline(v:foldstart),'/\*\|\*/\|{{{\d\=','','g')

    显示了折叠的第一行,除去其中的 "/*"、"*/" 和 "{{{" 。
    备注: 使用反斜杠是为了避免一些字符被 ":set" 命令解释。使用一个函数更简单: >

    :set foldtext=MyFoldText()
    :function MyFoldText()
    :  let line = getline(v:foldstart)
    :  let sub = substitute(line, '/*|*/|{{{d=', '', 'g')
    :  return v:folddashes . sub
    :endfunction

    'foldtext' 的计算是在沙盘 |sandbox| 里完成的。其中的当前窗口设为要显示该行的窗
    口。错误被忽略。

    默认值是 |foldtext()|。对于大多数类型的折叠它可以返回适合的文字。如果你不喜欢
    它,你可以自己指定 'foldtext' 表达式。可以使用以下这些 Vim 变量:
    v:foldstart    折叠首行的行号
    v:foldend    折叠末行的行号
    v:folddashes    一个含有连字符的字符串,用来表示折叠级别
    v:foldlevel    折叠级别

    在结果中,制表符被替换为空格,而不可显示的字符被替换为可显示的字符。

    结果行被截短以适合窗口的宽度,永远不会回绕。
    当在文字后有空余时,用 'fillchars' 来填充。

    备注: 对那些 ":set" 命令作特殊处理的字符在其前面须加上反斜杠。如: 空格,反斜杠
    和双引号。 |option-backslash|

    折 叠 栏                        *fold-foldcolumn*

    'foldcolumn' 是个数字,它设定了在窗口的边上表示折叠的栏的宽度。当为 0 时,没有
    折叠栏。一个普通值是 4 或 5。最小可用的值是 2,不过 1 仍然可以提供一些信息。最
    大是 12。

    一个打开的折叠由一栏来表示,顶端是 '-',其下方是 '|'。这栏在折叠结束的地方结
    束。当折叠嵌套时,嵌套的折叠出现在被包含的折叠右方一个字符位置。

    一个关闭的折叠由 '+' 表示。

    当折叠栏太窄而不能显示所有折叠时,显示一数字来表示嵌套的级别。

    在折叠栏点击鼠标,可以打开和关闭折叠:
    - 点击 '+' 打开在这行的关闭折叠
    - 在任何其他非空字符上点击,关闭这行上的打开折叠

    其 他 选 项

    'foldenable'  'fen':    复位时打开所有折叠。
    'foldexpr'    'fde':    用于 "expr" 折叠的表达式。
    'foldignore'  'fdi':    用于 "indent" 折叠的字符。
    'foldmarker'  'fmr':    用于 "marker" 折叠的标志。
    'foldmethod'  'fdm':    当前折叠方法。
    'foldminlines' 'fml':    关闭折叠的最小显示行数。
    'foldnestmax' 'fdn':    用于 "indent" 和 "syntax" 折叠的最大嵌套层数。
    'foldopen'    'fdo':    哪一种命令可以打开关闭的折叠。
    'foldclose'   'fcl':    当光标不在折叠上时关闭折叠。

    ==============================================================================
    4. 折叠行为                        *fold-behavior*

    当上下移动和滚动时,光标将移至连续折叠的行的第一行。当光标已在被折叠的行上时,
    它移动到下一个没有被折叠的行上,或下一个关闭的折叠。

    当光标在被折叠的行上时,光标总是显示在第一列。标尺显示确切的光标位置。光标本应
    也在实际位置显示的,但因为被折叠而无法做到。

    许多移动命令处理连续被折叠的行就象处理空行一样。如,"w" 命令只在首列停一次。

    在插入模式下,光标所在的行不会被折叠。这让你看得见你键入的内容。

    当使用操作符时,一个关闭的行被作为整体处理。所以 "dl" 在光标下删除了整个关闭的
    折叠。

    对 Ex 命令的执行范围被调整,使得它总是从关闭折叠的第一行开始,在关闭折叠的最后
    一行结束。所以,命令: >
    :s/foo/bar/g
    当光标在关闭的折叠上时,它将在整个折叠里用 "bar" 替换 "foo"。
    不过 |:folddoopen| 和 |:folddoclosed| 的操作并非如此。

    编辑一个已经被编辑过的缓冲区时,上次被使用的折叠设置会被再次使用。对手工定义折
    叠方式,已经被定义的折叠会被恢复。对所有的折叠方式,手工打开和关闭的折叠会被恢
    复。如果这个缓冲区曾经在这个窗口里被编辑,过去用的值被恢复。否则,来自该缓冲区
    最近一次编辑的窗口值被使用。

    ==============================================================================
    统计单词数、行数等 *count-items*
     
    如果需要统计缓冲区中一个模式 (pattern) 出现的频率,使用 substitute 命令并加入
    'n' 标志位以避免实际的替代。Vim 报告的已替代的数目就是模式出现的次数。例: >
     
    :%s/./&/gn字符数
    :%s/i+/&/gn单词数
    :%s/^//n行数
    :%s/the/&/gn任何地方出现的 "the"
    :%s/<the>/&/gn作为单词出现的 "the"
     
    你可能希望复位 'hlsearch' 或者使用 ":nohlsearch"。
    如果你希望没有匹配的时候不显示错误,那么增加标志位 'e'。
     
    另一种办法就是在可视模式下使用 v_g_CTRL-G。
     
     
    =========================================
     
    *08.3* 调整窗口大小
     
    :split 命令可以接受计数前缀。如果指定了这个前缀,这个数将作为窗口的高度。例如
    如下命令可以打开一个三行的窗口并编辑文件 alpha.c:
    >
    :3split alpha.c
     
    对于已经打开的窗口,你可以用有几种方法改变它的大小。如果你有鼠标,很简单: 把鼠
    标指针移到分割两个窗口的状态栏上,上下拖动即可。
     
    要扩大窗口:
    >
    CTRL-W +
     
    要缩小窗口:
    >
    CTRL-W -
     
    这两个命令接受计数前缀用于指定扩大和缩小的行数。所以 "4 CTRL-W +" 会使窗口增高
    4 行。
     
    要把一个窗口设置为指定的高度,可以用这个命令:
    >
    {height}CTRL-W _
     
    就是先输入一个数值,然后输入 CTRL-W 和一个下划线 (在美式英语键盘中就是 Shift
    加上 "-")。
        要把一个窗口扩展到尽可能大,可以使用无计数前缀的 CTRL-W _ 命令。
     
     
    使 用 鼠 标
     
    在 Vim 中,你可以用键盘很快完成很多工作。但很不幸,改变窗口大小要敲不少键。在
    这种情况下,使用鼠标会更快一些。把鼠标指针移到状态条上,按住左键并拖动。状态条
    会随之移动,这会使一个窗口更大一个更小。
     
     
    选 项
     
    'winheight' 选项设置最小的期望窗口高度而 'winminheight' 选项设置最小的 "硬性"
    高度。
        同样,'winwidth' 设置最小期望宽度而 'winminwidth' 设置最小硬性宽度。
        'equalalways' 选项使所有的窗口在关闭或者打开新窗口的时候总保持相同大小
     

    本文固定链接: http://www.dabu.info/vim-shortcut-key-operation.html | 大步's Blog

    转载请注明:大步's Blog » 【个人总结】我个人精心收集的必须熟悉的vim快捷键操作

  • 相关阅读:
    Android轩辕剑之ActionBar之三
    Android轩辕剑之ActionBar之二
    Android轩辕剑之ActionBar之一
    使用Android OpenGL ES 2.0绘图之六:响应触摸事件
    使用Android OpenGL ES 2.0绘图之五:添加运动
    使用Android OpenGL ES 2.0绘图之四:应用投影和相机视口
    使用Android OpenGL ES 2.0绘图之三:绘制形状
    使用Android OpenGL ES 2.0绘图之二:定义形状
    随笔编号-16 MySQL查看表及索引大小方法
    随笔编号-14 数据库连接最大数问题
  • 原文地址:https://www.cnblogs.com/davygeek/p/5211012.html
Copyright © 2011-2022 走看看