Vim学习笔记

基本模式、文件管理、寄存器操作等

操作模式

普通模式

插入模式

可视模式

命令行模式

管理多个文件

缓冲区列表(Vim)

  • 使用通配符打开相同后缀的文件
    ``shell
    vim *.txt

    1
    2
    3
    4
    5
    6
    * 查看缓冲区中的所有文件
    ```shell
    :ls
    1 # "hello.txt" line 1
    2 %a "test.txt" line 1
    3 "world.txt" line 0

    %a为当前编辑的文件,#为上次打开的文件。

  • 调整缓冲区列表中打开的文件
    Vim会给缓冲区的文件进行自动编号

    1
    2
    3
    4
    5
    6
    :bprev # 在列表中反向移动
    :bnext # 在列表中正向移动
    :bfirst # 跳转到列表头部
    :blast # 跳转到列表尾部
    :buffer N # 跳转到编号为N的文件
    :buffer {BufferName} # 跳转到名称为name

    使用ctrl+^可在当前文件和轮换文件之间快速切换

  • 删除缓冲区
    使用bdbdelete命令
    1
    2
    :2,4bd 删除2和3号缓冲区
    :bd 1 3 删除1号和3号缓冲区

参数列表(Vi)

  • 使用参数列表添加缓冲区文件

    1
    2
    3
    :args {arglist}
    :args *.txt
    :args 1.txt 2.txt

    arglist可以是文件也可以是通配符

处理隐藏缓冲区

  • 退出时处理隐藏缓冲区
    • :w(rite)! 保存缓冲区修改至文件
    • :e[dit]! 将文件内容读入缓冲区(即回滚修改)
    • :qa[ll]! 关闭所有缓冲区,无视警告
    • :wa[ll]! 将缓冲区全部修改保存至文件

将工作区切分窗口

  • 分割窗口
    • <C-w>s :sp[lit] FILE 水平分割窗口
    • <C-w>v :vsp[lit] FILE 垂直分割窗口
  • 切换窗口
    • <C-w>h 向左移动
    • <C-w>j 向下移动
    • <C-w>k 向上移动
    • <C-w>l 向右移动
  • 关闭窗口
    • <C-w>c :clo[se] 关闭活动窗口
    • <C-w>o :on[ly] 关闭除活动窗口外的其他窗口
  • 调整窗口大小
    • <C-w>= 使所有窗口等宽等高
    • <C-w>_ 最大化活动窗口高度
    • <C-w>| 最大化活动窗口宽度
    • N<C-w>_ 将活动窗口的高度设为N行
    • N<C-w>| 将活动窗口的宽度设为N列

标签页将窗口分组

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

  • 打开及关闭标签页

    1
    2
    3
    :tabe[dit] FILE # 在新标签页中打开FILE
    :tabc[lose] # 关闭当前标签页
    :tabo[nly] # 关闭当前标签页以外的标签页
  • 标签页切换

    1
    2
    3
    :tabn[ext] {N} # 切换到编号为N的标签额
    :tabn[ext] # 切换到下一标签页
    :tabp[revious] # 切换到上一标签页

打开与保存文件

:edit命令

  • 相对当前工作目录打开

    1
    2
    :pwd # 查看当前
    :edit main/app.js # 打开当前目录中main文件夹下的app.js文件
  • 相对当前活动文件目录打开

    1
    2
    3
    :edit %<Tab> # %符号表示当前缓冲区中的完整文件路径,Tab为展开
    :edit %:h<Tab> # :h修饰符会去掉文件名,保留其余部分
    :edit %:h<Tab>M<Tab> # 使用Tab展开当前文件夹下的Main.js文件

:find命令

使用:edit命令需要完整的文件路径,而:find可以配置path选项来方便的打开多级嵌套目录中的文件

  • 配置path选项

    1
    :set path+={YOUR_PATH}/**
  • 使用:find通过文件名查找文件

    1
    :find FILE.js

netrw文件管理

  • 进入文件管理系统
    当前文件夹目录

    1
    vim .

    用回车键计入文件,使用:edit .回到当前目录的文件管理界面

    1
    :edit .
  • 分割窗口

文件保存到不存在的目录

1
2
:edit /some/dir/a.txt
:write

若上面的a.txt存在于一个不存在的目录,则会报错,可使用下面的方法解决。

1
2
:!mkdir -p %:h
:write

以su的权限保存文件

1
:write!

文档中移动

本位行的移动

  • h 左移
  • j 上移
  • k 下移
  • l 右移
  • 0 行首
  • ^ 行首的第一个非空白字符
  • $ 行尾

实际行与屏幕行

有时实际行的长度会超出屏幕,若设置了wrap属性则使用本位行移动命令时进行的操作是针对实际行的,若想在屏幕行上进行移动,需要使用

  • gj 屏幕行上移
  • gk 屏幕行下移
  • g0 屏幕行行首
  • g^ 屏幕行行首的第一个非空白字符
  • g$ 屏幕行行尾

基于单词移动

  • w 正向移动到下一个单词开头
  • b 反向移动到当前单词/上一个单词的开头
  • e 正向移动到当前单词/下一个单词的结尾
  • ge 反向移动到上一个单词结尾

区分单词与字串

  • 单词 - 由字母、数字、下划线与 其他非空白字符的序列组成,以空白字符分割
  • 字串 - 由非空白字符序列组成,以空白字符分割
    一般字串的长度是大于字符的长度的,在使用单词相关命令时使用大写时表示检查字串,比如使用W则表示正向移动到下一个字串。

查找字符

查找方式

  • f{char}
    最快的查找方法,使用;可以重复执行上一步的查找,使用,可以撤销上一步的查找
  • /{char}<CR>
    直接在命令行模式下输入指令

查找相关指令

  • f{char} 正向移动到下一个{char}所在之处
  • F{char} 反向移动到上一个{char}所在之处
  • t{char} 正向移动到下一个{char}所在之处的前一个字符上
  • T{char} 反向移动到下一个{char}所在之处的后一个字符上

选择文本对象

假如有这样一段文本<div class="top">"{hello rizu}"</div>,当前光标处于中间的字母r上,进入可视模式下进行选区,使用的指令与选出的内容如下表所示

  • vi} - hello rizu
  • va} - {hello rizu}
  • vi" - {hello rizu}
  • vit - "{hello rizu}"
  • via - <div class="top">"{hello rizu}"</div>

使用文本对象执行操作

  • ci}hello - 将hello rizu修改为hello
  • di} - 删除hello rizu
  • yi} - 复制hello rizu至缓冲区

其他文本对象

  • w - 单词
  • W - 字串
  • s - 句子
  • p - 段落
  • i{obj} - 选取obj对象
  • a{obj} - 选取obj对象及一个空格

设置标记

  • m{a-zA-Z} 使用选定字母标记当前光标所在位置
  • `{mark} 跳到位置标记所在行
  • '{mark} 跳到位置标记所在行的第一个非空白字符

    自动位置标记

    vim自带的位置标记
  • `` - 当前文件上次跳转之前的位置
  • `. - 上次修改的地方
  • `^ - 上次插入的地方
  • `[ - 上次修改或复制的起始位置
  • `] - 上次修改或复制的结束位置
  • `< - 上次高亮选区的起始位置
  • `> - 上次高亮选区的结束位置

文件间跳转

遍历跳转列表

动作命令是在文件内移动,跳转命令是在文件间移动

使用:jumps查看跳转列表,使用<C-i><C-o>正向与反向遍历跳转列表。

比如使用vim 1.txt后使用:edit 2.txt开始编辑2.txt,则使用<C-o><C-i>可在1.txt和2.txt之间相互跳转。

部分跳转动作:

  • [count]G - 跳转到指定行号
  • H/M/L - 跳到屏幕最上方/正中间/最下方
  • % - 跳转到匹配的括号所在之处
  • gf - 跳转到光标下的文件名
  • `{mark}/'{mark} - 跳转到位置标记

遍历改变列表

使用:changes查看改变列表,使用g;g,正向与反向遍历改变列表。

跳转到光标下的文件

假设文件中有一行是import {People} from './resource/data.js',把光标放在data.js文件路径的人一个字母上,使用gf打开光标处所在文件。

指定文件扩展名

1
:set suffixesadd+=.js

指定要搜寻的路径

1
2
3
4
5
6
7
8
9
10
11
12
#查看当前路径
:set path?
> path=.,/use/include,,
```
其中`.`代表当前路径,空字符串代表工作目录,可以使用逗号分隔符添加多个路径。
## 使用全局位置标记的跳转
使用`m{mark}`与``{mark}`设置与跳转到标记,最多可以设置26个全局标记。
比如在使用如下命令查找时最好设置一个全局标记,或者使用`<C-o>`反向跳转
```shell
:vimgrep /{pattern}/{area}
文章目录
  1. 1. 操作模式
    1. 1.1. 普通模式
    2. 1.2. 插入模式
    3. 1.3. 可视模式
    4. 1.4. 命令行模式
  2. 2. 管理多个文件
    1. 2.1. 缓冲区列表(Vim)
    2. 2.2. 参数列表(Vi)
    3. 2.3. 处理隐藏缓冲区
    4. 2.4. 将工作区切分窗口
    5. 2.5. 标签页将窗口分组
  3. 3. 打开与保存文件
    1. 3.1. :edit命令
    2. 3.2. :find命令
    3. 3.3. netrw文件管理
    4. 3.4. 文件保存到不存在的目录
    5. 3.5. 以su的权限保存文件
  4. 4. 文档中移动
    1. 4.1. 本位行的移动
    2. 4.2. 实际行与屏幕行
    3. 4.3. 基于单词移动
      1. 4.3.1. 区分单词与字串
    4. 4.4. 查找字符
      1. 4.4.1. 查找方式
      2. 4.4.2. 查找相关指令
    5. 4.5. 选择文本对象
      1. 4.5.1. 使用文本对象执行操作
      2. 4.5.2. 其他文本对象
    6. 4.6. 设置标记
      1. 4.6.1. 自动位置标记
  5. 5. 文件间跳转
    1. 5.1. 遍历跳转列表
    2. 5.2. 遍历改变列表
    3. 5.3. 跳转到光标下的文件
      1. 5.3.1. 指定文件扩展名
      2. 5.3.2. 指定要搜寻的路径
|