2017-09-20 8 views
0

J'ai une fonction qui insère essentiellement function() {}; mais correctement en retrait et le curseur positionné de façon appropriée:Quelle est la meilleure façon d'insérer un extrait de code dans spacemacs

(defun insert-function-js() 
    (insert "function() { 
};")) 

(define-key evil-normal-state-map (kbd "SPC dg") 
    (lambda() 
    (interactive) 
    (call-interactively 'evil-insert) 
    (insert-function-js) 
    (evil-force-normal-state) 
    (call-interactively 'evil-visual-char) 
    (call-interactively 'evil-previous-line) 
    (call-interactively 'indent-region) 
    (call-interactively 'evil-open-below))) 

Cela semble très lourd. Je suppose qu'il existe une meilleure façon d'écrire cette fonctionnalité! Un qui exploite mieux les capacités d'elisp.

Merci pour l'aide!

+1

Vous voudrez peut-être consulter 'yasnippet' pour insérer ces types de modèles: http://joaotavora.github.io/yasnippet/ – Arnot

+0

Je suis actuellement à la recherche dans yas. C'est une belle découverte, je vais certainement jouer avec. Je n'ai pas encore trouvé un moyen d'exécuter une macro vim, sauf la liaison de touches. Peut-être existe-t-il un moyen de lier un extrait yas à une expression vim. – Mikechaos

Répondre

1

En réponse à votre première question, vous pouvez utiliser yasnippet et un extrait sur la base function -snippet fourni avec Spacemacs [1] pour le faire pour vous:

# -*- mode: snippet; require-final-newline: nil -*- 
# name: my-function 
# key: fn 
# -- 
function() { 
     $0 
}; 

Si vous mettez cet extrait dans un nouveau fichier dans ~/.emacs.d/private/snippets/, vous pouvez l'agrandir en tapant fn puis en appuyant sur M-/ [2]. Si yas-indent-line est défini sur 'auto (ce qui est par défaut dans Spacemacs), la fonction doit être indentée correctement et le $0 dans l'extrait place votre curseur dans cette position après l'insertion. Le yasnippet -expansion forme une seule action d'annulation.


[1] La valeur par défaut function -snippet se trouve dans ~/.emacs.d/elpa/yasnippet-<VERSION>/snippets/js-mode

[2] en utilisant les liaisons par défaut Spacemacs, cela exige hippie-expand, qui appelle à son tour yas-expand.

+1

De vos commentaires, j'ai déjà défini un extrait de yas comme celui-ci! Cela fonctionne plutôt bien. Il répond définitivement à la première question. Je vais éditer la question pour extraire le second comme un fil séparé et marquer celui-ci comme une réponse! – Mikechaos