vim学习笔记

回忆一下迄今为止,自己常用的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               to exit
type  :help  or    for on-line help
type  :help version7   for version info

 

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/\/gua/g

 

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代表光标在此

vim学习笔记_第1张图片

例2:同时打开 a.txt 和 b.txt

vim a.txt b.txt -O       

:ls                      #看到现在有两个buffer,a.txt激活且窗口可见,b.txt窗口可见

vim学习笔记_第2张图片

例3:在例2的基础上打开c.txt

:e c.txt

:ls            #现在有三个buffer,c.txt是在之前a.txt的窗口打开的,现在左边窗口的c.txt激活可见。a.txt作为交换缓冲区,按下Ctrl + ^ 左边窗口显示的就是 a.txt了。

vim学习笔记_第3张图片

 

1):b n 跳转到第n个缓冲区

2):bpre  :bnext  :bfirst  :blast 去前一个/后一个/第一个/最后一个缓冲区

3):b buffer_name (可用Tab补全)

 

Window(窗口)

窗口是可视化的分割区域,s 或 :sp 水平分割,v或 :vs 垂直分割

一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同缓冲区(即多个窗口可以打开一个文件或不同文件)

不同窗口编辑同一个文件,会对其它相同文件窗口生效(使用的是同一个缓冲区)

 

切换窗口

w   在窗口间循环切换

h    切换到左边的窗口

j     切换到下边的窗口

k    切换到上边的窗口

l     切换到右边的窗口

 

窗口移动

L     左边窗口移动到右边

H    右边窗口移动到左边

 

重排窗口(:h window-resize 查看文档)

=      使所有窗口等宽等高

_      最大化活动窗口高度

|      最大化活动窗口宽度

[N]_     把活动窗口的高度设为N行

[N]|     把活动窗口的宽度设为N列

 

Tab(标签页)

Tab是可以容纳一系列窗口的容器 :h tabpage 查看文档,比如一个Tab用来编辑JS文件,一个Tab用来编辑HTML文件

 

Vim的文本对象

操作方式:[number][text object]

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 + nnext)和 Ctrl + pprevious)进行上下选择

 

:r! echo%   输入当前文件名

:r! echo%:p   输入当前文件名全路径

 

Vim更换配色

:colorschema                       显示当前的主题颜色,默认是default

:colorschema      显示所有配色

:colorschema  配色名         修改配色

(The End)

 

参考资料:https://www.imooc.com/learn/1129 第2章

你可能感兴趣的:(Linux)