Vim语法及插件

Vim语法及插件

    • 常用
    • `Normal`模式
      • 移动
      • 删除
      • 修改
      • 查找
      • 复制粘贴
      • 撤销
    • `Insert`模式
      • 复制粘贴
    • `CMD`模式
      • 替换
    • `Visual`模式
    • 多文件间的转换
      • Buffer
      • Window
      • Tab
    • 文本对象
    • 补全
    • 配置
    • 映射
    • 插件
    • 脚本


常用

课程链接

Vim中的指令可以灵活组合使用

:help 查找文档

切换为后台Ctrl + z;切换为前台fg

Ctrl + D打开候选列表


Normal模式

进入Vim,默认Normal模式或使用Esc进入Normal模式

移动

单词间移动
移动到下一个word/WORD开头 w / W (移动到下一个word/WORD结尾 e / E
移动到上一个word/WORD开头 b / B
word是指以非空白符分割的单词,WORD是指以空白符分割的单词。

行间搜索移动
使用 f{char}可以移动到{char}字符上,t{char}移动到{char}字符的前一位字符
多个{char}间的切换用; / , 表示下一个 / 上一个
f搜索到光标行尾间的字符,F搜索到光标行首间的字符。

行间快速移动
0移动到行首第一个字符,使用0w起到和^相同的作用(^移动到行首第一个非空白字符)
$移动到行尾(g_移动到行尾非空白字符)

页面移动
gg / G 移动到文件的开头 / 结尾,ctrl + o快速返回
移动到屏幕的开头H (head),中间M (middle),结尾L (lower)
/ 上(upword) / 下(forward)翻页
zz 调整当前行到屏幕中间
zt 将光标所在行调整到屏幕上方
:n 跳转到第n

删除

xd 删除选中部分,x可以用在一个字符上直接删除,d属于删除指令,要删除一个字符,需要dl
dw删除光标到单词的结尾,diw删除光标所在的单词,dd删除光标所在行,D 删除所在行光标之后的所有词
dt{char}删除光标到{char}的所有字符
d0 删除到行首,d$ 删除到行尾
2dd删除行,4x删除个字符。数字+命令 表示多次重复。
ggdG清空屏幕
. 模仿上一次删除操作

修改

r (replace) 替换一个字符,保持Normal模式; R 替换多个字符,保持Normal模式
s (subtitute) 删除当前字符,并进入Insert模式;S删除当前行,并进入Insert模式
c (change)
cw删除单词,并进入Insert模式;C删除光标到行尾,并进入Insert模式;
ci( 修改()中的内容,()也可以是{} [] <>,但是对于c++中的流操作符<<就不能使用ci<来修改其内容,因为是两个<相连,可以使用c%进行修改,但是光标要置于<后。

查找

/ / ? 进行前向 / 反向搜索
使用n / N 跳转到一个 / 一个
使用* / # 进行单词的前向 / 后向匹配

复制粘贴

y (yank)复制 yiw复制一个单词,yy复制一行,y0复制光标到行首
d (delete)剪切
p (put)粘贴,p粘贴到光标之后,P粘贴到光标之前

vim在复制、剪切过程中的文本内容是存在寄存器中,而不是系统剪切板。
xp :用x删除一个字符,将字符放到无名寄存器中,再使用p粘贴,实现字符对调。

对于寄存器的使用,通过:{register}可以指定寄存器,有多个寄存器,如az都可以设置为寄存器,可以作为剪贴板来使用。如"ayiw表示复制一个单词到寄存器a中,"bdd表示删除当前行到寄存器b中。
使用:reg a显示寄存器a中保存的内容
使用"bp表示粘贴寄存器b中的内容
""表示无名寄存器,默认就是用的无名寄存器,因此可以省略不写
"0表示复制专用寄存器,默认复制到无名寄存器时,也会复制到专用寄存器
"+表示系统剪贴板,用于和vim外进行交互用的寄存器

清理寄存器的内容 :let @"='',让无名寄存器的内容赋为''空字符

当在客户端进行复制后,在服务端进行粘贴时,无法使用寄存器进行交互,因此可以使用:set clipboard=unnamed设置服务器中的vim,再直接使用p来进行粘贴

颠倒两行:exe "normal! ddpk"

  • :exe :这是一个 Ex 命令,用于执行后面的字符串作为 Vim 命令。
  • "normal! ddpk":这是要执行的字符串。在这个命令中,"normal!" 是告诉 Vim 将后面的字符串作为普通模式下的按键操作来执行。
  • dd :删除当前行,并将其保存到剪贴板中。
  • pk:按下 p 键,将剪贴板中的内容(之前删除的行)粘贴到光标当前位置的上一行。

撤销

u撤销操作,U撤销某一行最近所有修改,撤销u


Insert模式

i(insert)光标之插入,I插入
a(append)光标之插入,A插入
o(open a line below) 在下一行插入O在上一行插入

进入该模式后, 删除上一个字符, 删除上一个单词, 删除光标前当前行所有字符(同理于终端

可以使用 ,从 Insert 模式切换到 Normal 模式
可以使用 gi,从 Normal 模式切换到 Insert 模式中最后编辑的位置

复制粘贴

正常文本的复制粘贴
{register}对对应寄存器中的内容进行粘贴


CMD模式

通过 : 进入命令行模式

:w (write)写入
:wq (write quit)写入并退出
:q 退出编辑器,如果存在未保存的修改,Vim会提示保存放弃修改。如果没有做任何修改或已保存修改,Vim将立即退出。
:q! 也用于退出编辑器,但是它会强制退出,丢弃所有未保存的修改
因此,如果你有未保存的修改,应该首先使用:q命令尝试退出编辑器并保存修改。只有在确定不再需要这些修改时,才应使用:q!命令强制退出。

:vs (vertical split)竖直分屏
:sp (split)水平分屏
:set nu (set number)设置行号

替换

支持正则表达式
语法::[range]s[ubtitute]/{pattern}/{string}/[flags]

[range]表示范围,如10,20表示10到20行,%表示全部

{pattern}表示需要替换的文本

{string}表示替换后的文本

[flags]
g (global) 表示全局范围执行
c (confirm) 表示需要确认是否修改
n (number) 表示匹配到的次数,而不进行替换

:% s/a/b/g 把所有的a替换成b
:1,6 s/a/b/g 把1到6行的a替换成b
:1,6 s/a//n 1到6行中查找有多少个a。但可能会对a替换成空字符,可修改为:1,6 s/a/&/gn

使用正则表达式
:% s/\/b/g 把所有的单词a替换成b,而不替换含有a字符的单词


Visual模式

进行可视化选择
Normal模式输入v,进入visual选择。使用V选择整行,使用进行块状选择。
选中使用U转换成大写字母,u转换成小写字母


多文件间的转换

Buffer

Buffer指打开的一个文件的内存缓冲区
修改时针对Buffer的内容修改,:w再将修改内容写入文件。
每个文件对应一个Buffer,使用:ls会列举当前缓冲区,再使用:b n跳转到第n个缓冲区。
:bpre :bnext :bfirst :blast 分别跳到对应的缓冲区中,或者用:b buffer_name 加上Tab补全来跳转。

通过:ls来获得缓冲区中对应文件的信息、编号,可以通过:b1跳到编号为1所对应文件的Buffer中去。
也可以用:e buffer_name打开对应的文件。

Window

WindowBuffer可视化的分割区域。
v 垂直分割,同:vs
s 水平分割,同:sp
w 窗口间循环切换
h 切换到左侧窗口,H 将窗口移动左侧
j 切换到下侧窗口,J 将窗口移动下侧
k 切换到上侧窗口,K 将窗口移动上侧
l 切换到右侧窗口,L 将窗口移动右侧

Tab

Tab可以把Window组织为一个工作区


文本对象

可以快速操作一个单词、一个句子和一个段落等。
语法:[number][text object]

[number]表示次数
表示命令,如d c y
[text object]表示要操作的文本对象,如w 单词,s句子,p段落


iw (inner word) viw表示选择当前单词,vi"表示选择"中的内容
aw (around word) vaw表示选择当前单词以及单词后的空格


一系列命令的集合:可以使用宏录制一系列操作,再用于回放这些操作,用于批量的编辑。

Normal模式下,使用q来开启录制,再使用q来结束录制。可以使用q{register},来指定对应的寄存器来存放指令。使用@{register}回放

如,有多行网址,要给每一行的网址加上双引号。

https://www.example1111.com
https://www.example22.com
http://www.example333.com
http://www.example4444.com
https://www.example55555.com
http://www.example666666.com
https://www.example7777777.com
http://www.example88.com
https://www.example99999.com
http://www.example1000000.com

qa 开启录制宏到a寄存器中
光标置于第一行,I" A" q ,其中I光标置于行首,插入"退出Insert模式,A插入到行尾,插入",退出Insert模式,q结束录制。 完成了一个
可以使用j@a,让下一行也通过宏完成指令。
还可以使用进入visual模式,VG选择其余所有行,使用:进入命令行模式,vim会显示:'<,'>,使用normal模式下的指令,输入normal @a。命令行整体为:'<,'>normal @a,即可完成操作。

整体修改只需
:1 qa I" A" q :2 VG :normal @a

"https://www.example1111.com"
"https://www.example22.com"
"http://www.example333.com"
"http://www.example4444.com"
"https://www.example55555.com"
"http://www.example666666.com"
"https://www.example7777777.com"
"http://www.example88.com"
"https://www.example99999.com"
"http://www.example1000000.com"

其实可以不使用宏也来完成该需求,VG先全选,输入:normal I",给所有行首加入",进入命令行模式:输出上一步操作,将I"改为A"即可。
将宏的批量修改改成统一修改,由于录制宏中需要两次退出Insert模式,因此需要两次进入normal模式。


补全

常见补全
补全单词,在待补全选项中,可以通过使用操作选下一个和 上一个,而不使用方向键来选择。
补全文件名
补全代码,需要开启文件类型检查,安装插件



配置

:set number等配置的持久化,而不是每次打开一个文件都要重新配置。通过对vimrc的设置,完成此需求。
建立一个~/.vimrc配置文件,通过其编写对vim的设置。

  • 常用设置::set nu设置行号,colorscheme hybrid设置主题
  • 常用的vim映射:noremap w :w保存文件
  • 自定义的vimscript函数和插件的配置

" 表示注释


映射

vim的映射比较复杂,因为有多种模式。在~/.vimrc中,通过使用leader键来进行组合,常用的leader键是使用, 或者空格 let mapleader = ','

命令 模式 描述
map 所有模式 创建非递归映射
noremap 所有模式 创建递归映射
com! 命令行模式 定义自定义命令
imap 插入模式 创建插入模式下的非递归映射
inoremap 插入模式 创建插入模式下的递归映射
nmap 正常模式 创建正常模式下的非递归映射
nnoremap 正常模式 创建正常模式下的递归映射
vmap 可视模式 创建可视模式下的非递归映射
vnoremap 可视模式 创建可视模式下的递归映射
xmap 选择模式 创建选择模式下的非递归映射
xnoremap 选择模式 创建选择模式下的递归映射

inoremap w :w

  • inoremap : (i insert, nore no recursive, map map) 插入模式非递归映射
  • w 等价使用,w
  • :w 等价表示为在Insert模式,先使用,进入Normal模式,再进入命令行保存文件:w,最后再使用回车

使用,w映射为在Insert模式保存文件。

如何使得自定义的vimrc配置文件生效,类似与.bashrc一样,通过输入:source ~/.vimrc来使其生效或者退出,重新进入。

noremap h,通过来实现移动到左侧窗口。

有一种情况,如下

:nmap - dd
:nmap \ -

最后,会将\映射为dd。类似于递归的形式。因此,使用递归映射,行为有不确定性。比如安装的插件恰巧映射了不确定的行为。建议使用非递归映射

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


插件

推荐使用vim-plug
.vimrc

call plug#begin('~/.vim/plugged')
//...
call plug#end()

//...的位置添加插件内容,完成vimrc的修改后,执行:PlugInstall安装插件即可。
如,Plug mhinz/vim-startify 是直接使用 https://github.com/mhinz/vim-startify 网址的一部分

有需求就有供给,如何找到插件:

  • Google
  • vimawesome
  • 他人开源配置文件

脚本

vim对应的脚本vimscript

推荐书目笨方法学Vimscript


你可能感兴趣的:(工具,工具库,vim,编辑器,linux)