VIM 使用简介(转载

VIM 使用简介(转载

Vi IMproved (VIM) 是 Bram Moolenaar 开发的与 UNIX 下的通用文本编辑器 vi 兼容并

且更加强大的文本编辑器。它支持语法变色、正规表达式匹配与替换、插入补全、自定义键

等等功能,为编辑文本尤其是编写程序提供了极大方便。VIM 可以运行在“任何”操作系统

上,包括我们常用的 Windows 和 UNIX/Linux。一旦掌握了 VIM,你就掌握了一项跨平台的

利器。

尽管 VIM 功能十分强大,但对于刚接触它的人尤其是用惯类似 Windows 的 notepad 的人

来说,VIM 并不十分易于掌握,毕竟它兼容的是 vi 而不是 notepad。本文旨在介绍 VIM

中我所了解的用法,希望有更多的人喜欢 VIM。应该指出的是,VIM 中有太多的功能和命令

,有许多你并不用的着,因此没有记的必要,有些我也不知道,这要靠你来发现,关键是多

看 :help ,多试。另外,取决于你的 VIM 的版本以及编译安装时的设置,文中讲述的某些

功能或命令在你的 VIM 中也许并不存在,如有需要请升级。

1. vi 的基本用法

vi 的屏幕区域分为两个部分:最下面一行是命令行,一般用于提示信息或命令行输入;除

此之外为正文显示区域。跟 notepad 不同的是,vi 中存在两种模式:普通(Normal)模式和

插入(Insert)模式。

进入 vi 后默认即为普通模式。新手一般初次进入 vi 后就想输入一串字符,结果发现 vi

 一连串莫名其妙的反应。其实,在 vi 的普通模式下,任何按键包括普通字符都表示某个

命令,并不表示在当前光标处插入字符。常用的命令有:(注意区分大小写)

:       进入命令行

i 或 a  进入插入模式。区别是:i 进入插入模式后,光标在当前字符前面; a 进入插入

模式后,光标在当前字符后面

h j k l 分别是光标左移、下移、上移、右移(一般来说你不会用到它们来移动光标,按方

向键就可以了)

x       删除一个字符

dd      删除一行

J       删除本行的回车符,把下一行并入本行末尾

r字符   替换光标所在字符为新字符

^ $     分别是光标移到行首和行末

数字G   移动光标到第若干行,如果直接按 G 则移动到最后一行

在普通模式中,命令以按键形式输入。而在命令行中,命令以字符串形式输入。下面是常用

的命令行:

:q      退出! (更确切的说应该是关闭当前文件)

:w 文件名       存盘。如果还是保存为当前文件,不必写文件名

:wq     存盘退出

:new 文件名     打开或新建文件(同时关闭当前文件)。如果不指定文件名或者文件名不存

在则是新建文件

:help   帮助! 看完后用 :q 关掉窗口。可以在 help 后面加某个帮助主题的名称,如 :he

lp dd 或 :help help

还有一点是,如果某个命令得到警告(拒绝执行),则要在命令的命令词后加叹号表示强制执

行。比如你修改过文件,但又想放弃存盘并退出,如果输入 :q,vi 会告诉你文件已修改,

这时,你只能输入 :q! 退出。又如用 :w! a.txt 表示把当前文件存为 a.txt 而不管 a.tx

t 是否已经存在。

插入模式就不用多说了,添加你的新内容吧。不过,你也许会发现 BackSpace 键和 Delete

 键的运用很受限制,也不能像 notepad 那样选择、复制和粘贴。这些都是由于这是 vi 的

标准,后面我们将看到 VIM 扩展的功能可以解决这些问题。记住按 ESC 退出插入模式,回

到普通模式。

2. 复制和粘贴

为了便于选取文本,VIM 引入了可视(Visual)模式。要选取一段文本,首先将光标移到段首

,在普通模式下按 v 进入可视模式,然后把光标移到段末。需要注意,光标所在字符是包

含在选区中的。这时可以对所选的文本进行一些操作,常用的(可视模式)命令有:

x 或 d  剪切(即删除,同时所选的文本进入剪贴板)

y       复制

r字符   所有字符替换为新字符

u U ~   分别是所有字母变小写、变大写、反转大小写

> <     分别是缩进和反缩进

当输入了命令以后,VIM 将回到普通模式,这时可以按 p 或 P 进行粘贴。普通模式下有关

复制和粘贴的命令:

v       进入可视模式

p 或 P  在当前位置粘贴剪贴板的内容,p 粘在光标所在字符后面,P 粘在前面

不得不承认,虽然引入了可视模式,复制和粘贴在 VIM 中仍然是比较麻烦的操作,这也许

是 VIM 唯一的缺点。:-) 此外,VIM 还引入了选择(Select)模式,跟可视模式类似。结合

一些键的定义和选项设置,可以实现跟 notepad 相同的复制和粘贴的使用习惯。限于篇幅

和水平,在此不提。

3. VIM 的定制

VIM 在 vi 的基础上扩展了许多功能和命令,提供了许多选项。但是有些功能默认是关闭的

,有些选项可能也不符合个人的使用习惯。为此,我们需要编写一个 vimrc 文件。在 DOS/

Windows 版本的 VIM 中,这个文件应放在 VIM 的目录下,文件名为“_vimrc”。在 UNIX

 版本 的 VIM 中,这个文件一般可以放在用户的个人主目录下,文件名为“.vimrc”。VIM

 启动时将会把 vimrc 文件中的每一行作为命令行依次执行,我们可以在该文件中加入若干

下面是一个 vimrc 文件的示例:(请注意区分浏览器的换行与实际的换行。)

” 设置 Backspace 和 Delete 的灵活程度,backspace=2 则没有任何限制

set backspace=2

” 设置在哪些模式下使用鼠标功能,mouse=a 表示所有模式

set mouse=a

” 设置路径,在 <C-W>f 等命令中涉及此参数

” 对于 Windows 编程,path 可设为如

” set path=.,”C:/Program Files/Microsoft Visual Studio/vc98/Include”,,

” 对于 UNIX 编程,path 可设为如下

set path=.,/usr/include,/usr/include/qt,,

” 打开光标的行列位置显示功能

set ruler

” 设置跳格距离

set tabstop=4

” 设置自动缩进格数

set shiftwidth=4

” 打开自动缩进功能

set autoindent

” 设置哪些键可以行间绕转,如下设置则 Backspace 和方向键等均可行间绕转

set whichwrap=b,s,h,l,<,>,[,]

” 根据当前文件语法自动变色。VIM 识别上百种文本文件的语法,如 html、c++、java 等

syntax on

” 以下是个人习惯,定义 <F2> <F3> 等键,便于插入模式和可视模式之间的切换

” (1) 使 x d y 自动返回插入模式

vnoremap y “ryi

vnoremap x “rxi

vnoremap d di

” (2) 普通模式和插入模式下均可按 <F3> 粘贴

imap <F3> <Esc>:if col(“.”)!=1 <Bar>exe ‘normal “rp'<Bar>else<Bar>exe ‘normal “r

P'<Bar>endif<CR>`[i

nmap <F3> “rP

” (3) 普通模式和插入模式下均可按 <F2> 进入可视模式

imap <F2> <Esc>:if col(“.”)!=1 <Bar>exe ‘normal lv'<Bar>else<Bar>exe ‘normal v'<

Bar>endif<CR>

nmap <F2> v

下面给出我常用的 vimrc 文件。另外,你的 VIM 安装目录下很可能也带有一个默认的 vim

rc 文件,你都可以参考。如果遇到没有见过的命令或者参数,可以自己看看 :help 。

    * vimrc

4. VIM 的其它命令

要真正使用 VIM,光靠 vi 的基本命令当然不行,下面就来介绍更多的命令。以下的命令,

有些是 VIM 特有的,有些在 vi 中也存在,我就不加区分了。其中,以“:”开头表示该命

令在命令行输入,以“i”开头表示这是插入模式下的命令,其它则是普通模式下的命令。<

C-X> 表示按 Ctrl+X。

4.1 使用帮助

<C-]>   在 :help 中,遇到超连接可以按 Ctrl+] 跳转

<C-T>   在 :help 中,按 Ctrl+T 往回跳转

4.2 打开多个文件

:split 文件名   切分出一个新窗口,打开指定文件。如果省略文件名,则仍显示当前文件

,可用于同时观察文件的不同部分。(注意跟 :new 的区别)

<C-W>f  切分显示光标所指的文件名,VIM 会在 path 中搜索该文件名,比如常用它打开 #

include 语句中的文件

<C-W><C-W>      当同时打开几个文件时,按 <C-W><C-W> 在各窗口之间切换

<C-W>_  当同时打开几个文件时,按 <C-W>_ 使当前窗口最大化

:set scrollbind 设置卷动绑定属性。所有设置了卷动绑定属性的窗口将一起卷动。可以用

 :set noscrollbind 解除绑定

4.3 撤销和恢复

编辑过程中出现错误在所难免,不过没有关系,VIM 允许无限次的撤销。只要你没有关闭文

件,你甚至可以一直撤销下去,回到几个小时以前刚打开这个文件开始工作时的状态。

u       撤销(Undo)上次所做的修改

<C-R>   恢复(Redo)上次撤销的内容

4.4 字符串搜索替换

/字符串 向下搜索字符串

?字符串 向上搜索字符串

* #     分别是向下和向上搜索光标所指的词

n       重复上一次搜索

:起始行,结束行s/搜索串/替换串/g 从起始行到结束行,把所有的搜索串替换为替换串

:set ignorecase 设置忽略字母大小写。可以用 :set noignorecase 取消忽略字母大小写

例如 /hello 从当前光标位置开始向下搜索 hello,不带字符串的命令 / 可重复上一次搜

索,相当于 n。又如 :1,$s/hello/hi/g 把全文中的 hello 改为 hi,其中 $ 表示最后一

行。另外,你还可以先进入可视模式选择一段文本,按 :进入命令行并输入 s/hello/hi/g

 ,VIM 将在选区中进行替换操作。

搜索字符串用的是正规表达式(Regular expression),其中许多字符都有特殊含义:

/       取消后面所跟字符的特殊含义。比如 /[vim/] 匹配字符串“[vim]”

[]      匹配其中之一。比如 [vim] 匹配字母“v”、“i”或者“m”,[a-zA-Z] 匹配任

意字母

[^]     匹配非其中之一。比如 [^vim] 匹配除字母“v”、“i”和“m”之外的所有字符

.       匹配任意字符

*       匹配前一字符大于等于零遍。比如 vi*m 匹配“vm”、“vim”、“viim”……

/+      匹配前一字符大于等于一遍。比如 vi/+m 匹配“vim”、“viim”、“viiim”…



/?      匹配前一字符零遍或者一遍。比如 vi/?m 匹配“vm”或者“vim”

^       匹配行首。例如 /^hello 查找出现在行首的单词 hello

$       匹配行末。例如 /hello$ 查找出现在行末的单词 hello

/(/)    括住某段正规表达式

/数字   重复匹配前面某段括住的表达式。例如 /(hello/).*/1 匹配一个开始和末尾都是

“hello”,中间是任意字符串的字符串

对于替换字符串,可以用“&”代表整个搜索字符串,或者用“/数字”代表搜索字符串中的

某段括住的表达式。

举一个复杂的例子,把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列

写法:

:%s/abc/(.*/)xyz/xyz/1abc/g

:%s//(abc/)/(.*/)/(xyz/)//3/2/1/g

其它关于正规表达式搜索替换的更详细准确的说明请看 :help pattern 。

在插入模式下,为了减少重复的击键输入,VIM 提供了若干快捷键,当你要输入某个上下文

曾经输入过的字符串时,你只要输入开头若干字符,使用快捷键,VIM 将搜索上下文,找到

匹配字符串,把剩下的字符补全,你就不必敲了。这样,编程序时你起多长的变量名都没关

系了,:-) 而且还可以减少输入错误。我认为,插入补全是 VIM 最为突出的一项功能。

i<C-P>  向上搜索,补全一个词。例如,上文中出现过 filename 这个词,当你想再输入 f

ilename 时,只要按 f<C-P> 即可。假如 VIM 向上搜索,找到以 f 开头的第一个匹配不是

 filename,你可以继续按 <C-P> 搜索下一个匹配进行补全。当然,如果你想一次 <C-P>

就成功,你可以多输入几个字符比如 filen 再按 <C-P> 补全

i<C-N>  向下搜索,补全一个词

i<C-X><C-L>     补全一行。比如你写过一行 for (int i = 0; i < 100; i++),你想再写

一模一样的一行,只要输入 for<C-X><C-L> 即可。如果补全出来的不是你想要的那一行,

你可以按 <C-P> 或 <C-N> 选择上一个或下一个匹配行

i<C-X><C-F>     在文件系统中搜索,补全一个文件名

如果按 <C-P> 或 <C-N> 补全一个词,在当前文件中没有找到匹配,VIM 将搜索 #include

 语句中的文件,而文件的位置将在 path 中搜索。

4.6 键的定义

在 VIM 中你可以定义一个键,按了这个键等于按了某一串预定的键。比如

:map! <F10> <Esc>ddi

表示如果你在插入模式下按 <F10> 就相当于连续按了 <Esc>ddi,这将会使 VIM 退回到普

通模式,删除一行,再进入插入模式。

map 命令有许多变化形式,每种变化形式所定义的键只在某些模式下有效,而在其它模式下

无效。你需要根据情况使用正确的变化形式:

:nmap   键只对普通模式有效

:imap   键只对插入模式有效

:vmap   键只对可视模式有效

:cmap   键只在命令行下有效

:map    键在普通模式和可视模式都有效

:map!   键在插入模式和命令行下都有效

还要注意,如果你定义 :map d di 这将引起循环定义错误。这时,你需要使用 :noremap d

 di 来定义。同样,noremap 也有对不同模式的变化形式。

比如,你想在文件的每一行的倒数第二个字符处插入字符串“abc”,你可以定义

:nmap <F10> $hiabc<Esc>j

在普通模式下按一次 <F10> 将会:光标移到行末,光标左移一格,进入插入模式,输入“a

bc”,退回到普通模式,光标下移一行。不停地按 <F10> 将解决问题。这是我临时处理多

行重复操作的常用手段,当然,这是一种笨办法。:-) 而上文写到的对 <F2> <F3> 的定义

则是 map 更复杂的用法。你还可以定义

:map <F9> :w<CR>:!gcc -o %< -I/usr/include/qt -lqt %<CR>

:map <F5> :!./%<

实现按 <F9> 编译当前文件,按 <F5> 执行。

在插入补全当中提到的补全一行需要按 <C-X><C-L>,如果你觉得麻烦,你可以定义

:inoremap <C-L> <C-X><C-L>

减少击键次数。同样,对 <C-X><C-F> 也可以作类似定义。

4.7 其它命令

:!命令行        执行一条外部命令

.       在光标当前位置处重复上一次操作

i<C-V>后续字符  输入特殊的 ASCII 字符或键。除了插入模式外,也适用于命令行。后续

字符可以是键盘上的任意键,也可以是三位的十进制数字表示字符的 ASCII 码

i<C-O>命令      执行一个普通模式的命令,执行完毕后回到插入模式

<C-W>i  跳转到光标所指标识符的定义行。比如你在编程时遇到一个函数 CreateWindow,

想看它的定义语句,你就可以在它上面按 <C-W>i,VIM 将打开新窗口,把光标移到它定义

的地方。当然,前提是在当前文件或它的 #include 文件中存在 CreateWindow 的定义。这

也牵涉到 path 的设置。不过,VIM 找得不一定很准

K       看光标所指标识符的 man 帮助页

i<C-Y>  把上一行对应列的字符抄下来

i<C-E>  把下一行对应列的字符抄上来(写这一行时我就用了 <C-Y>)

<C-A>   光标所指整数加一

<C-X>   光标所指整数减一

<C-O>   光标返回到以前的位置。相当于光标移动的“撤销”

<C-I>   光标返回到后来的位置。相当于光标移动的“恢复”

<C-V>   进入可视模式,选取一个矩形区域。该命令通常用于对多行进行列操作。接着按 I

 可以在块前的每一行同时插入字符;按 A 可以在块后的每一行同时插入字符;按 x、d 或

 y 可以剪切或复制;等等

:X      对当前文件加密

5. VIM 6.0 的一些新特性

2001 年 9 月 26 日发布的 VIM 6.0 增加了一些以往没有的新特性。下面仅仅是一些简单

的介绍,更详细的描述请自己看 :help 。

    * 打开目录

      在 VIM 6.0 中,:new 和 :split 等命令不但可以打开普通文件,还可以打开目录。

一个目录打开以后将列出里面的文件信息,可以按回车继续打开相应的文件或者子目录,也

可以按 ? 得到其它目录操作(修改文件名,删除文件等)的帮助。

    * 折叠

      当一个文本太长而你又对其中很长一大段内容不关心的话,可以把你不关心的那些行

折叠起来,让它们从你的视线中消失。被折叠的行将以一行显示代替,例如:

      +–217 行:<b>2. VIM 的定制</b>———————

      折叠可以有多种方式控制,可以通过设置 foldmethod 选项的值来改变。默认情况下

 foldmethod=manual 为手工折叠。下面介绍几个使用折叠的最简单的命令:

      (可视模式下) zf   手工创建折叠。在可视模式下选择一段文本,然后按 zf 可以手

工创建一个折叠

      方向键左或右      打开折叠。普通或插入模式下,在折叠行上横向移动光标将打开

被折叠的行

      zc        关闭折叠

    * 垂直切分窗口

      :vsplit 文件名    垂直切分窗口。跟 :split 命令相似,但新窗口与原窗口左右并

列。

    * 更多的正规表达式

      VIM 6.0 比以前增加了许多新的正规表达式,其中我认为最有用的是换行匹配符 /n

。以前的版本中,正规表达式只能在同一行上匹配。现在,只要显式地给出 /n,正规表达

式可以跨多行。

    * diff 模式

      专门用于比较编辑两个或多个内容相近的文件的模式。一般来说,比如你要比较编辑

 A 跟 B 两个文件,你可以命令行启动 vim -d A B 或者这样:先打开文件 A,然后 :vspl

it 打开文件 B,对文件 A 和 B 都输入命令 :diffthis。这时 VIM 将非常清晰的对比显示

出两个文件的不同之处,编辑起来十分方便。

      仔细一看,这个 diff 模式动用了 VIM 许许多多的特性,包括卷动绑定,折叠和语

法变色等等。好高级啊!

我所熟悉的 VIM 的功能已经介绍得差不多,剩下的要靠你自己来学习了。其实,VIM 的功

能还有很多很多。还是那句话,多看 :help ,多试。VIM 的帮助还是挺容易看的,相信你

看了以后会有更多的惊喜。另外,VIM 的主页上有不少有用的技巧提示,也是一个很好的去

处。如果你有什么心得或者新发现,欢迎跟我讨论。

希望你喜欢 VIM。(2003.12.03)

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=409361

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100651.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • navcat15的永久激活码【在线注册码/序列号/破解码】

    navcat15的永久激活码【在线注册码/序列号/破解码】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • Spring容器和springmvc容器的区别联系

    Spring容器和springmvc容器的区别联系

  • spring boot 中使用 jpa以及jpa介绍

    最近在项目中使用了一下jpa,发现还是挺好用的。这里就来讲一下jpa以及在springboot中的使用。在这里我们先来了解一下jpa。1.什么是jpa呢?JPA顾名思义就是JavaPersistenceAPI的意思,是JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。2.jpa具有什么优势?2.1标准化JPA是JCP组织发布的Java

  • MATLAB矩阵合并「建议收藏」

    MATLAB矩阵合并「建议收藏」两个或多个矩阵的拼接(合并)操作:学习链接用[]做拼接时,有三种连接符:逗号(,),空格,分号(;)。逗号(,)和空格等价,表示不换行,直接横向拼接,横向拼接要求两个矩阵行数相同;分号(;)表示换行后纵向拼接,纵向拼接要求两个拼接的矩阵的列数相同。代码展示:1.横向拼接:1%逗号和空格表示横向拼接2A=zeros(4,2)3B=ones(4,1)4C=[AB]A=00000000B=11

  • 烫烫烫锟斤拷是什么_卡锟

    烫烫烫锟斤拷是什么_卡锟手持两把锟斤拷,口中疾呼烫烫烫。脚踏千朵屯屯屯,笑看万物锘锘锘解释一下为什么会是这两个东西不是别的==:棍斤拷乱码:源于GBK字符集和Unicode字符集之间的转换问题。Unicode和老编码

  • css里的clear_css display属性的值及用法

    css里的clear_css display属性的值及用法clear:none|left|right|both.对于CSS的清除浮动(clear),一定要牢记:这个规则只能影响使用清除的元素本身,不能影响其他元素。清除浮动方法,1,给父级元素添加class=“clearflex”2,在css中给父级添加属性:overflow:hidden;(我比较喜欢这个)3,伪元素清除法,4,建立空的div,命名为clear,在css中添加clear:both;…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号