Расширенное автозаполнение vim - PullRequest
1 голос
/ 11 февраля 2010

Я пытаюсь построить лексический анализатор, используя flex. Ниже приведена строка, которая показывает регулярное выражение и соответствующее ему действие.

[0-9] {printf("yada yada \n");} //regex1

Есть ли способ повторно использовать {printf("yada yada \n");} из regex1 с помощью функций автозаполнения vim, чтобы мне не нужно было писать все заново при написании regex2?

, например

.* {printf("yada yada \n");} //regex2

Это выходит за рамки завершения слова, поэтому мне было интересно, выполнимо ли это в vim?

1012 * ТИА *

Ответы [ 4 ]

3 голосов
/ 11 февраля 2010

Посмотрите детали :h complete-functions и :h 'completefunc'.

Или погрузитесь в код ниже:

" Scan current buffer for everithing in { }.
fun! GetRegexes()
  let rx = '{.\+}'
  let res = []
  for line in getline(1, '$')
    if line =~ rx
      call add(res, matchstr(line, rx))
    endif
  endfor
  return res
endfun

fun! MyComplete(findstart, base)
  if a:findstart
    " locate the start of the completion
    let line = getline('.')
    let start = col('.') - 1
    while start > 0 && line[start] !~ '{'
      let start -= 1
    endwhile
    return start
  else
    let res = []
    for m in GetRegexes()
      if m =~ '^' . a:base
        call add(res, m)
      endif
    endfor
    return res
  endif
endfun
set completefunc=MyComplete
finish

[0-9] {printf("yada yada \n");}
[0-9] {printf("yada \n");}

Если вы сохраните этот файл как compl.vim и отправите его с помощью команды :so %, тогда вы сможете начать ввод {pri и нажать Ctrl - X Ctrl - U , чтобы вызвать меню завершения из 2 элементов:

{printf("yada yada \n");}
{printf("yada \n");}

Полагаю, вы можете настроить его под свои нужды.

Вы можете сохранить 2 функции в вашем .vimrc и установить для Completefunc значение MyComlete для буфера, в котором вам необходим такой вид завершения.

1 голос
/ 11 февраля 2010

Это не совсем автозаполнение, но вы можете определить сокращение - например,

:iab yada {printf("yada yada \n");} 

Затем в режиме вставки, если вы наберете

[0-9] yada<SPACE>

мгновенно заменит yada на {printf("yada yada \n");}.

См. :h abbreviations для полного совка.

1 голос
/ 11 февраля 2010

Только немного отличается от ответа Мима:

  1. Перейти к первой скобке {
  2. Войдите в визуальный режим с помощью v
  3. Нажмите %, чтобы перейти к концу блока до последней скобки }
  4. y ank it.
  5. p В любом месте. : -)
0 голосов
/ 11 февраля 2010

Ну, это может быть не автозаполнение, но оно может помочь вам. Вы можете просто сохранить это действие / оператор печати в регистре копирования в vim и просто вставить его, когда это уместно.

  1. Перейдите к началу действия.
  2. Перейти в визуальный режим: v
  3. Переместить часть текста, который вы хотите скопировать / yank.
  4. Чтобы войти в регистр '1', введите: "1y

Теперь действие сохраняется в регистре номер один.

  1. Вставьте содержимое, выполнив: "1p (это p может быть любой командой вставки).

Надеюсь, это окажется полезным:)

...