Comment gérer et mémoriser de nombreuses abréviations dans mon vimrc?

10

J'ai plus de 500 abréviations ( iabbr, abbr) et quelques mappages dans mon fichier vimrc de Java, PHP, C / C ++ et Latex.

Ce n'est pas facile de me souvenir tout de suite quand je n'utilise pas les langues depuis un certain temps.

Je me demande si je peux faire l'achèvement sur le nom de l'abréviation. Existe-t-il un meilleur moyen d'accéder à / gérer toutes ces abréviations?

1234
la source

Réponses:

10

Je ne sais pas quelle est la meilleure façon de gérer plus de 500 abréviations. Peut-être qu'à long terme, comme l'a expliqué @statox, vous pourriez jeter un œil aux extraits de code pour réduire ce nombre.

Et si vous souhaitez compléter automatiquement les abréviations, vous pouvez essayer le code suivant:

augroup GetAbbrev
    autocmd!
    autocmd VimEnter * let s:abbrev_list = [] |
                \ call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(s:abbrev_list, submatch(1))', 'gn')
augroup END

set completefunc=CompleteAbbrev
function! CompleteAbbrev(findstart, base)
    if a:findstart
        return searchpos('\<\k', 'bcnW', line('.'))[1] - 1
    else
        return filter(copy(s:abbrev_list), 'v:val =~ "^" . a:base')
    endif
endfunction

Pour l'utiliser, vous devez taper C-x C-uaprès le début d'une abréviation.


L'autocmd configure la variable s:abbrev_listqui doit contenir toutes vos abréviations.

La fonction CompleteAbbrev()doit renvoyer une liste de candidats basée sur le mot devant le curseur.

La 'completefunc'valeur de l'option indique à Vim quelle fonction appeler lorsque vous appuyez C-x C-u.
Notez que l'option est locale au tampon, vous pouvez donc toujours utiliser d'autres fonctions dans différents types de tampons, en utilisant un autocmd et l' FileTypeévénement par exemple.

Voir :h complete-functionspour plus d'informations sur le fonctionnement de la fonction.


Une autre solution serait d'utiliser l'achèvement des synonymes. De :h i_^x^t:

                            *i_CTRL-X_CTRL-T*
CTRL-X CTRL-T       Works as CTRL-X CTRL-K, but in a special way.  It uses
                    the 'thesaurus' option instead of 'dictionary'.  If a
                    match is found in the thesaurus file, all the
                    remaining words on the same line are included as
                    matches, even though they don't complete the word.
                    Thus a word can be completely replaced.

                    For an example, imagine the 'thesaurus' file has a
                    line like this:
                            angry furious mad enraged
                    Placing the cursor after the letters "ang" and typing
                    CTRL-X CTRL-T would complete the word "angry";
                    subsequent presses would change the word to "furious",
                    "mad" etc.
                    Other uses include translation between two languages,
                    or grouping API functions by keyword.

Pour utiliser cette solution, vous devez faire 3 choses:

  1. Écrivez {lhs}toutes vos abréviations dans un fichier dédié.
    Par exemple /home/user/mysynonyms.txt,. Et regroupez-les autour de thèmes similaires.
  2. Ajoutez le chemin d'accès à ce fichier à l'option 'thesaurus':

    set thesaurus+=/home/user/mysynonyms.txt
    
  3. Frappez C-x C-taprès le début du nom de toute abréviation à l'intérieur d'un groupe.

Par exemple, supposons que vous ayez les abréviations suivantes:

iab cfa CFuncA
iab cfb CFuncB
iab cfc CFuncC

iab jfa JavaFuncA
iab jfb JavaFuncB
iab jfc JavaFuncC

iab pfa PhpFuncA
iab pfb PhpFuncB
iab pfc PhpFuncC

Vous pouvez les regrouper en fonction du langage de programmation auquel ils appartiennent.
A l'intérieur /home/user/mysynonyms.txt, vous écririez:

cpp cfa cfb cfc
php pfa pfb pfc
java jfa jfb jfc

Maintenant, chaque fois que vous frappez C-x C-taprès le nom d'une abréviation (ou juste son début), Vim devrait afficher, dans le menu contextuel, toutes les abréviations qui sont sur la même ligne.

Voici à quoi cela ressemblerait:

entrez la description de l'image ici

Notez que les abréviations n'ont pas besoin de commencer par les mêmes caractères pour être regroupées, elles peuvent être entièrement différentes. Tant qu'ils sont sur la même ligne dans votre fichier de synonymes, Vim les affichera tous.

Et vous n'avez pas besoin d'utiliser le langage de programmation pour décider dans quel groupe mettre une abréviation. Vous pouvez les regrouper en fonction de toute similitude / sujet / catégorie significative que vous avez en tête.

Ainsi, lorsque vous oubliez une abréviation spécifique, vous pouvez taper les premières lettres d'une catégorie, appuyer sur C-x C-tet choisir celle qui convient dans le menu.

Edit:
Pour vider toutes vos abréviations à l'intérieur /home/user/mysynonyms.txt, vous pouvez utiliser ces 3 commandes Ex:

:let abbrev_list = []
:call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(abbrev_list, submatch(1))', 'gn')
:call writefile(abbrev_list, '/home/user/mysynonyms.txt')

Edit2:
J'ai ajouté le drapeau nlorsque la substitute()fonction est appelée car vous n'avez besoin d'aucune substitution. Son seul but est d'ajouter une abréviation à l'intérieur d'une liste chaque fois qu'elle est trouvée.
Mais parce que vous avez de nombreuses abréviations, cela pourrait ralentir inutilement le processus, je ne sais pas. Au départ, je ne l'ai pas mis parce que je ne sais pas quelle version de Vim vous utilisez. Si votre version est plus récente que 7.3.627 , cela devrait être correct, sinon vous devrez supprimer le ndrapeau.

user9433424
la source
réponse fantastique et complète. vous Rock
1234
\ v% (^ | \ n) \ s * i?% (nore)? ab% [brev] \ s +% (% (\ <expr \> | \ <buffer \>) \ s +) {, 2} ( \ k +) ne fonctionne pas sur mon fichier vimrc
1234
@JoobLee Cela fonctionne sur mon système, avez-vous un message d'erreur? Fonctionne-t-il avec une expression rationnelle plus simple (mais moins fiable) \vi?abbr\s+(\k+)? Pourriez-vous me donner un lien avec un extrait de vos abréviations, pour voir si je peux reproduire votre problème?
user9433424
@JoobLee Si votre version de Vim est suffisamment récente, ajoutez l' nindicateur à l'appel de remplacement (j'ai modifié la réponse pour l'inclure). Si vous effectuez une recherche dans votre vimrcet que vous copiez-collez cela \v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+, cela met-il en évidence vos abréviations?
user9433424
9

Un conseil wikia suggère une méthode pour afficher sélectivement vos abréviations:

Vous pouvez répertorier toutes vos abréviations avec

:ab<CR>

(remplacer abpar iabpour répertorier uniquement les abréviations du mode d'insertion)

Et vous pouvez lister toutes les abréviations avec le même préfixe avec

:ab prefix<CR>

Ce n'est pas aussi idéal qu'un achèvement sur les abréviations, mais cela pourrait être un bon moyen d'avoir rapidement une liste de vos abréviations existantes.

Pour rendre cette solution plus efficace, une bonne pratique serait de créer une abréviation spécifique à un type de fichier. Par exemple, cette abréviation n'est utile que dans un tampon java:

iabbrev syso System.out.println("");

Il est donc bon de le définir comme ceci:

autocmd! FileType java :iabbrev <buffer> syso System.out.println("");

La partie autocommande permet de créer l'abréviation uniquement lorsque vous êtes dans un tampon java et l' <buffer>option rend l'abréviation accessible uniquement à partir de ce tampon.

De cette façon :iab, l’abréviation ne sera affichée que lorsque vous serez dans un tampon java. Si vous avez beaucoup d'abréviations, il pourrait être intéressant de créer une fonction par type de fichier qui définirait toutes les abréviations et laisserait l'autocommande appeler la fonction. Quelque chose comme:

autocmd! FileType latex call CreateLatexAbbrev()

function! CreateLatexAbbrev()
    iabbrev <buffer> something something else
    " All the other latex abbreviations
endfunction

Une autre solution pourrait être de créer votre propre fonction de saisie semi-automatique en utilisant une liste de vos abréviations comme source de mots-clés.

Enfin, je dois dire que je suis assez impressionné par "plus de 500 abréviations", je ne sais pas lesquelles vous utilisez, mais il serait peut-être intéressant pour vous de jeter un œil au concept d'extraits de code si vous n'êtes pas familier avec eux. Comme ce sont des modèles qui sont déclenchés en entrant un mot-clé et en appuyant sur une touche de raccourci, ils sont plus flexibles que les abréviations, cela pourrait vous permettre de réduire le nombre d'abréviations que vous utilisez. Voir ici pour une introduction intéressante.

statox
la source
1

Que diriez-vous de regrouper les abréviations par type de fichier?

Au lieu de les avoir tous dans votre ~/.vimrcfichier, décomposez-les et placez-les aux emplacements appropriés dans votre répertoire d'exécution, qui se trouve ~/.vimsur les systèmes d'exploitation de type Unix.

Par exemple, vos abréviations Markdown seraient situées dans le fichier ~/.vim/after/ftplugin/markdown.vim, que Vim vérifie après le chargement du plugin de type de fichier Markdown.

Il s'avère que nous ne devrions pas avoir d'énormes .vimrcfichiers; vous obtenez plus de flexibilité en utilisant $VIMRUNTIME. Le chemin d'exécution est documenté dans le système d'aide de Vim: :h 'runtimepath'.

J'ai d'abord appris cela à travers l'excellent article De .vimrc à .vim sur le calendrier de l'avent sur le thème de Vim Vimways .

alwillis
la source