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

How to keep the index and value after using `filter()` in Vim

我将使用 getline(1, '$') 获取文档中的所有行列表。 和 filter() 他们通过某种表达。 但我还需要保留索引(行号)以备后用。 我该怎么做?

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

结果应该是一个列表或者任何我可以参考的索引: [[1, LINE1], [4, LINE4],... [n, LINEn]]

您不能直接从 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

可以用v:key得到map()中列表的索引,然后v:key + 1就是下面的行号。

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