前言

本文翻译自:http://bencrowder.net/files/vim-fu/,参考了VIM中文帮助、 Google翻译结果和实际操作结果,对原文的部分内容重新整理,删除和添加了 部分内容并加入了一些技巧。如有翻译不当或在实际操作中出现的任何问题都可以 在文章后回复。注:

1. 文中以":"开头为"命令行模式",未注明均为"普通模式"。(了解vim模式":help vim-modes")
2. "<C-r>"意为"Ctrl + r",其他同理。
3. 主要关注点:"光标的移动","文本的编辑"和"多文件的切换"。
4. 有两个不得不提的键 <TAB>各种模式的下的补全 和 <ESC>各种模式下的切换。
无论你是使用什么终端,或是使用什么编辑器,这两个键都显得格外重要。

帮助

:help 加载帮助
:help j 获取"j"命令的相关帮助
:help :split 获取":split"命令帮助
:help z* 获取以"z"开头的相关命令帮助
:help function-list 显示vim提供的函数列表

撤销,恢复和重复

u 撤销(undo)
<C-r> 恢复撤销前的状态
:redo 恢复(同"<C-r>")
. 重复最后一个命令
[n][command] 重复[n]次[command]命令(编辑/移动光标等大部分命令都可使用此格式)
:qa 退出所有窗口
:wqa 保存退出所有窗口

移动光标:hjkl

         ^
k
< h l >
j
v

移动光标:行

0 跳转到当前行首
^ 跳转到当前行的第一个非空字符(空格/TAB)
$ 跳转到当前行的末尾
gg 跳转到文件第一行(goto)
G 跳转到文件最后一行
47G 跳转到文件第47行
:47 跳转到文件第47行(同"47G")

移动光标:字符

f[char] 跳转到第一个[char]字符(find)
3f[char] 跳转到第三个[char]字符
F[char] 向左跳转到第一个[char]字符
t[char] 跳转到第一个[char]字符的前一个字符(till before - right)
T[char] 向左跳转到第一个[char]字符的后一个字符(till after - left)
; 重复最后一次的 f/F/t/T 移动命令 这里加 shift 大写,意为反向:向左

移动光标:单词和文本块

w 跳转到下一个单词的开头(word)
3w 跳转到第三个单词的开头
e 跳转到下一个单词的结尾(end of word)
b 跳转到上一个单词的开头(backward beginning)
( 跳转到上一个句子的开头
) 跳转到下一个句子的开头
{ 跳转到上一个段落的开头
} 跳转到下一个段落的开头

移动光标:代码块

% 在当前大括号/中括号/小括号的开始位置"{/[/("和结束位置"}/]/)"之间跳转
[[ 跳转到上一个函数的开头(如果光标在函数体内则跳转到当前函数的开头)
]] 跳转到下一个函数的开头
[{ 跳转到当前程序块的开头(当前程序块为当前程序的上一层,不是固定的)
]} 跳转到当前程序块的结尾 更多移动光标命令请查看":help cursor-motions"

搜索

/[word] 搜索[word]字符串
?[word] 向上搜索[word]字符串
n 跳转到下一个匹配的字符串(保持最后一个搜索命令的方向)(next match)
N 跳转到上一个匹配的字符串(保持最后一个搜索命令的方向)
* 搜索当前光标下的单词
# 向上搜索当前光标下的单词 这里加 shift 大写,意为反向:向上

插入模式

i 在光标位置前进入插入模式
I 在当前行的第一个非空字符进入插入模式
o 在当前行的下一行添加一个空行进入插入模式
O 在当前行的上一行添加一个空行进入插入模式
a 在光标位置后进入插入模式
A 在当前行的末尾进入插入模式
s 删除光标位置下的字符并进入插入模式
S 删除当前行内容并进入插入模式 这里加 shift 大写,意为行首非空/行尾/反向
另:插入模式下使用 "<C-o>" 可以进入"插入普通模式"(窗口底部会由"-- INSERT --"
变为"-- (insert) --"),允许你执行完一个命令后,再返回插入模式,如:在插入模式下
选择保存在寄存器中的内容进行粘贴时,可以"<C-o>", ":reg", "<C-r> 3",解释一下:
":reg"是查看寄存器列表,"<C-r> 3"是把寄存器列表中编号为""3"的内容粘贴在此处。

删除文本

x 删除光标位置下的字符
dw 删除光标之后的单词剩余部分(delete word)
diw 删除一个单词
dd 删除当前行
D 删除从光标位置到当前行的末尾(同"d$")
df[char] 删除从光标位置到[char]字符(delete find [char])
d) 删除从光标位置到下一个句子的开始
d} 删除从光标位置到该段落的末尾
di{ 删除花括号之间的内容(delete inner {})(同"diB")
di( 删除小括号之间的内容(delete inner ())(同"dib")
dit 删除闭合标签之间的内容(html/xml等标签,delete inner tag)
dat 删除左右尖括号及之间的内容(delete a tag)
da< 删除左右尖括号及之间的内容(delete a <>)
di" 删除引号之间的内容(delete inner "")
da" 删除左右引号及之间的内容(delete a "")
:5,10d 删除5-10行
3dd 删除从当前行开始的3行
<C-w> 删除光标前的一个单词(插入模式)
<C-u> 从光标位置删除到行首(插入模式) 这里加 shift 大写,意为行尾
注:"d"/"c"开头的命令会将删除的文本放到寄存器(通过":reg"查看),可以理解为剪切。
关于"a"n和"i"nner可以参考":help object-select"文本对象选择部分
另:一般向右的操作包含光标下的字符,向左的操作不包含光标下的字符

更改文本

J 将下一行合并的当前行的末尾(Join line)
3,9j 合并3-9行
~ 切换光标下字符的大小写
u 更改选定的文本为小写(可视模式)
U 更改选定的文本为大写(可视模式)
<C-a> 把当前光标下或之后的数值加1
<C-x> 把当前光标下或之后的数值减1
r[char] 替换光标下的字符为[char]. (replace)
R 进入替换模式
cw 删除光标之后的单词剩余部分并进入插入模式(change word)
cc 删除当前行内容并进入插入模式(同"S")
C 删除从光标位置到当前行的末尾并进入插入模式(同"c$")
cf[char] 删除从光标位置到[char]字符并进入插入模式 这里"c"开头加 shift 大写,意为行尾
"c"开头"change"更改(删除并插入),"d"开头"delete"删除,和"y"开头"yank/copy",格式相同,可相互参考使用

缩进文本

>> 缩进当前行
<< 向左缩进当前行
<C-d> 缩进当前行(插入模式)
<C-t> 向左缩进当前行(插入模式)
:3,9>>>>> 将3-9行缩进5个TAB
> 缩进选定的行(可视模式)
< 向左缩进选定的行(可视模式)
>i{ 缩进花括号之间的内容(indent inner {})(同">iB")
>a{ 缩进花括号及之间的内容(indent a {})(同">aB")
=} 缩进当前段落
gg=G 全文缩进/格式化

复制和粘贴

v 进入可视模式,以字符为单位选择
V 进入可视模式,以行为单位选择
<C-v> 进入列块可视模式(如果映射"<C-v>"为"粘贴"时请注意)
gv 重新选择最后选定的区域
y 抽出选择的文本到寄存器(可视模式)(yank/copy)
"+y 抽出选择的文本到系统剪切板(可视模式)(好像不太好使)
:co 10 复制当前行到第11行(copy)
:co . 复制当前行到下一行(同"yyp")
:5,10co 20 复制5-10行到第21行
yy 复制当前行
y$ 复制到行尾
yw 复制光标之后的单词剩余部分(yank word)
yb 复制光标之前的单词剩余部分
yiw 复制一个单词
yip 复制当前段落(yank inner paragraph)
yas 复制一个句子(yank a sentence)
yi< 复制尖括号之间的内容(Yank inner <>)
11y 复制11行
p 粘贴(paste)
P 粘贴到光标前
<C-r>" 粘贴(插入模式)
"ayy 复制当前行到寄存器"a"(可使用范围"a-z")
"ap 粘贴从寄存器"a" 这里的"寄存器"即VIM剪切板

文件和目录

:e! 重新载入当前文件,放弃任何更改(edit)
:e [file] 编辑文件[file]
:r [file] 将[file]文件内容插入到下一行(read)
:r !date 将"date"命令返回的结果插入到下一行
:pwd 输出当前工作目录到状态栏
:cd [dir] 切换当前工作目录到[dir]
<C-g> 显示当前文件信息(文件名及行数等)
gf 打开光标下的文件路径(相当于以":e"的方式打开)
ga 显示光标下的字符在当前使用的 encoding 下的内码
:saveas [file] 另存为[file]文件(文件不存在,使用"saveas!"覆盖已存在文件)
:w > [file] 将当前文件内容写入[file]文件(文件不存在,同":saveas")
:3,9w >> [file] 将3-9行的内容追加到[file]文件(文件已存在)
:w 保存当前文件
:x 保存并退出
:q! 不保存退出
:qa! 强行退出所有文件,不保存 :sh 切换到shell终端,使用"ctrl+d"返回
ctrl+z 同上,使用"fg"返回(属终端快捷键范畴)

缓冲区

:ls 查看缓冲区列表(同 :files, 或 :buffers)
:bn 编辑下一个缓冲区(buffer next)
:bp 编辑上一个缓冲区(buffer previous)
:b[n] 编辑缓冲区列表中第[n]个缓冲区
:b <Tab> 选择要切换的 buffer 文件
:bd 卸载当前缓冲区(buffer delete)

分割窗口

:sp 水平分割当前窗口(split)
:vs 垂直分割当前窗口(vertical split)
:sp [file] 水平分割一个新窗口,并编辑文件[file]
:close 关闭当前窗口(同":q")
:only 关闭其他窗口
<C-w> h 光标移动到左边一个窗口
<C-w> j 光标移动到下边一个窗口
<C-w> k 光标移动到上边一个窗口
<C-w> l 光标移动到右边一个窗口
<C-w> w 光标移动到下一个窗口

标签页

:tabs 查看标签页列表
:tabe 打开一个新标签页(tab edit)(同":tabnew")
:tabe [file] 打开一个新标签页,并编辑文件[file].
:tabc 关闭当前标签页(tab close)(同":q")
gt 转到下一个标签页(go to)(同":tabn"/":tabnext")
gT 转到上一个标签页(同":tabp"/":tabprevious")

滚屏

H 跳转到屏幕的顶部(home)
M 跳转到屏幕的中间(middle)
L 跳转到屏幕的底部(low)
zt 将当前行滚动至屏幕顶部(top)
zz 将当前行滚动至屏幕中间(同"z.")
zb 将当前行滚动至屏幕中间(bottom)(同"z-")
<C-f> 滚动至下一页(forwards)
<C-b> 滚动至上一页(backwards)
<C-d> 向下滚动半屏(downwards)
<C-u> 向下滚动半屏(upwards)

折叠

3zF 创建折叠操作符,并折叠3行
zo 打开光标下的折叠(open)
zc 关闭光标下的折叠(close)
zR 打开所有的折叠
zd 删除光标下的折叠操作符(delete)

自动完成

<C-n> 自动完成当前的单词
<C-p> 自动完成当前的单词,光标定位在自动完成列表的最后一行
<C-x><C-o> 使用"Omnicomplete"全能补全函数(:help omnifunc)(同"<C-x-o>")

标记和历史

ma 在当前光标位置设置位置标记(可使用范围"a-zA-Z")
`a 跳转到"a"标记
g; 转到上一次编辑的地方
:his 查看执行的命令历史记录(默认参数为"c"即"cmd")
:his s 查看搜索字符串的历史记录(history search)
:his a 查看包括搜索/命令等所有历史记录(了解更多参数":help :history")

键映射

:map 查看已映射的键列表
:imap 查看插入模式下已映射的键列表
:nmap 查看普通模式下已映射的键列表
:imap jj <Esc> 插入模式下键入"jj"映射到"<ESC>"(返回普通模式)
:nmap <C-h> <C-w>h 普通模式下映射"<C-h>"到"<C-w>h"(光标移动到左边一个窗口)

替换

:%s/w1/r2/g 将文件中所有的"w1"替换为"r2"
:.,$s/w1/r2/g 将当前行到文件末尾所有的"w1"替换为"r2"
:s/w1/r2/g 将当前行中所有的"w1"替换为"r2"(同":g/w1/s//r2/g")
:3s/w1/r2/g 将第3行到文件末尾所有的"w1"替换为"r2"
:3,9s/w1/r2/ 将3-9行第一个"w1"替换为"r2"
:3,9s/^/#/ 将3-9行行首添加"#"号(可用于注释)
:3,9s/^/\/\// 将3-9行行首添加"//"双斜线
:3,+3s/^#// 将第3行及其后3行行首的"#"号去掉
:.-3s/^/#/ 将当前行上的第三行行首添加"#"号 :g/print/d 删除包含"print"字符串的所有行
:g!/print/d 删除不包含"print"字符串的所有行
:%s/\s\+$// 去除行尾空白字符("\s"表示空白字符"空格/TAB","\+"表示一个或多个)
:%s/^\([a-z]\)/\U\1/ 首字母大写("\1"表示第一个"\("和"\)"之间的匹配文本)
:g/^$/,/./-j 压缩空行
:%s/^M$// 去除行尾的"^M" ("^M"使用"<C-v><C-m>"录入)
:%s/^I// 删除文件所有行的第一个"TAB"("^I"使用"TAB"键录入)
:%s/^\d.// 删除文件所有行行首的数字和"."(如:"5.")

vim命令总结的更多相关文章

  1. Linux vim命令

    介绍 vim命令和vi的操作基本一致,vim命令的参数很多,我在这里列出了一些平时需要用的一些参数,vim主要有两个界面一个是esc的操作界面还有一个是输入i的编辑界面. 移动光标 0 (零):将光标 ...

  2. 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类

    今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在W ...

  3. 学习vim命令:“:w !sudo tee %”

    学习vim命令:“:w !sudo tee %” Original URL:http://www.haw-haw.org/node/1501 原文来自于commandlinefu 原文是这样解释这个命 ...

  4. [转]常用的130个vim命令

    原帖地址:http://www.oschina.net/news/43167/130-essential-vim-commands 从 1970 年开始,vi 和 vim 就成为了程序员最喜爱的文本编 ...

  5. 15个不起眼但非常强大的 Vim 命令

    如果我的关于这个话题的最新帖子没有提醒到你的话,那我明确地说,我是一个 vim 的粉丝.所以在你们中的某些人向我扔石头之前,我先向你们展示一系列“鲜为人知的 Vim 命令”.我的意思是,一些你可能以前 ...

  6. [转载]VIM命令合集

    Vim命令合集 http://www.cnblogs.com/softwaretesting/archive/2011/07/12/2104435.html 命令历史 以:和/开头的命令都有历史纪录, ...

  7. Vim命令快捷键(网摘)

    Vim命令快捷键(网摘) 原文出处:[?---->home]

  8. Vim 命令图解-Gvim使用笔记-2017-5-9

    Vim 命令图解-Gvim使用笔记... 图片要是看的不太清楚推荐使用:鼠标右键在新标签中打开或是全屏看图 Vim中常用的一些速查命令: Vim发展历史:1976年Bill Joy开发了vi1988 ...

  9. Vim 命令图解-Gvim使用笔记

    Vim 命令图解-Gvim使用笔记... 参考的网址:http://blog.vgod.tw/wp-content/uploads/2014/08/vgod-vim-cheat-sheet-full. ...

  10. 超级有用的Vim命令

    你是否曾经烦恼,每次编辑vim文件,想要跳到一行结尾,需要按多次右键,每次想找到某个字符的位置,都得用肉眼去观察,每次想跳到文件结尾,都要按多次向下键.现在,你不必担心这些繁杂的过程,因为我们完全可以 ...

随机推荐

  1. sift算法中翻译的第11页中比值问题

    没下载下来... http://download.csdn.net/detail/shwaicy1314/7320695 原文翻译.应该是 2004年lowe写的吧 第八页 图C展示的 是小于0.03 ...

  2. 剑指Offer14 逆序链表

    /************************************************************************* > File Name: 14_Revers ...

  3. 初识 Asp.Net内置对象之Cookie对象

    Cookie对象 Cookie对象用于保存客户端浏览器请求的服务器页面,也可用于存放非敏感性的用户信息,信息保存的时间可以根据用户的需要经行设置.并非所有的浏览器都支持Cookie,并非数据信息都是以 ...

  4. js验证连续两位数字递增或递减和连续三位数字相同

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  5. js解析xml,获取XMl标签属性值

    <script type="text/javascript"> var xml="<?xml version=\"1.0\" enc ...

  6. iOS UILabel自定义行间距时获取高度

    本文介绍一下自定义行间距的UILabel的高度如何获取,需要借助一下开源的UILabel控件:TTTAttributedLabel 附下载地址 https://github.com/TTTAttrib ...

  7. Windows 10 (or 8)Chrome 观看视频发生flash不能加载,即"could't load plugins"原因之一

    最近一直如题,不能看视频,后来发现从一个已经使用管理员权限打开的应用转到Chrome就可以加载flash,而从桌面打开Chrome就加载不了. 今天再次查找信息,从Ubuntu下Chrome不能加载f ...

  8. iOS-GCD多线程

    GCD GCD -- Grand Central Dispatch 是基于C语言的底层API 用Block定义任务,将任务添加到线程中使用.集中管理 1.GCD的执行函数 //同步 dispatch_ ...

  9. (转)为首次部署MongoDB做好准备:容量计划和监控

    如果你已经完成了自己新的MongoDB应用程序的开发,并且现在正准备将它部署进产品中,那么你和你的运营团队需要讨论一些关键的问题: 最佳部署实践是什么? 为了确保应用程序满足它所必须的服务层次我们需要 ...

  10. 直播开始:'云榨汁机'诞生记--聊聊JavaScript中的'业务建模'

    闭包是JavaScript中的一个重要特性,在之前的博文中,我们说闭包是一个'看似简单,其实很有内涵'的特性.当我们用JavaScript来实现相对复杂的业务建模时,我们可以如何利用'闭包'这个特性呢 ...