vim使用小技巧(1)

时间:2022-07-07 22:22:50
原文:http://www.enet.com.cn/article/2007/0910/A20070910816746.shtml

应用技巧一:快速注释

1、连续行注释

使用Vim/Vi编辑shell脚本,在进行调试的时候,需要进行多行的注释,每次都要先切换到插入模式,在行首输入注释符“#”,再退回命令模式,非常麻烦。其实如果要注释连续行,可在命令模式下执行,格式如下:

:起始行,终止行s/要替换字符/替换为新字符/g

如需注释第1行到第20行,可以执行:

:1,20s/^/#/g

其中“^”表示在行首插入,“#”为要插入的字符,“g”表示执行替换时不确认,若希望每行交互询问是否执行,可将“g”改为“c”。

如果编辑PHP脚本,注释要稍微麻烦一点,如也要注释第1行到第20行,要执行:

:1,20s/^//////g

PHP的注释符“//”要特殊处理,因为Vim/Vi替换命令格式中默认“/”为分隔符,这样就需要使用转义符“/”,表示“/”就要写成“//”才可以,所以命令如上所示。强烈建议各位看官使用,省时省力省键盘还省手指头。

2、非连续行注释

如果注释非连续的多行,可以定义快捷键简化,格式为:

:map 快捷键 执行命令

如定义快捷键Ctrl+P为在当前行行首添加“#”注释,可以执行:

:map ^P I//

“^P”为定义快捷键Ctrl+P,要注意的是必须同时按“Ctrl+v+p”按出此“^P”方才有效,或先按“Ctrl+v”再按 “Ctrl+p”也可以;“I//”就是此快捷键要触发的动作,“I”为在光标所在行行首插入,“//”为要输入的字符,“”表示退回命令模式,“”要逐 个字符键入,不可直接按键盘的“Esc”键。执行成功后,直接在任意需要注释的行上按“Ctrl+P”就自动会在行首加上“//”号了非常方便。

如果要取消此快捷键,只需输入命令:

:unmap ^P

我写程序或文档喜欢在末尾注释中写上自己的邮箱,每次录入十分麻烦,索性定义了一个快捷键,如下:

:map ^M isam_helen@vip.163.com

以后写完内容后,直接在注释中Ctrl+M就录入了俺的邮箱了。

应用技巧二:乱七八糟的技巧

1、传说中的命令“ab”

命令“ab”,同样可以解决上述输入邮箱的问题,因为我在Vim/Vi中定义了太多快捷键,如输入电子邮箱的、输入通信地址的、输入联系电话 的、输入求偶标准的、输入PHPChina管理员三围的……后来自己都记不住了。之后一天深夜电闪雷鸣,我突然发现了这条命令——“ab”,苍天啊大地 啊,我终于找到解决问题的方法了!oh yeah!

原来输入经常用的信息可以如此简单,LOOK——

:ab 替代符 原始信息

示例如下:

:ab sammail sam_helen@vip.163.com

执行之后,在输入模式任何地方录入“sammail”,再敲任意字母符号或者回车空格,咔嚓一下,利马就变成“sam_helen@vip.163.com”,那真是相当的方便啊!

2、原来可以双剑合一

在Vim/Vi中有两个小技巧:

No.1 可以直接在Vim/Vi中执行UNIX/Linux命令不需退出Vim/Vi

有时编写一些系统脚本,需要了解系统信息,很多同学就退出Vim/Vi然后执行命令,获得信息后再进行编辑。其实大可不必,如想获得/tmp目录下内容,只需在Vim/Vi命令模式下直接执行:

:!ls /etc

查看完命令结果,直接回车,就可以继续编辑非常方便。

在Vim/Vi中执行命令,格式就是这么简单:

:!命令

No.2 可以直接将其他文件内容导入当前编辑文件中

格式:

:r 文件名

如,需要导入文件/etc/issue的内容,执行:

:r /etc/issue

两个非常非常easy的小伎俩,就在一个我非常郁闷的下午,狂敲键盘时一不小心没留神发现了这样一个小秘密——原来它们可以结合起来用!

先举个例子,很多程序员喜欢写完程序后在注释中写入当前时间,我有个好办法即省事又快速还准确,只需要在命令模式下执行:

:r !date

当前时间就自动被导入了,任何命令的结果导入到当前编辑文件中,格式为:

:r !命令

3、助力编程的查询功能

以前在Linux系统下写一些C语言程序,有时记性不好,忘记了语法格式,使用Vim/Vi编写时可直接查询。如写程序写到fork时,突然 失忆了(失去了对这个东东的记忆),就可以直接把光标移动到fork上,按“K”(大写的K),直接就会跳到Linux程序员手册,看到fork的帮助, 看完后回车继续编写。

4、配置文件.vimrc

前面提到的快捷键、ab命令等的应用,设置后只在当前编辑文件中有效,如果想让它永久生效需要编辑用户宿主目录下的.vimrc文件,如你是root用户,则编辑/root/.vimrc(此文件默认不存在)。

写入你常用的设置命令即可,如:

:set nu

:map ^M isam_helen@vip.163.com

:ab sammail limingkillyou@163.com
vi/vim 中可以使用 :s 命令来替换字符串。以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询。
  :s/vivian/sky/ 替换当前行第一个 vivian 为 sky
  :s/vivian/sky/g 替换当前行所有 vivian 为 sky
  :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
  :n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
  n 为数字,若 n 为 .,表示从当前行开始到最后一行
  :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
  :%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
  可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
  :s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
  :%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/
  * ************************************
  1.:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
  :s/vivian/sky/g 替换当前行所有 vivian 为 sky
  2. :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
  :n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
  (n 为数字,若 n 为 .,表示从当前行开始到最后一行)
  3. :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
  :%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
  4. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
  :s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
  5. 删除文本中的^M
  问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M.请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。
  · 使用命令:cat filename1 | tr -d “^V^M” >newfile;
  · 使用命令:sed -e “s/^V^M//” filename >outputfilename。需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M。你必须要手工进行输入,而不是粘贴。
  · 在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:%s/^V^M//。
  · :%s/^M$//g
  如果上述方法无用,则正确的解决办法是:
  · tr -d "r" dest
  · tr -d "5" dest
  · strings A>B
  6. 其它
  利用 :s 命令可以实现字符串的替换。具体的用法包括:
  :s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
  :s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
  :.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
  :1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
  :g/str1/s//str2/g 功能同上
  从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索
  字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。