Как написать функцию vim для поиска нескольких строк (когда я вызываю функцию) и выделить все строки (чтобы я использовал n / N для перемещения) - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу вызвать эту функцию (используя мое отображение) и выделить все строки, чтобы я мог использовать n / N для навигации.

Вот мой код и отображение этой функции, но я не могу заставить ее работать.

  function! FindAll(...)
     let srchstr =  ""   
     let list = split(a:000[0], ' ')
     let lenth = len(list)
     for item in list
         let lenth = lenth - 1
         if lenth != 0
             let srchstr .= item."\\\|"
         else
             let srchstr .= item
         endif
     endfor

     "echo srchstr

     exec 'normal! /' . srchstr . "\<CR>"
  endfunction

Затем я использую это отображение для его вызова:

noremap <silent> ,fa  :call FindAll(input("Please Give Separate Strings :"))<CR>

И вот как я даю входные строки, когда я его вызывал.

Please Give Separate Strings :One Two Three

1 Ответ

0 голосов
/ 29 ноября 2018

Я думаю, вы боретесь с :help function-search-undo:

Последний использованный шаблон поиска и команда повторения "."не будет изменена функцией.

Это делает вашу команду поиска неэффективной в функции FindAll().

Дополнительная критика

  • input()всегда будет возвращать одну строку;нет необходимости в обработке аргументов переменных (...).
  • Ваш цикл for можно заменить на join().
  • Вместо :normal! / вы можете просто присвоить @/, последний регистр шаблона поиска (:help quote/).
  • Ваше отображение не использует оператор визуального выбора или ожидания, поэтому лучше просто определить его для нормальный режим .

Исправления

Чтобы иметь возможность изменять шаблон поиска, либо сделайте так, чтобы функция возвращала его, либо (на основе предложенных выше упрощений) выполняйте всю обработку в строке.Теперь это просто комбинация split - join:

nnoremap <silent> ,fa :let @/ =
\ join(split(input("Please Give Separate Strings :"), ' '), '\<Bar>')<CR>

На самом деле, мы можем просто поменять каждый пробел с элементом ветви регулярного выражения \|:

nnoremap <silent> ,fa :let @/ =
\ substitute(input("Please Give Separate Strings :"), ' ', '\\<Bar>', 'g')<CR>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...