• Vim实用技巧_1.vim解决问题的方式


    技巧001:结识.命令

    . 命令可以让我们重复上次的修改,它是 Vim 中最为强大的多面手

    Vim 文档只是简单地提到 . 命令会重复上次修改(参见 :h .),"上次修改"可以指很多东西,一次修改的单位可以是字符、整行,甚至是整个文件

    • 1.普通模式
    # x 命令会删除光标下的字符
    # dd 命令也做删除操作,但它会把整行一起删掉
    # >G 命令会增加从当前行到文档末尾处的缩进层级
    
    • 1
    • 2
    • 3

    使用.的效果截图

    在这里插入图片描述

    • 2.命令模式

    示例:从进入插入模式的那一刻(包括进入的按键也会记录,例如,输入 i),直到返回普通模式时为(输入),Vim 会记录每一个按键操作

    做出这样一个修改后,再用 . 命令的话,它将会重新执行所有这些按键操作

    • 3..命令是一个微观的宏

    Vim 可以录制任意数目的按键操作,然后在以后重复执行它们;我们可以把 . 命令当成一个很小的宏(macro);第11章会有宏的详细介绍

    技巧002:不要自我重复

    对于行尾添加内容这样的常见操作,如添加分号,Vim 提供了一个专门的命令,可把两步操作合并为一步

    示例:一共有3行,想在每行的结尾添加一个分号

    var foo = 1 
    var bar = 'a' 
    var foobar = foo + bar
    
    • 1
    • 2
    • 3
    • 1.常规操作

    先得把光标移到行尾($),接着就可以执行 a; 完成修改了;对另外2行执行同样的操作

    • 2..思路

    由于 . 命令可以重复上次的修改,因此对另外2行直接执行j$.即可

    # j 命令使光标下移一行
    # $ 命令把光标移到行尾
    # 一个键(`.`)顶 3 个(`a;`)
    
    • 1
    • 2
    • 3
    • 3.优化思路
    # a 命令在当前 光标之后 添加内容
    # A 命令则在当前 行的结尾 添加内容
    
    • 1
    • 2

    不管光标当前处于什么位置,输入 A 都会进入插入模式,并把光标移到行尾;换句话说,A$a 封装成了一个按键操作;优化后操作如下:

    在这里插入图片描述

    从普通模式切换到插入模式的等价命令整理如下

    复合命令等效命令说明
    Cc$C:删除光标位置到行尾,且开始插入
    c{motion}:删除{motion}文本(即重复删除多个数据),且开始插入
    示例:cgg,删除当前行到行首所有,c$,删除光标位置到行尾
    scls:删除字符,且开始开始插入
    S^c^:行首的第一个非空字符字符;0:行首;$:行尾
    I^i
    A$a本技巧中的示例
    oA
    Oko

    技巧003:以退为进

    我们可以用一种常用的 Vim 操作习惯在一个字符前后各添加一个空格。乍一看,这种方法有点古怪,不过其好处是可重复,这将使我们可以事半功倍地完成工作

    示例:在加号左右加上空格(实现思路:用s␣+␣,替换掉加号

    在这里插入图片描述

    key1:定位到特定字符

    • 1.定位:f{char} 命令让 Vim 查找下一处指定字符出现的位置,如果找到了,就直接把光标移到那里(参见 :h f )。因此,当我们输入 f+ 时,光标会直接移到下一个 + 号所在的位置

    • 2.下一个:; 命令会重复查找上次 f 命令所查找的字符(上一个用,

    key2:.命令记录修改并执行

    思路:先将加号删除掉,在用的形式替换加号,然后将这个操作用点号.记录下来

    • 1.s命令,把两个操作合并为一个:它先删除光标下的字符,然后进入插入模式
    • 2.在删除 + 号后,我们先输入␣+␣表示空格),然后退出插入模式

    技巧004:执行、重复、回退

    在面对重复性工作时,我们需要让移动和修改都能够重复,这样就可以达到一个最佳编辑模式

    本节将介绍 Vim 可以重复执行的每个操作,并学习如何回退这些命令

    vim 中可重复执行的命令,以及相应的回退方式。在多数场景中,撤销(undo)都是我们想要使用的命令

    在这里插入图片描述

    扩展:你是否曾经使用过撤销命令(u),然后紧接着又重做()呢?

    这两条命令的结果会相互抵消,不过却会带来一个副作用,即最终光标会停留在上次修改过的地方;
    但是这也有一个额外效果:最终光标会停留在上次修改过的地方

    技巧005:查找并手动替换

    Vim 提供了一个:substitute 命令专门用于查找替换任务,不过用上面介绍的技术,我们也可以手动修改第一处地方,然后再一个个地查找替换其他匹配项。

    . 命令可以把我们从繁重的工作中解放出来,而即将登场的另一个有用的单键命令,则能够让我们方便地在匹配项间跳转

    示例:用单词“copy”(意义同“copywriting”)来替代“content”,即第二行不替换

    ...We're waiting for content before the site can go live... 
    ...If you are content with this, let's go ahead with it... #这个content不进行替换
    ...We'll launch as soon as we have the content...
    
    • 1
    • 2
    • 3

    常规思路

    :%s/content/copy/gc,查找字符,然后替换

    • 1.第一个被替换的要输入y,然后,此时.命令记录了替换动作
    • 2.后面的只需要用n找到替换的字符,然后输入.命令即可

    偷懒:无需输入进行查找

    简单地把光标移到这个单词上,然后按 * 键,操作示例

    在这里插入图片描述

    操作解释

    • * 键会产生两个结果:一是光标会跳到下一个匹配项上,二是所有出现这个词的地方都会被高亮显示出来(没有高亮,试着运行一下 :set hls
    # 使用 * 或者 # 命令时,这两条查找命令分别用于 正向 或 反向 查找光标下的单词
    
    • 1
    • n 键:可以跳到下一个匹配项

    • cwcopy :当光标位于“content”的开头时,我们就可以着手修改它。两步操作:首先要删除单词“content”,然后输入替代的单词

    # 说明:cw 命令会删除从光标位置到单词结尾间的字符,并进入插入模式,接下来我们就可以输入单词“copy”了
    
    • 1
    • .命令:Vim 会把离开插入模式之前的全部按键操作都记录下来,因此整个 cwcopy 会被当成一个修改

    重复替换建议:在按了 n 之后,要审视一下当前的匹配项,然后决定是否把它改为“copy”。如果需要修改的话,就按 . 命令,反之则不用

    技巧006:结识 . 范式

    本节,我们将对上面技巧进行比较,并找出它们共有的模式:一个我称之为 . 范式的最佳编辑模式

    回顾前面 3 个 . 命令编辑任务

    技巧 2

    • 1.想在一系列行的结尾添加分号。我们先用 A; 修改了第一行,做完这步准备后,就可以使用 . 命令对后续行重复此修改

    • 2.使用了 j 命令在行间移动,要完成剩余的修改,只需简单地按足够多次 j. 就可以了

    技巧 3

    • 1.想为每个 + 号的前后各添加一个空格。我们先用 f+ 命令跳到目标字符上,然后用 s 命令把一个字符替换成 3 个

    • 2.做完这步准备后,我们就可以按若干次 ;. 完成此任务。

    技巧 5

    • 1.想把每处出现单词“content”的地方都替换成“copy”。我们使用 * 命令来查找目标单词,然后用 cw 命令修改第一处地方

    • 2.做完这步准备后,就可以用 n 键跳到下一匹配项,然后用 . 键做相同的修改。要完成这项任务,只需简单地按足够多次 n. 就行了

    总结:用一键移动,另一键执行(把它叫做“. 范式”)

    参考

    • 《Vim实用技巧》,书籍写的很好,强烈建议读一读
  • 相关阅读:
    python基于PHP+MySQL读书分享平台
    LeetCode 热题 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 4. 寻找两个正序数组的中位数 5. 最长回文子串
    Python——基于YOLOV8的车牌识别(源码+教程)
    基于Java Web的汽车租赁系统的设计与实现
    20221202今天的世界发生了什么
    Scrapy内容
    leetCode 121. 买卖股票的最佳时机 贪心算法
    安装MongoDb(mac系统)步骤以及踩坑笔记(图文详解)
    无法加载文件 C:\Users\haoqi\Documents\WindowsPowerShell\profile.ps1,因为在此系统上禁止运行脚本
    C++-win32-SendMessage-最简单的进程间消息传递-消息钩子
  • 原文地址:https://blog.csdn.net/weixin_44531336/article/details/126151484