vim 操作

分屏: :vs 横分屏 :sp 竖分屏

Visual 可视模式

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

使用 shirt+v选择行

使用 ctrl+v 进行快选择

编辑模式下(a,i,o)

快速纠错

Ctrl+h 删除上一个字符,Ctrl+w 删除上一个单词, Ctrl+u删除当前行

Ctrl+a 移动到开头 Ctrl+e 移动到末尾 Ctrl+b 前移 Ctrl+f 后移

快速切换insert和normal模式

Esc 按起来不方便

可以使用Ctrl+c 代替Esc(可能会中断某些插件不推荐)或者Ctrl+[

gi 快速跳转到最后一次编辑的地方并进入插入模式

vim快速移动

h,j,k,l 左下上右

w/W 移动到下一个单词开头。 e/E 下一个单次末尾。

b/B 回到上一个单次开头。backword

行间搜索移动

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

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

如果第一次没搜到,可以使用分号;下一个 逗号,上一个 继续搜索 改行

大写F 翻过来搜索前面的字符

vim 水平移动

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

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

常用的是0和$就可以满足日常需求了

vim重置移动

() {}

vim 页面移动

gg/G 移动到文件开头或结尾, 使用Ctrl+o 快速返回

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

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

vim 快速增删改查

vim 快速删除

vim 在normal 模式下使用x快速删除一个字符

使用d配合文本对象快速删除一个单次daw (d a word) 会删除单词周围的空格。

dd 删除整行 dt( 删除括号中的内容

dx 都可以搭配数字来执行多次

vim 快速修改

常用的 r (replace), c (change), s(substitute)

normal模式下使用r可以替换一个字符。 s替换并进入插入模式

使用c配合文本对象,我们可以快速修改 c

vim 查询

:set hls 高亮查询

:set incsearch 边搜索边高亮查询字符

使用 / 或者? 进行向上或者向下搜索

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

使用* 或者 # 进行当前单次的前向和后向匹配

vim 搜索替换

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

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

range 表示范围 比如 :10,20 表示10~20行 %替换所有

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

flags常用标志

g(global) 表示全局范围内执行

c(confirm) 表示确认,可以确认或者拒绝修改

n(number) 报告匹配到的次数而不替换,可以用来查询匹配次数

vim 多文件操作

buffer window tab

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

窗口是buffer可视化的分割区域

tab可以组织窗口为一个工作区

buffer

vim打开一个文件后会加载内容到缓冲区

之后的修改都是针对内存中缓存区,并不会直接保存到文件。

直到我们执行:w(write)的时候才会吧修改内容写入到文件

buffer之间的切换

使用:ls列举当前缓冲区,然后使用:b n跳转到指定的文件中

:bpre :bnext :bfirst :blast

或者用 :b buffer_name 加上tab补全来跳转

:e [edit] a.txt 打开a.txt

window 窗口

窗口是可视化的分割区域

一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同的缓冲区。

Ctrl+w s水平分割, Ctrl+w v 垂直分隔。或者:sp 水平 :vs 垂直

每个窗口可以继续被无限分割

如何切换窗口

Ctrl+w(window)

C-w w 在窗口间循环切换

C-w h 切换到左边的窗口

C-w j 切换到下边的窗口

C-w k 切换到上边的窗口

C-w l 切换到右边的窗口

C-w = 使所有窗口等宽、等高

Tab(标签页)将窗口分组

vim 的text object

vim 里文本也有对象的概念,比如一个单次,一段句子,一个段落

很多其他编辑器经常只能操作单个字符来修改文本,比较低效

通过操作文本对象来修改要比只操作单个字符高效

文本对象操作方式

[number] <command>[text object]

number 表示次数;command是命令, d(delete), c(change), y(yank)

text object 是要操作的文本对象,比如单次w, 句子 s, 段落p

vim 复制粘贴与寄存器使用

vim normal模式复制粘贴

normal模式下复制粘贴分别使用y(yank)p(put), 剪贴dp

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

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

vim insert模式下的复制粘贴

大部分人使用Ctrl+v 或者Cmd+v 粘贴

这个和其他的文本编辑器差不多,但是粘贴代码有个坑

很多人在vimrc中设置了autoindent 粘贴python代码缩进错误

可以使用 :set paste:set nopaste 解决

什么是vim寄存器?

vim 在normal模式下复制、剪贴的内容去了哪里?

vim里的操作的是寄存器而不是系统剪贴板,这和其他编辑器不同

默认我们使用d删除或者y复制的内容都放到了 “无名寄存器“

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

深入寄存器(register)

:echo has('clipboard') 输出1 支持以下操作

vim不适用单一剪贴板进行剪贴、复制与粘贴,而是多组寄存器

通过 "{register} 前缀可以指定寄存器,不指定使用默认无名寄存器

比如使用 "ayiw 复制一个单词到寄存器a中, "bdd删除当前行到寄存器b中

vim中 "" 表示无名寄存器,缺省使用。 ""p其实等于与p

其他常用的寄存器

除了有名寄存器 a-z, vim中还有一些其他常见的寄存器

复制专用寄存器 "0 使用y复制文本同时会被拷到复制寄存器0

系统剪贴板 "+ 可以在复制前加上 复制到系统剪贴板

其他一些寄存器 比如 "% 当前文件名, ". 上次插入的文本

:e! 重载文件

什么是vim宏(macro)

很多使用vim很久的vimer 都没用过宏

宏可以看成是一系列命令的集合

我们可以使用宏录制一系列操作,然后用于回放

宏可以非常方便地把一系列命令用在多行文本上

如何使用宏

宏的使用分为录制和回放

vim 使用 q{register}来录制,同时也是q结束录制

使用 q{register}选择要保存的寄存器,把录制的命令保存其中

使用 :normal @{register}回访寄存器中保存的一系列命令

什么是补全?

只要手速快,补全什么的都是浮云

补全是根据当前环境上下文由编辑器 “猜” 你想输入的东西

比如补全一个单词、文件名、或者代码中的函数名、变量名等

vim中提供了多种补全功能,还可以有插件扩展功能实现代码补全

vim 中常见的补全

C-n 普通关键字

C-x C-n 当前缓冲区关键字

C-x C-i 包含文件关键字

C-x C-] 标签文件关键字

C-x C-k 字典查找

C-x C-l 整行补全

C-x C-f 文件名补全

C-x C-o 全能补全

常见的三种补全类型

Ctrl+nCtrl+p 补全单词

Ctrl+x f 补全文件名

Ctrl+x o 补全代码,需要开启文件类型检测,安装插件

输出当前文件绝对路径::r! echo %:p

给vim 换个配色

使用 :colorscheme 显示当前的主题配色,默认是default

:colorscheme Ctrl+d 显示所有配色

: colorscheme 配色名 切换配色

vim a.txt b.txt -O 打开两个文件并分屏

编写vim配置

:set number 设置行号

持久化vim配置文件

vim 复制到系统剪贴板

vim --version | grep clipboard 如果有+clipboard,恭喜你可以直接使用了。

vim ~/.vimrc 加入一下配置

set clipboard=unnamed

如果是-clipboard

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# ubuntu
$ sudo apt install vim-gtk

# macOS
$ brew options vim
# 安装/重装
$ brew install/reinstall vim --with-client-server

# nvim + tmux + wsl2 复制到系统剪贴板
curl -sLo/tmp/win32yank.zip https://github.com/equalsraf/win32yank/releases/download/v0.0.4/win32yank-x64.zip
unzip -p /tmp/win32yank.zip win32yank.exe > /tmp/win32yank.exe
chmod +x /tmp/win32yank.exe
sudo mv /tmp/win32yank.exe /usr/local/bin/

# 安装完成后测试 clipboard: error invoking win32yank.exe
Windows缺少运行库导致的

搜索历史记录

C-b + [

fzf 插件

1
2
# 需要在本地环境上安装此命令
sudo apt-get install fzf silversearcher-ag

参考