vi/vim使用进阶: quickfix_龙啸九天520的博客-程序员秘密

技术标签: linux学习  quickfix使用方法  

:help quickfix
:help :make
:help 'makeprg'
:help 'errorformat'
:help 'switchbuf'
:help location-list
:help grep
:help :vimgrep
:help :grep
:help starstar-wildcard 

以前读武侠小说,看到武林高手们都是从来剑不离手的。使用vim写程序,你也可以做到这一点,:-)

vim由一个程序员开发,而且为更多的程序员所使用,所以在vim中加强了对软件开发的支持,quickfix模式的引入就是一个例子。所谓quickfix模式,它和Normal模式、Insert模式没什么关系,它只是一种加快你开发速度的工作方式。

Quickfix模式的主要思想是保存一个位置列表,然后提供一系列命令,实现在这个位置列表中跳转。

位置列表的产生可以从编译器的编译输出信息中获得,也可以由grep命令的输出信息中获得,我们上篇文章所介绍的cscope命令,也可以产生位置列表信息(:help ‘cscopequickfix’)。

[编译]

通常,我们在开发过程中,经常要写代码,编译,修改编译错误,这个过程会数十遍上百遍的重复。如果你是根据编译器输出的错误信息,打开出错的文件,找到出错的行,然后再开始修改,那效率未免太低下了。

利用vim的quickfix模式,可以大大加快这一过程,你可以在vim启动编译,然后vim会根据编译器输出的错误信息,自动跳到第一个出错的地方,让你进行修改;修改完后,使用一个快捷键,跳到下一个错误处,再进行修改,方便的很。

为了做到这一点,你首先要定义编译时所使用的程序,对大多数使用Makefile的项目来说,vim的缺省设置”make“已经可以满足要求了。如果你的项目需要用一个特殊的程序进行编译,就需要修改’makeprg‘选项的值。

大家在学编程时大概都读过”hello world”程序,我们就以这个简单的例子为例,讲一下quickfix模式的用法。

该程序的内容如下,里面包含了三个小小的错误:

/* hello world demo */
#include <stdio.h"
int main(int argc, char **argv)
{
    int i;
    print("hello world\n");
    return 0;
} 

我们可以为这个程序写个小小的Makefile文件,不过为了演示’makeprg‘的设置方法,我们并不用Makefile,而直接设置’makeprg‘选项,如下:

:set makeprg=gcc\ -Wall\ -ohello\ hello.c 

上面的命令会把hello.c编译为名hello的可执行文件,并打开了所有的Warnning。如果编译命令中有空格,需要使用’\‘对空格进行转义,上面的例子就使用了’\‘转义空格。

我们设置好’makeprg‘选项后,输入下面的命令就可以编译了:

:make 

在使用”:make“时,vim会自动调用’makeprg‘选项定义的命令进行编译,并把编译输出重定向到一个临时文件中,当编译出现错误时,vim会从上述临时文件中读出错误信息,根据这些信息形成quickfix列表,并跳转到第一个错误出现的地方。

对于我们上面的程序来说,光标会停在第三行,也就是第一个出错的位置,vim同时会提示出错信息。如果你没看清出错信息,可以输入”:cc“命令,vim会更次显示此信息,或者干脆使用”:cw“命令,打开一个quickfix窗口,把所有的出错信息显示出来,见下图:

现在我们知道错在哪儿了,修正一下,然后使用”:cn“命令(或者在Quickfix List对应行上输入回车)跳到下一个出错的地方,以此类推,直到修正全部错误。

好了,千辛万苦,我们的hello world终于工作了。乍一看这个例子,似乎Quickfix并没有提高什么效率,但如果你的错误出现在多个不同目录的不同文件里,它可以帮你省很多时间,使你可以集中精力在修正bug上。

vim可以同时记住最新的10个错误列表,也就是说你最近10次使用”:make“命令编译所遇到的错误都保存着,可以使用”:colder“和”:cnewer“命令,回到旧的错误列表,或者到更新的错误列表。

在quickfix模式里经常用到的命令有:

:cc                显示详细错误信息 ( :help :cc )
:cp                跳到上一个错误 ( :help :cp )
:cn                跳到下一个错误 ( :help :cn )
:cl                列出所有错误 ( :help :cl )
:cw                如果有错误列表,则打开quickfix窗口 ( :help :cw )
:col               到前一个旧的错误列表 ( :help :col )
:cnew              到后一个较新的错误列表 ( :help :cnew ) 

更多的命令,以及这些命令更详细的解释,请参见手册。

对于经常用到的命令,最好提供更方便的使用方法,在我的vimrc中的定义:

autocmd FileType c,cpp  map <buffer> <leader><space> :w<cr>:make<cr>
nmap <leader>cn :cn<cr>
nmap <leader>cp :cp<cr>
nmap <leader>cw :cw 10<cr> 

现在使用”,<space>“(先按,再按空格)就可以编译,使用”,cp“和”,cn“跳到上一个和下一个错误,使用”,cw“来打开一个quickfix窗口。这下顺手多了!

如果你希望跳转到出错的文件时,使用一个分隔的窗口打开,请参阅’switchbuf‘选项的值。

在vim7中,每个窗口都可以拥有自己的位置列表,这样,你就能够同时打开多个位置列表了,而quickfix列表在整个vim中只有一个。你可以使用位置列表来显示编译错误信息,具体命令参阅手册:”:help location-list“以及”:help :lmake“。

[GREP]

我们在程序员的利器 – cscope中讲过,cscope可以做为一个快速的grep程序使用,对于我们的软件项目,用cscope生成一个数据库,可以大大加快查找字符串的速度。但cscope需要事先生成一个数据库,对一些简单的查找,不需要专门为之生成数据库,这时候可以使用grep。

Grep的名字来源于”g/re/p”,”re”是正则表达式(regex)的意思,”p”是打印,也就是把匹配正则表达式的行打印出来。

vim既可以使用外部的grep程序,也可以使用内部集成的grep功能。

使用集成的grep命令非常简单,通常使用格式为:

:vimgrep /main/gj **/*.c 

在上面的例子里,我们使用vim内部集成的grep功能,在当前目录及其子目录树的所有c文件中查找main字符串,如果一行中main出现了多次,每个匹配都计入;在查找到后,不立即跳转到第一个匹配的地方。

使用内部集成的grep功能速度要比外部grep慢一些,因为它会打开每个文件,对其进行检查,然后关闭;但集成的grep支持vim增强的正则表达式,可以利用它进行更为复杂的查找。它也支持vim扩展的文件通配符表示方式,见”:help starstar-wildcard“。

vimgrep查找到的结果,也会放在quickfix列表中。下图是在vim 7.0的源代码目录中执行上面的命令生成的quickfix列表:

我们可以使用上面介绍的quickfix模式的命令,来查看这些匹配。

你也可以用外部的grep程序来查找,如果你的系统中所用的不是标准的grep程序,那么就需要修改’grepprg‘选项,详情请参阅手册。

使用外部grep的语法与grep程序相同,请参阅grep的手册。

无论使用内部的vimgrep,还是使用外部的grep,vim都允许你将查找到的结果放在与窗口相关联的位置列表,要了解详细信息,”:help :lvimgrep“及”:help :lgrep“。

在我的vimrc中,定义下面的键映射,利用它可以在当前文件中快速查找光标下的单词:

nmap <leader>lv :lv /<c-r>=expand("<cword>")<cr>/ %<cr>:lw<cr> 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011365893/article/details/12789299

智能推荐

android camera ae,Android Multimedia框架总结(十四)Camera框架初识及自定义相机案例..._张笑笑的酒窝的博客-程序员秘密

前言:国庆节告一段落,又是新一月,上月主要是围绕MediaPlayer相关展开,从今天开始,开始分析多媒体框架中的Camera模块,看下今天的Agenda:Camera拍照Camera录像新API android.hardware.camera2新旧API特点对比Camera自定义相机新API android.hardware.camera2自定义相机Camera类被用于获取图片设置,start/...

PHP实现二级目录跳转到二级域名带参数_php 目录转参数_陪代码一起浪迹天涯的博客-程序员秘密

    有朋友建站用的是虚拟空间,所以只能使用二级目录【域名/blog】建立博客,估计很多人也是这么做的,一位朋友由于最近换了主机,就想着把博客的二级目录切换到二级域名【blog.youdomain】,由于虚拟主机不能修改Nginx的配置文件,所以安教通小编想到了一个不错的方法,用PHP获取地址,然后判断,并转到二级域名,最重要的是带RUI!比如你访问【youdomain/blog/1.html】...

python日常实用小脚本-Python实现自动挂机脚本 | 沐雨浥尘_weixin_37988176的博客-程序员秘密

使用Python + win32api实现简单自动鼠标点击使用tkinter设计GUI界面并用pyinstaller打包不知不觉肝阴阳师也快一年了,对这游戏真是又爱又恨,最近刚刚发布了PC版,突然很想尝试着写个脚本挂机,话不多说进入正题。基础模拟点击简单的鼠标操作游戏挂机脚本,无非就是自动移动鼠标,自动点击,进行重复操作,所以,第一步就是如何控制鼠标1234567891011121314impor...

用VMWare笔记本一拖二,完美支持两套显示器键盘鼠标_ala617784513的博客-程序员秘密

先把笔记本分出一个扩展屏。把VM放在扩展屏上。宿主机环境:Windows7(其他的只要可以安装VMWare的我认为也都可以)+VM6.0.3分身步骤:第一步: 在虚拟机文件夹的设备配置文件.vmx里增加下面一行。 usb.generic.allowHID = "TRUE"第二步: 连接好第二套USB鼠标、键盘设备。第三步: 进入虚拟机...

ubuntu13.04更新源_ubuntu13.04源_玥Yue的博客-程序员秘密

Ubuntu 13.04正式发布有段时间了, 在安装好后的第一件事就是给Ubuntu 13.04换源,软件源、更新源,Ubuntu网易的更新源速度还是不错。相关阅读:Ubuntu 13.04 正式版发布 http://www.linuxidc.com/Linux/2013-04/83435.htmWindows 7下硬盘安装Ubuntu 13.04图文教程http://www.

英雄连门最新服务器开启时间,新版客户端现已开启公测!_角动量不守恒的博客-程序员秘密

从今天开始,所有玩家都可以参加公测并体验新版客户端了。快去下载(大约6GB)新客户端吧。无需任何申请程序——只需打开如上周所述,新版公测客户端将对所有人开放。在公测期间,你随时可以通过下载器下载更新,并可在任何大区进行游戏。在你下载前,请悉知目前仍是测试版,也就是说我们还有一些小问题需要攻克。新版客户端缺失的部分功能将在之后几个补丁里加入。上方视频中绚丽的动画也还没有加入。我们需要几个补丁包的时间...

随便推点

[LevelDB] LevelDB理论基础_weixin_30649859的博客-程序员秘密

说明:这篇文章主要介绍了理解LevelDB所需要的一些基础知识,主要是一些基础代码和基本机制。了解这些有助于对LevelDB的理解,同时这些实现基本上都出自Sanjay和Jeff Dean(Google GFS MapReduce Bigtable的缔造者)之手,其中的很多实现都非常不错,值得学习。转载请注明:作者:[email protected]出处:http://duanple.blog...

ANDROID内存优化(大汇总——全)(转载)_weixin_30391339的博客-程序员秘密

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总、挑选、简化后整理而成。 所以我将本文定义为一个工具类的文章,如果你在ANDROID开发中遇到关于内存问题,或者马上要参加面试,或者就是单纯的学习或复习一下...

qtp连接mysql数据库_QTP连接MYSQL数据库方法_蓝小狗的博客-程序员秘密

1.首先安装mysql数据驱动,qtp在windows系统下操作连接mysql,所以下载mysql-connector-odbc-5.1.8-win32.msi2.安装mysql驱动,默认安装即可。3.添加默认数据源控制面板-&gt;管理工具-&gt;数据源ODBC-&gt;系统DNS-&gt;添加-&gt;在“创建数据源”对话框中选择“MysqlODBC 5.1 Driver”-...

最简单的图片上传实例_weixin_30814223的博客-程序员秘密

&lt;form enctype="multipart/form-data" method="post"&gt; &lt;input type="file" id="avatar" name="avatar" /&gt; &lt;button&gt;提交&lt;/button&gt;&lt;/form&gt;&lt;script&gt; $('but...

利用weblogic的POOL(连接池)连接数据库 (转)_csd3176的博客-程序员秘密

利用weblogic的POOL(连接池)连接数据库 (转)[@[email protected]]利用webLOGIC的POOL(连接池)连接数据库作者:XYZ简单介绍以往用Java存取数据库都是直接用JdbC连接数据库;一般的,每个数据库...

推荐文章

热门文章

相关标签