视频教程:https://www.imooc.com/learn/1129
操作手册:https://www.runoob.com/linux/linux-vim.html
学习笔记参考:https://blog.csdn.net/wy_hhxx/article/details/93802227
目录
一、vim操作
1. 工作模式
2. Vim插入模式小技巧
3. Vim快速移动大法(normal模式)
4. Vim快速增删改查
5. Vim搜索替换命令
6. Vim多文件操作
7. Vim的文本对象
8. Vim复制粘贴与寄存器的使用
9. Vim使用宏(macro)完成批量操作
10. Vim的补全类型
11. Vim更换配色
二、编写vim配置
1. 如何编写自己的vim配置文件?
2. Vim映射
Windows环境可以下载Gvim。
输入vim进入 vim,可以看到版本信息和基本的帮助信息。Crtl + L 清屏。
type :q
type :help
type :help version7
vim的模式:普通模式(Normal)、插入模式(Insert)、命令模式(Command)、可视化模式(Vision)
Normal -> Insert:
Insert->Normal: ESC
Normal模式 -> Command模式,普通模式下输入“:”之后执行命令,例如,
:wq 保存退出
:vs 垂直分屏 vertical split
:sp 横向分屏 split
:%s/oldstr/newstr/g 全局替换
:set nu 显示行号
:set nonu 取消行号
:syntax on 语法高亮
:set hls 高亮搜索
:set incsearch 增量搜索
ZZ vim命令模式下快捷键保存并退出
编辑一个文件过程中想放弃编辑不用:wq!退出再进入,使用 :e! 重新加载即可
Normal模式 -> Visual模式 普通模式下使用v进行visual选择
Visual模式一般用来块状选择文本
删除(以下命令也适用于终端下。)
Ctrl + h 删除上一个字符
Ctrl + w 删除上一个单词 #光标如果在单词中间会从光标处删到该单词开头
Ctrl + u 删除当前行
Insert 快速切到Normal模式
使用Ctrl + c或者 Ctrl + [代替ESC,但Ctrl + c可能会中断某些插件
Normal 快速进入Insert模式
按住gi快速跳转到你最后一次编辑的地方并进入插入模式
上下左右,推荐用 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}移动到char的前一个字符,大写的T表示反过向前搜索,移动到char后一个字符
可以用分号(;)/逗号(,)继续搜该行下一个/上一个
Vim水平移动
0移动到行首第一个字符,^移动到行首第一个非空白字符(可以用0w代替)
$移动到行尾,g_移动到行尾非空白字符
Vim垂直移动(不常用)
使用括号()在句子间移动,可以用:help(来查看帮助
使用{}在段落间移动
插件章节会说如何用easy-motion插件移动,这些命令都不用记忆了
Vim页面移动
gg/G移动到文件的开头和结尾,可以使用Ctrl + o快速返回(可连续返回)
H/M/L跳转到屏幕的开头(Head)、中间(Middle)和结尾(Lower)
Ctrl + u/Ctrl + f 上下翻页(upword/forword)
zz把当前行(光标所在位置)放到屏幕中间
Vim删除
Vim在Normal模式下,
x 删除光标处字符,4x 删除4个字符
dw/daw(delete around word) 删除光标所在单词,以及周围的空格
diw 不会删除单词周围的空格
dd 删除当前行,5dd 删除5行
d$ 快速删除到行尾
d0 删除到行首
dt{char} 删除光标直到{char}处,例子如下
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 把当前单词删掉并进入插入模式,可以用来改一个单词
C 整行删除并进入插入模式
Vim查询
使用/或?进行前向或者反向搜索
使用n/N跳转到下一个或者上一个匹配
使用*或者#进行光标所在单词的向前和向后匹配 # 得在查询时才能这样用
:set hls 高亮显示
:set incsearch 增量搜索
用途:代码中命名错误、重构代码
substitute命令可以查找并替换文本,并且支持正则表达式,使用方法如下,
:[range]s[ubstitute]/{pattern}/{string}/[flags]
g (global)表示全局范围内执行
c (confirm) 表示确认,可以确认或者拒绝修改
n (number) 报告匹配的次数而不替换,可以用来查询匹配次数
例子(左侧为行号)
class Duck:
def __init__(this,name):
this.name = name
def quack(this):
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"
使用<>正则表达式精确匹配单词
:% s/\<quack\>/gua/g
三个概念:
Buffer(缓冲区)
Vim打开一个文件后会加载文件内容到缓冲区,修改是针对内存中的缓冲区,执行:w 的时候会把修改内容写入文件
:ls 列举当前缓冲区
:b n 跳转到第n个缓冲区
:bpre :bnext :bfirst :blast
:b buffer_name/文件名加上tab补全来跳转
:e b.txt 在当前缓冲区再打开一个文件,比如已经打开了a.txt ,想打开b.txt
vim a.txt b.txt -O 加大写O,两个窗口打开文件
Window(窗口)
窗口是可视化的分割区域,
一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同缓冲区(即多个窗口可以打开一个文件或不同文件)。不同窗口编辑同一个文件,会对其它相同文件窗口生效(使用的是同一个缓冲区)
切换窗口
窗口移动
重排窗口(:h window-resize 查看文档)
[N]
[N]
Tab(标签页)
Tab是可以容纳一系列窗口的容器 :h tabpage 查看文档,比如一个Tab用来编辑JS文件,一个Tab用来编辑HTML文件
使用不多,简单了解下常用操作就好
:tabe[dit] {filename}或:tabnew {filename} 在新标签页打开{filename}
:tabc[lose] 关闭当前标签页及其中的所有窗口
:tabo[nly] 只保留活动标签页,关闭所有其他标签页
:tab[ext] {N}或{N}gt 切换到编号为{N}的标签页
:tabn[ext]或gt 切换到下一标签页
:tabp[revious]或gT 切换到上一标签页
操作方式:[number]
例子:
daw 删除一个单词
3dw 删除三个单词
vaw 选中一个单词(around word)
viw 选中一个单词不包含两边空白区域(inner word)
caw 删除一个单词(光标所在单词)并进入插入模式
vi” 选中双引号内的内容
ci" 删除双引号里的内容 ci+" 并进入插入模式 (删除d、复制y、选中v同理)
ci{ 删除{}里的内容
ci+( 删除()里的内容
Normal模式复制粘贴
选中 v(visual)
复制 y(yank)
粘贴 p(put)
剪切 d(delete),剪贴dp
yy 复制一行
yiw 复制一个单词
Insert模式下的复制粘贴
: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的内容复制到别的地方需要系统剪贴板
1. 首先确认vim有没有clipboard(系统剪贴板)
:echo has('clipboard') 输出是1则支持这个特性
如果输出是0,说明vim的版本里没有系统剪贴板,这个时候需要装一个vim-gtk
例如,sudo apt-get install vim-gtk
2. 从vim复制到系统剪贴板
3. 从系统别的地方(编辑器、网页等)复制了内容,
编辑一个文件过程中想放弃编辑不用:wq!退出再进入,使用 :e! 重新加载即可
宏可以看成是一系列命令的集合。我们可以使用宏“录制”一系列操作,然后用于“回放”。宏可以非常方便地把一系列命令用在多行文本上
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" 回车 所有行都加上后双引号了
#命令行模式 :
常见的三种补全类型
使用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 插入当前文件名全路径
:colorschema 显示当前的主题颜色,默认是default
:colorschema
:colorschema 配色名 修改配色
也可以从网上下载配色,比如hybrid配色
git clone https://github.com/w0ng/vim-hybird.git
mkdir .vim/colors
cp vim-hybird/colors/hybird.vim ./.vim/colors
建议初学者从裸的Vim开始
可以在IDE上安装vim插件
然后就可以自定义自己的配置(normal模式),设置的内容包括
让vimrc生效:
-h options 可以找到所有设置
Vim有自己的脚本语言vimscript,可以通过它来实现更多对vim的控制。
网上很多开源的配置,可以直接拿来用
Vim映射就是把一个操作映射到另一个操作
基本模式:在normal模式下的映射
:map – x 使用-替代x
:map
:map
:unmap - 取消映射
nmap/vmap/imap定义映射只在normal/visual/insert模式下分别有效
:vmap \ U 在Visual模式U/u转换大小写,用\下
:imap
重复映射的话,会继续解释,直到最后一个。有递归风险。按下\会删除一行
:nmap – dd
:nmap \ -
如果安装了一个插件,插件映射了同一个按键的不同行为,有冲突就会导致一个失效。
非递归映射,这些命令不会递归解释
nnoremap/vnoremap/inoremap
尽量都使用非递归映射,以避免冲突
进阶:《笨方法学vimscript》