2010-02-11 5 views
1

J'essaye de construire un analyseur lexical en utilisant flex. Voici une ligne qui montre une expression régulière et son action correspondante.Auto-complétion vim avancée

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

Est-il possible de réutiliser {printf("yada yada \n");} de regex1 par des caractéristiques d'auto-complétion de vim, de sorte que je ne dois pas écrire à nouveau le tout en écrivant regex2?

par exemple. Cela va au-delà de la complétion des mots, donc je me demandais si c'était possible dans vim?

TIA

Répondre

0

Eh bien, il pourrait ne pas être auto-complétion, mais il pourrait faire l'affaire pour vous. Vous pouvez simplement enregistrer cette action/instruction print dans un registre de copie dans vim, et simplement le coller quand c'est approprié.

  1. Accédez au début de l'action.
  2. Passez en mode visuel: v
  3. Passez sur la partie du texte que vous souhaitez copier/masquer.
  4. Yank dans le registre '1', tapez: "1y

Maintenant, l'action est stocké dans le numéro de registre un

  1. coller le contenu en faisant:." 1P (que p peut être toute commande de collage).

Hope this se révèle être utile :)

+0

merci, mais je ne voulais pas cela, je sais stocker dans les registres ("aymotion) ferait, mais je cherchais un achèvement automatique divine: P –

+0

Je ne suis pas entièrement certain que" Autocomplete "décrit vraiment ce que vous Je fais ici – rossipedia

1

Il n'est pas tout à fait l'auto-complétion, mais vous pouvez définir une abréviation - par exemple

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

Ensuite, en mode d'insertion si vous tapez

[0-9] yada<SPACE> 

il remplacera instantanément yada avec {printf("yada yada \n");}. Pour plus de renseignements, veuillez consulter le :h abbreviations.

+0

non, c'était juste un exemple, je voulais dire en général, on ne peut pas continuer à ajouter des abréviations. –

1

Seulement un peu différent de la réponse de Myme:

  1. Accédez à la première accolade {
  2. Entrez le mode visuel avec v
  3. Appuyez sur % pour naviguer jusqu'à la fin du bloc, jusqu'à ce que la dernière accolade }
  4. y.
  5. p l'aste, n'importe où.:-)
3

Jetez un coup d'oeil sur :h complete-functions et :h 'completefunc' pour plus de détails.

Ou plonger dans le code ci-dessous:

" 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");} 

Si vous enregistrez ce fichier comme compl.vim et la source avec commande :so % alors vous serez en mesure de commencer à taper {pri et appuyez sur Ctrl - X , Ctrl - U pour appeler le menu d'achèvement avec 2 éléments:

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

Je crois que vous pouvez l'adapter à vos besoins.

Vous pouvez enregistrer 2 fonctions dans votre fichier .vimrc et définir le paramètre completefunc sur MyComlete pour le tampon où vous avez besoin de ce type d'achèvement.