laoazhang

laoazhang

An Open Web advocate and front-end engineer and back-end engineer, who loves everything mobile, and writes about HTML5, CSS, JS, TS, JAVA, PYTHON, tech events, gadgets, etc.

Twitter Facebook LinkedIn Instagram Github

玩转Vim

全局替换命令

% s/java/python/g

Normal(普通)

wq:保存并退出

w:保存

q:退出

q!:强制退出

w!:强制保存

gi:快速跳转到刚才插入的地方

Visual(可视)模式

Normal模式使用v进入visual模式选择

V选择行      Ctrl+v 进行方块选择

y:复制    p:粘贴    d:删除

移动

h:左    l:右    j:下    k:上

w/w:移动到下一个word/WORD开头

e/E:下一个word/WORD尾

b/B:回到上一个word/WORD开头,可以理解为backword

word:以非空白符分割的单词

WORD:以空白符分割的单词

# 查找移动

使用f{char} 可以移动到char字符上,t移动到char的前一个字符 

如果第一次没搜到,可以用分号(;)/逗号(,)继续搜该行下一个/上一个

F反过来搜索

# 水平移动
0移动到行首第一个字符,^移动到第一个非空白字符
$移动到行尾,g_移动到行尾非空白字符

# 垂直移动
在句子(sentence)和段落(paragraph)间移动(不常用)

使用()在句子间移动,你可以使用:hlep(来查看帮助
使用{}在段落之间移动
使用easy-motion插件移动,这些命令就都不用记忆了

# 页面移动
gg/G移动到文件开头和结尾,你可以使用ctrl+o快速返回
H/M/L跳转到屏幕的开头(Head),中间(Middle)和结尾(Lower)

Ctrl+u. ctrl+f. 上下翻页. (upword/forward)。zz把屏幕置为中间

# 快速删除
x 快速删除一个字符
d 配合文本对象,快速删除一个单词daw(d around word)
d 和x 可以搭配数据多次执行

# 恢复
u:恢复操作

# 快速修改
r(replace),c(change),s(substitute)
使用r可以替换一个字符。s替换并进入插入模式
使用c配合文本对象,可以快速进行修改

# vim 查询
使用/ 或者?进行前向或者反向搜索
使用n/N 跳转到下一个或者上一个匹配
使用* 或者 # 进行当前代词的前向和后向匹配

# 搜索替换
substitute 命令允许我们查找并且替换掉文本,并且支持正则式
:[range]s[ubstitute]/{pattern}/{string}/[flags]
range 表示范围 比如:10,20  表示10-20行, % 表示全部
pattern 是要替换的模式,string是替换后文本
Flags 表示替换的标志
	g(global)表示全局范围内执行
  c(confirm)表示确认,可以确认或者拒绝修改
	n(number)报告匹配到的次数而不替换,可以用来查询匹配次数 

# vim多文件操作
Buffer是指打开的一个文件的内存缓冲区
窗口是Buffer可视化的分割区域
Tab可以组织窗口为一个工作区

Buffer
	使用:ls 会列举当前缓冲区,然后使用:b n 跳转到第n个缓冲区
	:bpre :bnext :bfirst :blast
	或者使用:b buffer_name 加上tab补全来跳转

窗口
	一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同缓冲区
	<Ctrl+w>s水平分割 , <Ctrl+w>v 垂直分割。 或者:sp  和 :vs
	:e b.txt ,可以替换到另一个buffer
Tab
	类似于虚拟桌面
	操作命令
		:table[dit] {filename}  在新标签页中打开 {filename}
		:<C-w>T    把当前窗口移到一个新标签页
		:tabc[lose]   关闭当前标签页即其中的所有窗口
		:tabo[nly]    只保留活动标签页, 关闭所有其他标签页
	切换命令
			Ex命令           普通模式命令        用途
		:tabn[ext] {N}    {N}gt          切换到编号为{N}的标签页
		:tabn[ext]        gt             切换到下一标签页
		:tabp[revious]    gT             切换到上一标签页

ctrlp插件和nerdtree快速操作多个文件

# 复制 粘贴  
y(yank) 复制 和 p(put) 粘贴  ,剪贴 d 和 p
使用v(visual)命令选中所要复制的地方,然后使用p粘贴
配合文本对象: 比如使用yiw 复制一个单词,  yy 复制一行

# 重新加载当前文件,并且不保存
:e!

Insert(插入模式)

a/i/o之一进入插入模式

a:在光标之后

i:在光标之前

o:在光标下面另起一行

A:在光标这一行尾

I:在光标这一行首

O:在光标上面另起一行

ctrl+h:删除上一个字符,ctrl+w:删除上一个单词,ctrl+u:删除当前行
ctrl+a:快速移动到开头  ctrl+e:快速移动到结尾  ctrl+b:往前移  ctrl+f:往后移

快速切换Normal模式:设置快捷键  ctrl+[

# 粘贴
set autoindent 设置了缩进,粘贴进去的代码缩进有问题
解决:  :set paste   取消 :set nopaste 解决

Text Object(文本对象)

一个单词,一段句子,一个段落

[number]<command>[text object]
number 表示次数, command 是命令, d(elete) 表示删除,  c(hange) 表示替换, y(ank)表示复制
text object 是要操作的文本对象,比如单词w,  句子s,  段落p

寄存器

vim操作的是寄存器,

d删除或者y复制,内容都放到了”无名寄存器“

用x删除一个字符 放到无名寄存器,然后p粘贴,可以调换俩字符

通过"{register}前缀可以指定寄存器,不指定默认无名寄存器
比如使用 "ayiw 复制一个单词到寄存器a中,"bdd 删除当前行到寄存器b中

""表示无名寄存器,缺省使用。 "" p其实等同p

:reg a 查看寄存器a保存内容

有名寄存器a-z  
复制专用寄存器 "0 使用y复制文本同时会被拷到复制寄存器0
系统剪贴板 "+ 可以在复制前加上 "+ 复制到系统剪贴板
	echo has('clipboard') 输出1,则可以复制,否则不能
其他一些寄存器 比如 "% 当前文件名 , ".上次插入的文本

Vim宏(macro)

一系列命令的集合
可以用宏【录制】一系列操作,然后用于【回放】
宏可以方便地把一系列命令用在多行文本上

# 使用
使用q 进行录制,使用q结束录制
使用q{register}选择要保存的寄存器,把录制的命令保存其中
使用@{register}回放寄存器中保存的一系列命令

# 多行执行normal命令
normal @a

Vim补全

<Ctrl-n>                    普通关键字
<Ctrl-x><Ctrl-n>            当前缓冲区关键字
<Ctrl-x><Ctrl-j>            包含文件关键字
<Ctrl-x><Ctrl-x>            标签文件关键字
<Ctrl-x><Ctrl-k>            字典查找
<Ctrl-x><Ctrl-l>            整行补全
**<Ctrl-n><Ctrl-p>            单词补全**
**<Ctrl-x><Ctrl-f>            文件名补全**
**<Ctrl-x><Ctrl-o>            全能(0mni)补全,需要开启文件类型检查,安装插件**



comments powered by