Vim-quickfix-详述

可查看 :h quickfix 中的文档. 也可参考 http://neovim.io/doc/user/quickfix.html#grep.

简述

quickfix 的基本理念是, 保存 compiler 产生的错误信息, 并可以用 vim 在 errors 之间跳转.

在 Vim 中, 也可以借助 quickfix 来访问匹配文本的位置, 如使用 :vimgrep 查找的 pattern matches, 可以通过 getqflist() 函数来获取这些位置信息.

相关概念

quickfix-ID

每一个 quickfix list 都有一个唯一的标识符 called the quickfix ID, 其在一个 Vim session 中都不会改变.

可以用 getqflist() 函数来获取这些 identifier.

一个 quickfix list 可以由 :vimgrep, :grep, :helpgrep, :make 来创建.

location list

一个 location list 是 window-local quickfix list, 可以用 :lvimgrep, :lgrep, :lhelpgrep, :lmake 这些命令创建.

其与 quickfix list 是相互独立的, 其只与一个 window 有关. 当前 window spite 之后, 也会产生一个 location list 的复制.

可以用 getloclist() 函数来获取 location list 的 id.

quickfix-changedtick

每一个 quickfix 和 location list 都会有一个 read-only changetick variable 用于追踪 list 的总的变化次数. 每一次修改 quickfix list 中的内容, 这个变量都会加一.

changetick 的值也是通过 getqflist()getloclist() 函数来获取.

当前 window 被 autocommand 关闭后, 这个值会被舍弃 (即重新计数).

当前 quickfix or locatioin list 被 autocommand 修改后, changetick 也会被舍弃.

quickfix-title

每一个 quickfix and location list 都有一个 title. 默认情况下 title 为 the command that created the list.

可以从 getqflist()getloclist() 函数中获取 title.

可以用 setqflist()setloclist() 函数来修改 title:

1
2
3
4
call setqflist([], 'a', {'title' : 'Cmd output'})
echo getqflist({'title' : 1})
call setloclist(3, [], 'a', {'title' : 'Cmd output'})
echo getloclist(3, {'title' : 1})

quickfix-index

即当前 quickfix/location list entry 在 list 中的位置.

同样用 getqflist()setqflist() 函数获取.

1
2
3
echo getqflist({'idx' : 0}).idx
echo getqflist({'id' : qfid, 'idx' : 0}).idx
echo getloclist(2, {'idx' : 0}).idx

对于一个新的 quickfix/location list, 第一个 entry 会被 selected 且其 index 为 1.

任何 list 中的 entry 都可以用 setqflist()setloclist() 函数来设置称当前 selected entry.

1
2
3
call setqflist([], 'a', {'idx' : 12})
call setqflist([], 'a', {'id' : qfid, 'idx' : 7})
call setloclist(1, [], 'a', {'idx' : 7})

quickfix-size

即 quickfix/location list 的大小, 可以用 getqflist()getloclist() 函数来获取.

1
2
echo getqflist({'size' : 1})
echo getloclist(5, {'size' : 1})

quickfix-context

任何 Vim 类型都能够用 setqflist()setloclist() 函数来设置 a context with a quickfix or location list.

可以用 getqflist()getloclist() 函数来检索 quickfix/location list 中的 context.

1
2
3
4
5
6
7
let somectx = {'name' : 'Vim', 'type' : 'Editor'}
call setqflist([], 'a', {'context' : somectx})
echo getqflist({'context' : 1})

let newctx = ['red', 'green', 'blue']
call setloclist(2, [], 'a', {'id' : qfid, 'context' : newctx})
echo getloclist(2, {'id' : qfid, 'context' : 1})

make

:mak[e][!] [arguments] 用于执行一些预定义的指令.

所有和 QuickFixCmdPre 的 autocommands 都会被触发.
(QuickFixCmdPre 为一个 event, 其在一个 quickfix command 运行前触发.)

如果不加上 !, 则会跳转到第一个错误位置.

vimgrep 和 grep 的使用

vimgrep 属于 internal grep. 其使用 Vim 自己的搜索引擎.

grep 属于 external grep, 其基于命令行工具 grep.

vimgrep

1
:vim[grep][!] /{pattern}/[g][j][f] {file}...
  • g, 一行如果有多个 matched 会被加入多次
  • j, 不加上 j 则会自动跳转到 first match
  • f, 使用 fuzzy-matching

运行 vimgrep 时, QuickFixCmdPreQuickFixPost 两个 events 会被触发.

grep

1
:grep foo *.c

其运行时会调用外部的 gerp 且默认会开启 -n (--line-number, 显示行号) 选项.

可以通过设置 grepprg 选项来修改参数.

copen

:copen 可以查看 quickfix 列表.


Vim-quickfix-详述
http://example.com/2024/03/11/Vim-quickfix-详述/
作者
Jie
发布于
2024年3月11日
许可协议