vim编程

作者: 大短人 | 来源:发表于2019-02-15 14:36 被阅读0次

    学习vim笔记


    学习vim最主要的目的还是提高代码效率,学习编程中最重要的还是编程的思考,所以手下功夫一定不能耽误思维的流畅。
    本人主要从事游戏开发,以VSCode做为主,虽然之前已经对编辑器自身的快捷键很熟悉了,但是在编辑代码上的效率还是不满意,索性就开始学习“神之编辑器”。

    从两个方向去学习vim命令

    1. 从vim命令本身的结构去学习

    2. 从编程中常用的操作流程去实践


    vim基本结构

    vim基本分为4个基本模式,普通模式,插入模式,可视模式,命令模式。
    普通模式通过按键操作,进行移动、复制、粘贴、删除、替换、屏幕滚动等操作。
    插入模式如同最普通的文本编辑器一样的,写作模式。
    可视模式用来选择文本的模式,如同鼠标选择文本一样方便。
    命令模式输入vim提供的指令来完成相关操作。主要为设置环境、文件操作等。
    4个模式之间相关跳转完成编辑。

    模式下跳转

    普通模式下按<ESC>会取消当前命令,其他模式下按<ESC>会跳转到普通模式。
    普通模式按:进入命令模式。
    普通模式按v进入普通可视模式。
    普通模式按V进入可视模式。
    普通模式按<CTRL> + v进入可视模式。

    1. 普通模式下

    i/I 前/最前 插入;
    a/A 后/最后 插入;
    o/O 下/上行 插入;
    c + 命令 删除插入;

    s/S 删除插入(要与sround模式和sneak模式区分);

    替换模式
    R/gR 进入替换模式(替换后面的字符),推荐gR。
    r/gr 处理一个字符的替换,返回普通模式。

    2. 可视模式下

    I 进入 插入;
    o 切换移动点

    3. 插入模式下

    <C w> 删除前一个单词
    <C u> 删除至行首
    <C r>{register}将寄存器的内容粘贴到光标所在的位置,如:<C - r>=6*3<Enter>插入18。
    <C v>{123} 以十进制字符插入字符。
    <C v>u{123}以十六进制字符编码插入字符。
    <C k>{char1}{char2} 插入以二合字母{char1}{char2}表示的字符。

    这个模式允许执行一次普通模式命令,执行完后回到插入模式。
    <C o>进入“插入-普通模式”。
    <C o>zz 把当前行置于窗口正中,这个经常用。
    <C [>退出到普通模式==<Esc>

    f+字符 find 向下找一个字符,t+字符找之前

    #,*(shift+3/8)查找上/下一个光标所在相同的单词
    % 匹配括号跳转

    D 删除当前到末尾
    [{]}跳转函数体最上最下括号
    在块模式下按I(大写i),可进入多光标情况
    ctrl+o( older )/i返回到前/后一个光标位置
    gd 查询所属单词定义

    vib/vi((选中()内的内容)
    viB/vi{(选中{}内的内容)
    vi"(选中"内的内容)
    vi'(选中'内的内容)
    vi<(选中<>内的内容)

    vis 选中一个句子
    vib 选中一个block
    viw 选中一个单词
    vip 选中一个段落

    ~ 大小写互相转换
    U/u 可视模式下所选改为大/小写
    gU/u + iw/aw/w/e....
    gUU/guu 当前行大/小写

    视觉模式下
    ii选中函数体

    删除
    d/word 删除到word前 Exp: d/;

    重复类型 重复操作符 回退操作符
    文本改变重复 . u
    行内查找重复 ; ,
    全文查找重复 n N

    复制完单词
    /<Ctrl+R>0 查找寄存器上的单词

    查看寄存器中的内容::reg

    exp:10a!<esc>
    数字+a/i+字符串+esc 连续输入10个相同人字符串

    命令模式下命令流

    hello world

    Old text Command New text
    "Hell3 *world!" ds" Hello world!
    [123+4*56]/2 cs]) (123+456)/2
    "Look ma, I'm *HTML!" cs"<q> <q>Look ma, I'm HTML!</q>
    if *x>3 { ysW( if ( x>3 ) {
    my $str = *whee!; vlllls' my $str = 'whee!';
    <div>Yo!*</div> dst Yo!
    <div>Yo!*</div> cst<p> <p>Yo!</p>

    ci: 例如,ci(,或者ci),将会修改()之间的文本;
    di: 剪切配对符号之间文本;
    yi: 复制;
    ca: 同ci,但修改内容包括配对符号本身;
    da: 同di,但剪切内容包括配对符号本身;
    ya: 同yi,但复制内容包括配对符号本身。
    PS. dib等同于di(。diB等同于di{。

    ci[ ci( ci< ci{ 删除一对 [], (), <>, 或{} 中的所有字符并进入插入模式
    ci” ci’ ci删除一对引号字符 ” ‘ 或 中所有字符并进入插入模式
    cit 删除一对 HTML/XML 的标签内部的所有字符并进入插入模式

    1. 删除 复制 粘贴
      • x delete
      • X 退格
      • dd 删除当前行
      • d+0/$ 删到 行首/尾
      • yy 复制行
      • p 下行粘贴 P 上行粘贴
      • J 本行下行合并
    2. 移动
      • hjkl 移动一下
      • xxx+hjkl 重复移动xxx次
      • 0 行首
      • $ 行尾
      • gg 页首
      • G 页尾
      • xxx+G 定位到行号
      • xxx <Enter> 向下移动xxx行
    3. 搜索替换
      /world 找world
      ?world 向上找world
      n N 向下向上找
      :n1/n2s/word1/word2/g 替换
      :1,$s/... 全页替换
      :%s/... 同上

    底线命令模式

    1. :q quit退出
    2. :w 保存
    3. :open xx.xx 打开xx.xx

    标记与到达标记

    ma 设置此处为标记a
    'a 到达标记a行行首
    `a 到达当时标记位置的地方

    切换窗口

    ctrl + ww 切换窗口
    ctrl + w <h|j|k|l>切换到这个方向的窗口

    R 可以临时进入替换一直更改

    w 下个单词头
    b 上个单词头
    e 这个单词尾

    v + w/b/e/h/j/k/l/$/0 选择
    y/p 复制/粘贴
    x/d 删除/剪切

    vscode&vim对比

    快捷命令 vscode vim
    上下复制 Alt+shift+上/下 yyp/P
    上下新建行 ctrl+(shift)+enter o/O
    选中一个单词 ctrl + d viw
    系统剪切板 ctrl+c/v "+
    删除当前行 ctrl+shift+k dd
    跨越单词 ctrl + 左右 web

    gd - Go to definition, 跳转到定义。
    gb - 找出与光标下相同的下一个单词, 并添加一个光标 ,接下来就可以同时修改。
    af - VISUAL 模式命令, 依据语法分析, 将选择区域向外扩展。
    gh - 等同于将鼠标移至光标所在单词, 方便查看定义以及报错。

    insert插入模式下:删除前一个

    ctrl+h 字符
    ctrl+w 单词
    ctrl+u 一行

    Surround 模式

    https://github.com/tpope/vim-surround
    Normal mode


    ds - delete a surrounding
    cs - change a surrounding
    ys - add a surrounding
    yS - add a surrounding and place the surrounded text on a new line + indent it
    yss - add a surrounding to the whole line
    ySs - add a surrounding to the whole line, place it on a new line + indent it
    ySS - same as ySs

    Visual mode

    s - in visual mode, add a surrounding
    S - in visual mode, add a surrounding but place text on new line + indent it

    Insert mode

    <CTRL-s> - in insert mode, add a surrounding
    <CTRL-s><CTRL-s> - in insert mode, add a new line + surrounding + indent
    <CTRL-g>s - same as<CTRL-s>

    ci

    cis 改变句子
    重要命令
    y yank 提起
    p paster 粘贴
    a append 追加
    i insert 插入
    s substitute 替换

    Append,Insert,Replace,Subsitute
    AIRS
    小写表示characterwise(字符)
    linewise(行)

    5yl 复制光标后的5个字符(包括光标所在的那个字符)
    5yh 复制光标前的五个字符(不包括光标所在的那个字符)
    5dl 删除光标后的5个字符(包括光标所在的那个字符)
    5dh 删除光标前的5个字符(不包括光标所在的那个字符)

    例如执行命令(:键),搜索(/和?键)或者过滤命令(!键)。在命令

    输入插入命令i、附加命令a、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。
    http://c.biancheng.net/view/519.html

    S:删除光标所在行并开始插入
    s:删除光标所在的字符并开始插入
    ==排版

    替换

    :s/old/new #替换当前行的第一个old为new
    :s/old/new/g #替换当前行的所有的old为new
    :.,s/old/new #替换当前行到最后行的第一个old为new :.,s/old/new/g #替换当前行到最后行的所有old为new
    :N,Ms/old/new #替换第N行到第M行的第一个old为new
    :N,Ms/old/new/g #替换第N行到第M行的所有old为new
    :N,Ms/old/new/gc #替换第N行到第M行的所有old为new,且逐一询问是否删除
    :%s/old/new #替换所有行的第一个old为new
    :%s/old/new/g #替换所有行的所有old为new

    光标移动

    形式:Ctrl + cmd

    b 向上移动一屏
    f 向下移动一屏
    e 向上滚动一行
    y 向下滚动一行

    形式:cmd

    H 当前屏幕顶 high
    M 中 middl
    L 低 low

    形式:Num%
    移动到文档在百分之Num

    屏幕移动

    zz 光标所在行移动到屏幕 中
    zt 顶
    zb 低

    形式:Ctrl + cmd

    u 向上移动半屏
    d 向下移动半屏

    f/F/t/T: (find) (to)

    形式:Num f Char

    f移动到该字符
    t移动到该字符前
    ;重复执行命令

    在插入模式下ctrl + o 临时进入命令模式
    url:
    http://www.cnblogs.com/moiyer/archive/2010/04/01/1952681.html

    vim normal模式下

    1、c+i+分隔符,删除分隔符里面的内容(不删除分隔符,c+a+分隔符则包括分隔符一起删掉)

    如将光标位于'%s : %d years old ' 中,此时按c+i+' ?则可以将'%s : %d years old ' 变为' '

    vickey-wu = 'vickey-wu'
    例句:print '%s : %d years old ' % (vickey-wu,23)
    结果:print ''

    我个人记的方法c:change,i:ignore,a:all
    2、y+i+分隔符,y在vim是复制,与上面的同理,表示复制分隔符里面的内容(不复制分隔符,y+a+分隔符则包括分隔符一起复制)

    https://www.jianshu.com/p/41c759d543b7
    进阶
    https://www.jianshu.com/p/cbfa86c8d8a5

    gp,和p的功能基本一致,只是粘贴完,它会把光标移动至粘贴内容之后;gP同理

    https://www.cnblogs.com/yangjig/p/6014198.html

    相关文章

      网友评论

          本文标题:vim编程

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