Linux vim 用法

发布时间: 更新时间: 总字数:4033 阅读时间:9m 作者: 分享

介绍Vim的两种模式,如何在两个模式之间切换,并深入介绍Vim的移动、复制粘贴撤销、块选择、自动补全、可视化、分屏等等操作。

简介

在这个蔚蓝色的星球上,流传着两大神器的传说:据说Emacs是神的编辑器,而Vim是编辑器之神。一些人勇敢地拾起了Vim或Emacs,却发现学习曲线陡峭而漫长,还是有一些人留下来了,坚定地守护着这两大神器。一些说葡萄太酸的人想离开又不甘心,总是问:它们到底神在哪里啊?不过在此我只介绍传说中的编辑器之神-Vim。Vim是Vi最受欢迎的变种之一,除了继承了Vi迅捷的编辑方式, Vim的功能已经比原始的Vi强大得多。这也得益于它可以用Vim脚本无限地扩展。 Vim.org 上已经有数千个脚本了,给Vim增加各种各样的特性和功能。而且它的设计更符合Unix传统,它通过管道机制和系统内各种积木工具打交道,它讲究的是和系统内的工具程序协作来完成用户的任务。除此之外,它的定位也相当明确,就是做一个强大的编辑器,因此它的绝大部分扩展,都是为了更好的完成编辑文本的任务。Vim的前身Vi的作者Bill Joy和Emacs的作者Richard Stallman 都是那个时代著名的黑客,所以这两款编辑器一开始面向的主要用户就是写程序的人,现在仍然是。它们对编程加入了越来越多的支持,如语法高亮、智能缩进、关键字补全甚至集成调试。

初窥门径

要想玩嘛,首先需要先安装一个Vim再说咯。由于我的开发一般都是在CentOS上进行的,所以就说下它的安装吧。其实也就是一行命令的事儿了:

[root@voidy ~]# yum install vim
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
epel/metalink                                                                                                 | 4.3 kB     00:00

至此vim安装结束,现在先不要进行任何操作,先接着往下看:

[root@voidy site-packages]# vim site.py

然后就会看到如下的界面:

def __boot():
    import sys, imp, os, os.path
    PYTHONPATH = os.environ.get('PYTHONPATH')

此时进入了所谓的常规模式(Normal Mode),既然提到了模式这个概念,那么就详细的说下Vim的两种模式吧。

常规模式(Normal Mode)插入模式(Insert Mode)

常规模式:可以进行编辑,对已存在的文字进行一些操作,包括:复制,剪切,移动,修改,删除,格式化等等。

插入模式:也就是传说中的输入了。

而大部分的编辑器都只有一种模式,以上两部分的操作合并在一起进行,这就是为什么会有菜单和按钮的原因,而对于文字的范围选择也需要额外的方法来辅助,比如快捷键和鼠标操作等。无论是什么样的情况我们都不得不迫使大脑在思考(输入)和寻找(编辑)中不停转换,即使你不在意这一点,始终有一些操作你是无法流水化的。比如说:在光标随意停留在某处的时候,你能闭着眼睛用鼠标点击到某个功能吗?Vim 就可以。换言之一旦你掌握了 Vim之后,所有的操作——强调一遍:所有的操作都可以不用寻找,不用鼠标等工具辅助,你可以全副身心投入在你的主要目标上。

那么问题来了,如何在两种模式间进行切换呢?

其实很简单的。进入文件之后直接就是常规模式,那么从常规模式进入到插入模式只需要从以下几个命令选择一个即可:

i:在当前字符的左边插入
I:在当前行首插入
a:在当前字符的右边插入
A:在当前行尾插入
o:在当前行下面插入一个新行
O:在当前行上面插入一个新行

那么如何从插入模式进到常规模式,最常见的有三种:

  • 使用 ESC 键:这是最通用的方法,它唯一的缺点就是距离标准键位较远,然而由于它的位置在左上角,所以你也可以做一些强化练习来准确的找到它。记住:不要看键盘去找,要形成肌肉记忆!也有很多人偏好修改 ESC 键位,比如说把它转移到 CapsLock,即大写锁定键上去,这是可取的,并且也十分有效,然而我不推荐这么做。因为修改键位相对来说麻烦一些,在某些场景会让你颇感不便。比如说你去客户那里安装服务器,遇到的几乎都是标准键盘,不光是在 Vim 下让你难受,其他的地方也是如此,因为 ESC 太常用了,而且没有第二替代键。

  • 使用 Ctrl-[ 组合键:它的功能和 ESC 完全等价,只是组合键稍微困难一些。这里的窍门是 Ctrl 键的位置,我会把它重新映射到 CapsLock 键上去。这样一来两手的小指稍微移动就可以完成,稍加训练即可熟练掌握。这也是我不推荐 ESC 的第二个原因,至于之前提到过的键位映射带来的后遗症,不要紧,键盘上都有不止一个的 Ctrl 键,你根本无需调整键位。

  • 使用 Ctrl-c 组合键:看起来它似乎比 Ctrl-[ 更容易一些,但是它们的含义有很大的差别。在终端下 Ctrl-c 的意思是“中断”,基本上它会中止所有正在运行的命令,当然它也可以在 Vim 里带我们中断一切操作返回默认的常规模式。但是 Vim 有一些操作其实是依赖正常的返回方法的,也就是 ESC 或者 Ctrl-[,使用 Ctrl-c 会导致这样的功能无法被有效触发(有不少插件依赖这些触发功能,所以要小心莫名其妙的问题)。总而言之这是最不推荐的方法,除非你心里很有数,并且能在正确的时候使用前面两种方法。

好的,模式的介绍就此打住,在真正玩之前,特别建议要学会VIm的移动指令:Vim 的基本移动就是 h j k l 这四个键,分别代表 左 下 上 右

h    光标左移    
j    光标下移    
k    光标上移    
l    光标右移 

登堂入室

首先接着说移动吧:

0 → 数字零,到行头
^ → 到本行第一个不是blank字符的位置(所谓blank字符就是空格,tab,换行,回车等)
$ → 到本行行尾
/pattern → 搜索 pattern 的字符串(如果搜索出多个匹配,可按n键到下一个)

接下来就是一些常规的编辑的命令,通过它们你将能进行一些基本的操作,譬如复制粘贴、取消等:

yy → 拷贝当前行
p → 粘贴
dd → 删除当前行
u → 撤销上次操作
<C-r> → 返回撤销前一步(撤销多了可用)

当你编辑完之后想要对文件进行一些操作你会怎么办呢?别急,接着往下看:

:w → 保存(不过我一般用下面那个命令)
:wq → 保存并退出
:x → 同上
:q → 没有进行任何改动,仅仅查看的话可用
:q! → 进行改动后却又不想保存改动,强制退出
:saveas <path/to/file> → 另存为 <path/to/file>
:e <path/to/file> → 不退出当前文件打开另一个一个文件(PS:可用tab键进行路径补全,若当前文件有改动,可用:e! <path/to/file> → 打开一个文件)

当你掌握上面的指令之后,你已经算是练到登堂入室了。若想进军到登峰造极,那么请接着往下看。

登峰造极

来到这里,说明你的好奇心还是有的,并且还是有那么点上进心的,好的,首先我们来学习下如何进行更快速的光标移动,怎么,感觉光标移动很无趣,很简单?如果你不想你的大多时间花费在光标移动的话,那么我劝你还是继续往下看吧:

NG → 到第 N 行 (陈皓注:注意命令中的G是大写的,另我一般使用 : N 到第N行,如 :137 到第137行)
gg → 到第一行。(陈皓注:相当于1G,或 :1)
G → 到最后一行。
按单词移动:
    w → 到下一个单词的开头。
    e → 到下一个单词的结尾。

这样就没了吗?当然不是咯,或许你知道/pattern → 搜索 pattern 的字符串(如果搜索出多个匹配,可按n键到下一个),但是还有一个指令不用那么麻烦也可以做到哦,请看下面:

* 和 #:  匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个)

那么我们接着说说如何重复一个指令:

. → (小数点) 可以重复上一次的命令
N<command> → 重复某个命令N次

怎么样,有没有感受到Vim的强大,其实还远远不止这些,其实Vim的各种指令都是可以组合的哦,也就是下面这样:

<start position><command><end position>

举几个栗子:
dG:删除光标所在行直至文本末尾。
ye:从当前位置拷贝直至本单词最后一个字符。
好了,今天的内容就到此结束了,敬请期待下次的内容。

在当前行上移动光标: 0 ^ $ f F t T , ;

  • 0 → 到行头
  • ^ → 到本行的第一个非blank字符
  • $ → 到行尾
  • g_ → 到本行最后一个不是blank字符的位置。
  • fa → 到下一个为a的字符处,你也可以fs到下一个为s的字符。
  • t, → 到逗号前的第一个字符。逗号可以变成其它字符。
  • 3fa → 在当前行查找第三个出现的a。
  • F 和 T → 和 f 和 t 一样,只不过是相反方向。

##区域选择 < action>a< object> 或 < action>i< object>

在visual 模式下,这些命令很强大,其命令格式为

<action>a<object> 和 <action>i<object>
  • action可以是任何的命令,如 d (删除), y (拷贝), v (可以视模式选择)。
  • object 可能是: w 一个单词, W 一个以空格为分隔的单词, s 一个句字, p 一个段落。也可以是一个特别的字符:»、 ‘、 )、 }、 ]。
      假设你有一个字符串 (map (+) («foo»)).而光标键在第一个 o 的位置。

  • vi» → 会选择 foo.

  • va» → 会选择 «foo».

  • vi) → 会选择 «foo».

  • va) → 会选择(«foo»).

  • v2i) → 会选择 map (+) («foo»)

  • v2a) → 会选择 (map (+) («foo»))

块操作: < C-v>

块操作,典型的操作: 0 <C-v> <C-d> I-- [ESC]

  • ^ → 到行头
  • <C-v>→ 开始块操作
  • <C-d> → 向下移动 (你也可以使用hjkl来移动光标,或是使用%,或是别的)
    *I-- [ESC] → I是插入,插入“–”,按ESC键来为每一行生效。

在Windows下的vim,你需要使用 <C-q> 而不是 <C-v><C-v> 是拷贝剪贴板。

自动提示: <C-n><C-p>

在 Insert 模式下,你可以输入一个词的开头,然后按 <C-p>或是<C-n>,自动补齐功能就出现了……

宏录制: qa 操作序列 q, @a, @@

  • qa 把你的操作记录在寄存器 a。
  • 于是 @a 会replay被录制的宏。
  • @@ 是一个快捷键用来replay最新录制的宏。

示例

在一个只有一行且这一行只有“1”的文本中,键入如下命令:

  • qaYp<C-a>q→@a → 在1下面写下 2
  • qa 开始录制
  • Yp 复制行.
  • <C-a> 增加1.
  • q 停止录制.
  • @@ → 在2 正面写下3
  • 现在做 100@@ 会创建新的100行,并把数据增加到 103.

可视化选择:v,V,< C-v>

前面,我们看到了 <C-v>的示例 (在Windows下应该是<C-q>),我们可以使用 v 和 V。一但被选好了,你可以做下面的事:

  • J → 把所有的行连接起来(变成一行)
  • < 或 > → 左右缩进
  • = → 自动给缩进

在所有被选择的行后加上点东西:

  • <C-v>
  • 选中相关的行 (可使用 j 或 或是 /pattern 或是 % 等……)
  • $ 到行最后
  • A, 输入字符串,按 ESC。

分屏: :split 和 vsplit

下面是主要的命令,你可以使用VIM的帮助 :help split. 你可以参考陈皓以前的一篇文章VIM分屏

  • :split → 创建分屏 (:vsplit创建垂直分屏)
  • <C-w><dir> : dir就是方向,可以是 hjkl 或是 ←↓↑→ 中的一个,其用来切换分屏。
  • <C-w>_ (或 <C-w>|) : 最大化尺寸 (<C-w>| 垂直分屏)
  • <C-w>+ (或 <C-w>-) : 增加尺寸


vim 编辑文件

设置文件编辑的一些默认项:

#!/bin/bash
# vim:ft=sh sts=4 ts=4 expandtab

完毕。

Home Archives Categories Tags Docs