vim总结

Vim的风格
  • vim会记住我们的操作,并使最常用的操作触手可及,所以可以很方便地重复执行它们;

  • 当vim让一个操作或移动可以很方便地重复时,它总是会提供某种方式,让我们在不小心做过头时能回退回来;

    • 对.命令而言,我们永远可以按u 键撤销上次的修改;
    • 如果在使用f{char}命令后,不小心按了太多次;键,可以再按,键调回去,这个命令会反方向查找上次f{char}所查找的字符;
  • vim会把我们离开插入模式之前的全部按键操作都记录下来,因此整个cwcopy会被当成一个修改。

  • “.范式”:用一次按键移动,另一次按键执行。

  • 大多数普通模式命令可以在执行时指定次数,可以利用这个功能来做简单的算术运算。

  • 很多普通模式命令都可以带一个次数前缀,这样vim就会尝试把该命令执行指定的次数,而不是只执行一次。

  • 执行、重复、回退;

  • 操作符 + 动作命令(motion) = 操作

    操作符的作用范围由动作命令决定。

    命令用途
    c修改
    d删除
    y复制到寄存器
    g~反转大小写
    gu转换为大写
    >增加缩进
    <减小缩进
    =自动缩进
    !使用外部程序过滤{motion}所跨越的行
  • 当一个操作符命令被连续调用两次时,它会作用于当前行:

    • dd:删除当前行
    • >>:缩进当前行
    • gUgU或gUU
  • 符号%代表当前文件名

基本操作

四种模式切换

  • 光标移动:

    上下左右hjkl

    面向单词的动作命令:w、b、e(跳到下个单词的末尾)、ge(调到前一个单词的末尾)

    单词跳转wWbB(w:单词间跳转;W:子串间跳转,子串是以空格来区分的)

    f {char}:对字符进行查找,使用;结合使用,使用,进行回退。

    句跳转()

    段跳转{}

    [[、]]:跳转到上或下个函数

    跳到句子开头home/^和结尾end/$

    调到文档开头gg和结尾G

    数字G:跳到对应数字行号

    数字|:调到对应数字的列好

    翻页: 和 、 和

    翻半页: 和 ,Up 和 Down

    移动光标到屏幕的顶部、中间和底部:用 H(High)、M(Middle)和 L(Low)

    把当前行“滚动”到屏幕的顶部、中部或底部。Vim 里的对应按键是 zt、zz 和 zb

    滚动屏幕而不移动光标。需要的按键是 和

  • 进入插入模式的方式:iIaAoO

  • 剪切:d组合/c组合、撤销:uU、保存:S、

  • 退出:q(quit)、ZZ/wq:存盘退出、:w(writ):存盘

  • 重复.

  • 删除:x(删除当前光标所在的位置)、X(删除光标前面的字符)

  • 粘贴:p(put)

    • p:粘贴在光标的后面
    • P:粘贴在光标的前面
    • ctrl+insert
  • 文本复制:y(yank)

    1. 复制整行:yy、D
    2. 复制对应方向的内容:y数量和方向
    3. 文本对象选择:y、i、a、w、W、‘’、“”、()、[]、{}
    4. 多层对象操作:在a和i前加上数字
  • 文本修改:d(delete)/c(cut)

    1. 删除一个字符:dl
    2. 删除一个完整的单词:daw
    3. 删除光标到单词结尾:dw
    4. 删除一整个段落:dap
    5. 删除整行dd
    6. 删除到行尾D
    7. 删除对应方向的内容dn方向
    8. 文本对象选择:d/c、i、a、w、‘’、“”、()、[]、{}
    9. 多层对象操作:在a和i前加上数字
  • 多文件打开

  • :edit:能以文件路径打开任何文件

  • 缩进层级:>G

    增加从当前行到文档末尾出的缩进层级

  • ;:重复上次命令

  • s:把两个操作合并为一个,它先删除光标下的字符,然后进入插入模式。

  • 替换:😒/target/replacement

  • 转为大写:gU

    • gUaw:把当前单词转换成大写形式
    • gUap:把整段文字转换为大写
  • :version

vim的文本对象:i、a

一般以i(inside)开头的文本对象会选择分隔符内部的文本,而以a(around、all)开头的文本对象会选择包括分隔符在内的整个文本。

  • 分隔符文本对象

  • 范围文本对象:

    一般来说,d{motion} 命令和aw、as和ap配合起来使用比较好,而c{motion}命令和iw及类似的文本对象一起用效果会更好。

文本对象选择范围
iw当前单词
aw当前单词及一个空格
iW当前字串
aW当前字串及一个空格
is当前句子
as当前句子及一个空格
ip当前段落
ap当前段落及一个空行
查找项
  • 搜索:/?(向上下查找:-=)

  • *:查找当前光标下的单词

  • 寻找字符:f(find)/t(till)、F/T

    f{char}:让vim查找下一处指定字符出现的位置,如果找到了,就直接把光标移动到那里。

    fa:查找光标后面最靠近光标的a;然后使用;符号可以重复之前的操作。

命令行模式

可以使用:h xxx 来查看每个命令的说明文档。

  • :colors Tab:选择相应的主题
  • :help Tab:查看帮助文件
  • :set autowrite,告诉 Vim 在切换文件时自动存盘;
vim脚本
  • vim包管理器的安装和使用?
  • 插件的查找、安装和使用?
  • vim的运行支持文件
视频教学
键盘录制

qa:

.vimrc
  • set
    • number:设置行号
    • cursorline:设置横线
    • wrap:内容不超过边框,自动换行
    • showcmd:显示输入的命令
    • wildmenu:按Tab查找补全
    • ignorecase:忽略大小写
    • smartcase:适应大小写
  • noremap:键位的更改
  • map:映射
  • exec:执行命令
    • exec “nohlsearch”:每次打开文件执行命令去掉高亮
分屏:
  • sp{split}
  • vs
  • 向右分屏:map sr :set splitright<CR>:vsplit<CR>
  • 向左分屏:map sl :set nosplitright<CR>:vsplit<CR>
  • 向上分屏:map su :set nosplitbelow<CR>:split<CR>
  • 向下分屏:map sd :set splitbelow<CR>:split<CR>
  • 打开其他文件::e(edit) PATH
  • :res +5
  • :res -5
  • :vertical resize-5
  • :vertical resize+5
标签页
  • map tu :tabe
  • map tn :-tabnext
  • map ti :+tabnext
将键盘的Esc和CapsLock大写锁定互换
  • /etc/default/keyboard中的XKBOPTIONS设置为caps:swapecape,结果如下:

    # KEYBOARD CONFIGURATION FILE
    
    # Consult the keyboard(5) manual page.
    
    XKBMODEL="pc105"
    XKBLAYOUT="cn"
    XKBVARIANT=""
    XKBOPTIONS="caps:swapescape"
    
    BACKSPACE="guess"
    
  • 执行配置:sudo dpkg-reconfigure keyboard-configuration

  • 接下来会出来一个让你选择键盘类型的界面,一般一路确认就可以了,可以看一下信息,比方说我的键盘是pc105,所以我选择105的选项。

原理
  1. 减少无关的移动

    a命令是在当前光标之后添加内容,A命令则是在当前行的结尾添加内容。不管光标当前处于什么位置,输入A都会进入插入模式,并把光标移到行尾。换句话说,它把$a封装成了一个按键操作。

    在每行后面添加;符号:
    $:将光标移动到行尾
    a:在光标之后添加内容
    ;
    A:封装$a
    A;
    k:向下移动一行
    k.:在下一行重复上一次的动作
    
  2. 复合命令

    复合命令等效的长命令
    Cc$
    I^i
    A$a
    oA
    Ojo
  3. 使修改可重复(充分发挥.命令的最大威力) - 在一个字符前后各添加一个空格

    var foo = "method+alkdj+ladkl+kdlakdjf+dkal"
    f+:将光标移动到第一个+符号
    s␣+␣<Esc>:删除光标下的字符,进入插入模式,先输入␣+␣,然后退出插入模式
    ;
    .
    
  4. 使移动可重复

    f+命令跳到下一个+号所在的位置。
    ;命令会重复查找上次f命令所查找的字符;
    
  5. 执行、重复、回退

    目的操作重复回退
    做出一个修改{edit}.u
    在行内查找下一指定字符f{char}/t{char};,
    在行内查找上一指定字符F{char}/T{char};,
    在文档中查找下一处匹配项/patternnN
    在文档中查找上一处匹配项?patternnN
    执行替换😒/target/replacement&u
    执行一系列修改qx{changes}q@xu
  6. 把撤销单元切成快

    在vim中,我们自己可以控制撤销命令的粒度。从进入插入模式开始,直到返回普通模式为止,在此期间输入或删除的任何内容都被当成一次修改。因此,只要控制好对键的使用,就可使撤销命令作用于单词、句子或段落。

  7. 用次数做简单的算术运算

    • 大多数普通模式命令可以在执行时指定次数,可以利用这个功能来做简单的算术运算。
    • 很多普通模式命令都可以带一个次数前缀,这样vim就会尝试把该命令执行指定的次数,而不是只执行一次。
普通模式

程序员通常只花一小部分时间编写代码,绝大多数时间用来思考、阅读,以及在代码中穿梭浏览,而且当确实需要修改时,谁说一定要切换到插入模式才行?我们可以重新调整已有代码的格式,复制它们,移动其位置,或是删除它们。在普通模式中,我们有众多的工具可以利用。

  • 许多普通模式命令可以在执行时指定的次数,这样它们就可以被执行多次。
  • 普通模式命令的强大,很大程度上源于它可以把操作符与动作命令结合在一起。
  • 和命令分别对数字执行加和减操作。在不带次数执行时,它们会逐个加减,但如果带一个次数前缀,那么可以用它们加减任意整数。
  • 如果光标不在数字上,那么命令将在当前行正向查找一个数字,如果找到了,它就径直跳到那里。
可视模式:v/V
  • v:

  • V:进入可视行模式

  • ctrl + v:可视列模式

    • 可以选择多行中的多列并对其进行操作;
    • 进入可视的列模式后,选择多行中的多列,再shift+i进入插入模式,就可以对多列进行写入了;

插入模式
  • 在所有模式中删除的组合键

    按键操作用途
    删除前一个字符(同退格键)
    删除前一个单词
    删至行首
  • 切换回普通模式

    按键操作用途
    切换到普通模式
    <C-[>切换到普通模式
    切换到插入-普通模式
  • 插入-普通模式

    能让我们执行一次普通模式命令。在执行一个普通模式命令,执行后,马上又返回到插入模式。

  • 表达式寄存器

    <C-r>=访问寄存器:该命令会在屏幕下方显示一个提示符,可以在其后输入要执行的表达式,输入表达式后敲一下<CR>,vim就会把执行的结果插入文档的当前位置了。
    
可视模式

可视模式允许选中一块文本区域并在其上进行操作

vim有三种不同的可视模式,分别用于操作字符文本、行文本和块文本。

一般情况下,当使用可视模式时,选区的一端固定在一个特定字符上,另一端可以自由移动;当使用l、w及f{char}这类动作命令时,会移动高亮区域的活动端,使选区变大或缩小。

  • 在普通模式下激活可视模式:

    命令用途
    v激活面向字符的可视模式
    V激活面向行的可视模式
    激活面向块的可视模式
    gv重选上次的高亮选区
  • vi}:vim进入可视模式,并选中花括号{}括起来的所有字符。

命令行模式
  • 在指定范围上执行普通模式命令:normal

    对几十行后都添加一个分号:
    A;<Esc>
    jVG
    :'<,>'normal .:对高亮选区中的每一行,对其执行普通模式下的.命令。
    
  • :%normal A; :符号%代表整个文件范围,因此:%normal A; 告诉vim在文件每行的结尾都添加一个分号。

  • :%normal i# :可以把整个python文件注释掉

  • 用键自动补全命令

  • 运行shell命令::!可以调用外部程序,适用于执行一次性命令

  • :shell 命令用来启动一个交互的shell会话,exit退出会话返回vim

    命令用途
    :shell启动一个shell(输入exit返回vim)
    :!{cmd}在shell中执行{cmd}
    :read !{cmd}在shell中执行{cmd},并把其标准输出插入光标下方
    :[range]wirte !{cmd}在shell中执行{cmd},以[range]作为其标准输入
    :[range]!{filter}使用外部程序{filter}过滤指定的[range]
多文件
  • :ls:列出所有被载入内存中的缓冲区的列表,

    • 用:bnext命令可以切换到列表中的下一个缓冲区。

      :bnext!:叹号会强制vim切换缓冲区,即使当前缓冲区中有未保存的修改,也会继续切换。:ls命令中查看,被标记为a,表示为活动缓冲区(active);被标记为h,表示为隐藏缓冲区(hidden)。

    • 在退出时处理隐藏缓冲区:

      • :write(:w):命令把缓冲区保存到文件;
      • :edit!(:e!):摒弃修改,重新从磁盘读取此文件。
      • :wall(:wa!):保存所有改动的缓冲区而无需逐个检查
      • :qall!(:qa!):退出vim而不想检查未保存的修改
    • :bprev命令可以切换到列表中的上一个缓冲区。

    • :buffer N命令直接凭编号跳转到一个缓冲区;

    • :buffer {bufname}:{bufname}只需包含文件路径中足以唯一标识此缓冲区的字符即可,如果输入的字符串匹配不止一个缓冲区列表中的条目,就可以用Tab补全的方式在这些条目中选择。

    %符号知名哪个缓冲区在当前窗口中可见;

    # 符号则代表轮换文件;

    <C-^>可以在当前文件和轮换文件间快速切换;

  • :args:把缓冲区列表中的文件分组

  • argdo:在列表中的每个文件上执行Ex命令

  • 删除缓冲区

    • bdelete N1 N2 N3(bd 5 6 7 9 10):删除对应的文件
    • N,M bdelete(5,10bd):删除一个区间的文件
  • 用参数列表将缓冲区分组

    :args:参数列表记录了在启动时作为参数传递给vim的文件列表。

    :args filename1 filename:可以在列表列里增加文件

    • 通配符(:args **/*.js **/*.css)

      • *符号用于匹配0个或多个字符,但它的范围仅局限于指定的目录,而不会递归其子目录;
      • **通配符也匹配0个或多个字符,但它可以递归进入指定目录的子目录。
    • 用反引号结构指定文件

      :args `cat .chapters`:vim 会在shell中执行反撇号括起来的命令,然后把cat命令的输出作为:args命令的参数。

  • 多窗口

    Ex 命令普通模式命令用途
    :clo[se]c关闭活动窗口
    :on[ly]o只保留活动窗口,关闭其他所有窗口
  • 用标签页将窗口分组

    标签页是可以容纳一系列窗口的容器。

    • 用:tabedit {filename}命令打开一个新的标签页,如果省略了{filename}参数会创建一个新标签页,里面包含一个空缓冲区;
    • :close:命令关闭此窗口以及包含此狂口的标签页;
    • :tabc[lose]:命令来关闭当前标签页;
    • :tabo[nly]:命令可以关闭除当前标签页外的所有其他标签页
    • :tu:创建一个新的标签页;
    • :ti:向右切换标签页;
    • :tn:向左切换标签页;
  • :find:

    命令允许通过文件名打开一个文件,但无需输入该文件的完整路径。要想利用此功能,首先要配置“path”选项。

    :set path+=xx/**

    配置号路径之后,只需给出文件名就可以打开指定目录中的文件了;也可以用键自动补全文件名。

动作(motion)命令:h motion.txt
  • 基于单词移动

    命令光标动作
    w正向移动到下一单词的开头
    b反向移动到当前单词/上一单词的开头
    e正向移动到当前单词/下一单词的结尾
    ge反向移动到上一单词的结尾
  • 查找字符f {char}

    • 可以把f,dt.训练成手指的下意识动作
    命令用途
    f{char}正向移动到下一个{char}所在之处
    F{char}反向移动到上一个{char}所在之处
    t{char}正向移动到下一个{char}所在之处的前一个字符上
    T{char}反向移动到上一个{char}所在之处的前一个字符上
    ;重复上次的字符查找命令
    ,反转方向查找上次的字符查找命令
  • 用查找动作操作文本

    1.用选择模式:

    v:进入可视模式

    /ge:选择光标到指定内容前

    h:往回移一个字符

    d:删除内容

    2.普通模式

    d/ge

在文件间跳转

任何改变当前窗口中活动文件的命令,都可以被称为跳转命令。

vim会把执行跳转命令之前和之后的光标位置,记录到跳转列表中。

可以说大范围的动作命令可能会被当成跳转,但小范围的动作命令只能算移动。

  • :jump:查看跳转列表的内容

  • 用和命令进行跳转

  • 跳转动作:

    命令用途
    [count]G跳转到指定的行号
    /pattern/?pattern/n/N跳转到下一个/上一个模式出现之处
    %跳转到匹配的括号所在之处
    (/)跳转到上一句/下一句的开头
    {/}跳转到上一段/下一段的开头
    H/M/L跳到屏幕最上方/正中间/最下方
    gf跳转到光标下的文件名
    <C-]>跳转到光标下关键字的定义之处
    '{mark}/`{mark}跳转到一个位置标记
  • :change :改变列表change list

    vim为每次修改都记录了行号与列号,可以用g;和g,命令反向或正向遍历改变列表。

    ;和,分别用来正向及反向重复f{char}命令。

  • `.标记总是指向上次修改的位置;

  • `^标记则会记录上次退出插入模式时光标所在的位置;如果先退出插入模式,接着又在文档中四处移动,然后又想快速回到退出的地方继续编辑时,用gi命令就行了。

  • 跳转到光标下的文件gf(go to file)

    • :set suffixesadd+=.rb
    • :set path?
寄存器

是一组用于保存文本的简单容器;

它们既可像剪贴板那样,剪切、复制和粘贴文本,也可以记录一系列按键操作,把它们录制成宏。

vim的删除、复制与粘贴命令都会用到众多寄存器中的某一个。可以通过给命令家"{register}"前缀的方式指定要用的寄存器。若不指明,vim将缺省使用无名寄存器。

vim提供了一组以26个英文字母命令的有名寄存器。

  • 使用无名寄存器:

    • xp:可被用于调换光标之后的两个字符;
    • ddp:调换文本行;
    • yyp:创建文本行的副本;
  • 专用寄存器("0)

    "0p

    复制专用寄存器,仅当使用y{motion}命令时才会被赋值。

  • 有名寄存器("a-"Z)

    用小写字母引用有名寄存器,会覆盖该寄存器的原有内容,而换用大写字母的话,会将新内容添加到该寄存器的原有内容之后。

    • "ayy:将当前行复制到寄存器a中,"ap:粘贴寄存器a中的内容
  • 黑洞寄存器

    黑洞寄存器是个有去无回的地方,可用下划线引用它。

    如果运行"_d{motion}命令,vim将删除该文本且不保存任何副本。

    用于只想删除文本却不想覆盖无名寄存器中的内容时。

  • 系统剪贴板("+)

    如果在外部程序中用剪切或复制命令获取了文本,就可以通过"+p命令(或在插入模式下用+)将其粘贴到vim内部。相反地,如果在vim的复制或删除命令之前加入"+,相应的文本就被捕获至系统剪贴板。

  • 在可视模式下使用寄存器

    在可视模式下使用p命令时,vim 将用指定的寄存器内容来替换高亮选区中的文本。

可以用宏把任意数目的按键操作录制到寄存器,用于之后的回放。

在一组目标上执行宏有两种方式:以串行方式回放或者以并行方式多次运行。

在录制宏时,要确保每条命令都可被重复执行。

在录制宏的过程中,禁止使用鼠标。

  • qa:录制宏并将其内容保存至寄存器a中,直到再次按下q键停下为止

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

  • 用@{register}命令执行指定寄存器的内容,也可以用@@来重复最近调用过的宏

  • 以并行方式执行宏:以可视模式选取文本,然后执行命令:‘<,’>normal @

  • 给宏追加命令

    在输入qa时,vim将开始录制接下来的按键操作,并将它们保存到寄存器a中,这会覆盖该寄存器原有的内容。如果输入的是qA,vim也会录制按键操作,但会把他们附加到寄存器a原有的内容之后。

  • 编辑宏的内容:

    按G键,跳转到当前文档的结尾,使用:put命令粘贴宏的内容

    编辑完之后,再依次:

    0

    "ay$

    dd

    或者运行"add,该缺点是多了一个拖尾字符^J,即换行符。

模式
  • 调整查找模式的大小写敏感性

    • :set ignorecase
    • 每次查找时设置大小写敏感性:\c会让查找模式忽略大小写;\C会强制区分大小写
    • :set smartcase
  • 正则匹配

    • \v:使用\v模式开关后,(、)、|以及{字符会表现出特殊含义;
    • \V:会使得其后的模式中只有反斜杠有特殊的意义。
    模式说明
    #\([0-9a-fA-F]\{6}|[0-9a-fA-F]\{3}\)使用magic搜索模式时,必须转义(、)、|以及{字符,赋予它们特殊的含义
    `\v#([0-9a-fA-F]{6}[0-9a-fA-F]{3})`
    `\v#(x{6}\x{3})`
  • 界定单词的边界

    • /v
    • \w:匹配但此类字符,包括字母、数字以及符号“_”
    • \W:用来匹配除单词类字符以外的其他字符
查找
  • 如果只想在当前光标位置至文档结尾的范围内查找,而不想绕回文档继续查找的话,可以关闭"wrapscan"

  • /键为正向扫描,?键会进行反向查找

  • 在普通模式下使用gn时,光标会跳到下一处匹配,进入可视模式并选中匹配的文本。如果光标已经位于匹配上,gn就会选中当前的匹配;

  • gN进入面向字符的可视模式,并选中上一处匹配。

  • 高亮功能:(:set hls、:set noh)

  • 将光标偏移到查找匹配的结尾

    /lang/e<CR>
    auage<Esc>
    n
    .
    n.
    
替换

在缺省情况下,substitute命令仅仅作用于当前行,而且只会修改第一处匹配。因此,为了在整个文件的范围内修改每一处匹配,必须指定范围,并使用标志位g。

😒/going/rolling/g:将当前行上的所有going都替换成rolling

:%s/going/rolling/g:将整个文本中所有的going都替换成rolling

  • substitute命令允许先查找一段文本,再用另一段文本将其替换掉:

    :[range]s[ubstitute]/{pattern}/{string}/[flags]
    
  • 手动控制每一次替换操作

    :%s/content/copy/gc
    引入标志位c后,vim会对每处匹配结果都提示“替换为copy?”,可以按y键完成这次修改,或者按n键跳过这一次修改。
    
    答案用途
    y替换此处匹配
    n忽略此处匹配
    q退出替换过程
    l“last” - 替换此处匹配后退出
    a“all” - 替换此处与之后所有的匹配
    向上滚动屏幕
    向下滚动屏幕
global命令

:global 命令允许在某个指定模式的所有匹配行上运行Ex命令。

在缺省情况下,:global 命令的作用范围是整个文件(%)

:global 命令在指定 [range] 内的文本行上执行时通常分为两轮。第一轮,vim在所有[pattern]的匹配上做上标记。第二轮,再在所有已标记的文本行上执行 [cmd]。

查看帮助:
:h :g
: [range] global[!] /{pattern}/ [cmd]

[pattern]域与查找历史相互关联。这意味着如果将该域留空的话,vim会自动使用当前的查找模式。
[cmd]可以是除 :global命令之外的任何Ex命令。如果不指定任何[cmd],vim将缺省使用 :print
可以用 :global! 或者 :vglobal (v表示invert) 反向[0] :global 命令的行为[0]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值