普通模式下
操作符
>G >gg # 缩进 y复制 d删除
C == c$ #c是修改,删除之后进入插入模式
s == cl # l一个字符 aw一个单词(iw不涉及到空格,ciw推荐) ap一个段落
S == ^cc # 删除一整行
# g命令空间
g~l # 反转大小写
guw # 转化成小写
gUU # 转化成大写
:!nginx -s reload # 使用外部命令
当前文件中的移动
u # 撤消
<ctrl-r> # 重做
动作命令
w b e ge # 对单词 动作的移动程度和方向
W B E gE # 对字串 动作的移动程度和方向
* 和 #符号 # 匹配光标当前的所有单词
% # 匹配括号移动
f+ # 查找当前行的下一个'+'字符,定位到'+' F上一个
t+ # 查找当前行的下一个'+'字符,定位到'+'的上一个字符 T上一个
3fa → 在当前行查找第三个出现的a
; # 重复
, # 退回
yaw yt, f,dt. d/ge<CR> # 查找动作告诉d操作符删除什么
#Vim的文本对象由两个字符组成,第一个字符永远是i或a.文本对象自身并不是动作命令,不能用它们在文档中移动
# 但我们却可以在可视化及操作符待决模式中使用文本对象
#操作分隔符的文本对象 m{a-zA-Z}要在其内部
a)==ab a}==aB at#一对XML标签 it #XML标签内部
vi) ci)
# 操作文本块的文本对象
daw ciw
# 设置位置标记
m{a-zA-Z}#小写每个缓冲区局部可见,大写全局可见
mm `m
# Vim的自动位置标记
'' # 当前文件中上次跳转动作之前的位置
'. # 上次修改过的地方
'^ # 插入
'[ # 上次修改或复制的起始位置
'] # 结束
'< # 高亮选区
'> # 结束
# 括号间的跳转
%
# 当不同文件之间的移动和跳转
任何改变当前窗口中活动文件的命令,都可以称为跳转命令
Vim会把执行跳转命令之前和之后的光标位置,记录到跳转列表中
'<ff>'
@: # 重复上次的Ex命令
:s%/old/new/g # 替换
1<ctrl-a> # 对当前行的一下数字加1 1<ctrl-x>:减一
# 重绘屏幕
zz #把当前行显示在窗口正中
<ctrl-d>(D) # 向下滚屏
<ctrl-u>(U) # 上
H/M/L # 跳到屏幕最上,中,下方
# 可视化模式
v
# 命令行模式
:
# 命令行窗口
q:
# 替换模式
R gR
r{char} gr{char} # 覆盖一个字符之后,马上又回到普通模式
#特别一点
ga #查看任意字符的编码 分别以10,16,8进制的形式显示其字符编码
J将下面的一整行,都提到光标行的末尾
<ctrl-g> # 显示当前文件文件名及状态
寄存器
# Vim操作的是寄存器,而并非剪贴板
# "{register}前缀的方式指定要用的寄存器,若不指明则使用无名寄存器
"ayiw "bdd ""yiw "+yy:delete c # 分别 对应寄存器a,b,",c中
"ap "bp ""p :put c # 对应的复制
# x,s,d,c,y,p命令都会覆盖无名寄存器
# 无名寄存器("") ""p==p
yaw daw "0p
# 有名寄存器("a-"z)
# 黑洞寄存器("_)
# 复制专用寄存器("0) y命令不仅会被拷贝到无名寄存器中,还拷贝到复制专用寄存器中
# ubuntu 和mint默认安装的vim是不支持系统剪切、粘贴版的
sudo apt-get install -y vim-gnome
# 对于非GUI版本的vim,剪切板是不可用的,解决方案很简单,安装一下就是了:
sudo apt-get install gvim
# 系统剪贴板("+)
# 将系统剪贴板的内容粘贴到Vim内部
"+p # 插入模式下<ctrl-r>+,",a,0
# 将Vim的文本捕获到系统剪贴板
"+yy
"%p # "%当前文件名
".p # ".上次插入的文本
# 只读(read-only)寄存器:
":,分别缓存最近命令
".,最近插入文本
"%,当前文件名
"#,当前交替文件名
# 代换单词
yiw jww ve p
yiw jww ciw<ctrl-r>0<Esc>
宏:在录制一个宏时,要确保每条命令都可被重复执行,同时禁止使用鼠标
而且当动作命令(j,n)停止时,宏将中止运行
#打任意数目的按键操作录制到寄存器,用于之后的回放
# 把命令序列录制成宏
qa #录制宏的开始 q{register},从而指定一个用于保存宏的寄存器
A;<Esc>
Ivar <Esc>
q # 停止宏录制
j @a j@@
:reg a # 查看寄存器的内容
@a # @{register} 执行指定寄存器的内容,
@@ # 重复最近高过的宏
10@a # 加次数回放宏 .命令不能执行次数
f+ s_+_<Esc> qq;.q 22@q
# 串行的运行宏 j :next
10@a # 加次数回放宏 .命令不能执行次数
# 并行的运行宏
:'<,'>normal @a # 单个文件的多行并行运行宏
:args *.py # 建立目标文件列表
:edit!
:argdo normal @a
# 当在多个文件中 进行并行运行宏时,执行宏一旦失败,不方便找到到底哪个失败了
:wall
# 给宏追加命令
qA # Vim会录制按键操作,但会把它们附加到寄存器a原有的内容之后
# 编辑宏
:put a # 将宏复制到缓冲区,当前光标的下方,而 "ap 复制到当前光标之后
# 在缓冲区进行对宏的编辑
0 "ay$ dd # 将宏从缓冲区复制回寄存器
插入模式
<ctrl-h>
<ctrl-w>
<ctrl-u> # 都是删除操作
# 插入-普通模式
<ctrl-o> #切换到插入-普通模式,在此后可执行一条普通模式下的命令后,再回到插入模式
<ctrl-o>zz #
# 复制专用寄存器("0) y命令不仅会被拷贝到无名寄存器中,还拷贝到复制专用寄存器中
<ctrl-r>0 # 0就是寄存器的名字 在命令行中yaw,默认寄存器的名字是0
<ctrl-r><ctrl-p>0 # 它会按原义插入寄存器内的文本,并修正任何不必要的缩进
<ctrl-r>=9*9<CR> # 表达式寄存器 <ctrl-r>=
<C-p>或是<C-n>,自动补齐功
<ctrl-v>065 # A用字符编码插入字符,vim所接受的字符编码共包含3位数
<ctrl-v>u00bf # 编码超过3位的,可以用4位16进制编码来输入
<ctrl-v><Tab> # 如果后面跟一个非数字键,它会插入这个键本身所代表的字符
可视模式
v V <ctrl-v>
o # 切换高亮选区的活动端
gv # 重选上次的高亮选区
yyp-->Vr# # ####横编排
<ctrl-v>3j$ #竖编排
= # 自动给缩进
命令行(EX命令)
@: # 在普通模式下执行 重复上次的Ex命令
/
<ctrl-r>= # 访问表达式寄存器也会激活命令行模式
# 有些命令可以在插入和命令行模式下通用
<ctrl-r>0 #复制寄存器的内容
<ctrl-h>
<ctrl-w>
<ctrl-u> # 都是删除操作
/the/
?the?
:1,$ == :% # 整个文件
:. # 光标所有行
:0 #虚拟行 位于文件第一行上方
# 删除行
:3d == 3G+dd
:.d # 删除当前行
# 复制行t,移动行m
:6t. # :[range]t{address} 把第六行复制到当前行下方
:t6 当前 第六行
:t. == yyp
:'<,'>t$ # 将高亮选区的内容复制到文本结尾处
A;
:'<,'>normal . == :'<,'>normal A; # 对高亮选区中的每一行,对其执行普通模式下的 . 命令.
# 自动补全Ex命令
<ctrl-d> <Tab> <Shfit-Tab>
:colors<Tab>
:colorscheme <Tab>
# 把当前光标的单词插入到命令行
<ctrl-r><ctrl-w>
# 把当前光标的字串插入到命令行
<ctrl-r><ctrl-a>
# 命令行窗口,就像一个常规的Vim缓冲区,只不过它的内容都对应着命令历史中的一个条目
q: # 打开Ex 命令历史 k j键进行移动 ,<CR>将会把当前行的内容当成Ex命令执行
q/ # 打开查找
:q #关闭命令行窗口 像操作普通Vim窗口一样 其它的操作也可以
<ctrl-f> # 从命令行模式切换到命令行窗口
# 运行shell
:!{cmd} # 执行一次性命令
:shell # 启动一个交互的shell会话 exit # 退出此shell并返回Vim
# 也可以在普通模式下 <ctrl-z>挂起Vim进程,$jobs $fg [作业号]
:read !{cmd} # 将标准输出插入到光标下方
:[range]write !{cmd} # 将range(默认是整个文件)每行内容,作为此命令的输入
:%!sort -t ',' -k 2 # 以逗号分隔,按第二个字段进行排序
:tabnew # 创建新标签页
:split 文件路径 #分割窗口,如果不指定文件路径,默认是分割本文件
:set ignorecase #查找单词时需要忽略大小写
:set hlsearch # 可以将查找的内容设置成高亮
:set history=200 #设置保存命令的条数
参数列表(vi的一个功能)是缓冲区列表(Vim增加的功能)的强力补充
vim vim_grammar.md linux.md
:ls #缓冲区列表 %哪个缓冲区在当前容器中可见 #代表轮换文件<ctrl-^>进行快速切换
# Vim是用缓冲区列表对打开的文件进行管理的
# 选择缓冲区
:buffer N/bufname # N是Vim自动分配的编号由上面的命令行得知 bufname是文件名
:bprev
:bnext
:bfirst
:blast
#退出(保存)所有的缓冲区
:qall!
:wall
# 删除缓冲区
:bdelete N1 N2
# 用参数列表将缓冲区分组
# 查看参数列表
:args
:args *.py # 建立目标文件列表
#如果活动缓冲区的内容发生了变化,Vim会在离开缓冲区时自动将其设为隐藏(默认会有错误信息'文件已修改但未保存')
#'hidden'设置让我们用一条;argdo {cmd}或 bufdo{cmd}命令就可以修改一组缓冲区.
分割窗口
# 创建分割窗口
<ctrl-w>s
<ctrl-w>v
:sp[lit] {file} #载入新文件
:vsp[lit] {file}
# 关闭窗口
<ctrl-w>c #关闭活动窗口 :clo[se]
<ctrl-w>o #保存活动容器,关闭其它所有窗口 :on[ly]
# 切换窗口
<ctrl-w>w # 窗口循环切换
<ctrl-w>h j k l
#改变窗口
<ctrl-w>=
[N]<ctrl-w>_ # 最大化高度
[N]<ctrl-w>| # 宽度
[N]<ctrl-w>< # >
在Vim中,标签页是可以容纳一系列窗口的容器口
:tabnew # 创建新标签页
:tabe[dit] {filename} # 在新标签页打开{filename} 如果没有指定文件,会建立一个新标签页,里面包含一个空缓冲区
:<ctrl-w>T #当标签页中包含了不只一个窗口时,用此命令 把当前窗口移到一个新标签页
:tabc[lose] # 关闭当前所有标签页的窗口
:tabo[nly] # 关闭其它
[N]gt # 下 :tabn[ext]
[N]gT # 切换到上一标签页 :tabp[revious]
打开文件
#Vim也有工作目录的概念,这各bash及其他shell是一样的
#相对于活动文件目录下打开一个文件
:edit %:h<Tab> # %代表活动缓冲区的完整文件路径 :h修饰符会去除文件名 也就是此命令会被展开为当前文件所有目录的路径
:set path+=app/** # 匹配app/目录下所有子目录
:find 文件名
# netrw管理文件系统
# 打开文件管理器
$ vim .
:edit %:h ==:e . ==:Explore ==:E
# 上面的操作都会代替当前的缓冲区内容
# 当要保存到不存在的目录中时
:!mkdir -p %:h #-p创建任何不存在的中间目录
# 我们可以把任务委派给一个以sudo运行的shell进程,来完成工作
:w !sudo tee % >/dev/null # :w将缓冲区的内容作为sudo tee的标准输入,%是当前文件
# 此时Vim会检测到该文件被一个外部程序改了,所以Vim会提示我们做出选择,是保留缓冲区的还是载入磁盘上的版本
vim对于ctage的支持,
1.我们可以快速地跳到到函数及类的定义之处,实现浏览整个代码库的目的.(基于标签的跳转)
2.用于建立自动补全的单词列表
安装和运行ctage
sudo apt-get install exuberant-ctags
sudo apt install linuxbrew-wrapper
# 检测系统是否安装了ctags以及路径正确与否
brew install ctags
ctags --help
用ctags创建代码库的索引
# 手动创建索引
cd ~/app1.6
ctags -R *
# 应该可以用!cd /home/python/app1.6 && ctags -R *
# Linux下的C/C++的程序员,使用VIM+Ctags的组合来写程序也许是最佳的选择
# 好像没有递归子目录,所以为子目录创建索引
cd main && ctags -R *
cd ../app1.6 #必须要cd到此目录或者 main目录下,可由 :set tags 查看
vim runner
# 这样本地的所有代码,都正确的创建了索引,但源代码还是没有办法创建索引
:tabnew /home/python/app1.6/runner.py
:set tags?
<ctrl-]> # 会从当前所在的关键字跳转到它的定义处 ,
g<ctrl-]>
<ctrl-t> # 充当着后退按钮