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 移动光标到上一个匹配位置
使用指令重复快速移动
按照语义移动
gd 转到当前光标所在单词的定义,c++变量直接转到定义gf 转到当前光标所在的文件,c++include直接转到包含文件
其他移动操作
gg 回到文件第一行{line}gg 转到第{line}行G 转到文件最后一行% 跳到匹配的括号 ,支持({[]}),在c++中很有用
使用vim操作编辑文本
行操作
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 dhs 修改光标字符. 类似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. :%d0 文件开头 e.g. :0,10d$ 文件结果 e.g. :10,$d:'<,'> 视觉选中状态下执行指令的默认值
command-line mode substitute
分割窗口
: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> 标签包围。
自定义映射(需要自行添加到配置)
插入模式
普通模式
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是整个文本。
|