我要系列|如何使用Vim?

Vim大法硬

Vim ,有点难,这是真的,你没毅力就赶紧别点开了,如果不幸点开也早点关掉,这种浪费时间的去学习的工具是坑。

前言

但是,如果你有毅力,敢入坑,那就对不起了,一旦从坑里爬出来,就没人挡得住你了,你就叫:「人挡杀人,佛挡杀佛」。

怎么学好?

用!

怎么用?

如果你在用Mac,打开Terminal,输入vi how to use vim? 你就新建了一个文件名字就叫《how to use vim?》,而与此同时你也正在一个空白的区域,等着你输入。

试着敲两下键盘,你会发现,「这他妈键盘是不是坏了,没办法输入啊?」如果你运气好,按了i 键,你发现左下角出现了-- INSERT --,恭喜你进入了 输入模式,你发现你的键盘又好了,可以尽情打字了。

「我不想打了,我要回家,怎么退出啊?」你想想,退出我们按什么?没错,就是ESC 键,你就退出了INSERT模式,进入了NORMAL模式,这时候你依次输入:wq,你就成功退出得救了,同时你刚刚惊慌失措写的文字也保存下来了。

我知道你劫后余生的心理感受:「这他妈没有正常的编辑器好用啊!什么鬼?」

先活下去

别怕,遇到困难的第一件事都是:先活下去!

我的Vim 操作备忘录

合并行

第一种, 多行合并成一行,即:

AAAAA
BBBBB
CCCCC

合并为:

AAAAA BBBBB CCCCC

  • 方法1:NORMAL 状态下3J 其中的3 是范围,可以是书签或者搜索位置等方式实现,J 为合并,且为向下合并。
    注: 如果改为3gJ 的话,则合并时各行没有空白AAAAABBBBBCCCCC, 下面方法类似,不再重复这两种合并方式的区别.

  • 方法2: 命令状态下:1,3 join:1,3 j

  • 方法3: 传统一点的,替换换行符的方式,为避免最后一行也被换掉,范围缩小了,命令状态下:1,2s/\n/ /

第二种,隔行合并,即:

AAAAA
BBBBB
CCCCC
DDDDD

合并为:

AAAAA BBBBB
CCCCC DDDDD

  • 方法1: 借用一下宏录制功能, NORMAL 状态下qaJjq 实现录制, 然后在合适的区域重复执行n遍,这里2 遍即可,NORMAL 状态下2@a

  • 方法2: 命令状态下:1,4g/^/ join 增加了g 过滤后,合并变成了隔行处理

移动

字符移动
1
2
3
4
k            上移                k
h 左移 h l
l 右移 j
j 下移

你也可以使用键盘上的方向键来移动,但这么做h j k l的存在就失去了意义

之所以使用h j k l来控制方向,其主要目的是让你的手不离开键盘中心,从而提高效率

tips:在命令前加上数字代表命令执行次数,如:5k,表示上移5行

单词移动
1
2
3
W w            移动到下一个单词开头
E e 移动到下一个单词结尾
B b 倒退到上一个单词开头

需要注意的是,E会忽略标点符号,如:I‘m,e会当成两个单词,E则不会

同样,在命令前加上数字代表执行次数,如:2w,表示往下移动2个单词

开头我也许会多说几遍,因为这个技巧很重要

整行移动
1
2
3
4
0            移动到行首
$ 移动到行末
+ 移动到下一行开头
- 移动到上一行开头

这里需要注意的是+ - 和上面的j k 有什么不同之处

j k 也是移动到上一行和下一行,但它们移动的是光标所在的位置

+ - 不管你的光标在何处,总是移动到下一行或上一行的行首

滚屏
1
2
3
4
5
6
7
Ctrl+f            往前滚动一整屏
Ctrl+b 往后滚动一整屏
Ctrl+d 往前滚动半屏
Ctrl+u 往后滚动半屏

Ctrl+e 往后滚动一行
Ctrl+y 往前滚动一行

看似比较多,但是可以根据键盘的位置来进行记忆,并且下面两个也不常用

上面的滚屏都有一个共同点,就是会改变光标的位置,且屏幕也在改变

如果想让光标维持在原来的位置实现滚屏请看下面

z 调整光标

1
2
3
z<Enter>        将光标所在行移动到屏幕顶端
z. 将光标所在行移动到屏幕中间
z- 将光标所在行移动到屏幕低端

tips:980z<Enter> 可以将第980行移动到屏幕顶端

在屏幕中移动
1
2
3
4
5
6
H            移动到屏幕顶端的行
M 移动到屏幕中央的行
L 移动到屏幕底端的行

nH 移动到屏幕顶端往下的第n
nL 移动到屏幕顶端往上的第n

据我猜测这三个字母应该是HIgh、Middle和Low的缩写,其实挺好记的

多练习几遍就行了,需要注意的是:这里只是光标的位置变化,和上面两种不同

tips:你可以用+ -j k 实现同样的位置变化,只不过要操作多次而已

+ -j k 的区别忘了吗?往上看看吧

在当前行移动
1
2
^            移动到当前行的第一个非空格处
n| 移动到当前行的第n

这里的^ 与上面的0 通常情况下表示的位置是一样的

n| ,个人感觉还没有h l 方便,慢慢的数出行数还不如直接按着h l 左右移

根据文本块移动

所谓的文本块也就是句子、段落、小节等

1
2
3
4
5
6
(            移动到当前句子开头
) 移动到下一个句子开头
{ 移动到当前这一段开头
} 移动到下一段开头
[[ 移动到当前这一节的开头
]] 移动到下一节的开头

其中,VIM以? . ! 等符号来标记一个句子

空白行来标记一个段落

用节宏来标记一个节(节宏是什么我还没搞清楚)

根据行号来移动
1
2
3
4
Ctrl+g            显示当前行信息
nG 转至第n
G 转至文本末尾
gg         移至文本开头

如果你不知道当前是多少行的话就可以用Ctrl+g 来查看

如果想转到第800行,可以用800G

其实z 命令也可以做到,并且把光标移动到第一行

tips: `` 反引号可以返回到使用G之前的位置

大小写转化

gu 或者 gU ,你可以理解为小u 意味着转为小写,大U 意味着转为大写。

剩下的就是对这两个命令的限定(限定操作的行,字母,单词)等等

整篇文章大写转化为小写

打开文件后,无须进入命令行模式。键入:ggguG

解释一下:ggguG 分作三段gg gu G

  • gg =光标到文件第一个字符
  • gu =把选定范围全部小写
  • G =到文件结束
整篇文章小写转化为大写

打开文件后,无须进入命令行模式。键入:gggUG

解释一下:gggUG 分作三段gg gU G

  • gg =光标到文件第一个字符
  • gU =把选定范围全部大写
  • G =到文件结束
只转化某个单词

guwgue
gUwgUe

这样,光标后面的单词便会进行大小写转换

想转换5个单词的命令如下:

gu5wgu5e
gU5wgU5e

转换几行的大小写

将光标定位到想转换的行上,键入:1gU 从光标所在行 往下一行都进行小写到大写的转换

10gU ,则进行11行小写到大写的转换

以此类推,就出现其他的大小写转换命令

  • gU0 :从光标所在位置到行首,都变为大写
  • gU$ :从光标所在位置到行尾,都变为大写
  • gUG :从光标所在位置到文章最后一个字符,都变为大写
  • gU1G :从光标所在位置到文章第一个字符,都变为大写

搜索

进入NORMAL 模式,输入/ 在输入想要查找的内容,回车即可!

n 键,可以跳转到下一个

shift + nN 键,可以跳转到上一个

录制宏

所谓宏,在vim里面是指某种特定顺序的一系列操作,我们可以录制自己的操作序列,然后重复这个序列多次,以简化某种重复的操作。vim宏有录制和播放的过程,录制就是你教给vim该怎么操作,播放就是vim照着你教的进行自动操作。因此,对于上面的文件处理,首先要进行宏录制:

  1. 把光标定位在第一行;

  2. 在normal模式下输入qa(当然也可以输入qb, qc, etc,这里的a, b, c是指寄存器名称,vim会把录制好的宏放在这个寄存器中)(PS:如果不知道什么是vim的寄存器,请自行放狗搜之);

  3. 正常情况下,vim的命令行会显示“开始录制”的字样,这时候,把光标定位到第一个字符(按0或者|),再按x删除,按j跳到下一行;

  4. normal模式下输入q,结束宏录制

好了,经过以上步骤,我们定义了一个存储在寄存器a中的宏,它的操作序列是:0->x->j,也就是跳到行首,删除,跳到下一行。

现在,第一行已经删除了行首的逗号,而且光标也已经在第二行,现在,在NORMAL 模式下输入@a,以播放我们刚录制好的存在寄存器a 中的宏。于是,第二行行首的逗号也被删除,光标停在了第三行。

这也不简单啊?你肯定会这样想,要删除100行,我还得输入100个@a,我还不如手动删除呢。呵呵,Vim 早就想到了,输入7@a,好了,剩下的7行全部搞定了。(PS:在命令前面加数字,就是代表要执行这个命令多少次)

.

没错,就这么一个

如何撤销’撤销’ ?

在vi中按 u 可以撤销一次操作

u: 撤销上一步的操作
Ctrl+r: 恢复上一步被撤销的操作

如何根据条件删除某一行

假设要在某坨数据中删除含有「sent」的行,可以执行:

1
:g/sent/d

其中中间的条件部分sent 和一般的查找条件格式相同,最后部分的 d 则和一般的命令按键相同。如果要保留匹配的行则可以把开头的 g 替换为 g!

这样的写法实际是使用了 VIM 的「Multiple Repeats」功能,完整格式是这样的:

1
:[range]g[lobal]/{pattern}/[cmd]

这一块儿值得好好学习一下!

删除重复行

1
2
3
4
:sort   //可以直接排序,这个太好用了
:g/^\(.*\)$\n\1$/d //去除重复行
:g/\%(^\1$\n\)\@<=\(.*\)$/d //功能同上,也是去除重复行
:g/\%(^\1\>.*$\n\)\@<=\(\k\+\).*$/d //功能同上,也是去除重复行

还有别的方法,但是一定要先删除一下行里面的空格,因为有了空格他们就不是一样的。
删除多余的空格

行末:$
行首:^
空格:\s

行末空格:\s+$
行首空格:^+\s

有些人认为行末的空格是无用,浪费而难看的。要删除这些每行后面多余的空格,可以
执行如下命令:

命令前面指明范围是 “%”,所以这会作用于整个文件。”substitute” 命令的匹配模式是
“\s+$”。这表示行末($)前的一个或者多个(+)空格(\s)。后面我们会介绍怎样
写这样的模式。
替换命令的 “to” 部分是空的:”//“。这样就会删除那些匹配的空白字符。

1
2
3
4
:%s/\s\+$//
:sort
:g/\%(^\1$\n\)\@<=.∗$/d
:g/^.∗$\n\1$/d

------ EOF ------
David Fnck wechat

⬇⬇~ 挖 矿 打 赏 系 统 ~⬇⬇

启动线程数当前算力(Hashs/秒)您已贡献(Hash单位:个)

点击 Coin Hive 挖矿教程 学习如何配置博客打赏!

欢迎留下您的评论