美文网首页
Vim 让每一个键都拥有灵魂

Vim 让每一个键都拥有灵魂

作者: 鸡蛋绝缘体 | 来源:发表于2019-09-25 22:08 被阅读0次
    image.png
    • 本文
    • 插件
    • vimrc通用配置
    • 名词简介
    • 范围文本对象 a{symbol}, I{symbol}
    • vim 后台待命
    • 重点-宏
    • 普通模式
      • 操作符命令举例(后面跟{motion})
      • 普通模式
    • 插入模式
    • Ex模式
    • substitute 替换命令
    • global 命令
    • 可视模式
    • 命令行窗口
    • 后话

    本文

    Vim 几乎将键盘上的每一个键都赋予了灵魂。
    http://afra55.github.io/2017/09/14/vim-lover/

    插件

    https://github.com/tpope/vim-pathogen

    https://github.com/tpope/vim-commentary

    https://github.com/kana/vim-textobj-entire

    vimrc通用配置

    编辑 .vimrc
    添加 set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
    添加 cnoremap <expr> %% getcmdtype() == ':' ? expand('%:h'). '/' :'%%'
    添加 set history=200
    添加 set incsearch 使用 / 搜索时,进行实时预览

    image.png

    名词简介

    ==================================

    Keypress Command
    l 一个字符
    aw a word, 文本对象
    ap 一整个段落
    {motion} 例如:l,aw,ap, a{symbol}, i{symbol}
    {symbol} 代表符号,例如 '}',']',')','>',''','"','`',XML标签(例如:<xml>
    {code} 字符编码(普通情况三位数字,例如 A 是 065)(u{code} 可输入unicode 编码,例如 ¿ 是 u00bf)
    <C-a> Control键 + a键
    连续两次命令 作用于本行,例如:gUU,guu,dd
    :{start},{end} 第{start}行到第{end}行
    :. 代表当前行
    :% 代表所有行
    :'<,'> 代表高亮选区
    :/{start}/,/{end}/ {start}标签所在行到{end}标签所在行,内容如果有特殊字符则需要转义
    {range} 代表范围,一行,一块,一个等
    {address} 代表地址,一行,一块,一个等
    {n} 代表数字
    <TAB> table 制表符键
    {register} 寄存器,例如"+ 系统剪贴板, "0 专用寄存器, "a-"z 有名寄存器

    范围文本对象 a{symbol}, I{symbol}

    ==================================

    操作符后面跟的一个范围对象,例如 caw, ciw, daw, diw, vaw, viw


    Keypress Command
    iw 当前单词
    iW 当前字符串
    is 当前句子
    ip 当前段落
    aw 当前单词包括一个空格
    aW 当前字符串包括一个空格
    as 当前句子及一个空格
    ap 当前段落及一个空格
    a{symbol} 相对应符号之间的内容,包括符号
    i{symbol} 相对应符号之间的内容,不包括符号

    vim 后台待命

    Keypress Command
    <C-z> 把当前 vim 置于后台待命
    jobs 查看当前后台待命的 vim 进程
    fg 唤起 vim 进程

    重点-宏

    q{register} 把接下来的操作存入寄存器中,例如 qa,直到按 q 停止记录;
    q{大写的register} 在该寄存器中把接下来的操作附加在已有的操作之后, 例如 qA,直到按 q 停止记录;
    @{register} 把存入寄存器的操作,再次执行一遍, 接下来 按 @@ 可以重复执行这一操作;

    不要记录无法重复的命令。

    {number}@{register} 将该寄存器的操作重复执行 {number}次;

    :{range}normal @{register} 在{range}范围内的每一行上执行 {register} 里存储的操作;

    :reg {register} 可以查看存储在 {register} 中的操作

    image.png

    普通模式

    ==================================

    操作符命令举例(后面跟{motion})

    Keypress Command
    c 修改
    d 删除
    y 复制到寄存器
    ~ 大/小写光标下大字符
    g~ 反转大小写
    gU 转换为大写
    gu 转换为小写
    > 增加缩进
    < 减小缩进
    = 自动缩进
    ! 使用外部程序过滤{motion}所跨越的行

    ==================================

    普通模式

    Keypress Command
    . 重复上次修改
    >G 增加光标所在行到文档末尾的缩进层级
    0 光标移动到本行行首
    g0 光标移动到本行行首
    ^ 光标移动到本实际行的第一个非空字符
    g^ 光标移动到本屏幕行的第一个非空字符
    $ 光标移动到本行末尾
    g$ 光标移动到本屏幕行末尾
    a 插入模式(当前光标位置之后)
    A 插入模式(当前行末尾)
    b 光标移动到上一个单词的开头
    c 插入模式(删除当前位置字符,并在当前位置进行插入, 按下c之后再按字符会触发其他命令,比如 cw)
    C 插入模式(删除当前位置到本行结尾的内容并在当前位置插入)
    cw 插入模式(删除光标位置到单词结尾间的字符,并进入插入模式)(c{number}w)
    cb 插入模式(删除光标的前一个位置到单词开始间的字符,并进入插入模式)
    "_d{motion} 删除对应内容,即把内容剪贴到一个黑洞寄存器里,相当于黑洞扔进去拿不回来了
    d{motion} 剪贴对应内容
    dd 剪贴光标所在行
    db 剪贴光标的前一个位置到单词开始间的字符
    dw 剪贴光标位置到单词结束间的字符(d{number}w)
    daw 剪贴光标所在的目标单词
    dap 剪贴光标所在的整个段落
    e 移动光标到本单词结尾或下一个单词结尾
    ge 移动光标到上一个单词结尾
    {number}G 跳转到{number}行,不加数字则跳转到文本末尾
    f{char} 查找行内下一处{char}出现的位置(;重复)(,回退)
    F{char} 查找行内上一处{char}出现的位置(;重复)(,回退)
    /pattern 在文档中查找下一处的匹配项(n重复)(N回退)
    /\v{pattern} 在文档中查找下一处的正则匹配项(n重复)(N回退)
    /\v<pattern> 在文档中查找下一处的匹配项(一个完整单词, 例如:/\v<world>)(n重复)(N回退)
    /\V{pattern} 在文档中查找下一处的原意匹配项(n重复)(N回退)
    ?pattern 在文档中查找上一处的匹配项(n重复)(N回退)
    ga 查看当前字符的编码
    gv 重选上次的高亮选择区域
    gU{motion} 大些对应字符
    {n}gt 跳到第{n}个标签页,省略{n}则向右切换标签页
    gT 向左切换标签页
    h 光标移动到同行上一列
    j 光标移动到同列下一行
    gj 把光标移动到屏幕下一行(这里有个实际行和屏幕行的概念区别)
    J 把下一行拼接在当前行后面
    k 光标移动到同列上一行
    gk 把光标移动到屏幕上一行(这里有个实际行和屏幕行的概念区别)
    l 光标移动到同行下一列
    L 跳转到屏幕最下
    M 跳转到屏幕最上方
    mm 标记当前位置
    `m 跳转到标记为m的位置
    `. 跳转到上次修改的地方
    `` 跳转到上次跳转动作之前的位置
    % (),{},[] 左右两个括号跳转
    H 跳转到屏幕最上方
    i 插入模式(当前光标所在位置)
    I 插入模式(当前行开始位置)
    R 替换模式(从当前光标位置开始)(gR 虚拟替换模式,把制表符当作空格处理)
    s 插入模式(删除当前位置字符并在当前位置插入)
    S 插入模式(删除当前段落内容并插入)
    t{char} 查找行内下一处{char}出现的位置,并把光标移动到该位置的前一个字符(;重复)(,回退)
    T{char} 查找行内上一处{char}出现的位置,并把光标移动到该位置的后一个字符(;重复)(,回退)
    o 插入模式(在本行下面插入一行空行并进入插入模式)
    O 插入模式(在本行上面插入一行空行并进入插入模式)
    p 粘贴相应内容到下一行,前面可加寄存器标志{register}来粘贴不同寄存器的内容
    P 粘贴相应内容到上一行,前面可加寄存器标志{register}来粘贴不同寄存器的内容
    gp 粘贴相应内容到下一行,光标在复制文本的末尾,前面可加寄存器标志{register}来粘贴不同寄存器的内容
    gP 粘贴相应内容到上一行,光标在复制文本的末尾,前面可加寄存器标志{register}来粘贴不同寄存器的内容
    u 撤销上次修改
    v 进入字符可视模式
    va{symbol} 进入可视模式并选择相对应符号之内的内容,包括符号
    vi{symbol} 进入可视模式并选择相对应符号之内的内容,不包括符号
    V 进入行可视模式
    <C-v> 进入块可视模式
    w 光标移动到下一个单词的开头
    W 光标移动到下一个字符串的开头(每个字符串以空格或换行间隔)
    x 剪贴光标下的字符
    y{motion} 复制对应内容,可以前面加{register}标志字符("+ 系统剪贴板, "0, "a-"z)来复制到不同寄存器中
    yy 复制光标所在行
    zz 把当前行滚动至屏幕中央
    * 在文档中查找当前目标单词(n重复)(N回退)
    {number}<C-a> 光标所在数字字符加上{number},当{number}为空时,进行加1操作(如果光标没在数字字符上会正向查找并移动光标到数字字符上)
    {number}<C-x> 光标所在数字字符减掉{number},当{number}为空时,进行减1操作(如果光标没在数字字符上会正向查找并移动光标到数字字符上)
    <C-w>s 水平切分当前窗口
    <C-w>v 垂直切分当前窗口
    <C-w>w 循环切换窗口
    <C-w>h 切换到左边的窗口
    <C-w>j 切换到下边的窗口
    <C-w>k 切换到上边的窗口
    <C-w>l 切换到右边的窗口
    <C-w>= 令所有窗口等宽高
    <C-w>_ 最大化活动窗口的高度
    `<C-w> ` 最大化活动窗口的宽度
    {N}<C-w>_ 把活动窗口的高度设置为 {N} 行
    `{N}<C-w> ` 把活动窗口的高度设置为 {N} 列
    ( 跳转到上一句的开头
    ) 跳转到下一句的开头
    { 跳转到上一段的开头
    } 跳转到下一段的开头
    <C-]> 跳转到当前光标所在单词的声明处(代码可用),可按下 <C-t> 会退到之前的位置

    ==================================

    插入模式

    ==================================

    Keypress Command
    <C-h> 删除前一个字符
    <C-w> 删除前一个单词
    <C-u> 删至首行
    <C-[> 等同<ESC>,切换回普通模式
    <C-o> 切换到 插入-普通模式(即切换到普通模式后,执行一个操作又回到插入模式)
    <C-r>{register} 粘贴相应寄存器在当前光标之前,寄存器直接跟字符不用再加"
    <C-p>{register} 粘贴
    <C-v>{123} 以十进制字符编码插入字符,{123}代表三位数字
    <C-v>u{1234} 以十六进制字符编码插入字符,{1234}代表四位数字
    <C-v>{非数字字符} 按原义插入非数字字符
    <C-k>{char}{char} 插入以二合字母{char}{char}表示的字符,例如 ?I 代表 ¿

    Ex模式

    ==================================

    Ex模式(按 <tab> 键自动补全命令,<C-d> 显示可用的补全列表,个人习惯补全设置 :set wildmode=longest,list


    Keypress Command
    :s/{target}/{replacement} 替换当前行 {target} 为 {replacement} (&重复)(u回退)
    :%s/{target}/{replacement}/g 替换所有 {target} 为 {replacement}
    :h digraph-table 查看二合字母列表
    :tabnew 创建新标签页
    :{number} 光标跳转到该行行首
    :{number}d 删除第{number}行
    :join 使下一行拼接在本行后面
    :p 显示本行内容
    :0 文件开头
    :1 文件到第一行
    :$ 文件的最后一行
    :{range}t{address} 把{range}复制到{address}行之后,{range}不写就代表本行
    :{range}m{address} 把{range}移动到{address}行,{range}不写就代表本行
    :{range}normal {普通命令} 在连续{range}包含的行上执行一条普通命令
    :{range}substitute/{pattern}/{string}/[flags] substitute 缩写是 s, 把{range}范围内{pattern}出现的地方替换为{string}
    @: 重复上次操作
    <C-r><C-w> 把光标所在单词插入到命令行
    :!{commond} 执行 shell 命令
    :!shell 启动 shell 交互窗口
    :sp {file} 水平切分此窗口
    :vsp {file} 垂直切分此窗口
    :close 关闭窗口
    :tabclose 关闭当前标签页
    :tabonly 关闭其他标签页
    :only 关闭除当前活动窗口外的其他窗口
    :tabedit {filename} 在新标签页中打开 {filename}, 可省略 {filename} 打开一个空白标签页
    :pwd 打印工作目录
    :edit {file} 打开文件
    :find {file} 打开文件
    :vimgrep //g % 把上一个匹配命令(/命令)的所有匹配项放到 quickfix 列表中
    :cnext 正向遍历 quickfix 列表
    :cprev 反向遍历 quickfix 列表

    substitute 替换命令

    ==================================

    :[range]s[ubstitute]/{pattern}/{string}/[flags]


    标志位{flags} Command
    g 让命令可以在全局范围进行操作,即替换当前实际行的所有匹配项
    c 让我们自己决定每一处匹配项是否进行替换(y 替换;n 忽略;q 退出替换模式;l 替换此位置后退出;a 替换此处和之后所有匹配项;<C-e> 向上滚动屏幕;<C-y> 向下滚动屏幕)
    n 不执行替换操作,只提示匹配的个数
    e 屏蔽匹配错误提示
    & 重用上一次使用的标志位
    替换域{string} Command
    \r 插入换行符
    \t 插入制表符
    \\ 插入反斜杠
    \{number} 插入第{number}(0-9)个子匹配
    \0 插入匹配模式的所有内容
    & 插入匹配模式的所有内容
    使用上一个替换域的内容
    \=@{register} 使用寄存器中的内容
    查找域{pattern} Command
    (空) 使用上一次的匹配模式

    使用 g& 在整个文件范围内,重复上一条替换命令, 相当于执行 :%s//~/&
    :{range}&& 在 {range}(为空时范围即本行) 范围内,执行上一条替换命令

    global 命令

    ==================================

    [range]global[!]/{pattern}/[cmd]
    :global (:g)在指定模式的所有匹配行上运行Ex命令, ! 指反转命令
    :vglobal (:v)指命令反转

    查找域{pattern} Command
    (空) 使用上一次的匹配模式
    命令[cmd] Command
    (空) 默认使用 :print

    可视模式

    ==================================

    面向字符的可视模式(在普通/可视模式下输入 v 进入)
    面向行的可视模式(在普通/可视模式下输入 V 进入)
    面向块的可视模式(在普通/可视模式下输入 <C-v> 进入)


    Keypress Command
    <C-[> 等同<ESC>,切换回普通模式
    v 面向字符的可视模式
    V 面向行的可视模式
    <C-v> 面向块的可视模式
    o 切换至高亮的两端
    U 大写选中内容
    u 小写选中内容

    命令行窗口

    ==================================

    可以在中间加 | 来同时执行多个命令


    Keypress Command
    q: 打开展示 Ex 命令历史的命令行窗口
    q/ 打开展示查找命令(例:/afra,查找 'afra' )历史的命令行窗口
    :q 关闭命令行窗口
    <C-f> 从命令行模式切换到命令行窗口

    后话

    vim 入门级别的小结,不管咋样,都有收获。

    太简单都没脸见人了

    image.png

    相关文章

      网友评论

          本文标题:Vim 让每一个键都拥有灵魂

          本文链接:https://www.haomeiwen.com/subject/wwgwuctx.html