前言

本文翻译自: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. mysql数据类型分析

    CHAR, VARCHAR, TEXT CHAR 定长字符串,占用空间大,速度快 VARCHAR 变长字符串,占用空间小,速度慢 CHAR后面的空格会被去掉,VARCHAR不会去掉 TEXT 不能有默 ...

  2. VMware系统运维(十三)部署虚拟化桌面 Horizon View Agent 5.2安装

    1.先打开安装程序如下所示 2.点击"下一步" 3.不接受,你能装吗?点击"下一步" 4.选择安装位置,点击"下一步" 5.开启3389和3 ...

  3. NIS客户端限制用户登录

    公司所有账号信息由一台 NIS Server 统一管理,但是有几台 NIS Client 只允许某几个用户登录.这里通过PAM机制来实现该需求. 1. 需要配置的文件 (/etc/pam.d/目录下) ...

  4. 能够提高开发效率的Eclipse实用操作

    工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分 ...

  5. codeforces 678D D. Iterated Linear Function(水题)

    题目链接: D. Iterated Linear Function time limit per test 1 second memory limit per test 256 megabytes i ...

  6. linq to sql 增删改查

    ORM<Object Relation Mapping> Linq To Sql: 一.建立Linq To Sql 类 : 理解上下文类: Linq To Sql 类名+context 利 ...

  7. python字符串反转

    最一般的想法就是将字符串先转换成列表,倒置列表,再将列表转换为字符串 s = 'Hello world' l = list(s) l.reverse() python ''.join(l) 而pyth ...

  8. static和public

    static:静态.   可以设置:静态类.静态变量.静态方法.   没有使用static修饰的成员为实例成员. 静态成员的使用:通过类名.   1.不加static修饰的成员是对象成员,归每个对象所 ...

  9. OS中常用的调度算法总结 (转)

    http://blog.chinaunix.net/uid-25132162-id-361291.html 一.常见的批处理作业调度算法 1.先来先服务调度算法(FCFS):就是按照各个作业进入系统的 ...

  10. spring3+struts2+hibernate3整合出现的问题,No mapping found for dependency [type=java.lang.String, name='struts.objectFactory.spring.enableAopSupport']

    七月 11, 2016 3:49:24 下午 org.apache.tomcat.util.digester.SetPropertiesRule begin警告: [SetPropertiesRule ...