Как сохранить индекс и значение после использования `filter ()` в Vim - PullRequest
0 голосов
/ 06 апреля 2019

Я буду использовать getline(1, '$'), чтобы получить список всех строк в документе.и filter() их по какому-то выражению.Но мне также нужно сохранить индекс (номер строки) для после ссылки.Как я мог это сделать?

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

Результатом должен быть список или все, что я могу сослаться на индекс: [[1, LINE1], [4, LINE4],... [n, LINEn]]

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Вы можете использовать v:key, чтобы получить индекс списка в map(), и тогда v:key + 1 будет иметь номер строки следующим образом.

let lines = map(getline(1, '$'), '[v:key + 1, v:val]')
call filter(lines, 'v:val[1] == "EXPRESSION"')
2 голосов
/ 06 апреля 2019

Вы не можете получить это напрямую из filter(), но вы можете передать функцию вместо выражения, и функция может индексировать строки и сохранять индексированные строки в виде переменной. Пример:

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
...