2013-03-26 2 views
1

Я пытаюсь написать функцию в Vim, которая ищет текущий буфер для определенного шаблона и возвращает его. Но я терпеть неудачу. В общем, что я хочу, это функция, которая возвращает (PHP) пространство имен файла я работаю в пространство имен определяется в самом файле:.Vim: Как написать функцию, которая ищет текущий буфер?

namespace Foo\Bar; 

То, что я хотел бы это функция, которая возвращает Foo\Bar часть как строка. То есть что-то, что ищет, как /namespace\s\([^;]\+\), и возвращает первый профайл.

Edit: Вот функция я строю благодаря помощи я получил:

func! PhpNamespace() 
    let l:lnr = 0 
    while l:lnr < line('$') 
     let l:str = matchstr(getline(l:lnr), '^\s*namespace\s\+[^;]\+') 
     if len(l:str) 
      return substitute(l:str, '^\s*namespace\s\+', '', '') 
     endif 
     let l:lnr = l:lnr + 1 
    endwhile 

    return '' 
endfunc 

ответ

4

Одним из вариантов является использование searchpos(), который получает вам стартовую позицию; вам необходимо извлечь текст самостоятельно. Это быстро и просто, особенно если вам нужно искать вперед/назад из положения курсора. С флагом 'n' позиция курсора не изменится. В противном случае вам нужно сохранить и восстановить позицию курсора (getpos('.'), setpos('.', saved_cursor)).

Для вашей проблемы, похоже, что объявление пространства имен, скорее всего, находится в начале файла и ограничено одной строкой. Затем вы можете также получить отдельные строки с getline(lnum) в цикле и извлечь текст с matchstr() и вырваться из цикла после его получения.

+0

Спасибо! Это привело меня к правильному пути. –

+0

Отлично! Ваше решение выглядит хорошо для меня; престиж для публикации; ты профессионал! –

Смежные вопросы