一千萬個為什麽

搜索

:lvimgrep,每個文件一個匹配

有沒有辦法使用:lvimgrep 並將結果限制為每個文件一個匹配,這樣每個匹配的文件只在位置列表中出現一次?

最佳答案

根據幫助,您可以使用:1lvimgrep pattern </代碼>每個文件只有一個匹配項添加到quickfix列表中。 我從來沒有嘗試過,所以我不確定它有多好用。

Update Okay, I have apparently misunderstood the problem as mentioned in the comments.

所以似乎沒有一種簡單的方法可以做你想要的。這讓我們有了這些選擇:

  • 使用外部grep工具

grep supports the -l flag, which makes it stop on the first match per file. Same is true for git-grep. This has the additional advantage that it might be a lot faster and you can use standard perl like regexps as this is often a complaint for many users about the leaning toothpick syndrom. And you can use it with a custom :help 'grepprg' so the result will be available in the quickfixlist. However this might be a problem, if you depend on vim like regular expressions, as this will become impossible.

  • 過濾vimgrep結果

使用 getloclist()getqflist()函數對 lvimgrep 的結果進行後處理,只得到每個文件一個匹配。但是,這樣做的缺點是, vimgrep 仍然處理完整的文件(如果在第一次匹配時停止,則沒有性能優勢),並且還會添加額外的成本來過濾結果。

像這樣的東西應該工作:

function! FilterLocList()
  let a=getloclist(0)
  let file={}
  let result=[]
  for entry in a
    if !has_key(file, entry.bufnr)
      call add(result, entry)
      let file[entry.bufnr]=1
    endif
  endfor
  if !empty(result)
    call setloclist(0, result, 'r')
  endif
endfu

com! -nargs=0 FilterLocList :call FilterLocList()

因此,在執行:lvimgrep 命令後,調用:FilterLocList ,當前窗口的位置列表將僅包含第一個匹配項。

  • 使用:lnf:lpf 命令

You can use the :help :lnf and :help :lpf

您根本不關心,位置列表有多少條目,您可以使用:lnf 命令直接跳轉到位置列表中的下一個文件。您可以使用:lpf 命令跳轉到上一個文件。 quickfix列表存在類似的命令(:cnf:cpf ) - 使用自定義命令

另一種方法是創建一個自定義命令,它可以完成你想要的任務。像這樣的東西:

function! LVimgrepOnce(pattern, argspat)
  let args=glob(a:argspat, 1, 1)
  if empty(args)
    echo "No matching files found"
    return
  endif
  " clear location list
  lexpr []
  for file in args
    try
      exe "1lvimgrepadd /". a:pattern. '/j' file
    catch
    endtry
  endfor
  lopen
  let w:quickfix_title='vimgrep '. a:pattern. ' '. a:argspat
endfu

:com! -nargs=+ Lvimgrep :call LVimgrepOnce()

這將為指定的每個文件調用一個簡單的:1vimgrepadd 命令,並將結果收集到quickfix列表中(或者更具體地說,在位置列表中)。

轉載註明原文: :lvimgrep,每個文件一個匹配