Vim基本操作

操作

basic

  • .命令可以让我们重复上次的修改(理想模式: 用一键移动,另一键执行)

    • 重复上次修改: 从进入插入模式的那一刻起, 直到返回普通模式时为止
    • x, dd, >G 等普通模式中执行的命令
  • G: 增加从当前行到文档末尾处的缩进层级

  • $: 使光标移动到行尾

  • S: 删除光标下的字符并进入插入模式(我禁用了)

  • A: 使光标移动到行尾并进入插入模式

  • I: 使光标移动到行首并进入插入模式

  • o: 向下换行

  • O: 向上换行

  • f{char}

    • 使用;键可以跳到下一个
    • 使用,键可以跳到上一个
  • /: 在文档中查找下一处匹配项

  • ?: 在文档中查找上一处匹配项

  • *: 高亮光标出的词并移动到下一处

  • u: 撤销(从进入插入模式开始, 直到返回普通模式为止, 在此期间输入或删除的任何内容都被当成一次修改; 在插入模式中移动光标会重置修改状态)(此功能可以让你控制撤销粒度)

  • 模式下,r可以修改所有列选中的位置

  • !{cmd}: 运行shell命令

  • ea: 在当前单词结尾后添加

  • m{a-zA-Z} `{mark}: 添加标签,回到标签(大写字母是全局标记)

  • ``: 当前文件中上次跳转动作之前的位置

    • %r]``r[: 修改包围的符号,change surround
  • `.: 上次修改的地方

  • gi: 跳转到上次插入的地方

  • ^: 移动光标到行首第一个非空字符处

  • $: 移动光标到行末最后一个非空字符处

  • =: 自动缩进(格式化)

  • dtn: 删除字符n前面的内容

  • zz: 将光标所在行移动到窗口中央

  • 撤销在普通模式下使用u,反撤销使用Ctrl+r

  • 对比两个文件:

    • 在终端下: nvim -d 文件名1 文件名2
    • 在nvim中: :diffsplit 要对比的文件名
  • ctrl+z暂停vim返回shell,shell里做完想做的事,然后fg返回vim

  • %命令允许在一组开、闭括号间跳转,可作用于 ()、{}以及[]

  • daw/caw: 会删除当前单词以及前一个空格

  • /: 对数字执行加/减操作; 10: 对最近的数字加10 (有进制的区别: 0xff + 1 = 0x100)

  • 插入模式下

    • : 删除前一个字符
    • : 删除前一个单词
    • : 删至行首
    • : 切换到普通模式
    • <C-[>: 切换到普通模式
    • : 切换到插入-普通模式(可以执行一个普通模式命令, 执行完后, 马上就又返回到插入模式, eg: zz 调整屏幕显示位置并继续插入)
    • {register}: 粘贴某个寄存器的内容
    • =: 表达式寄存器, 可以做简单的算数表达式
    • r: 修改一个字符
    • R: 进入修改模式,直到回到普通模式
  • 普通模式下

    • J: 把当前行和下一行连接在一起
    • K: 查看处于光标之下的那个单词的手册页
    • : 运行跳转命令时, 会在跳转列表中添加一条记录, 而命令会回到跳转列表的上条记录
  • 可视模式下

    • v: 激活面向字符的可视模式
    • V: 激活面向行的可视模式
    • : 激活面向列块的可视模式
    • gv: 重选上次的高亮区域
    • o: 在可视模式时, o键可以切换光标的端点
    • .: .命令可以重复上一条在可视模式执行的命令
    • r: 在可视模式中使用r键时, 会修改选中的所有字符
    • 块选中时,按c删除选中内容并输入新内容, 在返回普通模式时会对所有行都进行修改(即: 快选中时, 对当前行进行修改时, 会对所有行都进行); 按A/I可在行末/首进行修改
    • : 可以在可视模式及选择模式间切换(选择模式中输入任意可见字符, 此字符会替换所选内容并切换到插入模式. 几乎不用)
  • 命令行模式下

    • tabnew, tabnext, tabprevious, tabclose: 操作tab
    • badd filename, bNext, bdelete: 操作buffer
    • /: 删除至上个单词的开头及行首
    • {start},{end}+action: eg:3,5p (.代表当前行的地址; $代表文件末尾行; %代表当前文件中的所有行)(.,.+3p 会对当前行至下三行进行打印)
    • {range}copy{address}: 复制
    • {range}copy{address}: 移动
    • 在高亮时按下:后执行命令时,会对所有行执行该命令
    • 在行选中模式下,按{:normal 指令}将会对高亮区中的每一行,对其执行普通模式下的指令(实际上就是选中范围{range}再输入normal)
    • @: : 重复上次执行的Ex命令; 在运行过一次@:后,后面就可以用@@命令来重复它
    • 在命令行上也可以用键自动补全命令
    • vim会记录命令行模式中执行过的命令; 也会为查找命令单独保存一份历史记录(使用上下方向键或者/遍历)
    • q: : 可以调出命令行窗口, 此时可以对窗口内的命令进行编辑
    • 正在命令行构建一条Ex命令,做到一半时,意识到需要更强大的编辑能力,此时可以按打开命令行窗口
    • 在命令行模式中,给命令加一个叹号前缀!,就可以调用外部程序
    • read !{cmd} 可以把{cmd}命令的输出读入当前缓冲区中
    • write !{cmd} 把缓冲区内容作为指定{cmd}的标准输入

选取范围

  • a)或ab一对圆括号(parentheses)
  • i)或ib圆括号(parentheses)内部
  • a}或aB一对花括号{braces}
  • i}或iB花括号{braces}内部
  • a] 一对方括号[brackets]
  • i] 方括号[brackets]内部
  • a> 一对尖括号
  • i> 尖括号 内部
  • a’ 一对单引号’single quotes’
  • i’ 单引号’single quotes’内部
  • a” 一对双引号”double quotes”
  • i” 双引号”double quotes”内部
  • a 一对反引号backticks`
  • i 反引号backticks`内部
  • at 一对XML标签tags
  • it XML标签内部
  • iW 当前字串
  • aW 当前字串及一个空格
  • is 当前句子
  • as 当前句子及一个空格
  • ip 当前段落
  • ap 当前段落及一个空行

标记

  • m{a-zA-Z}命令会用选定的字母标记当前光标所在位置. 小写位置标记只在每个缓冲区里局部可见, 而大写位置标记则全局可见. `{mark}命令跳到位置标记所在行, 并把光标置于该行第一个非空白字符上
  • `` 当前文件中上次跳转动作之前的位置
  • `. 上次修改的地方
  • `^ 上次插入的地方
  • `[ 上次修改或复制的起始位置
  • `] 上次修改或复制的结束位置
  • `< 上次高亮选区的起始位置
  • `> 上次高亮选区的结束位置

移动

  • j: 向下移动一个实际行 gj: 向下移动一个屏幕行

  • k: 向上移动一个实际行 gk: 向上移动一个屏幕行

  • 0: 移动到实际行的行首 g0: 移动到屏幕行的行首

  • ^: 移动到实际行的第一个非空白字符 g^: 移动到屏幕行的第一个非空白字符

  • $: 移动到实际行的行尾 g$: 移动到屏幕行的行尾

  • w: 正向移动到下一单词的开头

  • b: 反向移动到当前单词/上一单词的开头

  • e: 正向移动到当前单词/下一单词的结尾

  • ge: 反向移动到上一单词的结尾

  • W、B、E 和gE面向字串移动

查找

  • f{char}: 正向移动到下一个{char}所在之处
  • F{char}: 反向移动到上一个{char}所在之处
  • t{char}: 正向移动到下一个{char}所在之处的前一个字符上
  • T{char}: 反向移动到上一个{char}所在之处的后一个字符上
  • dt{char}: 从当前位置删除到char之前
  • 可视模式下也可使用/进行查找

在文件间跳转

  • 用[count]G命令直接跳到指定的行号也会被当成一次跳转, 但每次向上或向下移动一行则不算. 面向句子的动作及面向段落的动作都算跳转, 但面向字符及面向单词的动作则不算. 用一句话来概括, 可以说大范围的动作命令可能会被当成跳转, 但小范围的动作命令则只能算移动.
  • : 后退
  • : 前进

寄存器

  • Vim的删除、复制与粘贴命令都会用到众多寄存器中的某一个. 可以通过给命令加”{register}前缀的方式指定要用的寄存器. 若不指明,Vim将缺省使用无名寄存器
  • 想把当前单词复制到寄存器a中, 可执行”ayiw, 或者, 可以用”bdd, 把当前整行文本剪切至寄存器b中. 在此之后,既可以输入”ap粘贴来自寄存器a的单词, 也可使用”bp命令粘贴来自寄存器b的一整行文本, 两者互不干扰
  • 当我们使用y{motion}命令时, 要复制的文本不仅会被拷贝到无名寄存器中, 而且也被拷贝到了复制专用寄存器中, 后者可用数字0加以引用. 复制专用寄存器, 顾名思义, 仅当使用y{motion}命令时才会被赋值. 换句话讲, 使用x、s、c{motion}以及d{motion}命令均不会覆盖该寄存器. 如果复制了一些文本, 可以确信该文本会一直保存于寄存器0中, 直到复制其他文本时才会被覆盖. 复制专用寄存器是稳定的, 而无名寄存器是易变的. 尽管diw 命令仍会覆盖无名寄存器, 但不会波及复制专用寄存器. 可以通过输入”0P, 安全地粘贴来自复制专用寄存器中的内容.
  • 用小写字母引用有名寄存器, 会覆盖该寄存器的原有内容, 而换用大写字母的话, 则会将新内容添加到该寄存器的原有内容之后
  • 系统剪贴板(“+)与选择专用寄存器(“*): 如果在外部程序中用剪切或复制命令获取了文本, 就可以通过”+p 命令(或在插入模式下用+)将其粘贴到Vim内部. 相反地, 如果在Vim的复制或删除命令之前加入”+, 相应的文本将被捕获至系统剪贴板
  • X11视窗系统支持另一种被叫作主剪贴板的剪贴板, 它保存着上次被高亮选中的文本, 可以用鼠标中键(如果有的话)把它们粘贴出来. Vim的星号寄存器对应主剪贴板, 可用*号加以引用
  • p命令旨在将寄存器中的文本粘贴到光标之后. 作为补充, Vim也提供了大写的P命令用于将文本插入到光标之前

  • q{char}{changes}q记录宏
  • q键既是“录制”按钮,也是“停止”按钮
  • :reg {char}: 查看指定宏内容
  • 用@{register}命令执行指定寄存器的内容, 也可以用@@来重复最近调用过的宏
  • 输入qa时, Vim将开始录制接下来的按键操作, 并将它们保存到寄存器a中, 这会覆盖该寄存器原有的内容. 如果输入的是qA的话, Vim也会录制按键操作, 但会把它们附加到寄存器a原有的内容之后
  • 当动作命令失败时, 宏将中止执行

模式

  • 通过使用元字符\c与\C,可以覆盖Vim缺省的大小写敏感性设置。小写字母\c 会让查找模式忽略大小写,而大写字母\C则会强制区分大小写。
  • 正则表达式使用\进行转义

替换

  • [range] [substitute]/{pattern}/{string}/[flags]
    • range:
      • 使用可视模式选取范围
      • %: 表示整个文件
      • 1,20: 第1行~第20行
      • .,+2 当前行~往后2行
      • .,$ 当前行~文件尾
    • flags:
      • g: 全局范围内执行
      • c: 可以确认或拒绝每一处修改
      • n: 抑制正常的替换行为, 只是报告本次substitute命令匹配的个数
  • substitute命令要在整个x轴与y轴上执行, 即凭借标志位g处理横轴字符的同时, 使用地址符%处理纵轴的文本行
  • 替换特殊字符
    • \r 插入一个换行符
    • \t 插入一个制表符
    • \ 插入一个反斜杠
    • ~ 使用上一次调用:substitute时的{string}
  • :substitute命令的查找域留空, Vim将使用上一次的查找模式(:%s//{new_word}/g)
  • 通过输入{register}, 可以将寄存器的内容插入到命令行

自动补全

  • 通过这两个组合键, 不仅可以在插入模式下触发Vim的自动补全, 而且还可以用它们在补全列表中反向或正向选择
  • 通过来终止这次自动补全, 其效果是下拉菜单将被清除, 并恢复光标前的文本, 即调用自动补全前所输入的内容
  • 文件名补全

文件

  • :ls 列表的开头有一个数字, 它是在缓冲区创建时由Vim自动分配的编号. 可以用:buffer N 命令直接凭编号跳转到一个缓冲区, 或是用更直观的:buffer {bufname}格式实现同样的功能. {bufname} 只需包含文件路径中足以唯一标识此缓冲区的字符即可
  • :bufdo 命令允许我们在:ls列出的所有缓冲区上执行Ex命令. 不过在实际应用中, 发现:argdo更加实用
  • :wa! 把所有改变的缓冲区写入磁盘
  • :qa! 关闭所有窗口, 摒弃修改无需警告
  • Explore缩写E :edit 只需输入:e
  • Vexplore/Sexplore: 水平或竖直打开目录树
  • :write !{cmd} 命令会把缓冲区的内容作为标准输入 传给指定的{cmd},{cmd} 可以是任何外部程序
  • :w !sudo tee % > /dev/null 普通用户保存root权限文件

install vim

ubuntu

1
2
3
4
5
6
7
8
9
vim:
sudo add-apt-repository ppa:jonathonf/vim
sudo apt update
sudo apt install vim

nvim:
sudo apt-add-repository ppa:neovim-ppa/unstable
sudo apt update
sudo apt install neovim

config nvim

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo pacman -S unzip(要解压一些包) git neovim
# 安装pyright需要安装npm以及python3,这里不需要nodejs
sudo pacman -S npm python3
# copilot需要高版本的nodejs

# telescope
sudo add-apt-repository ppa:x4121/ripgrep
sudo apt update
sudo apt install ripgrep
npm install -g fd-find

# 清除nvim配置
rm -rf ~/.local/share/nvim ~/.cache/nvim ~/.local/state/nvim