2015-04-21 2 views
2

Я пытаюсь искать и заменять только в строке без комментариев.vim поиск и замена только на строки без комментариев

Не прокомментированная строка, я имею в виду строки, которые не выделены синим цветом, выделенными синим синтаксисом vim.

Например:

/* 
... 
DO NOT REPLACE 
.... 
*/ 

не должны быть найдены и заменены. Моя проблема специфична для C++, но может быть расширена на любой язык, если есть способ использовать «синтаксический движок» vim.

Редактировать: Ссылка предназначена только для поиска, ничего о замене.

+0

Может быть дубликатом: http://stackoverflow.com/questions/2683521/vim-search- in-cc-code-lines –

+4

Если вы можете сложить свои комментарии, вы можете закрыть их и использовать ': folddoopen s/foo/bar/gc'. – romainl

+0

сложенный регион искать и заменять vim –

ответ

0

Я наконец сделал это сам, используя Bill Odom code в качестве основы:

function Repl(pattern, patternSub) 

    " Move to top of the file 
    normal 1G 

    " Search Pattern, no wrap 
    while search(a:pattern, "W", "", "") > 0 

     " If found pattern is a comment, skip 
     if eval(synIDattr(synID(line("."), col("."), 0), "name") =~? "Comment") 
      continue 
     endif 

     " If found pattern is a string, skip 
     if eval(synIDattr(synID(line("."), col("."), 0), "name") =~? "String") 
      continue 
     endif 

     " Replace pattern by it's substitute 
     exec '.s/'.a:pattern.'/'.a:patternSub.'/' 

     " Restore cursor position 
     normal `` 
    endwhile 
endfunction 

command! -nargs=+ -complete=command Repl call Repl(<args>) 

Это не заменяет вхождение шаблона, который является комментарием или строкой. Это на самом деле не зависит от языка.

Вы должны использовать его таким образом (например: удаление пространства после всех не комментировал скобках):

:Repl '(*','(' 
Смежные вопросы