月亮是树梢的眼睛

《玩转Vim 从放弃到爱不释手》学习笔记

本篇是b站up主PegasusWang老师的玩转Vim 从放弃到爱不释手教程笔记,在大学的时候使用过vim,但只是停留非常低级的操作阶段,也在其他地方零散的学习过Vim,直到在b站发现了PegasusWang的视频,非常不错,是目前看到过最好的vim入门教程,经过几天的学习,Vim已经近乎熟练,再次感谢PegasusWang的无私奉献,笔记还会持续更新。

Vim编辑器的四种模式

Normal(普通)模式

使用vim打开文件时显示的模式,只可以查看,不可以做任何编辑操作

进行所有操作之后可以单击u(undo)来撤销操作

移动操作

w/W 移到下一-个word/WORD开头。e/E 下一个word/WORD尾

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

word指的是以非空白符分割的单词,WORD以空白符分割的单词

搜索操作

同一行快速移动的方式其实是搜索一个字符并且移动到该字符

f{char} 可以把光标移动到当前行的char字符上,t把光标移动到char的前一个字符

如果第一次没搜到,可以用分号;和逗号,继续搜该行里的下一个/上一个char字符

大写的F{char}表示反过来搜前面的字符

快速移动到一行的行首或者行尾

0 移动到行首第一个字符,^移动到第一个非空白字符

$ 移动到行尾,g_ 移动到行尾非空白字符

记住常用的0$就可以满足日常需求了

页面移动

gg / G 移动到文件开头和结尾,你可以使用ctrl+o快速返回

H / M / L 跳转到屏幕的开头(Head),中间(Middle)和结尾(Lower)

Ctrl+u / ctrl+f 上下翻页 (upword/forward)

zz 把当前光标放置到屏幕置中间

删除操作

x 快速删除一个字符

dw delete word:快速删除一个单词

dd 快速删除当前整行内容

修改操作

常用有三个,r (replace) , c (change) ,s(substitute)

r可以替换一个字,s替换并进入插入模式

*cw change word: 快速删除一个单词并且进入编辑模式

查询操作

/ 或者 ? 进行前向或者反向搜索

n / N 跳转到下一个或者上一个匹配

Normal下的复制粘贴

复制剪切分别使用y(yank)p(put),剪切用d

我们可以使用v(visual)命令进入可视模式选中所要复制的地方,然后使用p粘贴

配合文本对象:比如使用yw复制一个单词, yy复制一行

编辑/插入模式

普通模式下单击以下字母进入编辑/插入模式

i insert: 在当前光标位置前面开始插入

I insert before line: 光标调到当前行最前面开始插入

a append: 在当前光标位置后面开始插入

A append after line: 光标跳到当前行最后面开始插入

o open a line below: 在当前光标所在行下面新加一行开始插入

O open a line above: 在当前光标所在行上面新加一行开始插入

按Esc可以退出编辑模式进入普通模式,我在.vimrc里配置了jj映射来方便地进入普通模式

快捷键

gi 快速返回上一次编辑的位置

终端中和vim插入模式下都可以使用的快捷键:

ctrl+h 删除上一个字符

ctrl+w 删除上一个单词

ctrl+u 删除当前行

ctrl+a 移动到开头

ctrl+e 移动到结尾

ctrl+b 往前移动

ctrl+f 往后移动

命令模式

普通模式下单击冒号:进入命令模式

保存退出方式

:q quite 退出

:w write 写入/保存

:wq write & quite 保存然后退出

ZZ 作用等同于:wq

:e! 禁止刚刚所有修改

多文件操作

BufferWindowTab区别:

  • Buffer是指打开的一个文件的内存缓冲区

    • Vim打开一个文件后会加载文件内容到缓冲区
    • 之后的修改都是针对内存中的缓冲区,并不会直接保存到文件
    • 直到我们执行:w (write)的时候才会把修改内容写入到文件里
  • Window是Buffer可视化的分割区域

    • 一个缓冲区可以分割成多个窗口, 每个窗口也可以打开不同缓冲区
    • 每个窗口可以继续被无限分割(看你屏幕是否够大)
  • Tab可以组织窗口为一-个工作区.

    • Vim的Tab和其他编辑器不太一样,可以想象成Linux的虚拟桌面
    • 比如一个Tab全用来编辑Python文件,一个Tab全是HTML文件
    • 相比窗口,Tab一般用的比较少,Tab太多管理起来也比较麻烦

buffer、window、tab区别.png

打开多个Buffer(缓冲区):

  • 使用:e {文件名}可以打开多个文件,这时虽然只有一个窗口,但是却有多个Buffer(缓冲区)

在Buffer(缓冲区)之间切换:

  • 使用:ls会列举当前缓冲区,然后使用:b n跳转到第n个缓冲区
  • 使用:bpre :bnext :bfirst :blast来跳转到 上一个/下一个/第一个/最后一个 缓冲区
  • 或者用:b {buffe名称}加上tab补全来跳转缓冲区

分割Window(窗口)命令:

  • <Ctrl+w>+s:sp水平分割
  • <Ctrl+w>+v:vs垂直分割,:q 来退出分屏
  • 使用:sp {文件路径}:vs {文件路径}可以在横竖分屏时直接打开指定的文件

在Window(窗口)之间切换:

  • <Ctrl+w>+w 在窗口间循环切换
  • <Ctrl+w>+h 切换到左边的窗口
  • <Ctrl+w>+j 切换到下边的窗口
  • <Ctrl+w>+k 切换到上边的窗口
  • <Ctrl+w>+l 切换到右边的窗口

可以使用:q /:wq来关闭分屏

切换窗口快捷键就是vim内上下左右对应的k j h l方向键,记住j是下就好

将切换窗口的方向快捷键改为大写效果是移动窗口

在不同窗口编辑同一个Buffer,所有的Buffer都会生效,因为都是编辑的同一块内存里的内容

替换操作

substitute命令允许我们查找并且替换掉文本,并且支持正则式

:[range]s[ubstitute]/{pattern}/{string}/[flags]

range 表示范围,比如:10, 20表示10-20行,%表示全部

s substitute:表示替换

pattern 是要替换的文本,string 是替换后文本

flage 是替换标志,一般有:

  • g global:表示全局范围内执行
  • c confirm:表示确认,可以确认或者拒绝修改
  • n number:报告匹配到的次数而不替换,可以用来查询某个单词出现的次数,例如::% s/java//n (因为是查询所以java后面留空)

例如:

:% s/java/python/g

表示在整个文件内把“java”替换为“python”,%:所有文件 s:替换 g:全局替换

解决粘贴缩进混乱的操作

:set paste 保留原格式粘贴,先执行该命令,再按i进入编辑模式粘贴就会保留原文件格式

:set nopaste 关闭粘贴命令

h paste 显示粘贴命令帮助,:exit退出帮助

其他操作

:set nu 显示行号

:% s/java/python/g 全局替换字符,把“java”替换为“python” %:所有文件 s:替换 g:全局替换

Visual(可视)模式

v 进入VISUAL选择模式,会选中当前字符,左右移动光标可以连续选中左右字符,上下移动光标会选中整行字符

V 选中当前行,上下移动光标可以连续选中上下整行字符

ctrl + v 进入VISUAL BLOCK:列选择/块选择模式,用于列编辑

在visual模式下:

y yank:复制

d 剪切

p put:粘贴

dd 删除一行

yy 复制一行

给vim更换配色

使用普通命令方式更换第三方配色

hybrid主题为例,先在用户根目录下clone好主题的仓库

git clone https://github.com/w0ng/vim-hybrid.git

然后在用户根目录下创建.vim/colors文件夹,如果没有.vim文件夹需要先创建好.vim文件夹

mkdir ~/.vim
mkdir ~/.vim/colors

接着把hybird主题文件夹内的Vim主题文件拷贝到刚创建好的colors文件夹内

cp vim-hybrid/colors/hybrid.vim ./.vim/colors

最后用Vim任意打开一个文件,键入:colorscheme,敲一个空格后按ctrl+d,就可以看到Vim可以更换的所有主题配色了

接着输入你想更换的配色的名字,点击回车,可以看到vim编辑器的配色就被成功更改了

这种方式不能持久化的更改vim编辑器的配色

Vim配置文件的使用

Vim里非常多常用的设置,比如:set number设置行号,之前的使用都是在Vim里临时设置,没法持久化,每次都要重新设置

但是Vim还提供了一种持久化配置的方式,使用.vimrc配置文件,让我们自定义配置

新建Vim配置文件

Linux/Unix下新建一个隐藏文件

vim ~/.vimrc

接着我们就可以开始自定义自己的配置了

Vimrc配置文件的内容

配置文件内需要设置的东西有以下四种:

  • 常用设置,我们可以把常用的设置写到.vimrc内避免每次打卡爱vim重新设置,比如:

    • set number 设置行号,colorscheme xxx 设置主题
    • Vim内有非常多这种配置,可以参考别人的配置,常用的有:

      " 设置行号
      set number
      " 设置主题
      colorscheme hybrid
      " 按F2进入粘贴模式
      set pastetoggle=<F2>
      " 高亮搜索
      set hlsearch
      " 设置折叠方式
      set foldmethod=indent 
  • Vim映射配置,Vim中的映射比较复杂,源于Vim有多种模式

    • 设置一下leader键let mapleader = ‘,’常用的是逗号或空格
    • 比如noremap <leader>w :w<cr>保存文件
    • 在下面映射章节有详细讲解Vim中的映射概念和常用的映射配置
  • 插件的配置,现代化的Vim可以通过插件管理器安装插件

    • 通过插件可以无限扩充Vim的功能
    • 使用插件需要具备一定的Vim配置知识
    • 在下面插件章节有详细讲解如何安装和使用常用插件
  • Vim脚本函数配置,Vim有可以自定义的脚本语言vimscript

    • Vim脚本对于Vim高级玩家来说可以实现强大的vim插件
    • 初学者知道有这个概念就好, vim脚本是一种简单的脚本语言
    • 可以通过vimscript实现更多vim的控制,开发自己的插件

可以研究下github上vim-go教程vim-go-tutorial的vimrc文件

这个文件是使用vim写go语言的一个最小配置,基本涵盖了一个编程语言需要设置的选项,可以用来参考学习

通过把vimrc配置放到git版本备库管理,可以同步到其他电脑或者服务器上

Vim映射的使用

Vim映射就是把「一个操作」映射到「另一个操作」

如果你不满现在的按键设置,比如vim本来的命令,或者你想映射一些方便的快捷键时,按照你的意愿定制Vim

基本映射

基本映射指的是normal模式下的映射,当然还有其他模式的映射

使用map就可以实现映射。比如:

map- x 表示按-就会删除字符

map <space> viw 表示按下空格的时候选中整个单词

map <c-d> dd 表示使用ctrl+d执行dd删除一行

模式映射

Vim常用模式normal/visual/insert都可以定义映射

nmap/vmap/imap定义映射只在normal/visual/insert分别有效,比如:

:vmap \ U 表示把在visual模式下选中的文本用\转换大小写 (u/U转换大小写)

:imap <d-d> <Esc>ddi 表示在insert模式下用ctrl+d删除一行

递归映射与非递归映射

递归映射

*map系列命令有递归的风险,例如定义了以下两个映射:

:nmap \ -:nmap - dd

当你按下\时, Vim会解释其为-,我们又映射了-,Vim会继续解析为dd,即它会删除整行,即有点类似于递归

通常情况是你安装了一个插件,插件映射了同一个按键的不同行为,有冲突就会有一个失效,解决方案就是使用非递归映射

非递归映射

Vim提供了非递归映射,这些命令不会递归解释

使用*map对应的nnoremap/vnoremap/inoremap

「任何」时候都应该使用非递归映射,防止自己的命令和其他命令冲突

一些方便的映射

以上的设置映射的命令都可以去掉冒号:持久化到.vimrc文件内,这里提供一些常用的映射配置:

" 把leader键映射为','
let mapleader=',' 
" 使用 jj 进入 normal 模式
inoremap jj <Esc>`^
" 使用 leader+w 直接保存
inoremap <leader>w <Esc>:W<Cr>
noremap <leader>w :W<cr>
" 切换buffer
nnoremap <silent> [b :bprevious<CR>
nnoremap <silent> [n :bnext<CR>
" 使用 ctrl+h/j/k/l 切换 window
noremap <C-h> <C-w>h
noremap <C-j> <C-w>j
noremap <C-k> <C-w>k
noremap <C-l> <C-w>l
" 使用 sudo 强制写入
cnoremap w!! w !sudo tee % >/dev/null
" json格式化 这是命令模式下的映射
com! FormatJSON %!python3 -m json. tool
可以研究下笨方法学Vimscript这本书中映射章节的内容

Vim插件的使用

和其他现代流行编辑器一样, Vim同样支持强大的插件扩展

Vim 插件是使用vimscript或者其他语言编写的vim功能扩展,编辑器自带的功能有限,有了插件之后几乎可以无限制扩充其功能

网络上比如github.com等有很多开源的vim插件可以使用

插件的安装

原始的方式是直接clone插件代码,如今vim有很多插件管理器可供选择,你可以选择一个顺手的使用

常见的有vim-plug,VundlePathogen Dein.Vimvolt

综合性能、 易用性、文档等几个方面,这里推荐使用vim-plug

vim-plug的安装

进入vim-plug插件的github仓库:https://github.com/junegunn/vim-plug

根据文档内容,在终端输入命令安装vim-plug:

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

如果使用的是Neovim,则使用以下命令:

curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

vim-plug的使用

编写配置文件

.vimrc文件内写入一行call plug#begin(),指定插件安装的目录

然后在中间列出要安装的插件,格式为Plug 'xxx',注意插件名称前后必须使用单引号

最后在结尾加上一行call plug#end()就可以安装插件了

可以参考文档给出的示例进行编写:

" Specify a directory for plugins:指定一个插件目录
" - For Neovim: stdpath('data') . '/plugged'
" - Avoid using standard Vim directory names like 'plugin':避免使用标准的Vim目录名称,例如“插件”
call plug#begin('~/.vim/plugged')

" Make sure you use single quotes:确保使用单引号
" 列出要安装的插件,例如:
Plug 'mhinz/vim-startify'


" Initialize plugin system:初始化插件系统
call plug#end()
这里起作用的代码其实就三行:call plug#begin('~/.vim/plugged')Plug 'mhinz/vim-startify'call plug#end()

安装第一个vim插件

我们将安装vim-startify,一个好用的vim开屏插件:vim-startify

根据仓库内的文档教程,修改你的.vimrc文件,增加该插件名称:Plug 'mhinz/vim-startify'

重新启动Vim或者使用:source ~/.vimrc ,然后执行:PlugInstall就可以开始安装插件了

安装完成后,回到终端重新启动vim就可以看到该插件的效果了,其他插件的安装方式也都类似

Vim插件网站:https://vimawesome.com/

添加新评论