vim_basic

〇、前言

汇总整理四篇文章,来学习掌握vim
(一)vim_plus :直接学习一款成熟的配置vimplus,快速上手
(二)vim_basic :巩固基础操作,无插件操作,加深理解vim思想 ◀◀◀
(三)vim_config :对配置文件vimrc进行解析说明,同时学习脚本语法
(四)vim_skills :高频操作技巧总结,通过一个个技巧掌握一系列操作

本文主要内容:

  • 常用vim无插件操作总结
  • 高频操作总结,最常用
  • 基础vim安装总结

一、基本操作

1.四种模式

  • 一般模式(–NORMAL–):
    普通模式,以下3个模式的切换也是在这里中转(按Esc回到normal);可移动光标、删除字符、复制粘贴
  • 插入模式(–INSERT–):
    可编辑,按下i I o O a A r R s S 均可进入此模式,编辑完成后,按Esc回到normal模式
i I是insert #进入插入模式,在光标所在字符前或光标所在行首插入(字符)
a A是append #进入插入模式,在光标所在字符后或光标所在行尾插入(字符)
o O是open   #进入插入模式,在光标所在行的下面或上面open一新行插入(字符)
s S 是substitute    #删除光标所在的字符或行,并开始插入(字符)
gi          #进入上次插入模式的位置,并处于插入模式
"r R不同于上面:执行完替换不在插入模式"
r R是replace    #替换光标所在的字符(替换完就 回到一般模式)或进入插入替代模式,将光标后面的字符都替换
  • 可视模式(–VISUAL–):
    可以进行块操作,按下v或V或ctrl-v进入,v选择单位是一个字符,V选择单位是一行,ctrl-v选择单位是方块。
    |快捷键|说明|
    |-|-|
    | v | 开始字符标记,字符选择 |
    | V | 开始按行标记,按行选择 |
    | CTRL-V | 开始列标记, 按块选择 |

  • 末行模式
    也即命令行模式,按下: / ?任何一个进入此模式;可查找、读取、保存、替换、离开vim、显示行号等操作

2.移动跳转

(1)基础移动

h j k l  左 下 上 右(l一般用w代替)
gg → 跳到首行行首
ge → 跳到上一个单词尾部与b相反
gd → 跳到变量定义处(高亮变量或,并跳转)
g; → 可切换到上次修改的位置。
G →  到最后一行 = ]]
0 → 数字零,到行首
^ → 跳到从行首开始第一个非空白字符
$ → 光标移动到行尾(最后一个字符上)
% → 在配对符间移动, 可用于()、{}、[]
H → 移动光标到当前界面的顶部行首非空字符处
M → 移动光标到当前界面的中部行首非空字符处
L → 移动光标到当前界面的底部行首非空字符处
:240    #跳到指定240行,冒号+行号,然后回车
230G    #跳到230行。

(2)字串移动

w → 将光标移动到下一个word的首字符上;
W → 到将光标移动下一个字符串str的首字符上;
e → 将光标移动到下一个单词的结尾; ge → 跳到上一个单词尾部
E → 将光标移动到下一个字符串str的结尾 
b → 将光标移动到前一个word的首字符上;
B → 到将光标移动前一个字符串str的首字符上;
(word默认是以空格或分号分隔的;字符串str默认以空格分隔,指数字、字母、下划线组成的字符串)

以上命令配合数字使用,如20j就是向下移动20行,5h就是向左移动5个字符等等。在Vim中,很多命令都可以配合数字使用,比如删除10个字符10x,在当前位置后插入3个!,3a!,这里的Esc是必须的,否则命令不生效。

f #(find)命令也可以用于移动,fx将找到光标后第一个为x的字符,3fd将找到第三个为d的字符。
F #同f,反向查找。

高频使用场景:

  • 修改行中某个变量名 移动光标用:w and bW and B (或者如果本行太长可用下文的搜索功能)到目的单词
  • 修改缩进,跳到行头^
  • 查看函数或类的完整或者变量作用域%
  • 切分屏幕之后,跳转不同窗口:ctrl+w+(h or j or k or l)
  • 左下上右移动h、j、k、l,l一般用w替代,w跳到下一个字符或单词词首(b跳到上一个字符或单词词首)
  • 删除到末尾:d$ 删除到开头: d^
  • 在当前位置后插入3个!,3a!<Esc>,这里的Esc是必须的,否则命令不生效

(3)标记跳转

#标记是为了更好地查找,normal模式下执行
mx  //将光标所在位置mark为x, x is the name of mark;
'x  //go to the position of x mark  。'''

#高频使用场景:
#在函数中看到调用其他函数,你想去看怎么定义的,你看完之后要回来,那么先标记一下,然后在跳回来。

(4)函数跳转

#normal模式下:
gd  //go to definition(高亮所选择变量或宏或函数,并跳到变量定义地方<宏或函数不会跳转>)
[ <ctrl+d>  //跳转到#define处(宏定义函数可以跳转)
[ <ctrl+i>  //跳转到函数、变量和#define(跳转到函数的具体实现),语言支持不一定良好

[[	跳转到函数开头大括号处
]]	跳转到函数结尾(或跳到下一个函数开头)

ctrl-o //跳到上一个位置(跳回原处)
ctrl-i  //跳到下一个位置

(5)搜索跳转

fx	跳转到下一个为x的字符
Fx	跳转到上一个为x的字符
tx	跳转到下一个为x的字符前
Tx	跳转到上一个为x的字符前
;	跳到下一个搜索的结果
/pattern    从光标处向文件尾搜索 pattern 
?pattern    从光标处向文件头搜索 pattern 
n           向同一方向执行上一次搜索 
N           向相反方向执行上一次搜索 
*           向前搜索光标下的单词
#           向后搜索光标下的单词

(6)翻页跳转
normal模式下:

ctrl-u 向上翻半页
ctrl-d 向下翻半页
ctrl-b 返回上一页
ctrl-f 向前下一页
Ctrl + y #向上滚动一行
Ctrl + e #向下滚动一行

3.文本编辑

(1)删除

快捷键说明
x删除当前字符,前面可以接数字,3x代表删除三个字符
X向前删除字符
d删除光标下的字符并复制到剪切板;
dd删除当前行,并复制(剪切)
d0删除到行首
d^删除到行首(第一个非零字符)
d$删除到行末 ,并复制(p可粘贴)
D删除到行末(同 d$)
dw删除当前单词
dt,删除到逗号
diw删除光标所处的单词
daw删除光标所处的单词,并包含前后空格(如果有的话)
di"删除双引号中的内容
di'删除单引号中的内容
di)删除小括号中的内容
di]删除中括号中内容
di}删除大括号中内容
diB删除’{}'中的内容
dit删除 xml tag 中的内容
dis删除当前句子
d2w删除下两个单词
dt(删除到小括号前
dgg删除到文件头部
dG删除到文件尾部;从光标所在行,删除到本文件末尾
d}删除下一段
d{删除上一段
ddp交换两行内容:先删除当前行复制到寄存器,并粘贴
:%s/\r//g删除 DOS 换行符 ^M
:g/^\s*$/d删除空行
:g/test/d删除所有包含 test 的行
:v/test/d删除所有不包含 test 的行

| :g/^\(.\+\)$\n\1/d | 去除重复行(先排序) |
| :%s/^.\{10\}// | 删除每行前10个字符 |
| :%s/.\{10\}$// | 删除每行尾10个字符

(2)粘贴

快捷键说明
p粘贴到光标所在字符之后;
P粘贴到光标所在字符之前。
:set paste允许粘贴模式(避免粘贴时自动缩进影响格式)
:set nopaste禁止粘贴模式
"?p将寄存器 ? 的内容粘贴到光标后
"?P将寄存器 ? 的内容粘贴到光标前

(3)复制

快捷键说明
y复制光标所在字符;
Y复制一行(即 yy )
y$复制当前位置到本行结束的内容
yy复制当前行
yt,复制到逗号
yiw复制当前单词
"+y复制当前选中到系统剪切板
3yy复制光标下三行内容
"?yy复制当前行到寄存器 ? ,问号代表 0-9 的寄存器名称

(4)可视选择

快捷键说明
v开始字符标记,字符选择
V开始按行标记,按行选择
CTRL-V开始列标记, 按块选择
v0选中当前位置到行首
v$选中当前位置到行末
vt,选中到逗号
viw选中当前单词
vi)选中小括号内的东西
vi]选中中括号内的东西
viB选中’{}'中的内容
vis选中句子中的东西
gv重新选择上一次选中的文字

(5)撤销

快捷键说明
u撤销上次操作
U撤销整行操作
CTRL-R撤销上一次 u 命令

(6)替代替换

快捷键说明
r替换当前字符(不进插入模式)
R进入替换模式,将后面的字符都替代,直至 ESC 离开(不进插入模式)
ssubstitute,替换字符(删除光标处字符,并进入插入模式,前可接数量)
S替换行(删除当前行,并进入插入模式,前可接数量)
:s/p1/p2/g替换当前行的p1为p2
:%s/p1/p2/g替换当前文件中的p1为p2
:%s/<p1>/p2/g替换当前文件中的p1单词为p2
:%s/p1/p2/gc替换当前文件中的p1为p2,并且每处询问你是否替换
:10,20s/p1/p2/g将第10到20行中所有p1替换为p2
:%s/1\\2\/3/123/g将“1\2/3” 替换为 “123”(特殊字符使用反斜杠标注)
  • 配置快捷键:
# vimrc 添加
nmap <c-\>r :%s/ostr/nstr/g
# 快捷替换
ctrl+\抬起来后r,输入新旧字符串

(7)改写

快捷键说明
cc改写光标当前行(删除当前行并进入插入模式),同S,Esc后p可粘贴
cw改写光标开始处的当前单词(直到不为字母或下划线为止),并进入插入模式,Esc后可以p粘贴
ciw改写光标所处的单词
caw改写光标所处的单词,并且包括前后空格(如果有的话)
ct,改写到逗号
c0改写到行首
c^改写到行首(第一个非零字符)
c$改写到行末
C改写到行末(同 c$)
ci"改写双引号中的内容
ci'改写单引号中的内容
ci)改写小括号中的内容
ci]改写中括号中内容
ci}改写大括号中内容
cit改写 xml tag 中的内容
cis改写当前句子
ciB改写’{}'中的内容
c2w改写下两个单词
ct(改写到小括号前
:%s/^/test/在行首加入特定字符(也可以用宏录制来添加)
:%s/$/test/在行尾加入特定字符(也可以用宏录制来添加)

(8)大小写

快捷键说明
~交换大小写
g~iw替换当前单词的大小写
gUiw将单词转成大写
guiw将当前单词转成小写
guu全行转为小写
gUU全行转为大写

(9)缩进

快捷键说明
gg=G缩进整个文件
=a{缩进光标所在代码块
=i{缩进光标所在代码块,不缩进"{"
<<减少缩进
>>增加缩进
==自动缩进

(10)数字增加

快捷键说明
CTRL-A增加数字
CTRL-X减少数字

(11)寄存器操作

快捷键说明
:registers显示所有寄存器内容
:reg显示所有寄存器内容

(12)其他

快捷键说明
J连接若干行
gJ连接若干行,删除空白字符
.重复上一次操作,具体见vimskill
:[range]y复制范围,比如 :20,30y 是复制20到30行,:10y 是复制第十行
:[range]d删除范围,比如 :20,30d 是删除20到30行,:10d 是删除第十行
:sort排序
!5Gsort使用外部sort命令对1-5行文本排序

4.文件操作

快捷键说明
:w保存文件
:w <filename>按名称保存文件
ZZ保存文件(如果有改动的话),并关闭窗口
:e <filename>打开文件并编辑
:saveas <filename>另存为文件
:r <filename>读取文件并将内容插入到光标后
:r !dir将dir命令的输出捕获并插入到光标后
:close关闭文件
:q退出
:q!强制退出
:wa保存所有文件
:wq保存并退出文件
:cd <path>切换Vim当前路径
:new打开一个新的窗口编辑新文件
:enew在当前窗口创建新文件
:vnew在左右切分的新窗口中编辑新文件
:tabnew在新的标签页中编辑新文件

5.注释代码

:3,5 s/^/#/g    注释第3-5行
:3,5 s/^#//g    解除3-5行的注释
:1,$ s/^/#/g    注释整个文档。
:%s/^/#/g       注释整个文档,此法更快。

6.read操作

#把外部文件读入 Vim
"例如打开一个文件、复制内容、关闭文件、打开另一个文件、然后粘贴进去复制到内容。切换到正常模式,然后按 :read <File Name> "
:read readme.md
#把某个命令的结果读入 Vim
#切换到正常模式,然后输入
:read !command
:read !ls -l

7.搜索查找

快捷键说明
/pattern从光标处向文件尾搜索 pattern
?pattern从光标处向文件头搜索 pattern
n向同一方向执行上一次搜索
N向相反方向执行上一次搜索
*向前搜索光标下的单词
#向后搜索光标下的单词

normal模式下:

* 向下搜索当前光标所在的单词,找到就跳到下一个单词(全文查找)
# 向上搜索当前光标所在的单词,找到就跳到下一个单词
f 向光标位置之后查找一个字符;F 向光标位置之前查找一个字符 (仅限当前行)
t 向光标位置之后查找一个字符,并跳到目标字符前面;T类似

末行模式下:

/word  向下全文搜索word代表字符,n 向下搜;N 向上搜
?word 向上全文搜索word代表字符,n 向上搜;N 向下搜(方向反着来)
/text #正向查找text,按n健查找下一个,按N健查找前一个。
?text #逆向查找text,按n健查找下一个,按N健查找前一个。
%  #查找配对的 {,[,(
#vim中有一些特殊字符在查找时需要转义  .*[]^%/?~$
#查找很长的词,如果一个词很长,键入麻烦,可以将光标移动到该词上,按*或#键即可以该单词进行搜索,相当于/搜索。而#命令相当于?搜索。
:set hlsearch  高亮搜索结果,所有结果都高亮显示,而不是只显示一个匹配。
:set nohlsearch  关闭高亮搜索显示
:nohlsearch  关闭当前的高亮显示,如果再次搜索或者按下n或N键,则会再次高亮。
:set incsearch  逐步搜索模式,对当前键入的字符进行搜索而不必等待键入完成。
:set wrapscan  重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启。
:set ignorecase  忽略大小写的查找
:set noignorecase  不忽略大小写的查找
:set ic 忽略大小写
:set noic 取消忽略大小写
:set hls 匹配项高亮显示
:set is 显示部分匹配

9.单独成型

.重复刚才的操作
~转换大小写

  • 可以对变量首字母改变大小写
  • 可以结合下文提供的命令的选择一个字符串(变量),然后再改变整个字符串(变量)的大小写。比如:宏定义

=自动格式化

  • 对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行
  • 或者进入可视行模式选择一些行后再=进行格式化,相当于一般IDE里的code format。
  • 使用gg=G可对整篇代码进行排版。

10.撤销和恢复

  • u undo撤销上一步的操作,命令可以组合,例如Nu N是任意一个整数,表示撤销N步操作,以下类同。
  • U 恢复当前行(即一次撤销对当前行的全部操作)
  • ctr+r control+redo 恢复上一步被撤销的操作
  • CTRL-R 回退前一个命令

11.文本替换

末行模式下输入替换命令:

:[range]s/pattern/string/[flags]

用string替换pattern就是要被替換掉的字串,可以用 regexp 來表示。
將 pattern 由 string 所取代。
[range] 有以下一些取值:

无      默认为光标所在的行
.       光标所在当前的行
N       第N行
$       最后一行
'a      标记a所在的行(之前要使用ma做过标记)
.+1     当前光标所在行的下面一行
$-1     倒数第二行,可以对某一行加减某个数值来确定取得相对的行
22,3322331,$     第1行 到 最后一行
1,.1行 到 当前行
.,$     当前行 到 最后一行
'a,'b   标记a所在的行 到 标记b所在的行(之前要使用ma和mb做过标记)
%       所有行(与 1,$ 等价)
?str?   从当前位置向上搜索,找到的第一个str所在的行 (其中str可以是任何字符串或者正则表达式)
/str/   从当前位置向下搜索,找到的第一个str所在的行(其中str可以是任何字符串或者正则表达式)

注意,上面的所有用于range的表示方法都可以通过 +、- 操作来设置相对偏移量。
[flags]有以下一些取值:

g	对指定范围内的所有匹配项(global)进行替换
c	在替换前请求用户确认(confirm)
e	忽略执行过程中的错误
i	ignore 不分大小写
无	只对指定范围内的第一个匹配项进行替换

注意:上面的所有flags都可以组合起来使用,比如 gc 表示对指定范围内的 所有匹配项进行替换,并且在每一次替换之前都会请用户确认。
高频操作:

:10,20s/from/to/g   对第10行到第20行的内容进行替换。
:1,$s/from/to/g     对第一行到最后一行的内容进行替换(即全部文本)
:1,.s/from/to/g     对第一行到当前行的内容进行替换。
:.,$s/from/to/g     对当前行到最后一行的内容进行替换。
:'a,'bs/from/to/g   对标记a和b之间的行(含a和b所在的行)进行替换,其中a和b是之前用m命令所做的标记。
替换所有行的内容::%s/from/to/g
ra  #将当前字符替换为a,当期字符即光标所在字符。
:s/old/new/   #用old替换new,替换当前行的第一个匹配
:s/old/new/g  #用old替换new,替换当前行的所有匹配
:%s/old/new/  #用old替换new,替换所有行的第一个匹配
:%s/old/new/g #用old替换new,替换整个文件的所有匹配
:10,20 s/^/    /g  #在第10行知第20行每行前面加四个空格,用于缩进。
ddp #交换光标所在行和其下紧邻的一行。

12.动作的重复

normal模式下,任意一个动作都可以重复

13.N的使用

Nyy从当前行算起向下拷贝N行
Ndd从当前行算起向下删除N行
Ngg跳到第N行
dNw删除从当前光标开始到第N个单词前(不包含空白,即删除N-1个单词)
yNe拷贝从当前光标到第N个单词末尾(注意: yy=1yy dd=1dd)
d$ 从光标所在字符,删除到本行末尾
dG 从光标所在行,删除到本文件最末尾
重复前一个命令: N. (N表示重复的次数)

14.点(.)的使用

待续~~~

15.可视模式-块操作

  • 15.1进入可视模式
    normal模式下:v或者ctr+v或者shift+v即可进入,配合h j k l选择操作。
  • 15.2 代码格式调整
    • [ctr + ] v 选中某些行的行头之后再按=。效果:代码格式自动调整
  • 15.3 注释代码
    • [ctr + ] v 选中某些行的行头之后 再按I再按注释的符号(比如://)最后按ESC。 效果:选中的这些行全部注释了
    • [ctr + ] v 选中某些行的行头之后 再按A再按注释的内容 最后按 ESC(比如://这是测试代码) 效果:选中的这些行的行尾全部注释上“//这是测试代码”
    • [ctr + ] v 选中某些行的行头的注释(比如://)之后 再按d 最后按ESC 效果:选中的这些行全部注释删除了
      注释代码:
      、可视模式
      按v键进入可视模式(VISUAL),可视块模式用来多选和注释
      1.处理列,移动光标到指定位置,ctrl+v,进入可视块模式(V-BLOCK)
      2.处理行,移动光标到指定位置,shift+v,进入可视行模式(V-LINE)
      1.加注释
  • 光标置于行首
  • ctrl + v,进入可视块模式
  • 移动光标,选中的位置会有高亮显示
  • shift + i,进入 insert 模式
  • 输入//
  • esc
    2.解注释
  • 光标置于行首
  • ctrl + v,进入可视块模式
  • 移动光标,选中的位置会有高亮显示
  • 按d

3.编辑
可视模式的编辑

  • 插入I(shift+i):插入你想要的字符 --> ESC
  • shift+<> 左右移动选中的部分常用于代码的缩进配合2
  • d 删除
  • o 移动光标开始《–》结束

4.代码注释

代码注释
代码注释:
按 Ctrl+v 切换到可视化模式;
移动光标(j 或 k)选中需要注释的行的开头;
按大写 I,然后输入注释符,如 #;
最后按 Esc。
取消注释:
按 Ctrl+v 切换到可视化模式;
按 j 或 k 选择要删除的注释符;
按 d 或 x 删除注释符
如果使用 // 符号注释,则取消注释时需进行两遍操作。

16.组合的强大

操作光标所在的一个word。默认上来说,一个word(单词串)由字母,数字和下划线组成
normal模式下:

动作 + 移动 [+重复次数]

前面已经已经大量使用组合,这里继续:

c1或c2  剪切1个或2个字符,并进入插入模式,esc后可粘贴
cw或c1w  改变当前光标位置开始的第一个word,并进入插入模式
c2w     改变当前光标位置开始的第一个word+非word字串,并进入插入模式
c3w     改变当前光标位置开始的第一个word+非word字串+第二个word,并进入插入模式
c3w     改变当前光标位置开始的第一个word+非word字串+第二个word+第二个非word串,并进入插入模式
caw     改变当前光标所在的整个word,并进入插入模式
d1或d2  删除1个或2个字符,不进入插入模式,可p粘贴删除的字符(但要注意光标停留位置)
dw或d1w 删除光标位置开始的word,不进入插入模式
d2w或d3w或d4w 同c2w/c3w/c4w类似,但不进入插入模式
daw     删除光标所在的整个word,不进入插入模式
yw或y1w  从当前光标位置开始复制word
y1或y2   从光标位置开始复制字符1个或2个
yaw     复制光标所在位置的整个word
d/word	从当前光标处向下删除到‘word’之前('word'保留)
d?word	从当前光标处向上删除到‘word’之前(‘word’也删掉)
dtc	向后删除直到第一个'c'之前
dfc	向后删除直到第一个'c'之后
bve 操作当前光标所在的一个变量或word,配合c/d/y/p/P操作使用

7.自动补全

在insert模式下直接按: 最常用的补全

ctrl + n    补全,同时按住ctrl+通过n向下选择
ctrl + p    补全,同时按住ctrl+通过p向上选择    

智能补全

待续~~~~

8.切分屏幕-多窗口

  • 调整切分窗口的大小
    (1)ctrl+w+=等分窗口
    (2)在normal模式下输入:resize -N:resize +N,明确指定窗口减少或增加N行
    (3)窗口大小调整
纵向调整
:ctrl+w + 纵向扩大(行数增加)
:ctrl+w - 纵向缩小 (行数减少)
:res(ize) num  例如::res 5,显示行数调整为5行
:res(ize)+num 把当前窗口高度增加num行
:res(ize)-num 把当前窗口高度减少num行
横向调整
:vertical res(ize) num 指定当前窗口为num列
:vertical res(ize)+num 把当前窗口增加num列
:vertical res(ize)-num 把当前窗口减少num列
--------------------- 
  • 关闭窗口

    • 关闭光标所在的窗口使用:q 或者 :close
    • 关闭除光标之外的其他窗口使用 :only
    • 上面三个关闭命令,只是暂时关闭窗口,其内容还在缓存中,只有使用q!、w!或x才能真能退出。
  • 分隔窗口选项
    :[n] split(vsplit) [++opt] [+cmd] [file]

    n   为vim指定在新窗口中显示的行数,且新窗口的大小刚好容纳该行数,新窗口位于画面顶端
    opt  传递vim选项信息给新的窗口会话(请注意,它的前面必须加上两个加号)
    cmd 传入欲在新窗口中执行的命令(请注意,它的前面必须加上一个加号)
    file  指定在新窗口中编辑的文件
    

    :sview filename 以只读的方式水平分割打开一个新窗口
    :sfind [++opt] [+cmd] [file] 和split的运作方式相似,但在path中寻找filename,如果vim未找到文件则不显示

10.目录

normal模式下:

:Te     //以tab窗口形式显示当前目录 然后可进行切换目录、打开某个文件
:Ex     //开启目录浏览器,可以浏览当前目录下的所有文件,并可以选择
:Sex    //水平分割当前窗口,并在一个窗口中开启目录浏览器
:ls     //显示当前buffer情况
:!ls    //这种是vim调用shell命令的方式:!+shell命令(不是以tab窗口形式显示当前目录)

11.成对符号的内容操作

以下命令可以对标点内的内容进行操作:

ci' ci" ci( ci[ ci{ ci<     分别change这些配对标点符号中的文本内容,进入插入模式,光标在配对符号同一行即可不必在符号内
di' di" di(或dib di{或diB   分别删除这些配对标点符号中的文本内容,需将光标移到配对符号内
yi' yi" yi( yi[ yi{ yi<     分别复制这些配对标点符号中的文本内容,光标在配对符号同一行即可不必在符号内
vi' vi" vi( vi[ vi{ vi<     分别选中这些配对标点符号中的文本内容,需先将光标移到配对符号内

注:(1)将把上面的 i 改成 a 可以同时操作配对标点和配对标点内的内容:(2)尽量将光标移动到配对符号内部操作
高频操作
要操作的文本:111"222"333,将光标移到"222"的任何一个字符处输入命令

di",文本会变成: 111""333
若输入命令 da" ,文本会变成: 111333

12.剪贴板

  • 使用:reg命令,可以查看vim提供多少个剪切板以及各个粘贴板里的内容。
    在vim中简单用y只是复制到某个粘贴板里,同样用p粘贴的也是这个粘贴板里的内容。

  • 复制和粘贴到指定剪贴板

    • 要将vim的内容复制到某个粘贴板,normal模式下,选择要复制的内容,然后按"Ny完成复制,其中N为粘贴板号.例如要把内容复制到粘贴板a,选中内容后按"ay就可以了。
    • 要将vim某个粘贴板里的内容粘贴进来,normal模式下按"Np,其中N为粘贴板号。
  • 系统剪贴板
    normal模式下输入:reg,查看vim支持的剪切板
    星号(*)和加号(+)粘贴板是系统粘贴板。在windows系统下, (空)和 + 剪贴板是相同的。
    *剪贴板的一个作用是,在vim的一个窗口选中的内容,可以在vim的另一个窗口取出。

    • 复制到系统剪贴板
    "*y     将选中内容复制到系统*号剪切板
    "+y     将选中内容复制到系统+号剪切板,在visual模式下选中内容
    "+Nyy   复制N行到系统剪切板
    
    • 剪切到系统剪贴板
        "+dd
    
    • 从系统剪贴板粘贴到vim
    normal模式下:
    "*p
    "+p  比ctrl-v好用
    

13.外部程序

快捷键说明
!告诉vim正在执行一个过滤操作
!5Gsort<Enter>使用外部sort命令对1-5行文本排序
!!对当前行执行过滤命令
!!date<Enter>用"date"的输出代替当前行

14.个人配置

无插件使用过程中的配置很短,写在vim的配置文件.vimrc中


set tabstop=4 ; setting tab width 4 letters
set shiftwidth=4; setting new line incident width
set noexpandtab; tab doesn't expand to space
;set list ;display manipulator, example: \n \t \r ......
set encoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936
set fileencoding=gb2312
set termencoding=utf-8

我的.vimrc文件如下:

:set encoding=utf-8
:set fileencodings=ucs-bom,utf-8,cp936
:set fileencoding=gb2312
:set termencoding=utf-8

15.shell操作

:shell  可以在不关闭vi的情况下切换到shell命令行
exit    //从shell回到vi

:!ls    //列出当前目录下文件
!   //告诉vim正在执行一个过滤操作
!5Gsort<Enter>  //使用外部sort命令对1-5行文本排序
!!  //对当前行执行过滤命令
!!date<Enter>   //用"date"的输出代替当前行

:suspend或Ctrl-Z 挂起vim(将vim放置到后台),回到shell,按 fg 可以返回vim

16.文件比较与退出

(1)比较

vimdiff file1 file2
vim -d file1 file2
vim -d file1.txt file2.txt  //垂直打开多窗口并进行内容比较

在Vim末行模式,进入比较模式,执行:

:diffs[plit] {filename}
:vert diffsplit another_filename 这个垂直比较会高频使用

(2)跳转到差异位置:

[c  反向跳转至上一处更改的开始。计数前缀使之重复执行相应次。
]c  正向跳转至下一个更改的开始。计数前缀使之重复执行相应次。

(3)合并
比较目的就是合并差异,直接使用以下自带命令或者麻烦的办法:手动从一个窗口拷贝至另一个窗口。

:[range]diffg[et] [bufspec]
    用另一个缓冲区来修改当前的缓冲区,消除不同之处。除非只有另外一个比较模式下的缓冲区, [bufspec] 必须存在并指定那个缓冲区。如果 [bufspec] 指定的是当前缓冲区, 则为空动作。 [range] 可以参考下面。

:[range]diffpu[t] [bufspec]
    用当前缓冲区来修改另一个缓冲区,消除不同之处。
[count]do   
    同 ":diffget",但没有范围。"o" 表示 "obtain" (不能用"dg",因为那可能是 "dgg" 的开始!)。
dp
    同 ":diffput",但没有范围。注意 不适用于可视模式。给出的 [count] 用作 ":diffput" 的 [bufspec] 参数。
    
当没有给定 [range] 时,受影响的仅是当前光标所处位置或其紧上方的差异文本。
当指定 [range] 时,Vim 试图仅改动它指定的行。不过,当有被删除的行时,这不总有效。
参数 [bufspec] 可以是缓冲区的序号,匹配缓冲区名称或缓冲区名称的一部分的模式。
例如:
        :diffget                使用另一个进入比较模式的缓冲区
        :diffget 3              使用 3 号缓冲区
        :diffget v2             使用名字同 "v2" 匹配的缓冲区,并进入比较模式(例如,"file.c.v2")

(4)更新比较和撤销修改

:diffupdate[!]  //如果载入的文件有修改,需要不时执行此命令来手动更新。包含`!` 时,Vim会检查文件是否被外部改变而需要重新载入,对每个被改变的文件给出提示。
u   //normal模式执行u,撤销修改,注意一定要将光标移动到需要撤销修改的文件窗口中。

(5)上下文的展开和查看
比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。Vimdiff 缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数,可以这样设置:

:set diffopt=context:3

(6)多个文件的退出

:qa  (quit all) //多文件比较时,同时退出
:wa (write all)//希望保存全部文件
:wqa (write, then quit all)//保存全部文件,然后退出
:qa!(force to quit all)//退出时不希望保存任何操作结果

(7)vimdiff详细请参考

vimdiff doc
或者
:help diff //末行模式

17.文件保存与退出

:w      //将编辑的数据写入硬盘文件中。
:w!     //强制写入文件或只读文件,文件权限影响成败
:wq     //保存并退出
:wq!    //强制保存并退出
:q      //直接退出
:q!     //强制退出并忽略所有更改
:w[文件名]  //将编辑的数据保存为另一个文件。
:r[文件名] //在编辑的数据中读入另一个文件的内容加到光标所在行后面。
:n1,n2 w[文件名]    //将n1行到n2行的内容保存到另一个文件。
:!command   //暂时离开vi到命令行模式下执行command的显示结果。
ZZ  //若文件未改动,则直接离开;若已改动则保存并退出;保存当前文件修改(保存完会自动退出所有文件编辑),如果要放弃更改并移到上一个文件使用:N!
:e! #放弃所有修改,并打开原来文件。
esc #进入nomal模式/命令行模式




18.宏的使用

宏录制

快捷键说明
qa开始录制名字为a的宏
q结束录制宏
@a播放名字为a的宏
100@a播放名字为a的宏100次
:normal@a播放名字为a的宏直到自动结束

19 文件操作

vim file //打开单个文件
vim file +行号  //打开并定位到多少行(行首),同vim +行号 file
vim file + //打开并定位最后一行行首
vim file1 file2 file3 ... #同时打开多个文件
vim -o file1 file2 file3  //水平分割打开三个文件
vim -O file1 file2 file3 //垂直分割打开三个文件 
vim -R filename //以只读方式打开(阅读模式)
:open file //在vim窗口中打开一个新文件
:split file //在新窗口中打开文件
:n  //跳到下一个文件
:n file1 //跳到文件file1
:e#  //回到刚才编辑的文件
:bn //切换到下一个文件
:bp //切换到上一个文件
:ls  //列出一共打开多少个文件,并有编号1、2、3......N
:bN  //跳转打开到第N个文件
:args //查看当前打开的文件列表,当前正在编辑的文件会用[]括起来。
:e ftp://192.168.10.76/abc.txt #打开远程文件,比如ftp或者share folder
:e \\qadrive\test\1.txt

文件操作
快捷键 说明
:w 保存文件
:w 按名称保存文件
ZZ 保存文件(如果有改动的话),并关闭窗口
:e 打开文件并编辑
:saveas 另存为文件
:r 读取文件并将内容插入到光标后
:r !dir 将dir命令的输出捕获并插入到光标后
:close 关闭文件
:q 退出
:q! 强制退出
:wa 保存所有文件
:cd 切换Vim当前路径
:new 打开一个新的窗口编辑新文件
:enew 在当前窗口创建新文件
:vnew 在左右切分的新窗口中编辑新文件
:tabnew 在新的标签页中编辑新文件

21.删除

x   #删除当前字符
3x  #删除当前光标开始向后三个字符
X   #删除当前字符的前一个字符。X=dh
dw  #删除至当前单词末尾
dl  #删除当前字符, dl=x
dh  #删除前一个字符
dd  #删除当前行
10dd #删除当前行开始的10行。
cc   #删除当前行,并进入插入模式
10cc #删除10行,并进入插入模式
dj  #删除上一行
dk  #删除下一行
de #删除至当前单词末尾,包括当前字符
D    #删除当前字符至行尾。D=d$
d$   #删除当前字符之后的所有字符(本行)
kdgg #删除当前行之前所有行(不包括当前行)
jdG  #(jd shift + g)   删除当前行之后所有行(不包括当前行)
:1,10d #删除1-10行
:11,$d #删除11行及以后所有的行
:1,$d  #删除所有行
J(shift + j)  #删除两行之间的空行,实际上是合并两行。

22.复制粘贴剪切

yy  #拷贝当前行
nyy #拷贝当前后开始的n行,比如2yy拷贝当前行及其下一行。
p   #在当前光标后粘贴,如果之前使用了yy命令来复制一行,那么就在当前行的下一行粘贴。
shift+p #在当前行前粘贴
:1,10 co 20 #将1-10行插入到第20行之后。
:1,$ co $ #将整个文件复制一份并添加到文件尾部。
快选择复制 #正常模式下按v(逐字)或V(逐行)进入可视模式,然后用jklh命令移动即可选择某些行或字符,再按y即可复制
ddp #交换当前行和其下一行
xp #交换当前字符和其后一个字符
块选择剪切 #正常模式下按v(逐字)或V(逐行)进入可视模式,然后用jklh命令移动即可选择某些行或字符,再按d即可剪切
ndd #剪切当前行之后的n行。利用p命令可以对剪切的内容进行粘贴
:1,10d #将1-10行剪切。利用p命令可将剪切后的内容进行粘贴。
:1, 10 m 20 #将第1-10行移动到第20行之后。

23.buffer操作

A buffer is the in-memory text of a file.   
    //文件在内存中的缓存数据,没写到磁盘上时,所有的修改都发生在内存中。
    //一个文件只有一个buffer
    //buffer操作主要用在屏幕比较小的电脑环境下,如果屏幕够大,则建议用window操作
A window is a viewport on a buffer.     
    //仅用来显示buffer数据的,不影响buffer,同一buffer可被多个window显示
A tab page is a collection of windows.  
    //用来管理windows的,Tab为Window提供布局,叫layout更合适
"使用选择:"
"如果显示器比较小,适合用buffer管理编辑"
"如果显示器比较大,适合使用windows管理编辑"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RwYAZIdx-1581925865319)(leanote://file/getImage?fileId=5e2698ef68684c74ea000002)]

#查看buffer list
:ls     //(查看有几个文件加载到内存中)//*****

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hehehhn0-1581925865320)(leanote://file/getImage?fileId=5e2699e868684c74ea000003)]

#直接打开文件编辑,并载入到buffer并当前窗口显示
:e file1.txt    //*****
:e[dit] [++opt] [+cmd] {fname}  //格式
    //末行模式,输入':e'+文件名,Tab会补全与罗列待选项
    //Tab健或者c-n或c-p选择

#添加文件名到buffer list,但并不载入,当前窗口并不显示 
:bad fpsensor.h *****
:bad[d] [+lnum] {fname} //格式

#打开buffer列表中的一个buffer
:b [N]  //载入第N个buffer,N为buffer的序 //*****
:[N]b  //载入第N个buffer,N为buffer的序
:[N]b[uffer][!] [+cmd] [N]
:[N]b[uffer][!] [+cmd] {bufname}
:[N]sb[uffer] [+cmd] [N]
:[N]sb[uffer] [+cmd] {bufname}

#buffer跳转
:bn //跳到下一个buffer  //*****
:bp //跳到上一个buffer  //*****
:bf //跳到第一个buffer
:bl //跳到最后一个buffer
CTRL + 6    //在当前buffer与上一个buffer来回跳转 //*****


#从buffer删除文件
:bd [N] //关闭第N个buffer //*****
:bd {bufname}   //*****
:bd[elete][!] [N]   //N为buffer的序号
:bd[elete][!] {bufname}     //bufname为buf列表中显示的名字
:N,Mbd[elete][!]        //!为强制删除关闭
    
#打开buffer list中全部的buffer
:ba [N]      //打开前N个buffer,以窗口的形式显示 
:ba         //打开所有的buffer,以窗口的形式显示 //*****
:[N]unh[ide] [N]    //打开已经 loaded 的 buffer
:[N]ba[all] [N]     //N可以指定最大数目
#buffer操作快捷键设置
//要保证buffer的切换方便快捷,需修改.vimrc配置
//具体可根据个人喜好来设置
"按Ctrl+h 向左移动一个buffer
nnoremap <C-h> :bp<CR>
"按Ctrl+l 向右移动一个buffer
nnoremap <C-l> :bn<CR>
"按Ctrl+^ 关闭当前buffer
nnoremap <C-^> :bd<CR>

buffer高频操作总结:

:ls
:e file1.txt   //tab
:bad file1.txt
:b [N]
:b [filename]
:bn
:bp
<C-6>
:bd [N]
:bd [filename]
:ba
<C-W> o
<C-W> c

24.windows操作

#打开一个空白窗口
:new
:vnew
#vim以窗口的形式打开多个文件,横向-o 或 竖向-O
vim -o/O[N] file1 file2 file3   //实际这三个文件都加入buffer list里了
vim -O5 file1.c file2.c file3.c file4.c file5.c垂直分屏打开5个文件
#退出窗口,但依然在buffer中保留,除非vim退出
:q
:wq
:q!
:{count}q[uit]!
ctrl-w q    //注意先操作c-w,然后再按q

#关闭窗口
CTRL-W c        #关闭当前窗口 //*****
:clo[se][!]     #关闭当前窗口
CTRL-W o        #关闭其他窗口 //*****
:only           #关闭其他窗口
:q 如果是最后一个被关闭的窗口,那么将退出vim。
ZZ 保存并退出。
#窗口拆分
:vsp    //或者:vs,vertically split 纵向拆分
:sp     //横向拆分 split横向拆分(默认方式)
:vs file2.txt   //垂直打开文件file2.txt,又不失原来的编辑文件
:[N]sp[lit] [++opt] [+cmd] [file] 
:[N]vsp[lit] [++opt] [+cmd] [file]

#给窗口重命名
:f newFilename

#窗口跳转
CTRL-W j/k/h/l/w

#窗口移动
CTRL-W r/R	轮换窗口交换
CTRL-W x/X	与相邻窗口交换
#调整窗口大小
CTRL-W =   等分窗口
CTRL-W _   当前屏幕高度扩展到最大, (shift + -) 
CTRL-W |   当前屏幕宽度扩展到最大, (shift + \) 
CTRL-W >/< 调整宽度
CTRL-W +/- 调整高度

Vim中多窗口的调整
    窗口的调整可以分为绝对值调整和增量式调整
    绝对值调整如下:
     :resize num "将窗口的高度调整为num行
     :res num "resize的缩写模式 与resize实现同样的功能   
     :vertical resize num "将窗口的宽度调整为num列
     :verticalres num "verticalresize的缩写模式 与verticalresize实现同样的功能
    增量式调整如下:
     :resize+num "将窗口的高度增加num行
    :resize-num "将窗口的高度减少num行
     :vertical resize+num "将窗口的宽度增加num列
    :vertical resize-num "将窗口的宽度减少num列
    将resize简写为res能实现同样的功能。
:help window

windows高频操作总结:

vim -O5 file1.c file2.c file3.c file4.c
:new
:vnew
:e file.txt 
:sp file1.txt
:vsp file1.txt
<c-w> h/j/k/l/w

:q
:wq
:q!
ctrl-w q
CTRL-W c
CTRL-W o 
:only

CTRL-W =   
CTRL-W _   
CTRL-W |   
CTRL-W >/< 
CTRL-W +/- 

:f newFilename

25.tab操作

#打开标签页
:tabnew file1.txt   //对文件file1.txt建立标签,文件补全用tab,选择文件用tab切换 //*****
:tabnew [++opt选项] [+cmd] 文件   //建立对指定文件新的tab标签
:tabe file.txt      //在标签页中打开文件file.txt //*****
:[count]tabe[dit] [++opt] [+cmd] {file}

#列出所有标签页
:tabs       //*****

#关闭标签页
:tabc       //*****
:tabo       //*****
:{count}tabc[lose][!] 关闭当前标签页
:{count}tabo[nly][!]  关闭其余标签页

#跳转标签页
2gt //跳到第2个标签页//*****
gt或gT  //在tab之间切换
:tabp 前一个tab窗口
:tabn 后一个tab窗口
{count}gt 正向跳转到第 count 个 page,第一个标签页是 1
{count}gT 反向跳转到第 count 个 page
:tabr[ewind] 跳到第一个
:tabl[ast]   跳到最后一个

#移动标签页
:tabm 1 //*****
:tabm +1
:tabm[ove] [N] 移动到第N个页面位置
:tabm[ove] +/-[N] 向前或向后移动N个位置

:help table 可以查看tab其他用法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p7D9bV7w-1581925865324)(leanote://file/getImage?fileId=5e26b7a768684c74ea000004)]

#用多个标签打开多个文件
vim -p file1 file2 file3

#对多个标签页执行同一个命令
:[range]tabd[o] {cmd}	//所有标签页号在 range 范围内的标签,都会执行 cmd。

tab高频操作总结:

:tabnew file1.txt
:tabe file1.txt
:tabs
gt
2gt
:tabc
:tabo
:tabp
:tabn
vim -p file1 file2 file3

##26.帮助

快捷键说明
h tutor入门文档
h quickref快速帮助
h index查询Vim所有键盘命令定义
h summary帮助你更好的使用内置帮助系统
h pattern.txt正则表达式帮助
h eval脚本编写帮助
h function-list查看VimScript的函数列表
h windows.txt窗口使用帮助
h tabpage.txt标签页使用帮助
h tips查看Vim内置的常用技巧文档
h quote寄存器
h autocommand-events所有可能事件
h write-plugin编写插件

:help or F1 显示整个帮助
:help xxx 显示xxx的帮助,比如 :help i, :help CTRL-[(即Ctrl+[的帮助)。
:help ‘number’ Vim选项的帮助用单引号括起
:help 特殊键的帮助用<>扩起
:help -t Vim启动参数的帮助用-
:help i_ 插入模式下Esc的帮助,某个模式下的帮助用模式_主题的模式
帮助文件中位于||之间的内容是超链接,可以用Ctrl+]进入链接,Ctrl+o(Ctrl + t)返回

27.其他

快捷键说明
vim -u NONE -N开启vim时不加载vimrc文件
vimdiff file1 file2显示文件差异
vim -R filename以只读方式打开(阅读模式)

28.后台运行vim

后台运行vim:ctrl + z
切换到前台fg [num] (num为后台运行编号,不写默认最后一个后台运行的vim)

三 win10安装vim

1.使用scoop安装vim
scoop install vim
scoop update vim
安装路径在:D:\softwareInstall\scoop\apps\vim\8.2
2.安装fzf
参考:https://github.com/junegunn/fzf
scoop install fzf
fzf命令开始执行查找
3.安装插件管理器vim-plug
参考:https://github.com/junegunn/vim-plug
(1)到github上下载vim-plug.vim,放到autoload目录
(2)然后配置_vimrc,例如下载nerdtree插件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hTkRln8B-1581925865326)(leanote://file/getImage?fileId=5e18349aab396077f5000003)]
安装vim-plug
vimplug比Vundle下载更快的插件管理软件,更轻量更简约更高效。

#安装方法一
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

#安装方法二
mkdir ~/.vim/autoload/
cd ~/.vim/autoload/
wget https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

四 ubuntu安装vim

五、参考资料汇总

1.VIM中文帮助文件http://vimcdoc.sourceforge.net/doc/help.html
2.https://www.linuxsong.org/2010/09/vim-quick-select-copy-delete/
3.vim无插件使用https://snaildove.github.io/2016/01/20/vim_without_widgets/#vim比较文件
4.https://www.cnblogs.com/cnland/archive/2013/03/20/2970545.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值