在Vim中使用`filter()`之后如何保持索引和值

问题描述 投票:0回答:2

我将使用getline(1, '$')获取文档中的所有行列表。和filter()他们通过一些表达。但是我还需要保留索引(行号)以供参考。我怎么能这样做?

let lines = getline(1, '$')
filter(lines, 'EXPRESSION')

结果应该是列表或我可以引用索引的任何内容:[[1, LINE1], [4, LINE4],... [n, LINEn]]

vim vi
2个回答
2
投票

您可以使用v:key获取map()中列表的索引,然后v:key + 1将成为行数,如下所示。

let lines = map(getline(1, '$'), '[v:key + 1, v:val]')
call filter(lines, 'v:val[1] == "EXPRESSION"')

2
投票

你不能直接从filter()得到它,但你可以pass a function而不是表达式,函数可以索引行并将索引行存储为变量。例:

let b:filtered_lines = []

function! FilterWithIndex(idx, value)
   if condition
      let b:filtered_lines += [a:idx, a:value]
   endif
   return 0  " We don't care about filter's result
endfunction

call filter(getline(1, '$'), function('FilterWithIndex'))
echo b:filtered_lines

实际上我不认为这或map比简单循环更好:

let idx = 0
let filtered_lines = []
let lines = getline(1, '$')

while idx < len(lines)
   let line = lines[idx]
   if condition
      let filtered_lines += [idx, line]
   endif
   let idx += 1
endwhile

echo filtered_lines
© www.soinside.com 2019 - 2024. All rights reserved.