Retour arrière dans l'abréviation d'insertion

8

Pour fonctionner, les abréviations doivent être séparées par des espaces. Par exemple, si j'ai un, la iab fo FOOBARfrappe whatfone déclenchera pas l'abréviation. Il y a des raisons évidentes à cela.

Cependant, je voudrais une abréviation qui pourrait être utilisée comme suffixe sans que je doive déclencher l'iab, puis revenir en arrière et supprimer l'espace. Est-ce possible? Par exemple, iab fo <backspace>FOOBAR.

boucle d'or
la source
Le code suivant produit-il ce que vous voulez? vpaste.net/IfU1j
saginaw
@saginaw Ouais, génial - postez cela comme réponse et c'est la vôtre.
goldilocks

Réponses:

8

Vous pouvez écrire dans votre vimrc: iab fo <BS>FOOBAR

<BS> est la notation à utiliser pour la touche de retour arrière.

Pour plus d'informations sur les noms de clés spéciales, voir:

:help key-notation
saginaw
la source
1
La "manière plus simple" n'a pas fonctionné dans ce cas parce que je pense à la robustesse; le suffixe réel est [7:0]et vous devrez jouer avec le nombre de bs, etc. à personnaliser pour cela, je pense.
goldilocks
@delicateLatticeworkFever Vous avez raison, je n'y ai pas pensé. Dans ce cas particulier, peut-être remplacer bet epar Bet Eserait suffisant. Mais il peut y avoir d'autres cas où cela échouerait, je ne sais pas. Dans tous les cas, la première version devrait, espérons-le, fonctionner la plupart du temps.
saginaw
@delicateLatticeworkFever En relisant ma réponse, je me rends compte que c'est trop complexe. Probablement quelque chose comme ça iab fo <BS>foobarsuffisait. Désolé pour la gêne occasionnée, vous devriez probablement cocher la réponse de @djjcast comme réponse correcte. Pour le moment, je ne peux pas retirer ma réponse, mais une fois que je le pourrai, je le ferai. Encore une fois vraiment désolé, je n'ai pas l'habitude des abréviations.
saginaw
<BS>était juste la chose. Je jure d'avoir essayé quelque chose comme ça, mais je ne connais pas tous les personnages de contrôle, donc j'aurais peut-être utilisé <backspace>quelque chose.
goldilocks
1
@delicateLatticeworkFever Je comprends, pas de problème. Si vous voulez voir tous les noms de clés spéciales, vous pouvez les lire ici::help key-notation
saginaw
4

Appuyez simplement sur en mode insertion Ctrl]. Cela déclenchera l'extension des abréviations, sans entrer dans un espace

Christian Brabandt
la source
Vous avez mal lu la question. Je veux que le résultat final soit quelque chose comme: X(FOOBAR)non X( FOOBAR. L'utilisation de Ctrl-] élimine simplement l'espace à la fin . J'ai besoin de pouvoir utiliser l'abréviation - qui dépend également des espaces au début pour se déclencher - mais la faire concaténer avec le mot précédent (c'est ce que signifie un " suffixe ").
goldilocks
Oh, vous voulez un plugin d'extraits ...
Christian Brabandt
Je suppose que cela pourrait être fait avec quelque chose de défini ${1}FOOBAR- c'est une bonne réponse. Si vous voulez changer ceci: / ou ajouter une autre réponse, je cocherai cela.
goldilocks
comme je ne connais pas personnellement les plugins d'extraits, je ne peux pas sérieusement en faire une réponse.
Christian Brabandt
4

Comme alternative, voici un moyen de définir et d'étendre des abréviations qui se développent n'importe où:

let s:anywhere_abbreviations = {
    \ 'fo': 'FOOBAR',
    \ 'ab': 'ABBREVIATION',
\ }

function! s:MaybeExpandAbbreviation(trigger)
    for key in keys(s:anywhere_abbreviations)
        if matchstr(getline('.'), repeat('.', strchars(key)) . '\%' . col('.') . 'c') ==# key
            return repeat("\<BS>", strchars(key)) . s:anywhere_abbreviations[key] . a:trigger
        endif
    endfor
    return "\<C-]>" . a:trigger
endfunction

inoremap <expr> <Space> <SID>MaybeExpandAbbreviation("\<Space>")

Ajoutez simplement les abréviations qui devraient se développer n'importe où dans le s:anywhere_abbreviationsdictionnaire. La s:MaybeExpandAbbreviation()fonction recherche et étend les correspondances d'abréviations lorsque la touche de déclenchement est enfoncée - <Space>est mappée pour déclencher l'expansion des «abréviations n'importe où».

Avec le s:anywhere_abbreviationsdictionnaire ci-dessus , la saisie whatfo<Space>s'étendra à whatFOOBAR.

djjcast
la source
2

Pour résumer les deux réponses les plus simples qui en sont ressorties:

  1. Vous pouvez utiliser un retour arrière directement dans une abréviation - divers caractères spéciaux sont documentés sous :help keycodes. Ainsi, par exemple:

    :iab cdt <BS>cedental
    

    Vous permettra de taper trans cdtet d'obtenir transcendental.

  2. Celui dont j'ai particulièrement honte depuis que je l'utilise depuis des années: le plugin snipMate commun permet aux paramètres d'aller de l'avant, donc

     snippet cdt
         ${1}cendental ${2}
    

    Permet de taper cdt, qui Tabse développera cendentalet mettra le curseur devant pour que vous puissiez taper trans, puis appuyez à Tabnouveau pour passer au début du mot suivant.

boucle d'or
la source