视频教程:https://www.imooc.com/learn/1129
操作手册:https://www.runoob.com/linux/linux-vim.html
学习笔记参考:https://blog.youkuaiyun.com/wy_hhxx/article/details/93802227
目录
一、vim操作
Windows环境可以下载Gvim。
输入vim进入 vim,可以看到版本信息和基本的帮助信息。Crtl + L 清屏。
type :q<Enter> to exit
type :help<Enter> or <F1> for on-line help
type :help version7<Enter> for version info
1. 工作模式
vim的模式:普通模式(Normal)、插入模式(Insert)、命令模式(Command)、可视化模式(Vision)
Normal -> Insert:
- i(insert) 在当前字母插入; I 在当前行第一个非空格字母前插入
- a(append)在字母后面插入; A在当前行最后一个字母后插入
- o(open a line below)在当前行下方插入空行; O在当前行上方插入空行
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选择
- 选择 普通模式 按v,左下角变成VISUAL,光标往右移动(会选中一段区域),eg:按d或x删除
- 选择行 大V整行选中,使用上下方向键,eg:按d或x删除
- 选择块 Ctrl + v 配合方向键可以选择一块区域,eg:按d或x删除
Visual模式一般用来块状选择文本
2. Vim插入模式小技巧
删除(以下命令也适用于终端下。)
Ctrl + h 删除上一个字符
Ctrl + w 删除上一个单词 #光标如果在单词中间会从光标处删到该单词开头
Ctrl + u 删除当前行
Insert 快速切到Normal模式
使用Ctrl + c或者 Ctrl + [代替ESC,但Ctrl + c可能会中断某些插件
Normal 快速进入Insert模式
按住gi快速跳转到你最后一次编辑的地方并进入插入模式
3. 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}移动到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把当前行(光标所在位置)放到屏幕中间
4. Vim快速增删改查
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 增量搜索
5. Vim搜索替换命令
用途:代码中命名错误、重构代码
substitute命令可以查找并替换文本,并且支持正则表达式,使用方法如下,
:[range]s[ubstitute]/{pattern}/{string}/[flags]
- range 表示范围,例如:10,20表示10-20行,%表示全部
- 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
6. Vim多文件操作
三个概念:
- Buffer是指打开的一个文件的内存缓冲区(一个Buffer对应一个文件)
- 窗口是Buffer可视化的分割区域(一个窗口展示一个Buffer,一个Buffer可同时被多个窗口展示)
- Tab可以组织窗口为一个工作区(给窗口分组)
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(窗口)
窗口是可视化的分割区域,
<Ctrl + w>s 或 :sp 水平分割,
<Ctrl + w>v或 :vs 垂直分割
一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同缓冲区(即多个窗口可以打开一个文件或不同文件)。不同窗口编辑同一个文件,会对其它相同文件窗口生效(使用的是同一个缓冲区)
切换窗口
<Ctrl + w>w 在窗口间循环切换
<Ctrl + w>h 切换到左边的窗口
<Ctrl + w>j 切换到下边的窗口
<Ctrl + w>k 切换到上边的窗口
<Ctrl + w>l 切换到右边的窗口
窗口移动
<Ctrl + w>L 左边窗口移动到右边
<Ctrl + w>H 右边窗口移动到左边
重排窗口(:h window-resize 查看文档)
<Ctrl + w>= 使所有窗口等宽等高(默认)
<Ctrl + w>_ 最大化活动窗口高度
<Ctrl + w>| 最大化活动窗口宽度
[N]<Ctrl + w>_ 把活动窗口的高度设为N行
[N]<Ctrl + w>| 把活动窗口的宽度设为N列
Tab(标签页)
Tab是可以容纳一系列窗口的容器 :h tabpage 查看文档,比如一个Tab用来编辑JS文件,一个Tab用来编辑HTML文件
使用不多,简单了解下常用操作就好
:tabe[dit] {filename}或:tabnew {filename} 在新标签页打开{filename}
<C-w>T 把当前窗口移动到一个新的标签页
:tabc[lose] 关闭当前标签页及其中的所有窗口
:tabo[nly] 只保留活动标签页,关闭所有其他标签页
:tab[ext] {N}或{N}gt 切换到编号为{N}的标签页
:tabn[ext]或gt 切换到下一标签页
:tabp[revious]或gT 切换到上一标签页
7. Vim的文本对象
操作方式:[number]<command>[text object]
- number 次数
- command 命令,d(delete),c(change),y(yank)复制
- text object 要操作的文本对象,比如单词w,句子s,段落p
例子:
daw 删除一个单词
3dw 删除三个单词
vaw 选中一个单词(around word)
viw 选中一个单词不包含两边空白区域(inner word)
caw 删除一个单词(光标所在单词)并进入插入模式
vi” 选中双引号内的内容
ci" 删除双引号里的内容 ci+" 并进入插入模式 (删除d、复制y、选中v同理)
ci{ 删除{}里的内容
ci+( 删除()里的内容
8. Vim复制粘贴与寄存器的使用
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复制到系统剪贴板
- “+y
- 或者:set clipboard=unnamed后按y
3. 从系统别的地方(编辑器、网页等)复制了内容,
- Insert模式下按 "Ctrl r +" 或”+p粘贴到vim
- 或者:set clipboard=unnamed后按p
编辑一个文件过程中想放弃编辑不用:wq!退出再进入,使用 :e! 重新加载即可
9. 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" 回车 所有行都加上后双引号了
#命令行模式 :<Ctrl + p>可以输入上一个命令
10. 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 插入当前文件名全路径
11. Vim更换配色
:colorschema 显示当前的主题颜色,默认是default
:colorschema <Ctrl + d> 显示所有配色
: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插件
二、编写vim配置
1. 如何编写自己的vim配置文件?
- Linux/Unix:新建一个隐藏文件 vim ~/.vimrc
- Windows系统:cim $MYVIMRC,通过环境变量编辑配置文件
然后就可以自定义自己的配置(normal模式),设置的内容包括
- 常用配置,比如set nu, colorscheme hybrid, set hlsearch, set pastetoggle=<F2> //按下F2,粘贴的时候就不会错行
- 常用的vim映射
- let mapleader=”,” //设置一下leader键,常用的为逗号或空格
- inoremap <leader>w <Esc>:w <cr> 在插入模式用,w代替了<Esc>:w
- inoremap jj <Esc> 用jj替代<Esc>
- 自定义的vmscript函数和插件的配置
- 通过插件来无限扩充vim功能
让vimrc生效:
- 重启vim;
- 或者在vimrc文件中:source ~/.vimrc
-h options 可以找到所有设置
Vim有自己的脚本语言vimscript,可以通过它来实现更多对vim的控制。
网上很多开源的配置,可以直接拿来用
2. Vim映射
Vim映射就是把一个操作映射到另一个操作
基本模式:在normal模式下的映射
- 使用map就可以实现映射。 不持久化,可以通过写到配置文件来持久化
:map – x 使用-替代x
:map <space> viw 使用space选中一个单词
:map <c-d> dd 使用ctrl+d就可以实现删除
:unmap - 取消映射
nmap/vmap/imap定义映射只在normal/visual/insert模式下分别有效
:vmap \ U 在Visual模式U/u转换大小写,用\下
:imap <c-d> <Esc>ddi 在insert模式下删除一行
重复映射的话,会继续解释,直到最后一个。有递归风险。按下\会删除一行
:nmap – dd
:nmap \ -
如果安装了一个插件,插件映射了同一个按键的不同行为,有冲突就会导致一个失效。
非递归映射,这些命令不会递归解释
nnoremap/vnoremap/inoremap
尽量都使用非递归映射,以避免冲突
进阶:《笨方法学vimscript》