vim模式及命令

vim的四种模式

  • 正常模式(normal-mode):不能对文本直接编辑,可使用快捷键进行增删改查(打开后的默认模式)
  • 插入模式(insert-mode):可直接对文本进行编辑(普通模式下输入i进入输入模式)
  • 命令模式(command-mode):在末行输入命令进行操作
  • 可视模式(visual-mode)

对于初学者,安装后建议运行vimtutor进入官方文档,如果是不是中文可运行vimtuor zh,先根据文档进行练习

vim四种模式的切换

  • 普通模式
    在任何模式下,只要按下 Esc 键就可以返回普通模式。

  • 普通模式进入插入模式(插入模式则类似于记事本)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    i # 在光标所在字符前开始输入文字并进入插入模式
    a # 在光标所在字符后开始输入文字并进入插入模式
    o # 在光标所在行的下面单独开一新行来输入文字并进入插入模式
    s # 删除光标所在的字符并进入插入模式
    I # 在行首开始输入文字并进入插入模式
    A # 在行尾开始输入文字并进入插入模式
    O # 在光标所在行的上面单独开一新行来输入文字并进入插入模式。
    S # 删除光标所在行并进入插入模式
    c[n]w # 改写光标后1(n)个词。
    c[n]l # 改写光标后n个字母。
    c[n]h # 改写光标前n个字母。
    [n]cc # 修改当前[n]行。
    [n]s # 以输入的文本替代光标之后1(n)个字符,相当于c[n]l。
    [n]S # 删除指定数目的行,并以所输入文本代替之。
  • 进入可视模式(可视模式相当于高亮选取文本后的普通模式)

    • 普通模式 按键 v 进入Vim字符选择可视化模式
    • 普通模式Ctrl + v进入块选择模式
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      vis # 选中一个句子
      vib # 选中一个block
      viw # 选中一个单词
      vip # 选中一个段落
      va{ # 选中{}中间内容,包括{}
      vi( # 选中()中间内容
      vi{ # 选中{}中间的内容,不包括{}
      vi< # 选中<>中间内容
      vi[ # 选中[]中间内容
      vi” # 选中”"中间内容
      vi’ # 选中”中间的内容
  • 命令模式

    • 正常模式输入:进入命令模式
      1
      2
      3
      4
      5
      :q  # 离开vim
      :q! # 退出不保存
      :wq # 保存后退出
      :w # 保存编辑的内容
      :w! # 强制写入该文件

      操作文件

      1
      2
      3
      4
      vim filename  # 用vim打开指定文件夹
      vim -r filename # 恢复上次异常退出的文件
      vim -R filename # 以只读的方式打开文件,但可以强制保存
      vim -M file # 以只读的方式打开文件,不可以强制保存

      移动

  • 可配合number使用,3j (下移三行),3w(后移三个单词)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    h或退格   # 左移一个字符;
    l或空格 # 右移一个字符;
    j # 下移一行;
    k: # 上移一行;
    - # 把光标移至上一行第一个非空白字符。
    w/W # 移动到下一个word/WORD的开头(WORD表示不包含单词相邻的标点)
    e/E # 移动到下一个word/WORD的结尾
    b/B # 回到上一个word/WORD的开头
    ge/gE # 回到上一个word/WORD的开头
    ( # 前移1句。
    ) # 后移1句。
    { # 前移1段。
    } # 后移1段。
    fc # 把光标移到同一行的下一个c字符处
    Fc # 把光标移到同一行的上一个c字符处
    tc # 把光标移到同一行的下一个c字符前
    Tc # 把光标移到同一行的上一个c字符后
  • 不可配合number使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    0 # 移动当前行开头
    ^ # 移动到当前行第一个非空白字符
    $ # 移动到当前行行尾
    g # 移动光标所在屏幕行行尾
    gg/G # 移动到文件开头/结尾: 把光标移到递n列上。
    nG #到文件第n行
    :[n]<cr> # 移动到第n行<cr>为回车
    :$<cr> # 移动到最后一行。
    H # 把光标移到屏幕最顶端一行
    M # 把光标移到屏幕中间一行
    L # 把光标移到屏幕最底端一行
    gi # 快速回到上次编辑的地方
    zz # 将当前行移动到屏幕中央
    zt #将当前行移动到屏幕顶端
    zb # 将当前行移动到屏幕底端
    m{a-z} # 标记光标所在位置,局部标记,只用于当前文件
    m{A-Z} # 标记光标所在位置,全局标记。标记之后,退出Vim, 重新启动,标记仍然有效。
    `{a-z} # 移动到标记位置。
    ‘{a-z}: # 移动到标记行的行首。
    :marks # 显示所有标记。
    :delmarks a b # 删除标记a和b。
    :delmarks a-c # 删除标记a、b和c。
    :delmarks a c-f # 删除标记a、c、d、e、f。
    :delmarks! # 删除当前缓冲区的所有标记。

    复制粘贴

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    yy/Y   # 复制当前行
    p # 粘贴
    3yy # 复制当前行向下的3行
    dd # 删除
    3dd # 删除当前行向下的5行
    y # 复制在可视模式下选中的文本。
    [n]x # 剪切光标右边n个字符,相当于d[n]l。
    [n]X # 剪切光标左边n个字符,相当于d[n]h。
    y[n]w # 复制n个词。
    y[n]l # 复制光标右边n个字符。
    y[n]h # 复制光标左边1(n)个字符。
    d[n]w # 删除(剪切)1(n)个单词
    d[n]l # 删除(剪切)光标右边n个字符。
    d[n]h # 删除(剪切)光标左边n个字符。
    d0 # 删除(剪切)当前位置到行首的内容
    [n] dd # 删除(剪切)n行。
    :m,nd<cr> # 剪切m行到n行的内容。
    dgg # 剪切光标以上的所有行。
    dG: # 剪切光标以下的所有行。
    daw和das # 剪切一个词和剪切一个句子,即使光标不在词首和句首也没关系。
    p: 在光标之后粘贴。
    P: 在光标之前粘贴。

    查找替换

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /string # 在后面的文本中查找string
    ?string # 在前面的文本中查找string
    n # 向后查找下一个
    N # 向前查找下一个
    :s/old/new # 用new替换当前行第一个old
    :s/old/new/g # 用new替换当前行所有的old
    :n1,n2s/old/new/g # 用new替换文件n1行到n2行所有的old
    :%s/old/new/g # 用new替换文件中所有的old。
    :%s/^/xxx/g # 在每一行的行首插入xxx,^表示行首
    :%s//xxx/g # 在每一行的行尾插入xxx,表示行尾
    r # 替换光标处的字符,同样支持汉字。
    R # 进入替换模式(依次向后替换),按esc回到正常模式。
  • 参数说明

    • g 全局变量
    • c每个替换都将需要用户确认(%s/old/new/gc)
    • i则忽略大小写(ignore)

分屏浏览

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
vim -o file1 file2 # 水平分割窗口,同时打开file1和file2
vim -O file1 file2 # 垂直分割窗口,同时打开file1和file2
:sp filename # 水平分割窗口打开文件夹
:vs filename # 垂直分割窗口打开文件夹
:nsp filename # 水平分割出一个n行高的窗口
:nvs filename# 垂直分割出一个n行高的窗口
:qa # 关闭所有窗口,退出vim。
:wa # 保存所有修改过的窗口
ctrl+w # 切换到下一个窗口。或者是ctrl+w w
ctrl+w p # 切换到前一个窗口
ctrl+w t(b) # 切换到最上(下)面的窗口。
ctrl+w H(L,K,J) # 将当前窗口移动到最左(右、上、下)面
ctrl+w T # 将当前的窗口移动到新的标签页上。
ctrl+w + # 当前窗口增高一行。也可以用n增高n行。
ctrl+w - # 当前窗口减小一行。也可以用n减小n行。
ctrl+w _ # 当前窗口扩展到尽可能的大。也可以用n设定行数。
:resize n # 当前窗口n行高。
ctrl+w = # 所有窗口同样高度。
n ctrl+w _ # 当前窗口的高度设定为n行。
ctrl+w < # 当前窗口减少一列。也可以用n减少n列。
ctrl+w > # 当前窗口增宽一列。也可以用n增宽n列。
ctrl+w | # –当前窗口尽可能的宽。也可以用n设定列数。

撤销

1
2
3
4
5
6
7
u # 撤销一次
U # 取消当前行中所有的改动。
[n]u: # 取消n个改动。
:undo 5 # 撤销5个改变。
:undolist # 你的撤销历史。
:earlier 1m # 回到1分钟前
:later 10s # 前进10秒

1
2
3
4
.  #重复上一个编辑动作
qa:# 开始录制宏a(键盘操作记录)
q: # 停止录制
@a:# 播放宏a