VIM操作速查

vim下的模式

insert模式、normal模式、visual模式、command模式

  • 进入insert

    a/i/o、A/I/O;a【append】、i【insert】、o【在下一行插入】;

  • 进入normal

    esc。默认模式就是normal

  • 进入visual

    v,V【选择行】,ctrl+v【进行方块选择】

  • 进入command

    按【:】

    【:wq】保存退出、【:e!】重新加载并且不保存当前文件

    分屏

    【:vs】vertical split 【:sp】split

    替换

    % s/php/go/g 全局替换;%表示全部文件,s执行替换,g表示全局

insert模式小技巧

  • ctrl+h删除光标前一字符
  • ctrl+w删除光标前一单词
  • ctrl+u删除光标前的一行

终端命令行小技巧

  • ctrl+h删除光标前一字符
  • ctrl+w删除光标前一单词
  • ctrl+u删除光标前的一行
  • ctrl+a光标到命令开头
  • ctrl+e光标到命令结尾
  • ctrl+b光标前移
  • ctrl+f光标后移

normal模式小技巧

  • gi 快速切换到上次insert模式下的编辑位置

  • hjkl移动。最常用的是下移,所以右手食指是j下移

  • w/W移到下一个word/WORD开头

  • e/E下一个word/WORD尾

  • b/B到上一个word/WORD开头,b->backword

    word指以非空白符分割的单词,WORD以空白符分割的单词

移动

行间搜索移动

  • f+char :char->你要搜索的字母/字符

  • F+char :反过来从行尾向行首搜索字符,当光标在行尾时需要

  • t移动到char的前一个字符

    如果第一次没搜索到,可以用【;】和【,】进行上一个/下一个切换

快速到行首行尾

  • 0移动到行首第一个字符,^ 移动到第一个非空白字符(0+w也可以实现 ^ 功能)

  • $移动到行尾,g_移动到行尾非空白字符

    其实常用的的记住0和$就可以

垂直移动

  • 使用 ( ) 在句子之间移动,使用 { } 在段落之间移动
  • 也可使用easy-motion插件移动,使用这个插件这些命令就不用记忆啦

页面移动

  • gg/G移动到文件的开头和结尾,可以使用ctrl+o快速返回上一个位置
  • H/M/L跳转到开头、中间、结尾
  • ctrl+u、ctrl+f上下翻页、zz把屏幕置为中间

可以用:help来查看帮助。比如 使用 :help ( 就可以查看(的帮助说明了

  • x删除一个字符,可搭配数字多次执行
  • d删除一个单词,可搭配数字多次执行
  • dd:删除一整行
  • d$:删除到行尾
  • d0:删除到行首
  • dt):delete to );也可以dt"、dt>等等
  • dw(diw的简写)、diw、daw。根据范围文本对象删

范围文本对象

iw(inside the word)当前单词、aw(around the word)当前单词及空格

r(replace)、c(change)、s(substitute)

  • r+char:替换字符
  • s:删除当前字符并进入插入模式
  • R+char1、char2、char3:相当于多个r的操作连续起来
  • S:整行删除,并进入插入模式
  • c可以配合文本对象,删除并进入插入模式
  • cw、caw、ct"
  • C删除整行来进行插入操作

/ ? n N * #
set hls(high light search)
set incsearch (一边搜索一边高亮)

搜索替换

substitute命令允许我们查找并且替换掉文本,并且支持正则
:[range] s[ubstitute]/{pattern}/{string}/{flags}

  • range -> :10,20 表示10-20行,%表示全部

  • pattern -> 要替换的模式

  • string -> 替换后的文本

  • flags -> g全局范围内执行;c(confirm);n(number)报告匹配到的次数而不替换,可以用来查询匹配次数

    :% s/php/go/g
    :1,6 s/php/go/g
    :1,6 s/php//n -> 会报告出有多少个匹配
    :% s/<quick>/jiao/g ->正则匹配替换

多文件操作

文件操作的概念:buffer、window、tab
vim每打开一个文件,其实是把这个文件内容从硬盘放到内存里面,buffer就是这个文件在内存中的缓冲区,窗口是各个buffer可视化的一个分割区域,tab是组织窗口为一个工作区
buffer<window<tab

切换buffer

  • :ls,查看buffer
  • :b 2,跳转到第2个缓冲区
  • :bpre :bnext :bfirst :blast
  • :b 文件名(可以使用tab补全,使用文件名跳转)
  • :e 文件名(再打开一个文件,即增加了一个缓冲区)

分割windows

  • <ctrl+w>s 水平分割,<ctrl+w>v垂直分割。或者:sp和:vs

切换window

  • <ctrl+w>w 在窗口之间循环切换
  • <ctrl+w>h 切换到左窗口
  • <ctrl+w>j 切换到下窗口
  • <ctrl+w>k 切换到上窗口
  • <ctrl+w>l 切换到右窗口

移动window

  • <ctrl+w>H 把窗口移到左边
  • <ctrl+w>J 把窗口移到下边
  • <ctrl+w>K 把窗口移到上边
  • <ctrl+w>L 把窗口移到右边

操作tab

  • <ctrl+w>T 把当前窗口移到一个新标签页
  • :tabe[dit] 文件名 在新标签页中打开文件
  • :tabc[lose] 关闭当前标签页和其中的所有窗口
  • :tabo[nly] 只保留活动标签页,关闭所有其他标签页
  • :tabn[ext] {N} 或者normal模式下 {N}gt 切换到编号为{N}的标签页
  • :tabn 或者normal模式下 gt 切换到下移标签页
  • :tabp[revious] 或者normal模式下 gT 切换到上一标签页

文本对象

[number][text object]

  • number:次数

  • command:命令,d(delete),c(change),y(yank),v(visualuuu)

  • text object:文本对象,单词w,句子s,段落p

    iw(inner word):单词
    aw(around word):单词和单词之后的空格

    以下例子中[ ]表示作用范围
    iw This ia a [test] sentence
    aw This ia a [test ] sentence
    iW This ia a [...test...] sentence
    aW This ia a [...test... ] sentence
    is ..................
    as ..................
    ip ..................
    ap ..................

    i( or i) —— 选择括号里的内容
    a( or a) —— 选择括号和括号里的内容
    i< or i> —— ................
    a< or a> —— .................
    i{ or i} —— ................
    a{ or a} —— .................
    [] " ` 等等

应用举例:

vaw ——环绕选中单词
viw ——选中单词
3daw ——删除3个单词
cw —— 删除单词并进入insert模式,c(change)编辑改变单词
ci" —— 删除""里的单词并进入insert模式
ci{ —— 删除{}里的单词并进入insert模式

复制粘贴&寄存器

normal下复制粘贴

y(yank)、p(put)、d(剪切)、x(剪切字符)
可以先使用visual模式选中再y复制p粘贴
配合文本对象:yiw复制一个单词,yy复制一行

insert下复制粘贴

粘贴有个坑:如果vimrc设置了autoindent,粘贴代码会导致缩进混乱。这时候使用:set paste和:set nopaste解决

寄存器

vim里操作的是寄存器不是系统剪贴板,这一点和其他编辑器不同
默认使用d删除或者y复制的内容都放到了“无名寄存器
小tips

用x删除一个字符放到无名寄存器中,然后再p粘贴,可以调换左右俩字符

有名寄存器【a-z】

"{register} —— 可以指定寄存器,不指定默认用无名寄存器

"ayiw —— 复制一个单词到寄存器a中
"bdd —— 删除当前行到寄存器b中

"" 指的是无名寄存器,默认情况就是无名寄存器,平时基本用不上""

查看寄存器

使用:reg a来查看register中的内容

其他寄存器

除了有名寄存器a-z,vim中还有一些其他常见的寄存器

  • 复制专用寄存器:"0 ——使用y复制文本同时会被拷到复制寄存器
  • 系统剪贴板 :**"+ ** —— 可以在复制前加上 "+复制到系统剪贴板,前提是vim支持clipboard。echo has('clipboard') 如果输出是1,vim就支持系统剪贴板,然后设置clipboard=unnamed
  • 当前文件名寄存器如:"% (不常用)
  • 上次插入的文本寄存器:".(不常用)

宏macro

场景:给许多url加上双引号
https://www.imooc.com/video/19455
https://home.cnblogs.com/u/abzor
https://time.geekbang.org/column/article/14271
宏可以看作是一系列命令的结合
可以使用宏【录制】一系列操作,然后用于【回放】
宏可以非常方便的把一系列命令用在多行文本上

①vim中使用q来录制宏,同时也是q结束录制
②使用q{register}选择要保存的寄存器,把录制的命令保存其中。qa,就是把录制的命令放到a寄存器中
③@{register}回放寄存器中保存的一系列命令
使用:
先使用q录制,再给一行加上双引号,之后使用q退出,在剩下的所有行中回放宏的录制
但是每一行都按一次@{register}比较麻烦,那么:

  1. V+G(全选剩下所有行)
  2. :(进入命令行模式)
  3. 输入normal @

上面的场景不使用宏也可以:

  1. V+G(全选所有文本)
  2. :(进入命令行模式)
  3. 输入normal I"(在行首插入双引号)
  4. :->ctrl+p(显示上一个vim命令)
  5. 输入normal A"(所有行尾也都加上了")

vim补全

ctrl+n和ctrl+p补全单词,根据当前文件里的关键词,来补全
ctrl+x ctrl+f 文件路径补全
ctrl+x ctrl+o补全代码,这种需要开启文件类型检查(:filetype on),并安装插件比如vim-go
google搜索vim input current path,就能搜索到怎么在vim中插入当前文件名或路径

posted @ 2021-09-17 12:49  abzor  阅读(96)  评论(0编辑  收藏  举报