vim常用命令和使用技巧
文章目录
使用Linux的同学们都应该用过vim。vim用的熟练绝对是可以事半功倍。这里我们不讨论编辑器孰优孰劣,只是列出一些vim常用命令和使用技巧,方便大家查询。
基本命令
最基本的操作
i 当前光标处插入 a 当前光标后插入 x 删除当前光标所在的一个字符 :w 存盘 :q 退出 :wq 存盘并退出 :x 存盘并退出,同:wq :q! 强制退出
光标操作
0 数字0,移到行首 ^ 移到当前行的第一个非空白符 $ 移到行尾 - 移到上一行的行首 + 移到下一行的行首 w 移到下一个单词,将空白符和标点符号,括号等都视为单词分割符 W 移到下一个单词,只将空白符视为单词分割符 b 移到上一个单词,将空白符和标点符号,括号等都视为单词分割符 B 移到上一个单词,只将空白符视为单词分割符 e 移到当前字符的词尾,将空白符和标点符号,括号等都视为单词分割符 E 移到当前字符的词尾,只将空白符视为单词分割符 3G 移到第3行行首 :3 同上,移到第3行行首 G 移到最后一行行首 gg 移到第一行行首 Ctrl+f 向下翻页 Ctrl+b 向上翻页
复制粘贴
v/V 进入可视化(Visual)模式,可上下左右选择高亮区间,小写v按字母选择,大写V按行选择 d/y 在可视化模式中,d剪切高亮区间,y复制高亮区间 yy 复制当前行的内容 p/P 小写p在当前位置后粘贴,大写P在当前位置前粘贴 :n1,n2 co n3 将n1行到n2行间的内容(包括n1和n2行)复制到第n3行的下方 :n1,n2 m n3 将n1行到n2行间的内容(包括n1和n2行)移到第n3行的下方
插入命令
I 当前光标所在行的行首插入 A 当前光标所在行的行尾插入 o 当前光标所在行的下面另起一行,光标停留在新行行首,并等待插入 O 大写字母O,当前光标所在行的上面另起一行,光标停留在新行行首,并等待插入
删除命令
X 删除当前光标前面的那个字符 dd 删除当前行,并把删除的行存到剪贴板里 d^ 删除从当前位置至行首的内容,不包括光标位 d$ 删除从当前位置到行尾的内容,包括光标位 D 同上,删除从当前位置到行尾的内容,包括光标位 dw 删除从当前位置到光标当前所在的单词尾的内容 dG 删除从当前行到文档结尾的所有内容,包括当前行 dgg 删除从当前行到文件头的所有内容,包括当前行 di[sign] [sign]可以是(),[],{},',"。当光标在括号或引号的范围内,该命令可以删除括号或引号里的内容 dt[sign] [sign]可以是任意符号。如果在光标后同一行上存在这个符号,则删除从光标开始到符号前的内容 :n1,n2 d 将n1行到n2行间的内容(包括n1和n2行)删除
撤销回复操作
u Undo,撤销上一步操作,可反复撤销 Ctrl+r Redo,恢复下一步操作,可反复恢复 :e! 撤销之前所有操作,重新编辑当前文件
查找
/string 向后查找字符串"string" ?string 向前查找字符串"string"
文件操作
:e file 打开文件file :r file 将文件file内容复制到当前光标处 :w file 另存为文件file :n1, n2 w file 将n1行到n2行间的内容另存为文件file
屏幕操作
zz 将当前行置为屏幕正中央 zt 将当前行置为屏幕顶端 zb 将当前行置于屏幕底端 Ctrl+g 显示当前行列号
参数设置
设置格式
:set number 每行行首显示行号 :set nu 同上,每行行首显示行号 :set ruler 屏幕右下角显示行列号 :set tabstop=4 将tab的显示宽度定位4个空格,默认为8 :set softtabstop=4 根据情况决定按tab时插入空格还是制表符,如设为4,按1次tab为4个字符,按2次为1个制表符 :set expandtab 用空格替代tab,空格的个数由上面softtabstop设置确定,默认为8 :syntax on 开启语法高亮显示 :set syntax=java 指定语法高亮的程序语言 :set showmatch 高亮显示括号(), [], {}的匹配情况 :set encoding=utf-8 设置字符编码 :set history=50 设置保留历史个数 :set vb 即visualbell,用屏幕闪烁代替bi的提示音 :set noeb 即noerrorbells,不发出bi的错误提示音 :set no[option] 将设置取消,[option]可以是上述所有不使用赋值操作的设置选项
保存格式设置。将上一步的设置存放到用户根目录
.vimrc
文件里$ vi ~/.vimrc
高级技巧
通用技巧
. 重复上一个命令 n[command] 将"command"命令重复执行n次。如: 3dd 删除从当前行开始往下的3行 5yy 复制从当前行开始往下5行的内容
缩进
:set autoindent 设置自动缩进,新增加的行和前一行使用相同的缩进形式 :set cindent 设置自动缩进,可以很好的识别出C和Java等结构化程序设计语言 :set smartindent 设置自动缩进,新增加的行和前一行使用相同的缩进形式,并可自动识别出花括号 :set shiftwidth=4 设置缩进宽度为4个字符,默认为8 >> 对当前行增加缩进 >G 对从当前行到文件结尾的所有行增加缩进 << 对当前行减少缩进 <G 对从当前行到文件结尾的所有行减少缩进 == 对当前行自动缩进 =G 对从当前行到文件结尾的所有行自动缩进 5== 对从当前行开始往下5行自动缩进,<<和>>操作也相同
插入模式下自动补全
Ctrl+n 单词自动补全,根据已经输入的字母,列出上下文已有的相近单词,默认选中列表中第一个 Ctrl+p 单词自动补全,根据已经输入的字母,列出上下文已有的相近单词,默认选中列表中最后一个 Ctrl+x Ctrl+k 单词自动补全,根据已经输入的字母,列出词典中的相近单词 Ctrl+x Ctrl+l 行自动补全,根据已经输入的字母,列出上下文已有的相近行 Ctrl+x Ctrl+f 文件名自动补全,根据已经输入的字母,列出当前目录下的文件名 :set dictionary=./dict.txt 设置词典文件,文件中每行一个单词 :set dictionary+=./dict.txt 添加词典文件 :set dictionary-=./dict.txt 去除词典文件
格式转换
:%!xxd 按十六进制查看当前文件 :%!xxd -r 从十六进制返回正常模式
内容与命令映射
:ab [abbr] [phrase] 定义缩写,用于插入模式中替换内容。如:ab ma int main() { :ab 列出当前已定义的所有缩写 :unab 撤销缩写定义。如:unab ma :map [co] [commands] 命令映射,用于普通模式中替换命令组合,如:map f yyp,按f键会复制当前行 :map 列出当前已定义的所有命令映射 :unmap 撤销命令映射定义。如:unmap f :mapclear 清空所有已定义的命令映射 :noremap 避免递归的命令映射,防止map b a, map c b后,c等同于a的情况 :imap 插入模式中的内容映射,等同于ab :vmap Visual模式中的命令映射 :map <c-a> <esc>ggVG 实现类似于Windows下的Ctrl+a全选 :inoremap ( ()<esc>i 插入模式下输入"("后自动补全")",同理还可以实现"[","{"
字符替换
:retab! 将所有Tab转换为空格 :%s/aaa/bbb/g 将文档中所有"aaa"字符串替换为"bbb",这里支持正则表达式 gU 将当前字符转化为大写 gu 将当前字符转化为小写 gUw 将当前光标后面的单词转化为大写;guw则转化为小写 gUnw n为数字,如gU5w,将当前光标后面的5个单词转化为大写;gu5w则转化为小写 gU0 从光标所在位置到行首,都转化为大写;gu0则转化为小写 gU$ 从光标所在位置到行尾,都转化为大写;gu$则转化为小写 gU1G 从光标所在位置到文章第一个字符,都变为大写;gu1G则转化为小写 gUG 从光标所在位置到文章最后一个字符,都变为大写;guG则转化为小写 gggUG 所有字符都转化为大写,gg即光标移动到文件首字符,gU转化为大写,G一直到文件末尾
其他技巧
*/# 移动到与光标当前单词所匹配的单词,*移动到上一个,#移动到下一个 gd 移动到光标当前单词第一次出现的位置,可用于查找变量或函数的声明 % 移动到与当前括号"(, [, {"相匹配的括号,光标行上必须有括号 :w !sudo tee % 使用管理员权限将当前文件保存 :!gcc % 不退出vim,用gcc命令执行当前文件,"!"后可以是任意Shell命令,可不加%而指定文件名 :r !date 读取系统时间并插入到当前行的下一行,"!"后可以是任意Shell命令 :%TOhtml 分割一个新窗口,并在其中生成一个HTML来显示当前文本的内容
分屏操作
开启分屏
$ vi -o f1 f2 打开f1和f2两个文件并分屏显示。小写o上下分屏,大写O左右分屏。可以打开两个以上文件 :sp [file] 上下分屏打开文件file,没有[file]则表示将当前文件显示两屏 :vsp [file] 左右分屏打开文件file,没有[file]则表示将当前文件显示两屏 :new [file] 上下分屏创建一个新文件file,没有[file]则保存时需输入文件名 :vnew [file] 左右分屏创建一个新文件file,没有[file]则保存时需输入文件名
分屏中的操作
Ctrl+w w 按住Ctrl键并按两次w,在分屏窗口中切换 Ctrl+w 方向键 按Ctrl+w后按方向键,切换到指定方向的屏幕 Ctrl+w s 按Ctrl+w后按s,对当前文件分屏。等同于:sp Ctrl+w o 按Ctrl+w后按o,关闭其他分屏,仅显示当前屏的内容 Ctrl+w q 按Ctrl+w后按q,关闭当前的分屏。如果当前只有一个屏,则等同于:q :ls 列出所有已打开的文件 :bn 将当前屏的内容切换到已打开文件列表中的下一个文件 :bp 将当前屏的内容切换到已打开文件列表中的上一个文件 :b# 将当前屏的内容切换到已打开文件列表中的第#个文件
分屏中的文件比较
$ vi -d f1 f2 左右分屏打开f1和f2两个文件,并对两个屏内容作比较 :difft 先在第一个屏输入:difft,再切换到第二个屏输入:difft,即可对这两个屏的内容作比较 :diffs file 上下分屏打开文件file,将当前屏的内容和新的屏作比较 :vert diffs file 左右分屏打开文件file,将当前屏的内容和新的屏作比较 :diffo 当前屏退出比较 :diffo! 所有屏都退出比较 :diffu 刷新比较信息 ]c 光标移到下一个diff点,前面加上数字可跳过多个diff点 [c 光标移到上一个diff点,前面加上数字可跳过多个diff点 dp 将当前行的diff内容复制到另一个屏中 do 将另一个屏中的diff内容复制到当前行