回忆一下迄今为止,自己常用的vim功能:
插入用i,删除经常进入插入模式然后按退格(==)
普通模式下字符删除用x,行删除用dd,赋值yy,粘贴p
命令模式下设置行号(:set number),全局查找(:%s/str/newstr/g)
真的得好好反思了,了解过不少技巧,但因为没有积极去使用也就忘了。
“vim靠的是肌肉记忆”,多多使用才能提高效率,为成为vim大佬努力吧(误)。
本文大部分内容是看这个视频教程整理的 -> 玩转Vim 从放弃到爱不释手 https://www.imooc.com/learn/1129
===================================================================================
Windows环境可以下载Gvim。本文是基于在Linux上使用Vim~
输入vim进入 vim,可以看到版本信息和基本的帮助信息。Crtl + L 清屏。
type :q
type :help
type :help version7
vim的模式:普通模式、插入模式、命令模式、可视化模式
Normal模式 -> Insert模式
小写 i (insert) 当前字母前面插入 | 大写 I 行首插入
小写 a (append) 当前字母后面插入 | 大写 A行末插入
小写 o (open a line below) 当前行下方插入空行并进入插入模式 | 大写 O当前行上方插入空行并进入插入模式
小写 s (substitute) 删除当前字符并进入插入模式 | 大写 S删除当前行并进入插入模式 (注意会有删除操作)
Insert模式 -> Normal模式 按ESC
为什么vim默认是普通模式?因为大部分情况下是在浏览而不是编辑
Normal模式 -> Command模式,普通模式下输入“:”之后执行命令,例如,
:wq 保存退出
:vs 垂直分屏 vertical split
:sp 横向分屏 split
:%s/oldstr/newstr/g 全局替换
:syntax on 语法高亮
:set hls 高亮搜索
:set incsearch 增量搜索
Normal模式 -> Visual模式 普通模式下使用v进行visual选择,例如
选择 普通模式 按v,左下角变成VISUAL,光标往右移动(会选中一段区域),eg:按d或x删除
选择行 大V整行选中,使用上下方向键,eg:按d或x删除
选择块 Ctrl + v 配合方向键可以选择一块区域,eg:按d或x删除
Vim插入模式小技巧
Ctrl + h 删除上一个字符
Ctrl + w 删除上一个单词 #光标如果在单词中间会从光标处删到该单词开头
Ctrl + u 删除当前行
在系统终端输入命令也可以使用以上快捷键,除此之外还有 Ctrl B往前移动 Ctrl F往后移动 Ctrl A移动到开头 Ctrl E移动到结尾
Insert 快速切到Normal模式
使用Ctrl + c代替ESC(但可能会中断某些插件)或者 Ctrl + [
Normal 快速进入Insert模式
按住gi快速跳转到你最后一次编辑的地方并进入插入模式
Vim快速移动(Normal模式)
上下左右,推荐用 h j k l
h (←) j (↓) k (↑) l (→)
提示:h的键位于左边,1的键位于右边,j键看起来很象一支尖端方向朝下的箭头。
单词间跳转
w/W移到下一个word/WORD开头
e/E移动到下一个word/WORD结尾 # 首次执行,若光标不在当前单词结尾,则会跳到本单词结尾
b/B回到上一个word/WORD开头 # 首次执行,若光标不在当前单词开头,则会跳到本单词开头
其中 word -以非空白符分割的单词,WORD -以空白符分割的单词
例如,光标在如下"p"的位置,下一个word是是第一个gua,下一个WORD是第二个gua
def quack(self):
print("gua gua")
行间搜索移动
f{char}可以移动到char字符上,大写的F表示反过来搜前面的字符
t移动到char的前一个字符,大写的T表示反过向前搜索,移动到char的后一个字符
可以用分号/逗号继续搜该行下一个/上一个
Vim水平移动
0移动到行首第一个字符,^移动到行首第一个非空白字符(可以用0w代替)
$移动到行尾
Vim页面移动
gg/G移动到文件的开头和结尾,可以使用Ctrl + o快速返回(可连续返回)
H/M/L跳转到屏幕的开头(Head)、中间(Middle)和结尾(Lower)
Ctrl + u/Ctrl + f 上下翻页(upword/forword)
zz把当前行(光标所在位置)放到屏幕中间
Vim快速增删改查
Vim删除
Vim在Normal模式下,
x 删除光标处字符
4x 删除4个字符
dw/daw(d around word) 删除光标所在单词
diw 不会删除单词周围的空格
dd 删除当前行
5dd 删除5行
d$ 快速删除到行尾
d0 删除到行首
def quack(self):
print("gua gua")
dt) delete till ")" 光标位于左括号可以删除括号里的内容
配合visual模式,选中,按x或d删除
Vim后悔药
u (undo)表示撤销最后一次修改 #可以连续用
U 表示撤销对整行的修改 #只能用一次,再用旧是恢复撤销的内容,二者不断切换
Ctrl + r 恢复撤销的内容 #可以连续用
Vim修改(一般是删除之后改成我们期望的文本)
r(replace),c(change),s(substitute)
Normal模式下用r可以替换一个字符,s删除字符并进入插入模式
ra 光标字符变成a
R 会不断替换后面的字符 # 右下角会出现 "-- REPLACE --"
4s 删4个字符并进入插入模式
S 整行删除并进入插入模式
caw 把当前单词删掉并进入插入模式,可以用来改一个单词
def quack(self):
print("gua gua")
ct" 光标在前双引号则删除双引号间内容并进入插入模式
Vim查询
使用/或?进行前向或者反向搜索
使用n/N跳转到下一个或者上一个匹配
使用*或者#进行光标所在单词的向前和向后匹配 # 得在查询时才能这样用
Vim替换命令
用途:代码中命名错误、重构代码
substitute命令可以查找并替换文本,并且支持正则表达式,使用方法如下,
:[range]s[ubstitute]/{pattern}/{string}/[flags]
range 表示范围,例如:10,20表示10-20行,%表示全部
pattern 是要替换的模式,string是替换后的文本
flags常用标志:
g (global)表示全局范围内执行
c (confirm) 表示确认,可以确认或者拒绝修改
n (number) 报告匹配的次数而不替换,可以用来查询匹配次数
例子(左侧为行号)
1 class Duck:
2 def __init__(this,name):
3 this.name = name
4
5 def quack(this):
6 print("gua gua")
…
仅把Duck类中的self换成this,先用:set numbers 显示行号看一下范围
:1,6 s/self/this/g
仅统计1-6行self的匹配次数
:1,6 s/self//n 下方显示 "3matches on 3 lines"
正则表达式精确匹配quack方法,使用<>
:% s/\
Vim多文件操作
三个概念:
Buffer是指打开的一个文件的内存缓冲区(一个Buffer对应一个文件)
窗口是Buffer可视化的分割区域(一个窗口展示一个Buffer,一个Buffer可同时被多个窗口展示)
Tab可以组织窗口为一个工作区(给窗口分组)
Buffer(缓冲区)
Vim打开一个文件后会加载文件内容到缓冲区,修改是针对内存中的缓冲区,执行 :w 的时候会把修改内容写入文件
已经打开了一个文件 a.txt 想打开另一个文件b.txt可以执行 :e b.txt
vim a.txt b.txt -O 加大写O,两个窗口打开文件
buffer之间切换,首先使用 :ls 会列举当前缓冲区,
- (非活动的缓冲区)
a (激活缓冲区) # 指光标所在的缓冲区
h (隐藏的缓冲区)
% (当前的缓冲区) # 是指当前窗口可见的缓冲区,因为可以分割窗口,可能有多个
# (交换缓冲区) # 代表轮换文件。用Ctrl + ^在当前文件和轮换文件间快速切换
= (只读缓冲区)
+ (已经更改的缓冲区)
例1:打开一个文件a.txt
vim a.txt
:vs #垂直分割
:ls #看到现在只有一个buffer,%代表窗口中可见,a代表光标在此
例2:同时打开 a.txt 和 b.txt
vim a.txt b.txt -O
:ls #看到现在有两个buffer,a.txt激活且窗口可见,b.txt窗口可见
例3:在例2的基础上打开c.txt
:e c.txt
:ls #现在有三个buffer,c.txt是在之前a.txt的窗口打开的,现在左边窗口的c.txt激活可见。a.txt作为交换缓冲区,按下Ctrl + ^ 左边窗口显示的就是 a.txt了。
1):b n 跳转到第n个缓冲区
2):bpre :bnext :bfirst :blast 去前一个/后一个/第一个/最后一个缓冲区
3):b buffer_name (可用Tab补全)
Window(窗口)
窗口是可视化的分割区域,
一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同缓冲区(即多个窗口可以打开一个文件或不同文件)
不同窗口编辑同一个文件,会对其它相同文件窗口生效(使用的是同一个缓冲区)
切换窗口
窗口移动
重排窗口(:h window-resize 查看文档)
[N]
[N]
Tab(标签页)
Tab是可以容纳一系列窗口的容器 :h tabpage 查看文档,比如一个Tab用来编辑JS文件,一个Tab用来编辑HTML文件
Vim的文本对象
操作方式:[number]
number 次数
command 命令,d(delete),c(change),y(yank)
text object 要操作的文本对象,比如单词w,句子s,段落p
例子:
daw 删除一个单词
3dw 删除三个单词
vaw 选中一个单词
viw 选中一个单词不包含两边空白区域
caw 删除一个单词(光标所在单词)并进入插入模式
ci+" 删除双引号里的内容 ci+" 并进入插入模式 (删除d、复制y、选中v同理)
ci+{ 删除{}里的内容
ci+( 删除()里的内容
Vim复制粘贴与寄存器的使用
Normal模式复制粘贴
选中 v(visual)
复制 y(yank)
粘贴 p(put)
剪切 d(delete),剪贴dp
Insert模式下的复制粘贴
很多人在vimrc中设置了autoindent(可持久化,手动设置:set autoindent),粘贴python等代码缩进错乱
解决:粘贴前:set paste,(但这样编辑时回车就没有自动缩进了,所以)粘贴后再执行:set nopaste
Vim寄存器
Vim里操作的是寄存器而不是系统剪切板
默认我们使用d删除或者y复制的内容都放到了“无名寄存器”
用x删除一个字符放到无名寄存器,然后p粘贴,可以调换俩字符(例如,检查代码发现单词中两个字母写反了)
通过 "{register} 前缀可以指定寄存器,不指定则默认用无名寄存器
"ayiw 复制一个单词到寄存器a中
"bdd 删除/剪切当前行到寄存器b中
:reg a 查看寄存器a中的内容
:call setreg('a', '') 清空寄存器a的内容
常见寄存器
"" 无名寄存器,缺省使用,""p等同于p
"a等 有名寄存器a-z
"0 复制专用寄存器,使用y复制文本同时会被拷贝到复制寄存器0
"+ 系统剪贴板,可以在复制前加上 "+ 复制到系统剪贴板
"% 当前文件名
". 上次插入的文本
vim的内容复制到别的地方需要系统剪贴板
首先确认vim有没有clipboard
:echo has('clipboard') 输出是1则支持这个特性
如果输出是0,说明vim的版本里没有系统剪贴板,这个时候需要装一个vim-gtk
例如,sudo apt-get install vim-gtk
如果 想直接复制粘贴系统剪贴板内容,可以这样设置
:set clipboard=unnamed
从系统别的地方(编辑器、网页等)复制了内容,Insert模式下按 "Ctrl r +" 粘贴到vim
编辑一个文件过程中想放弃编辑不用:wq!退出再进入,使用 :e! 重新加载即可
Vim使用宏(macro)完成批量操作
宏可以看成是一系列命令的集合
我们可以使用宏“录制”一系列操作,然后用于“回放”
宏可以非常方便地把一系列命令用在多行文本上
Normal模式使用q录制,同时也是使用q结束录制
使用q{register}选择要保存的寄存器,把录制的命令保存在其中
使用@{register}回放寄存器中保存的一系列命令
例子:给多行url链接加上双引号(变成python中可以使用的字符串)
方法一:先使用q开始录制,给一行加上双引号,之后使用q退出;在剩下的所有行中回放录制的宏
录制 -->
qa #开始录制,保存在寄存器a(左下角出现recording @a)
I -> 加上前双引号 -> ESC #在行首插入双引号
A -> 加上后双引号 -> ESC #在行尾巴插入双引号
q #结束录制(左下角recording @a 消失)
回放 -->
1)一行行回放
j #到下一行
@a #回放寄存器a中的录制的操作
2)全篇回放
V #大V选中一行(左下角变成 --VISUAL LINE--)
G #选中行一直到结尾,即全选
: #进入命令行模式(左下角变为 :'<,'> )
normal @a #命令行模式下输入该命令,回车完成全部修改
方法二:也可以不使用宏
打开文件,V G 全选
:normal I" 回车 所有行都加上前双引号了 #命令行模式使用Normal模式命令
:normal A" 回车 所有行都加上后双引号了 #命令行模式 :
Vim常见的三种补全类型
使用Ctrl + n 和 Ctrl + p 补全单词
使用Ctrl + x 和 Ctrl + f 补全文件名
使用Ctrl + x 和 Ctrl + o 补全代码,需要开启文件类型检查、安装插件
:filetype on
:set filetype #返回filetype=python
补全单词例子:
(1)
class Man:
def __init__(self,name):
self.name = name
self.print # Ctrl + n
(2)
self.name = __ # Ctrl + n 出现__main__和__init__ ,可以使用Ctrl + n(next)和 Ctrl + p(previous)进行上下选择
:r! echo% 输入当前文件名
:r! echo%:p 输入当前文件名全路径
Vim更换配色
:colorschema 显示当前的主题颜色,默认是default
:colorschema
:colorschema 配色名 修改配色
(The End)
参考资料:https://www.imooc.com/learn/1129 第2章