2014-10-06 3 views
0

Я хочу, чтобы заменить следующие occurings:заменить регулярное выражение с помощью vimscript

@todo call customer 
@todo-next do foo 
@todo-wait customer will call me back 

с @done, когда я с curser на линии. Например:

@todo call customer 

должен быть затем

@done call customer 

Я получил его заменить @todo, но и для двух других (@ TODO-следующий, @ ToDo-ожидание) Я думаю, что мое регулярное выражение не работает должным образом. ..

Вот что я получил, когда я бегу это бездельники происходит на линиях ...:

function! Tdone() 
    let line=getline('.') 
    "let newline = substitute(line, "@todo", "@done", "") 
    let newline = substitute(line, "@todo.*? ", "@done", "") 
    call setline('.', newline) 
    :w 
endfunction 
+0

http://regex101.com/r/hQ1rP0/20 ?? – vks

ответ

1

Ваш синтаксис regexp неверен; Вим не понимает Perlish .*?; это .\{-} в Vim. См. :help perl-patterns. (Кроме того, поскольку вы сопоставления конечных пробелов, вам необходимо включить, что в замене, также, или использовать \ze ограничить матч.)

let newline = substitute(line, "@todo.\{-} ", "@done ", "") 

Я бы, вероятно, будет более ограничительным в шаблоне, чтобы избежать ложных матчей (зависит от точного синтаксиса ваших маркеров, хотя, так что это просто пример):

let newline = substitute(line, "@todo\%(-\w\+\)* ", "@done ", "") 

Наконец, нет никакой необходимости в getline()/setline(); вы можете сделать это с помощью :substitute. Если вы сохраните функцию, это не скроет последний шаблон поиска. Чтобы очистить историю, :call histdel('search', -1).

+0

Почему не может быть стандартного способа делать регулярное выражение, могли бы возникнуть ситуации, подобные этому, если бы это было так. – Thermatix

+0

@ user3536548: Почему все люди мира не могут говорить на одном языке, стало бы намного легче общаться? –

+0

Потому что мир - это очень большое место и язык, который развивается отдельно, где языки кодирования развивались раздельно, но в общем коммуникативном рабочем пространстве (в Интернете). Ваш ответ работает только в том случае, если вы не принимаете во внимание тот факт, что у нас есть средства для общения по всему миру. Чтобы быть справедливым, хотя массовое общение, которое мы имеем сейчас, доступно только сравнительно недавно. – Thermatix