vim操作备忘录

Vim拥有独一无二的文本编辑功能与现代特性,相比于其他文本编译软件,它提供了完全不同等级的文本编辑熟练度,速度和精度。

基础操作:

  • h 向左移动光标
  • j 向下移动
  • k 向上移动
  • l 向右移动
  • i 进入插入模式
  • <ESC>``<Ctrl-C>``<Ctrl-[> 返回普通模式

按照单词快速移动:

  • w 移动光标到下一个单词的开始
  • b 移动光标到上一个单词的开始
  • e 移动光标到下一个单词的末尾
  • ge 移动光标到上一个单词的末尾
  • W 移动光标到下一个广义单词的开始
  • B 移动光标到上一个广义单词的开始
  • E 移动光标到下一个广义单词的末尾
  • gE 移动光标到上一个广义单词的末尾

字符定位:

  • f{character} 找到字符出现的下一个位置
  • F{character} 找到字符出现的上一个位置
  • t{character} 找到字符出现的下一个位置,并将光标移到这个字符之前
  • T{character} 找到字符出现的上一个位置,并将光标移到这个字符之前
  • ; 搜索时,将光标移动到下一个匹配位置
  • , 搜索时,将光标移动到上一个匹配位置

行内移动:

  • 0 移动到一行的第一个字符
  • ^ 移动到一行的第一个非空字符,一般用0w
  • $ 移动到一行的最后一个字符
  • g_ 移动到一行的最后一个非空字符

行间快速移动:

  • } 向下跳过整个段落
  • { 向上跳过整个段落
  • CTRL-D 向下移动半页
  • CTRL-U 向上移动半页

搜索时精确行间移动

  • /{pattern} 搜索 {pattern}。 {pattern} 可以是正则表达式.
  • ?{pattern} 搜索 {pattern} ,向反方向。
  • / 重复上次搜索
  • ? 重复上次搜索,向反方向。
  • n 移动光标到下一个匹配位置
  • N 移动光标到上一个匹配位置

使用指令重复快速移动

  • {count}{motion} 重复{motion} {count} 次

    比如:

  • 2w 跳到下2行

  • 4f" 跳到第4个 " 字符

  • 3/cucumber 跳到第三个匹配 "cucumber"的位置

按照语义移动

  • gd 转到当前光标所在单词的定义,c++变量直接转到定义
  • gf 转到当前光标所在的文件,c++include直接转到包含文件

其他移动操作

  • gg 回到文件第一行
  • {line}gg 转到第{line}行
  • G 转到文件最后一行
  • % 跳到匹配的括号 ,支持({[]}),在c++中很有用

使用vim操作编辑文本

  • {operator}{count}{motion} 将操作{operator}应用到{motion}覆盖的文本{count}次。

    e.g:

  • d 删除(delete)

  • c 修改(change)

  • y 复制(yank ,copy)

  • p 粘贴 (put,paste)

  • g~ 切换大小写

  • > 向右缩进

  • < 向左缩进

  • = 格式化

行操作

  • dd 删除一行
  • cc 修改一行
  • yy 拷贝一行
  • g~~ 切换一行的大小写
  • >> 整行向右缩进
  • << 整行向左缩进
  • == 格式化一行

大写操作(更强版本)

  • D从光标到行尾,删除
  • C 从光标到行尾,修改
  • Y 拷贝一行,和yy一样
  • P 粘贴到光标前

文本对象

  • {operator}a{text-object} 将 {operator}应用到包含周围空格的文本对象。
  • {operator}i{text-object} 将 {operator}应用到文本对象。
    e.g:
  • diw 删除单词
  • daw 删除单词(包含空格)
  • dis 删除句子
  • das 删除句子(包含空格)
  • dip 删除段落
  • dap 删除段落(包含空格)
  • di(``dib 删除圆括号中内容
  • da(``dab 删除圆括号中内容(包含括号)
  • di{``diB 删除花括号中内容
  • da{``daB 删除花括号中内容(包含括号)
  • di[ 删除方括号中内容
  • da[ 删除方括号中内容(包含括号)
  • di" 删除引用中内容
  • da" 删除引用中内容(包含引用符号)
  • dit 删除标签中内容(html语言中tag)
  • dat 删除标签中内容(包含标签)
  • ciw 以此类推

重复上次改变

  • . 重复上次改变

字符编辑指令

  • x 删除光标所在的一个字符,类似dl(delete letter)
  • X 删除光标前一个字符. Like dh
  • s 修改光标字符. 类似cl(change letter)
  • ~ 切换字符大小写

撤销和反撤销

  • u 撤销上次修改
  • Ctrl-R 反撤销上次撤销
  • {count}u 撤销上{count} 次修改

插入文本

  • i 进入插入模式,在当前光标前
  • a 进入插入模式,在当前光标后
  • I 进入插入模式,在行首
  • A 进入插入模式,在行尾
  • o 进入插入模式,在一行新建一行
  • O 进入插入模式,在上一行新建一行
  • gi 转到上次推出插入模式时位置
  • Ctrl-H 在插入模式下,删除一个字符,也可以用退格。
  • Ctrl-W 在插入模式下,删除一个单词。
  • Ctrl-U 在插入模式下,删除一行。

可视模式

  • v 转到基于字符的可视模式
  • V 转到基于行的可是模式
  • Ctrl-V 转到基于块的可视模式,用来选择矩形区域的文本。
  • {trigger visual mode}{motion}{operator} 可视模式和普通模式操作相反,需要先指定选择文本,然后应用操作。

下一个搜索位置的操作

  • {operator}gn 将操作应用到下一个搜索位置
  • . 在使用{op}gn后, 重复操作会应用到下一个匹配位置,不需要使用n来手动移动。

拷贝和粘贴

  • y{motion} 拷贝yank (copy) 被{motion}覆盖的文本
  • p 粘贴(put ,paste) 到光标后
  • P 粘贴到光标前
  • yy 拷贝一行
  • Y 同上
  • yyp 复制一行
  • ddp 交互一行
  • xp 交换字符
  • "ay{motion} 拷贝到寄存器a
  • "Ay{motion} 拷贝并附加到寄存器a
  • "ap 从寄存器a粘贴
  • " 无名寄存器
  • 0 拷贝寄存器
  • 1-9 删除寄存器
  • [a-z] 命名寄存器
  • Ctrl-R a 在插入模式从寄存器a粘贴内容

命令行模式

  • :edit {file}``:e {file} 创建或者编辑文件
  • :write``:w 保存文件
  • :quit``:q 关闭文件
  • :write!``:w! 强制保存文件
  • :quit!``:q! 强制关闭文件,不保存
  • :wq 保存并关闭
  • :wall``:wa 保存所有文件
  • :qall``:qa 关闭所有文件
  • :wqall``:wqa 保存并关闭所有文件
  • :qall!``:qa! 关闭所有文件,不保存
  • :[range]delete [register]``:[r]d [r] 删除多行,放到寄存器
  • @: 重复上次命令
  • @@ 再次重复

命令行模式范围

  • :{start},{end} 起始和结束行 e.g. :1,2d
  • :{start},{offset} 起始和偏移行 e.g. :1,+2d
  • . 代表当前行 e.g. :.,+2d
  • % 代表整个文件 e.g. :%d
  • 0 文件开头 e.g. :0,10d
  • $ 文件结果 e.g. :10,$d
  • :'<,'> 视觉选中状态下执行指令的默认值

command-line mode substitute

  • :[range]/{pattern}/{substitute}/[flags] 用匹配的模式替换给定范围内的字符串文字

  • g flag 替换一行中所有匹配

  • i flag 区分大小写

  • c flag 每处替换均需要确认

分割窗口

  • :sp {file} 水平分割,打开新文件
  • :vsp {file} 垂直分割,打开新文件
  • Ctrl-W S 水平分割,打开同一文件
  • Ctrl-W V 垂直分割,打开同一文件
  • Ctrl-W h 移动到左边分割窗口
  • Ctrl-W j 移动到下边分割窗口
  • Ctrl-W k 移动到上边分割窗口
  • Ctrl-W l 移动到右边分割窗口

选项卡tab

  • :tabnew {file} 新tab中打开
  • :tabnext``:tabn 跳到下一个tab
  • :tabprev``:tabp 跳到上一个tab
  • :tabonly``:tabo 关闭所有tab

vim包围操作

  • ds 删除包围符号 e.g. ds"
  • cs 修改包围符号 e.g. cs*tem>
  • ys 添加包围 e.g. ysiw"
  • ds" 删除引用的包围
  • cs*tem> 修改包围 * 为 <em> 标签
  • ysiw" 用引用将当前单词包围
  • S 在可视模式,选择部分文本,然后使用S来添加包围。 比如,Stp> 来把选中内容用 <p> 标签包围。

自定义映射(需要自行添加到配置)

插入模式

  • jk 返回普通模式,操作更加丝滑。

普通模式

  • J 一次向下移动5行
  • K 一次向上移动5行
  • <leader>j 合并行
  • <leader>/ 搜索时不高亮
  • <leader>w 保存文件
  • <leader>p 打开指令面板
  • <leader>t 转到文件中符号
  • <Ctrl-H> 移动到左边的窗口
  • <Ctrl-J> 移动到下边的窗口
  • <Ctrl-K> 移动到上边的窗口
  • <Ctrl-L> 移动到右边的窗口
  • <leader>tt 创建新tab
  • <leader>tn 移动到下一个tab
  • <leader>tp 移动到上一个tab
  • <leader>to 删除所有tab,只保留当前

使用 vim-sneak快速移动

  • s{char}{char} 跳转到下一个匹配 {char}{char}位置
  • S{char}{char} 跳转到上一个匹配 {char}{char}位置
  • ; 跳转到下一个匹配
  • , 跳转到上一个匹配
  • {op}z{char}{char} 将操作应用到文本遍历的所有{char}{char}位置

使用 easy-motion快速移动

  • <leader><leader>w 标记所有单词开头,光标之后
  • <leader><leader>b 标记所有单词开头,光标之前
  • <leader><leader>bdw 标记所有单词开头. bd代表双向
  • <leader><leader>e 标记所有单词结尾,光标之后
  • <leader><leader>ge 标记所有单词结尾,光标之前
  • <leader><leader>bdw 标记所有单词结尾
  • <leader><leader>j 标记所有行开头
  • <leader><leader>k 标记所有行开头
  • <leader><leader>f{char} 标记找到的字符位置,光标之后
  • <leader><leader>F{char} 标记找到的字符位置,光标之前
  • <leader><leader>t{char} 标记找到的字符位置之前,光标之后
  • <leader><leader>T{char} 标记找到的字符位置之前,光标之前
  • <leader><leader>s{char} 标记找到的字符位置

多光标

搜索位置

  • <CMD-D>``<Ctrl-D>``gb 增加额外的光标,会进入可视模式。
  • {operator} 将操作应用到所有光标处
  • I 同时给多个单词前面插入
  • A 同时给多个单词后面附加

连续行

  • <Ctrl-V> 转到可视模式,开始选择要操作的行
  • {operator} 将操作应用到所有行
  • I同时在多行前面插入
  • A 同时在多行后面附加

使用宏重编辑

  • q{register}在 {register}中记录一个新的宏
  • q 停止记录宏
  • @{register} 执行{register}宏
  • @@ 重复执行上次执行过的宏

neovim集成

  • :[range]copy {address} 多行拷贝到 {address}
  • :[range]move {address} 多行移动到{address}
  • :[range]normal {commands} 多行执行普通模式指令
  • :execute "{ex-command}" 执行字符串ex指令. 当指令包含特殊字符时使用。
  • :[range]global/{pattern}/{command} 在所有匹配pattern的range行执行ex指令。默认range是整个文本。
  • :[range]global!/{pattern}/{command} 在所有不匹配pattern的range行执行ex指令。默认range是整个文本。

猜你喜欢

转载自blog.csdn.net/iamqianrenzhan/article/details/127151367