在 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"')
我将使用 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"')