Навигация по серии файлов в Vim - PullRequest
3 голосов
/ 28 октября 2011

При изменении кода я обнаружил, что мне часто приходится просматривать десятки файлов, чтобы изменить самые простые вещи.Например, допустим, у меня есть функция pretty_print, и я изменил ее, чтобы она соответствовала случаю верблюда prettyPrint.Теперь я хочу просмотреть файлы от apple1.js до apple99.js и, возможно, несколько файлов orange.js.Есть ли быстрый способ сделать это в Vim?

ПРИМЕЧАНИЕ: это не то, что я могу автоматизировать, мне действительно нужно пойти и изменить код самостоятельно.

Я знаю, что могу сделать:b <fileName>, но, хотя он поддерживает завершение имени / сопоставление с образцом, я не думаю, что образец переносится.

Например, если я сделаю

:b apple*.js

и нажмуна вкладке я получу

:b apple1.js

, но если я вернусь к этой функции (нажав : + upArrow или q:), то если я нажму на вкладку, она не перейдет к

:b apple2.js

Я хочу указать что-то вроде

:b apple*.js

редактировать файл, затем, когда я набираю :w, он перемещается в следующий буфер.Я бы предпочел остаться в Vim, я не хочу выходить, введите vim apple*.js, вернитесь в Vim и затем используйте команду :x.Я понимаю, что это работает, но мне все еще нужны все остальные файлы на случай, например, перехода между тегами.

Ответы [ 3 ]

1 голос
/ 04 ноября 2011

Соответствует ли функция BufSel из Викия вашим потребностям?

Если вы предпочитаете выбирать буфер из списка частичных совпадений следующая функция может быть использована.Он перейдет к соответствующему буферу, если найдено только одно совпадение или если найдется много совпадений, он выведет список соответствующих буферов в области командной строки и позволит выбрать один из подходящих буферов по номеру буфера.

function! BufSel(pattern)
  let bufcount = bufnr("$")
  let currbufnr = 1
  let nummatches = 0
  let firstmatchingbufnr = 0
  while currbufnr <= bufcount
    if(bufexists(currbufnr))
      let currbufname = bufname(currbufnr)
      if(match(currbufname, a:pattern) > -1)
        echo currbufnr . ": ". bufname(currbufnr)
        let nummatches += 1
        let firstmatchingbufnr = currbufnr
      endif
    endif
    let currbufnr = currbufnr + 1
  endwhile
  if(nummatches == 1)
    execute ":buffer ". firstmatchingbufnr
  elseif(nummatches > 1)
    let desiredbufnr = input("Enter buffer number: ")
    if(strlen(desiredbufnr) != 0)
      execute ":buffer ". desiredbufnr
    endif
  else
    echo "No matching buffers"
  endif
endfunction

"Bind the BufSel() function to a user-command
command! -nargs=1 Bs :call BufSel("<args>")
1 голос
/ 04 ноября 2011

Вероятно, наиболее подходящим решением для вас в этом случае будет использование Возможности grep интегрированы в Vim. Следующая команда выполняет поиск для шаблона \<pretty_print\> в файлах, соответствующих шаблону apple*.js, и сохраняет местоположения вхождений шаблона в списке быстрых исправлений позволяя легко прыгать через все спички.

:vimgrep /\<pretty_print\>/ apple*.js

Для более подробного введения в список быстрых исправлений в отношении поиска в файлах см. мой ответ на вопрос " Загрузка набора полученных файлов через cmd-exec в буферы Vim".

Если вы хотите просто открыть список файлов, соответствующих определенному подстановочный знак, загрузить имена этих файлов в список аргументов

:args apple*.js

, а затем перемещайтесь между ними, используя :n и :N, как обычно.

1 голос
/ 04 ноября 2011

начните с этого:

:set hidden "required because `argdo` won't load next argument into current window
            "if there is a modified buffer displayed inside this window
:args apple*.js
:argdo %s/\<pretty_print\>/prettyPrint/g
:rewind " if you want to proofread all files then use :next and :prev
:wa

Вы лучше верните свои файлы и сделайте diff после такого изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...