VIM

编译 #

--with-features=tiny                # 只包含最基本功能。small, normal, big, huge, :h feature-list查看

命令 #

vim -u NONE -N                      # -u NONE 不加载配置文件和插件,并进入vi兼容模式
    -u code/essential.vim           # 加载指定配置文件
    -N set nocompatible             # 不进入vi兼容模式
    --version                       # 可查看特性

mode #

普通模式
插入模式
可视模式
    v/V                             # 面向字/面向行 可视模式
    <C - v>                         # 面向块 可视模式
    gv                              # 重选上次选区
    o                               # 切换到选区的开头, 再按切换回尾端 
替换模式
    R
命令行模式(Ex命令)
    :                               # 可视模式中选定范围,切换到命令行时,自动输入range'<,'>代表选中区
操作符待决模式                         # operator 与 motion之间的空闲时期
                                    # 两个字符的operator, 字符间的空闲时期不是该模式,是命名空间,是普通模式的扩充
                                    # 有了这个模式,能创建自定义映射项来激活或终结操作符待决模式,就可以自定义operator和motion
选择模式                              # 类似windows中选中
    <C - g>在可视和选择模式切换
历史
    q:                              # 命令历史
    q/                              # 搜索历史

operate #

思想
    {operator}{motion}
    {operator}{text-objects}
shortcut key
    ctrl + c                        # 同Esc
motions
    .                               # 重复前一次修改, 目标做到一键移动,一键执行。修改是指: 一个normal模式下的按键, 插入内容, <ESC>; 或一组normal模式下按键
    K                               # 当前单词的:h 手册
    ga                              # 当前字符的unicode码
Ex command                          # 可视模式下选中行, : 时前面有'<,'> 表示对选中的行执行操作
    :h e 或 :help e                 # 查看e的帮助
        vimtutor 查看教程
        operator 查看operator
        map-operator 查看自定义operator
        omap-info 查看自定义motion
        digraphs-default
        digraphs
        digraphs-table 查看二合字符表
        ex-cmd-index 查看所有Ex命令
        vi-differences vim 相对vi的特性
    :version                        # 查看版本和支持的功能
    :! command                      # 执行某shell命令(CR返回)
        !! 执行前一个命令
        r!command 执行结果插入当前位置
        w!command 当前文件作为输入执行
    :cd directory                   # 修改工作目录
    :sh                             # 跳到shell, 再执行exit返回
    :map bbc ia                     # 定义命令序列ia的别名为bbc
    :pwd                            # 显示当前目录
    :normal A;                      # 执行普通模式命令A;, 添加分号到行尾
    系统命令
        :grep t * # 在当前所有文件中匹配t, 自动加-n参数(显示行号)
        :ls

locate oper #

motion
    ^/$/0/<home>/g_/h/l/j/k/w/W/e/E/b/B/ge/gE/gg/G/[[/]]/(/)/{/}/nH/M/nL/点鼠标
        # 移动motion
        ge同b, 停在单词尾部
        <home>同0, 到行开始, ^则到本行第一个字符
        gg同[[,G同]],10G跳到第10行
        fx 移动到下一个x, F反向查找, tx 移动到x的前一个字符

        nG 跳到第n行
    f/F/t/T                         # 行搜索motion         重复查找(以相反方向重复搜索)
    ;                               # 重复移动上次f/F/t/T的字符
    ,                               # 撤销上次f/F/t/T移动
    *                               # 查找当前词
    nzz/nz-                         # 跳到指定行, 显示在屏幕中间/底部
        zz 当前屏幕到中间
    可视模式
        $                           # 块可视模式中,表示所有行尾
        i/a                         # 块可视模式中有不同含义
operator
    3G                              # 跳到第3行
    /text                          # 查找text,按n健查找下一个,按N健查找前一个。
    ?text                          # 查找text,反向查找,按n健查找下一个,按N健查找前一个。
    *或#                            # # *相当于/,#相当于?
        g* 搜索子串
        gd  同* 但跳到第一个匹配序列
    %                               # 搜索对应括号

    o-> marks
    ``                              # 跳回
        `" 最后编辑的位置
        `[ 最后修改的开始位置
        `] 最后修改的结束位置
        '. `. 跳到上次编辑位置
    ''                              # 跳回到第一个非空白字符
    marks                           # 显示系统全部书签
    ma                              # mark当前光标位置为a,小写字母不同文件标记不同行, 大写字母全局标记,但webstorm中ideaVim不行
    `a                              # 跳到a的位置
Ex command
    :10                             # 跳到第10行, 同10G, 0位于第一行上方
    :jumps                          # 输出能跳往的位置列表,可跳转多个文件
    :$                              # 文件结尾
    :.                              # 当前位置
    :%                              # 文件中的所有行
    :'<                             # 选中区开始
    :'>                             # 选中区结尾
    :'m                             # 位置标记为m的行
    :/<html>/,/<\html>/             # 模式匹配范围
    : 1+1, 5-1                      # 开始向下偏移一行,结尾向上偏移一行
    :vim[grep] abc test             # 在test文件中grep匹配abc
shortcut key
    <c - e>/y                       # 向下/上滚动一行
    <c - d>/u                       # 向下/上滚动半屏
    <c - f>/b                       # 向下/上滚动一屏
    <c - i>/o                       # 到下个/上个跳动过的位置

edit oper #

shortcut key
    <C - r>                         # 撤销的撤销
    <C - a>/x                       # 数字增加/减少1, 对0开关数字进行八进制操作, 0x进行十进制操作。可以设置nrformats改变
    插入模式/命令模式
        <C - h>                     # 删除前一个字符
        <C - w>                     # 命令模式可用,删除前一个单词
        <C - u>                     # 命令模式可用,删至行首
        <C - [>                     # 返回普通模式
        <C - o>                     # 到插入-普通模式
        <C - v>                     # 命令模式可用,插入编码对应的字符
            065                     # 两位的编码
            u00bf                   # 超过3位的unicode码
            非数字                   # 直接插入, 如expandtab开启后插入tab
        <C - k>{char1}{char2}       # 命令模式可用,插入以二合字母表示的字符
            12
            <<
            ?I
        <C - r>{register}           # 命令模式可用,插入寄存器内容
    补全
        <C - n>/p                   # 自动补全下/上

        <C - x> 接着按如下
            <C - L>                 # 整行补全
            <C - N>                 # 根据当前文件里关键字补全
            <C - K>                 # 根据字典补全
            <C - T>                 # 根据同义词字典补全
            <C - I>                 # 根据头文件内关键字补全
            <C - ]>                 # 根据标签补全
            <C - F>                 # 补全文件名
            <C - D>                 # 补全宏定义
            <C - V>                 # 补全vim命令
            <C - U>                 # 用户自定义补全方式
            <C - S>                 # 拼写建议
operator                            # num + operator 来多次操作, 合并命令如A(同$a), 是为了普通模式下一个按键进行插入,这样能够在.命令中重复
    @:                              # 重复Ex命令
    &                               # 重复substitute命令
    x/X                             # 删除当前字符/删除前一个字符, x等于dl,X 等于dh
    u/U                             # 撤销(Undo)/撤销对整行的操作
    r/R                             # 替换一个字符/持续替换字符,tab是一个字符
        gR                          # 一个tab由tabstop个字符才能替换
        gr
    y/yy/Y                          # yank 复制/复制一行/同yy
        :y
    p/P                             # 粘贴/前面粘贴
        :p
    a/A                             # s当前字符后插入
        A同$a, 行尾插入
    o/O                             # 向后插入行
        o同A<CR>
        O同ko, 向前插入行
    s/S                             # 替换当前字符/替换当前行
        s同cl
        S同^C
    i/I                             # 当前字符前插入/行首插入
        I同^i 
    c/cc/C                          # 替换/替换一行/同cc
        :0,10c 与 :c
        C同c$
    d/dd/D                          # 删除/删除一行/删到行尾
        dd 同 :d
        10d表示删除10行
        D同d$
        :0,10d 与 :d
    <</>>
        可视模式下 </>
        命令下 1>>2 表示从1行开始, 作用2行>>, 可以1>>>>2
        1,2> 表示 1到2行>>, 可以1,2>>
        >G 缩进当前到最后一行
    =                               # 自动缩进
        == 自动缩进当前行
    !                               # 用外部命令过滤指定行
        如!j, 自动进入命令模式, 选定了指定行进行!
        !!当前[count]行
    J                               # 与下行合并
    g                               # :[range]global/{pattern}/{command}
        global命令在[range]指定的文本范围内(缺省为整个文件)查找{pattern},然后对匹配到的行执行命令{command},如果希望对没匹配上的行执行命令,则使用global!或vglobal命令。
        g/^/m 0 倒序文件行
    g_                              # 到本行最后一个不是blank字符的位置
    gd                              # 智能跳到当前变量定义的位置
    gu/gU                           # 转换到小写/大写, 如gUw
        gugu / guu / gUgU / gUU
    g~                              # 大写转小写,小写转大写
        g~g~ / g~~ 转换一行
    可视模式下
            U/u                     # 大写/小写
ex command
    :1,10 co 20                     # 将1-10行插入到第20行之后。
        :1,$ co $ 复制整个文件添加到尾部
    :1, 10 m 20                     # 第1-10行移动到第20行之后
    :ab attr attribute              # 缩写, 输入模式中输入attr,再输入非字母字符(空格, 点等),自动补全
        ab查看所有缩写
        una/unab attr 取消缩写 
    :!                              # 执行外部命令
    :[range]copy{address} /:t /:co  # 复制range到address后, :t 2 表示复制当前行到第2行后
    :[range]move{address}           # 移动
    :[range]join                    # 连接
    :[range]delete[x]               # 删除指定范围内的行到寄存器中
    :[range]yank[x]                 # 复制
    :[line]put[x]                   # 指定行后粘贴寄存器中内容
    :[range]normal{commands}        # 指定范围执行命令
    :[range]print / p               # 在vim下方回显指定行的内容
text-object
    i"
        " 表示 光标所在""的内容
        '
        `
        ) 表示 ()的内容
        ( 同上
        ]
        [
        >
        <
        }
        {
        B 表示 {}的内容
        t 表示 tag之间的内容,如<h2>aaaa</h2>
        w 表示 光标所在word
        s 表示 光标所在句子
        p 表示 段落
    a"                              # 包括外围,命令同i
    视图模式下
        vit                         # 在可视模式下选中标签内容,如<a>xxx</a>的xxx

patterns oper #

operator
    &                               # 重复:s上次执行的命令, 不包含g
        g& 全局重复:s上次的命令
    n/N                             # 查找下一个/上一个
Ex command
    :[range]substitude/{pattern}/{string}/[flags]
        :s 用new替换old,替换当前行的第一个匹配
        前面是正则, 用()分组,后面用\1引用分组
        :s/old/new/g 作用到整行
        :%s/old/new/ 作用到每行第一个
        :10,20 s/^/    /g 作用到10到20行的每一个
        :%s/old/new/g 作用到全文
        :s/old/new/gc 每次修改前询问

    :[range]global/{pattern}/[cmd]
        :g 查找text的行执行命令,如:g/text/s/old/new/g
        v/text/command 查找到行不执行命令,其它行执行
    :&                              # 同operator中&

registers oper #

register                            # 寄存器
    :reg                            # 查看所有寄存器 或 :reg 1 查看寄存器1的内容
    "0p                             # "0<operator> 粘贴寄存器0的内容
        "0y 复制到寄存器0
    :pu 0                           # 同上
        :pu! 0 同 "0P
    :y a                            # 复制当前行到"a寄存器
        :5,10y m 复制5到10行到"m寄存器
    分类
        ""                          # unamed 缓存最后一次操作内容
        "0                          # numbered 范围0 - 9 。"0缓存最近一次复制的内容
            "1到"9缓存最近9次删除的内容, "9向后则丢弃
            第2次删除时,缓存1转存到缓存2, 新的删除内容存到缓存1
        "-                          # small delete 缓存行内删除内容
        "a                          # named 范围a - z 与 A - Z
        ":                          # read-only
            如 ": 最近命令 ". 最近插入文本 "% 当前文件名 "# 当前交替文件名
        "=                          # expression 用于执行表达式命令,只读
        "*                          # selection and drop
            如 "* "+ "~ 存取GUI选择文本,可用于与外部交互,要求系统剪切板(clipboard)可用
        "_                          # black hole 表示不缓存,干净删除
        "/                          # last search pattern 缓存最近的搜索模式
shortcut key
    <C - r>0                        # 插入寄存器缓冲区内容, 原理是vim插入模式模拟打入
            <C - p>0                # 保持格式不变
    <C - r>=6 * 35<CR>              # 计算结果
宏
    qa ... q                        # 录制宏a,存到寄存器中,可以用"ap粘贴出来
    @a                              # 运行宏a
    let @a = ""                     # 用let @a 在.vimrc设置文件中设置宏a
    内置宏
        :                           # 上次的Ex命令

file oper #

shell
    $ vim file1 file2..
    $ vimtutor                      # vim的教程

operator
    o-> 折叠
    zf                              # 创建折叠
        zf% 创建括号折叠
        zf56G 创建从当前行起到56行代码的折叠
    zo/zO                           # 展开当前/递归展开当前(folding open, z这个字母看上去比较像折叠的纸)
    zc/zC                           # 再折叠/递归再折叠(folding close)
    [z                              # 到折叠的开始处
    z]                              # 到折叠的结束处
    zk                              # 向上移动到前一个折叠的结束处
    zd/zD                           # 删除当前光标下的折叠/嵌套删除折叠

    o-> 文件对比
    vim -d file1 file2
    diffsplit file2
    diffthis
    diffupdate
    [c                              # 跳到前一个不同点
    ]c                              # 跳到后一个不同点
    dp                              # 合并增加另一个 (diff put)
    do                              # 合并增加当前 (diff get)
Ex command
    :help                           # 显示帮助, 同F1
        帮助文件中位于||之间的内容是超链接,可以用Ctrl+]进入链接,Ctrl+o(Ctrl + t)返回
        :help tutor 显示vimtutor的教程
        :help xx 显示某个帮助, 如help CTRL-[
        :help 'number' 显示vim选项的帮助
        :help <Esc> 显示特殊键的帮助
        :help -t 显示vim启动参数的帮助
        :help i_<Esc> 插入模式下Esc的帮助,某个模式下的帮助用 模式_主题的模式
    :r/nr filename                  # 插入一个文件的内容/插入到第n行
    :f                              # 显示当前文件状态
    :.=                             # 打印当前行号
        := 打印总行号
    :open file                      # 新窗口打开文件
    :saveas filename                # 另存为并切换到文件
    :tabnew                         # 新建标签页
    :split file/:new                # 屏幕分割
    :vsplit 纵向打开窗口
    :q                              # q! 强制退出
    :w/:write                       # :w filename 写入新文件
    :x                              # 有改动时保存并退出, 无改动只退出
    ZZ
    :e/:edit                        # 重新打开文件, e! 放弃所有修改重新打开文件
        e filename 当前窗口打开另一个文件
    :bn/:bp                         # 切换上个/下个文件
    :saveas <path/to/file>          # 另存为到 <path/to/file>
    :!command                       # 执行shell命令,如 :!ls
        :!perl -c script.pl 检查perl脚本语法,可以不用退出vim,非常方便。
        :!perl script.pl 执行perl脚本,可以不用退出vim,非常方便。
    :suspend                        # 挂起vim,回到shell,命令fg返回vim。
    :buffers/:ls                    # 缓冲区列表
    :bprev                          # 上一缓冲区
    :bnext                          # 下一缓冲区

    o-> 多视窗
    :vert                           # 横向打开
    :vsplit                         # 横向打开
    :split
    :prev                           # 上一个文件
    :next                           # 下一个文件
    :close                          # 最后一个窗口不能使用此命令,可以防止意外退出vim。
    :only                           # 关闭所有窗口,只保留当前窗口

    o-> 标签窗口                      # 启动 Vim 时用 "vim -p filename ..."
    :tabe[dit]                      # 打开文件到标签
    :tabnew                         #  在当前标签页之后打开带空窗口的新标签页。
    :tabc[lose][!]{count}           #  关闭当前标签页。 {}表示关闭第count个标签
    :tabo[nly][!]                   # 关闭所有其它的标签页。
    :tabn[ext] {count}              # 切换到后面的标签页
    :tabp[revious] {count}          # 切换到前面的标签页
    :tabr[ewind]                    # 回卷跳转
    :tabfir[st]                     #  转到第一个标签页。
    :tabl[ast]                      # 转到最后一个标签页。
    :tabm[ove] [N]                  # 重排标签页
        把当前标签页移到第 N 个标签页之后。用 0 使当前标签页成为首个标
        签页。如果没有 N,当前标签页成为最后一个。
    :tabs                           # 列出标签页和它们包含的窗口信息。
        当前窗口显示 ">"。
        修改过的缓冲区显示 "+"。
    :tabd[o] {cmd}                  # 对每个标签页执行 {cmd}

shortcut keys
        ctrl - z                    # 同 :suspend
        ctrl + g                    # 同 :f

        o-> 多视窗
        ctrl + w + hljk
        ctrl + w + w                # 跳到下一个
        ctrl + w + p                # 跳到前一个

settings #

设置文件
    /etc/vimrc
    ~/.vimrc                        # vim的配置文件, 优先于.exrc
    ~/.exrc                         # vi的配置文件
命令
    :set
        all                         # 打印所有set选项
        nocompatible                # 不设置vi兼容
        ruler?                     # 查看是否设置了ruler,在.vimrc中,使用set命令设制的选项都可以通过这个命令查看
        shell    :/usr/bin/sh       # 使用SystemⅤ中的shell来执行vi中以!或  :!开头的shell命令
        nrformts                    # 设置进制, <c - a> <c - x>时对八进制有用,如07

        encoding=utf-8              # 程序显示编码
        enc                         # 同上
        fileencodings=ucs-bom,utf-8,cp936                       # 设置读取文件支持的编码
        fencs                       # 同上
        fileencoding=utf-8          # 当前文件编码
        fenc                        # 同上
        termencoding=utf-8          # 设置终端编码
        tenc                        # 同上

        list                        # 显示非打印字符,如tab,空格,行尾等。
        nolist                      # 取消显示非打印字符, 如果tab无法显示,请确定用 set lcs=tab:>- 命令设置了.vimrc文件
        number                      # 显示行号
        nu                          # 同上
        nonumber                    # 不显示行号
        nonu                        # 同上
        reprot=2                    # 用户做2行以上修改时显示统计信息
        hlsearch                    # 设置查找高亮
        hls                         # 同上
        incsearch                   # 查找高亮所有(增量高亮)

        smartindent                 # 括号补全
        sm                          # 同上
        ignorecase                  # 查找时忽略大小写
        ic                          # 同上
        noignorecase                # 查找时不忽略大小写
        noic                        # 同上
        expandtab                   # 存起来的文件, 用space替换tab
        shiftwidth=4                # 换行时缩进长度
        sw                          # 同上
        softtabstop=4               # 插入模式tab长度
        tabstop=4                   # 识别和显示tab时,转换成space的长度

        autoindent                  # 启用自动缩进
        ai                          # 同上
        foldmethod=indent           # 设置折叠
        fdm                         # 同上
            indent 缩进折叠
            syntax 语法高亮折叠
            expr 表达式定义折叠
            diff 对没有更改的文本折叠
            marker 对文中的标志折叠
    :scriptnames                    # 脚本文件位置,如.vimrc文件、语法文件、plugin
    :syntax clear                   # 列出已经定义的语法项
        clear 清除已定义的语法规则
        case match 大小写敏感,int和Int将视为不同的语法元素
        case ignore 大小写无关,int和Int将视为相同的语法元素,并使用同样的配色方案
配置
    inoremap <C-]> <C-X><C-]>       # 插入模式下映射
    nnoremap                        # 在normal模式下映射
    fileType plugin on              # 激活内置插件, 检测文件类型
    filetype on                     # 同上

plugins #

netrw
    介绍
        自带插件
    edit ./                         # 查看目录树
    Ex                              # 同上
    Se                              # 下面弹出目录树 好用
    Ve                              # 左面弹出目录树 好用

    <cr>   netrw 进入目录或读入文件 |netrw-cr|
    <del>  netrw 试图删除文件/目录 |netrw-del|
    -    netrw 往上走一层目录 |netrw--|
    a    在以下三种方式间切换: 正常显示,|netrw-a|
        隐藏 (不显示匹配 g:netrw_list_hide 的文件) 和
        显示 (只显示匹配 g:netrw_list_hide 的文件)
    c    使浏览中的目录成为当前目录 |netrw-c|
    d    建立目录 |netrw-d|
    D    netrw 试图删除文件/目录 |netrw-D|
    i    在瘦、长、宽和树形的各种列表方式间切换 |netrw-i|
    <c-l>  netrw 刷新目录列表 |netrw-ctrl-l|
    o    打开新浏览窗口,进入光标所在的目录。使用水平分割。|netrw-o|
    p    预览文件 |netrw-p|
    P    在前次使用的窗口里浏览 |netrw-P|
    r    反转排序顺序 |netrw-r|
    R    给指定的文件/目录换名 |netrw-R|
    s    选择排序方式: 按名字、时间或文件大小排序 |netrw-s|
    S    指定按名字排序的后缀优先级 |netrw-S|
    t    在新标签页里打开光标所在的文件/目录 |netrw-t|
    v    打开新浏览窗口,进入光标所在的目录。使用垂直分割。|netrw-v|
ctags
    将ec57w32.zip解压,在解压后文件夹中找到ctags.exe,将其复制到C:\ProgramFiles\Vim\vim72下,并编辑_vimrc文件,添加以下内容:
    set tags=tags;
    set autochdir
    打开cmd命令行,切换到你要查看的源代码的根目录处,运行
    ctags -R
    将会在此目录处生成一个tags文件。
    用gvim打开一个代码文件,将光标放到某一函数名上,如下图的UpdateViewByPosNo(),按下"ctrl+]",光标会自动跳转到定义处。按下"ctrl+T"会跳回到原来的位置。
    变量、结构体、宏等等,都可以这样做。
    当你的源文件有更新时,只能重新运行ctags -R命令,来更新tags文件。

    taglist
        将taglist_45.zip解压,解压后包含一个doc文件夹和一个plugin文件夹,将其中内容分别复制到C:\Program Files\Vim\vim72下的doc及plugin中。
        在_vimrc文件中加入以下内容:
        let Tlist_Show_One_File=1
        let Tlist_Exit_OnlyWindow=1
        用gvim打开代码文件(已生成过tags文件),:Tlist,TagList窗口即出现在左侧。

visual-star
Qargs
nerdTreeToggle
    介绍
        目录显示插件

方案 #

加分号
    jA;
    j.
批量执行
    选中多行, :normal .
批量前缀
    选中多行, I
括起文字
    ci"        # 替换内容""
    ca"        # 替换所有
    di"        # 删除内容
    cit        # 替换标签
执行python
    选中代码, :!python
缩进全文
    gg=G
替换到"
    cf"
esc
    <C-[>
目录窗口
    :Sex


console输出乱码
    language messages utf-8
    set termencoding=utf-8
设置文件编码
    set encoding=utf-8
    set fileencodings=utf-8,chinese,latin-1