Как сделать глобальную команду Vim: g / работать для каждого случая - PullRequest
3 голосов
/ 02 июня 2010

Обычно глобальная команда Vim: g // работает для каждой строки. Можно ли сделать так, чтобы он работал для каждого вхождения, так как в строке может быть несколько вхождений.

Ответы [ 2 ]

0 голосов
/ 02 июня 2010

Вы можете попробовать:

command! -bang -nargs=1 -range OGlobal 
    \ <line1>,<line2>call s:Global("<bang>", <f-args>)

function! s:Global(bang, param) range
  let inverse = a:bang == '!'

  " obtain the separator character
  let sep = a:param[0]
  " obtain all fields in the initial command
  let fields = split(a:param, sep)

  " todo: handle inverse
  let l = a:firstline
  while 1
    let l = search(fields[0], 'W')
    if l == -1 || l > a:lastline 
      break 
    endif
    exe fields[1]
  endwhile
endfunction

Который вы можете использовать как :global, за исключением того, что имя команды отличается (и что опция bang еще не реализована)

0 голосов
/ 02 июня 2010

Не прямой ответ, но вы можете использовать что-то вроде: rubydo, который будет запускать несколько скриптов ruby ​​для каждой строки кода. Объединение этого с gsub в ruby ​​должно дать вам возможность делать что угодно в каждом случае совпадения. Конечно, вам нужно будет сделать это с помощью кода ruby, который может не дать вам доступа ко всему, что вам может понадобиться без хлопот (например, добавление в реестр будет раздражать)

:[range]rubyd[o] {cmd}  Evaluate Ruby command {cmd} for each line in the
                        [range], with $_ being set to the text of each line in
                        turn, without a trailing <EOL>.  Setting $_ will change
                        the text, but note that it is not possible to add or
                        delete lines using this command.
                        The default for [range] is the whole file: "1,$".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...