vim学习篇

视频教程: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映射


一、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映射
    1. let mapleader=”,”   //设置一下leader键,常用的为逗号或空格
    2. inoremap <leader>w <Esc>:w <cr>  在插入模式用,w代替了<Esc>:w
    3. inoremap jj <Esc>  用jj替代<Esc>
    4.  
  • 自定义的vmscript函数和插件的配置
    1. 通过插件来无限扩充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》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值