• 必须熟悉的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快捷键操作

  • 相关阅读:
    使用javap分析Java的字符串操作
    使用javap深入理解Java整型常量和整型变量的区别
    分享一个WebGL开发的网站-用JavaScript + WebGL开发3D模型
    Java动态代理之InvocationHandler最简单的入门教程
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
  • 原文地址:https://www.cnblogs.com/davygeek/p/5211012.html
Copyright © 2020-2023  润新知