vim编程 -- 学习vim笔记

大短人    2019/10/09    总阅读量

高并发、锁   思考   面试   实践   Netty   Linux   Redis   MySQL   Nginx   Maven   Git   ElasticSearch   Spring  

学习vim最主要的目的还是提高代码效率,学习编程中最重要的还是编程的思考,所以手下功夫一定不能耽误思维的流畅。 本人主要从事游戏开发,以VSCode做为主,虽然之前已经对编辑器自身的快捷键很熟悉了,但是在编辑代码上的效率还是不满意,索性就开始学习“神之编辑器”。

从两个方向去学习vim命令

1. 从vim命令本身的结构去学习

2. 从编程中常用的操作流程去实践


vim基本结构

vim基本分为4个基本模式,普通模式,插入模式,可视模式,命令模式。

普通模式通过按键操作,进行移动、复制、粘贴、删除、替换、屏幕滚动等操作。

插入模式如同最普通的文本编辑器一样的,写作模式。

可视模式用来选择文本的模式,如同鼠标选择文本一样方便。

命令模式输入vim提供的指令来完成相关操作。主要为设置环境、文件操作等。

4个模式之间相关跳转完成编辑。

模式下跳转

> 普通模式下按`<ESC>`会取消当前命令,其他模式下按`<ESC>`会跳转到普通模式。
> 普通模式按`:`进入命令模式。
> 普通模式按`v`进入**普通**可视模式。
> 普通模式按`V`进入**行**可视模式。
> 普通模式按`<CTRL> + v`进入**块**可视模式。

1. 普通模式下

`i/I` 前/最前 **插入**;
`a/A` 后/最后 **插入**;
`o/O` 下/上行 **插入**;
`c + 命令` 删除**插入**;

`s/S` 删除插入(要与sround模式和sneak模式区分);

替换模式

`R/gR` 进入替换模式(替换后面的字符),推荐gR。
`r/gr` 处理一个字符的替换,返回普通模式。

2. 可视模式下

`I` 进入 **插入**;
`o` 切换移动点

3. 插入模式下

<C w> 删除前一个单词
<C u> 删除至行首
<C r>{register}将寄存器的内容粘贴到光标所在的位置,如:<C - r>=6*3<Enter>插入18。
<C v>{123} 以十进制字符插入字符。
<C v>u{123}以十六进制字符编码插入字符。
<C k>{char1}{char2} 插入以二合字母{char1}{char2}表示的字符。

这个模式允许执行一次普通模式命令,执行完后回到插入模式。
<C o>进入“插入-普通模式”。
<C o>zz 把当前行置于窗口正中,这个经常用。
<C [>退出到普通模式==<Esc>

`f+字符` find 向下找一个字符,`t+字符`找之前

`#`,`*`(shift+3/8)查找上/下一个光标所在相同的单词
% 匹配括号跳转

D 删除当前到末尾
`[{`、`]}`跳转函数体最上最下括号
在块模式下按I(大写i),可进入多光标情况
ctrl+o( older )/i返回到前/后一个光标位置
gd 查询所属单词定义

`vib/vi(`(选中`()`内的内容)
`viB/vi{`(选中`{}`内的内容)
`vi"`(选中`"`内的内容)
`vi'`(选中`'`内的内容)
`vi<`(选中`<>`内的内容)

vis 选中一个句子
vib 选中一个block
viw 选中一个单词
vip 选中一个段落

`~` 大小写互相转换
`U/u` 可视模式下所选改为大/小写
`gU/u` + iw/aw/w/e....
`gUU/guu` 当前行大/小写

视觉模式下 ii选中函数体

删除 d/word 删除到word前 Exp: d/;

重复类型 重复操作符 回退操作符
文本改变重复 . u
行内查找重复 ; ,
全文查找重复 n N

复制完单词 /<Ctrl+R>0 查找寄存器上的单词

查看寄存器中的内容::reg

exp:10a!<esc> 数字+a/i+字符串+esc 连续输入10个相同人字符串

命令模式下命令流

hello world

Old text Command New text
"Hell3 *world!" ds" Hello world!
[123+4*56]/2 cs]) (123+456)/2
"Look ma, I'm *HTML!" cs"<q> <q>Look ma, I'm HTML!</q>
if *x>3 { ysW( if ( x>3 ) {
my $str = *whee!; vlllls' my $str = 'whee!';
<div>Yo!*</div> dst Yo!
<div>Yo!*</div> cst<p> <p>Yo!</p>
ci: 例如,ci(,或者ci),将会修改()之间的文本;
di: 剪切配对符号之间文本;
yi: 复制;
ca: 同ci,但修改内容包括配对符号本身;
da: 同di,但剪切内容包括配对符号本身;
ya: 同yi,但复制内容包括配对符号本身。
PS. dib等同于di(。diB等同于di{。

`ci[ ci( ci< ci{` 删除一对 [], (), <>, 或{} 中的所有字符并进入插入模式
ci” ci’ ci`删除一对引号字符 ” ‘ 或` 中所有字符并进入插入模式
cit 删除一对 HTML/XML 的标签内部的所有字符并进入插入模式

1. 删除 复制 粘贴
   - `x` delete
   - `X` 退格
   - dd 删除当前行
   - d+0/$ 删到 行首/尾
   - yy 复制行
   - p 下行粘贴 P 上行粘贴
   - J 本行下行合并
2. 移动
   - hjkl 移动一下
   - xxx+hjkl 重复移动xxx次
   - 0 行首
   - $ 行尾
   - gg 页首
   - G 页尾
   - xxx+G 定位到行号
   - xxx `<Enter>` 向下移动xxx行
3. 搜索替换
   /world 找world
   ?world 向上找world
   n N 向下向上找
   :n1/n2s/word1/word2/g 替换
   :1,$s/... 全页替换
   :%s/... 同上

底线命令模式

1. `:q` quit退出
2. `:w` 保存
3. `:open xx.xx` 打开xx.xx

标记与到达标记

ma 设置此处为标记a
`'a` 到达标记a行行首
``a` 到达当时标记位置的地方

切换窗口

`ctrl + ww` 切换窗口
`ctrl + w <h|j|k|l>`切换到这个方向的窗口

`R` 可以临时进入替换一直更改

`w` 下个单词头
`b` 上个单词头
`e` 这个单词尾

`v + w/b/e/h/j/k/l/$/0` 选择
`y/p` 复制/粘贴
`x/d` 删除/剪切

vscode&vim对比

快捷命令 vscode vim
上下复制 Alt+shift+上/下 yyp/P
上下新建行 ctrl+(shift)+enter o/O
选中一个单词 ctrl + d viw
系统剪切板 ctrl+c/v ”+
删除当前行 ctrl+shift+k dd
跨越单词 ctrl + 左右 web

gd - Go to definition, 跳转到定义。 gb - 找出与光标下相同的下一个单词, 并添加一个光标 ,接下来就可以同时修改。 af - VISUAL 模式命令, 依据语法分析, 将选择区域向外扩展。 gh - 等同于将鼠标移至光标所在单词, 方便查看定义以及报错。

insert插入模式下:删除前一个

`ctrl+h` 字符
`ctrl+w` 单词
`ctrl+u` 一行

Surround 模式

https://github.com/tpope/vim-surround Normal mode


ds - delete a surrounding
cs - change a surrounding
ys - add a surrounding
yS - add a surrounding and place the surrounded text on a new line + indent it
yss - add a surrounding to the whole line
ySs - add a surrounding to the whole line, place it on a new line + indent it
ySS - same as ySs

Visual mode

s - in visual mode, add a surrounding

S - in visual mode, add a surrounding but place text on new line + indent it

Insert mode

<CTRL-s>` - in insert mode, add a surrounding
`<CTRL-s><CTRL-s>` - in insert mode, add a new line + surrounding + indent
`<CTRL-g>`s - same as`<CTRL-s>

ci

`cis` 改变句子
重要命令
`y` yank 提起
`p` paster 粘贴
`a` append 追加
`i` insert 插入
`s` substitute 替换

Append,Insert,Replace,Subsitute
AIRS
小写表示characterwise(字符)
linewise(行)

`5yl` 复制光标后的5个字符(包括光标所在的那个字符)
`5yh` 复制光标前的五个字符(不包括光标所在的那个字符)
`5dl` 删除光标后的5个字符(包括光标所在的那个字符)
`5dh` 删除光标前的5个字符(不包括光标所在的那个字符)

例如执行命令(:键),搜索(/和?键)或者过滤命令(!键)。在命令

输入插入命令i、附加命令a、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。
<http://c.biancheng.net/view/519.html>

S:删除光标所在行并开始插入
s:删除光标所在的字符并开始插入
==排版

替换

:s/old/new #替换当前行的第一个old为new
:s/old/new/g #替换当前行的所有的old为new
:.,![s/old/new #替换当前行到最后行的第一个old为new :.,](https://math.jianshu.com/math?formula=s%2Fold%2Fnew%20%23%E6%9B%BF%E6%8D%A2%E5%BD%93%E5%89%8D%E8%A1%8C%E5%88%B0%E6%9C%80%E5%90%8E%E8%A1%8C%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AAold%E4%B8%BAnew%20%3A.%2C)s/old/new/g #替换当前行到最后行的所有old为new
:N,Ms/old/new #替换第N行到第M行的第一个old为new
:N,Ms/old/new/g #替换第N行到第M行的所有old为new
:N,Ms/old/new/gc #替换第N行到第M行的所有old为new,且逐一询问是否删除
:%s/old/new #替换所有行的第一个old为new
:%s/old/new/g #替换所有行的所有old为new

光标移动

> 形式:Ctrl + cmd

b 向上移动一屏
f 向下移动一屏
e 向上滚动一行
y 向下滚动一行

> 形式:cmd

H 当前屏幕顶 high
M 中 middl
L 低 low

> 形式:Num%
> 移动到文档在百分之Num

屏幕移动

zz 光标所在行移动到屏幕 中
zt 顶
zb 低

> 形式:Ctrl + cmd

u 向上移动半屏
d 向下移动半屏

f/F/t/T: (find) (to)

形式:Num f Char

f移动到该字符 t移动到该字符前 ;重复执行命令

在插入模式下ctrl + o 临时进入命令模式 url: http://www.cnblogs.com/moiyer/archive/2010/04/01/1952681.html

vim normal模式下

1、c+i+分隔符,删除分隔符里面的内容(不删除分隔符,c+a+分隔符则包括分隔符一起删掉)

如将光标位于’%s : %d years old ‘ 中,此时按c+i+’ ?则可以将’%s : %d years old ‘ 变为’ ‘

vickey-wu = ‘vickey-wu’ 例句:print ‘%s : %d years old ‘ % (vickey-wu,23) 结果:print ‘’

我个人记的方法c:change,i:ignore,a:all 2、y+i+分隔符,y在vim是复制,与上面的同理,表示复制分隔符里面的内容(不复制分隔符,y+a+分隔符则包括分隔符一起复制)

https://www.jianshu.com/p/41c759d543b7 进阶 https://www.jianshu.com/p/cbfa86c8d8a5

gp,和p的功能基本一致,只是粘贴完,它会把光标移动至粘贴内容之后;gP同理

https://www.cnblogs.com/yangjig/p/6014198.html



作者:大短人
链接:https://www.jianshu.com/p/9caf97de4905
版权归作者所有,转载请注明出处



腾讯云:新客户代金券
腾讯云:3年时长最低265元/年
阿里云双11活动压轴出场


目录