Comment créer automatiquement des accolades correspondantes dans vim?
Il devrait fonctionner comme suit: Si je saisis une accolade ouverte, la fermeture devrait apparaître automatiquement et le slider devrait être placé entre les deux. Pour sortir de la paire d'accolades, la combinaison Ctrl-j est utilisée.
Il y a beaucoup de plugins fournissant l'insertion d'accolade automatique. Mais ils
Les travaux suivants sont prévus
:inoremap ( ()<Esc>:let leavechar=")"<CR>i :imap <Cj> <Esc>:exec "normal f" . leavechar<CR>a
Mais avec ces parameters, les extraits UltiSnips ne fonctionnent plus. J'ai donc utilisé UltiSnips pour insert l'accolade de fermeture:
inoremap ( (<CR>=UltiSnips_Anon('($1)$0', '(')<CR>
Cela fonctionne presque. L'accolade correspondante est insérée et je peux passer la fermeture avec Ctrl-j . Ceci, cependant, ne fonctionne que s'il y a un espace devant l'accolade ouverte.
main () // works, the closing parentheses is added main( // fails without a space
Mes solutions nécessitent soit une binding de key différente pour sauter par-dessus l'accolade de fermeture, soit un espace devant l'ouverture. Comment réparer cela?
Note: J'ai utilisé des parenthèses comme exemple. Il devrait fonctionner avec des parenthèses, des accolades, des parenthèses et less que des signes et ne pas interférer avec le plugin UltiSnips.
Comment créer automatiquement des accolades correspondantes dans vim?
Ce problème est non-sortingvial, comme vous le verrez. La réponse simple est la suivante: Utilisez un plugin, comme autoclose ou smartinput . Il suffit de réafficher naïvement les touches ([..] pour vous présenter des edgecases en quelques lignes, c'est pourquoi ces plugins sont faits, et pourquoi ils sont généralement assez complexes (s'ils sont bons).
J'ai donc utilisé UltiSnips pour insert l'accolade de fermeture
Vous pourriez essayer ceci à la place (ce qui est différent de ma suggestion originale):
inoremap ( ()<CR>=UltiSnips_Anon('$1)$0', ')')<CR>
Le problème avec l'utilisation d'un plugin de snippet est qu'ils ne prennent généralement pas en charge l'imbrication, de sorte qu'ils n'oublieront aucune position de saut lorsque le prochain élément (nested) un extrait est inséré.
Pour sortir de la paire d'accolades, la combinaison Ctrl-j est utilisée.
Vous pouvez remapper Ctrl-j pour UltiSnips ou le plugin en conflit. Si les mappages ne sont pas répertoriés dans la documentation, vous pouvez utiliser :map/imap/nmap <key>
pour afficher le mappage. Si vous voulez que Ctrl-j choisisse et fasse le travail des deux plugins, vous requestz:
Considérez cette boucle bash:
while (( ${arr1[i]} < ${arr2[i<CURSOR>]} )); do [next_snippet_position_marker] done
Dans ce cas, vous devrez appuyer sur Ctrl-j 5 fois pour accéder au corps de la boucle. L'utilisation des accolades de fermeture pour sauter d'une paire correspondante vous donne beaucoup plus de contrôle sur l'endroit où vous voulez réellement déplacer le slider. Vous pouvez implémenter une stack pour garder la trace des paires insérées et utiliser Ctrl-j pour afficher et déplacer, mais vous rencontrerez des problèmes si vous commencez à supprimer manuellement les accolades sans les retirer de la stack. Vous allez donc commencer à résoudre les problèmes que les correctifs de armsage tentent de résoudre. C'est une roue dure à réinventer.
En développant cela, vous pouvez get ce que vous avez initialement demandé, en utilisant Ctrl-j pour sauter des accolades et des extraits. Si vous utilisez une valeur factice pour représenter les positions des extraits et les poussez sur la stack en plus des accolades de fermeture, avec remappage dynamic de Ctrl-j pour correspondre à la remise des extraits ou des accolades. Mais vous aurez besoin d'implémenter des heuristiques assez avancées pour comprendre ce qui doit se passer, puisque vous êtes en train de résoudre deux problèmes à la fois, qui sont résolus séparément par les créateurs de plugins d'insertion de fragments. re-résolvant ces problèmes à nouveau, en plus de leurs solutions, pour atteindre la commodité et, bien, la magie.
Cela revient à contrôler par rapport à la commodité. Je pense que le contrôle vous servira mieux dans ce cas, ce qui signifie que vous devriez garder ces problèmes et leurs plugins associés et keysmappings séparés. Si vous voulez toujours la commodité, c'est faisable, mais c'est difficile.
Personnellement, j'utilise smartinput pour l'insertion automatique des parenthèses et des citations. Par exemple, tapez {
anywhere produira {}
avec votre slider au milieu. Pour quitter le {
groupe de parenthèses, il suffit de taper le }
quand à côté de l'inséré }
.
Cependant cela ne supporte pas votre besoin de tabstops et de sauter à l'extérieur de la parenthèse. Cela ne crée pas non plus de nouveau entre parenthèses, mais vous avez besoin d'une seule touche supplémentaire pour cela – <CR>
.
Vous pouvez mapper <CJ>
pour passer à la ligne suivante:
:inoremap <CJ> <CO>j
ou si vous vouliez passer au début de la ligne suivante:
:inoremap <CJ> <CO>+
Il n'y a rien de très nouveau ici, mais j'espère que ces solutions peuvent aider.
Je pense que delimitMate fait ce dont vous avez besoin.
Il ferme automatiquement les parenthèses ou les guillemets et place votre slider entre les deux. Pour sauter d'une paire de parenthèses (en mode insertion), vous devez faire Ctrl-g + g, mais vous pouvez le modifier pour qu'il soit Ctrl-j en l'ajoutant à votre vimrc
:
% Jump out of a block of parentheses (uses delimitMate) imap <Cj> <Cg>g
Quelque chose comme ça pourrait fonctionner pour vous.
inoremap { {}<Left> inoremap {<CR> {<CR>}<Esc>O inoremap {{ { inoremap {} {}
J'ai trouvé autoclose ajoutant un peu de retard, et aussi interférer avec mon installation (Ultisnips et Supertab), mais j'aime son approche d'émulation d'Eclipse CDT.
J'utilise delimitMate avec les maps suivantes pour aider à la navigation et l'indentation, en essayant d'get les mêmes résultats:
imap <CF> <CG>g " To jump out brackets in same line. inoremap <CK> <ESC>ki<TAB> " To move and insert an indent on the line before the current cursor (assuming empty line)
Je l'utilise de cette façon: insert l'ouverture { <CR><CR><CK>
et commencer à écrire dans la ligne intérieure en retrait.
En fait, Ultisnips peut le faire presque parfaitement (cela peut être nouveau). Les réponses légèrement modificasortingces données ci-dessus, j'ai un bon succès avec
inoremap () ()<CR>=UltiSnips#Anon('($1)$0', '()', 'double parentheses', 'i')<CR>
On doit taper ()
qui trouve mieux, mais qui peut aussi être changé en (
ainsi, les arguments optionnels supplémentaires à UltiSnips#Anon
sont une description et le modificateur i
qui permet l'expansion dans le mot.
Sortir des parenthèses avec <cj>
fonctionne, aussi nested dans d'autres fragments. Cependant, invoquer des parenthèses nestedes ()
semble briser cette fonctionnalité, ce qui n'est pas une grosse affaire.