技术标签: 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>
1. 我们在使用Dijkstra算法求解源点到其余顶点的最短路径的时候,在大多数情况下最短路径是只有一条的,但是也有可能存在着多条最短路径的情况,所以之前使用整型的pre[]数组来记录当前节点的前驱节点的方法就不再适用这个问题了,所以需要另外的数据结构来进行记录,而题目中告诉我们可能存在着多条最短的路径的时候往往会要求在多条最短路径下的另外一个条件,比如是边权之和最小或者最大,点权之和最小或者最大...
ASCII码大致由三部分组成:1、ASCII 打印字符:数字 32–126 分配给了能在键盘上找到的字符,当您查看或打印文档时就会出现。注:十进制32代表空格 ,十进制数字 127 代表 DELETE 命令。下面是ASCII码和相应数字的对照表ASCII 码 字符 ASCII 码 字符 ASCII 码 字符 ASCII 码 字符 十进位 十六进位 十进位 十六进位 十...
I want to convert the following JSON string to a java object:String jsonString = "{"libraryname":"My Library","mymusic":[{"Artist Name":"Aaron","Song Name":"Beautiful"},{"Artist Name":"Britney","Song ...
广播通信设计一、设计要求设计要求是通过学习winSock API编程,实现局域网消息广播的应用程序。系统采用CS架构的方式,具有服务端和客户端。完成的功能有私聊、群聊和私聊时的文件传输,私聊和文件传输采用TCP协议,群聊采用UDP协议。服务端只作为私聊信息的记录和转发,以及在线用户的更新。文件传输和聊天功能工作方式不同。文件传输的服务器由客户端提供,文件传输的客户端由系统客户端的私聊模块提供。而聊天功能的服务器由系统服务端提供,聊天功能的客户端由系统客户端提供。二、开发环境与工具开发系统:W
一、视频切分成帧import cv2def video2frame(videos_path,frames_save_path,time_interval): ''' :param videos_path: 视频的存放路径 :param frames_save_path: 视频切分成帧之后图片的保存路径 :param time_interval: 保存间隔 :retu...
2019独角兽企业重金招聘Python工程师标准>>> ...
前言在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个, 对应的要学习的内容是:视频采集-系统API基础音视频任务列表音视频任务列表: 点击此处跳转查看.目录(一)拍照系统API介绍(1.1)使用默认Intent拍照使用默认Intent启动cameramTakePhotoByIntent.setOnClickListener(new
android解析xml常用的有三种方式:dom,sax,pull方式。参考上篇文章以及许多网络资料加上自己的实例测试后总结如下:一、使用pull方式解析在android系统中,很多资源文件中,很多都是xml格式,在android系统中解析这些xml的方式,是使用pul解析器进行解析的,它和sax解析一样(个人感觉要比sax简单点),也是采用事件驱动进行解析的,当pull解析器,开始解析之后,我们...
RTL8821CE 在Linux Kernel 5.0 上并没有相关驱动,蓝牙设备虽可以识别但无法使用,而WiFi设备都不能识别出来。在搜索引擎中搜索一番,找到了一个可行的回答,但是这个回答是2017年给出的,有些过时了。但是基本思路还是不变的,只要稍作修改就可成功编译驱动程序。从 chili555 的回答中给出的下载链接下载驱动源代码压缩包。按照 chili555给出的步骤操作,在执行make命...
迷宫的最短路径 代码(C++)本文地址: http://blog.csdn.net/caroline_wendy题目: 给定一个大小为N*M的迷宫. 迷宫由通道和墙壁组成, 每一步可以向邻接的上下左右四格的通道移动.请求出从起点到终点所需的最小步数. 请注意, 本题假定从起点一定可以移动到终点.使用宽度优先搜索算法(DFS), 依
2018.10.20trainval_num与train_num为比例。set(a).difference(set(b)) 求差集random.shuffle()打乱数据,有返回。math.floor向下取整。random.sample(a,b):在a中随机采样b个元素。os.listdir()生成文件夹下文件名称列表。"""https://blog.csdn.ne...