2009-03-07 6 views
10

Je me retrouve souvent à taper sur une ligne, quand je réalise que j'ai besoin d'une définition variable (ou quelque chose de similaire) sur la ligne ci-dessus. Ce que je voudrais est (le même ou tout au moins que la ligne d'origine) àCommande Emacs pour insérer et indenter la ligne au-dessus du curseur

  1. presse C-retour de n'importe où sur une ligne et ont déplacer le curseur sur une ligne vierge inséré ci-dessus, avec indentation correcte.
  2. pouvoir tirer sur tout texte ...
  3. et Cu C-espace pour revenir à la position initiale

J'ai réussi à faire # 1, mais mon emacs-fu n'est pas assez fort pour faire le reste.

Répondre

6

Voilà mon humble solution:

 
(defun insert-before-line() 
    (interactive) 
    (let ((pos (point)) 
     (cur-max (point-max))) 
    (beginning-of-line) 
    ; I've changed the order of (yank) and (indent-according-to-mode) 
    ; in order to handle the case when yanked line comes with its own indent 
    (yank)(indent-according-to-mode) 
    ; could be as well changed to simple (newline) it's metter of taste 
    ; and of usage 
    (newline-and-indent) 
    (goto-char (+ pos (- (point-max) cur-max))))) 

Hope it helps.

+1

Intéressant. IIUC, votre solution maintient le curseur stationnaire et "auto-yanks" dans une ligne correctement indentée ci-dessus. Je pense que cela pourrait mieux convenir à mon mode d'utilisation que ce que j'ai demandé. Merci :-) – thebjorn

+1

Le code devrait utiliser 'save-excursion', devrait éviter d'utiliser' yank', et devrait être général pour gérer quand le texte n'est pas à la fin du tampon ('point-max'). – ashawley

+0

@aaronhawley - pourquoi «sauver-excursion»? Je ne change pas de marque, je gère correctement le point, et le code ci-dessus ne provoquera guère le béguin du tampon. Pouvez-vous être plus précis sur le cas "quand le texte n'est pas à la fin du tampon", il fait la même chose quand le point est au moment de l'invocation – Serge

3

Voici ce que vous pouvez faire si vous n'êtes pas un mec Zen Emacs.

Emacs possède une macro d'enregistrement, kmacro-start-macro et macroacro-end-macro. Après l'enregistrement de votre macro, faites name-last-kbd-macro. puis visitez .emacs et insérez insert-kbd-macro.

Vous avez alors une instruction fset qui définit votre macro. Cela peut sembler amusant, et ce n'est pas aussi facile à gérer qu'elisp, mais si vous le bourrez dans votre .emacs, cette macro (par ce nom) sera disponible pour n'importe laquelle de vos sessions d'édition. Et vous pouvez également le lier à une séquence de touches.

3

Probablement une mauvaise forme pour répondre à ma propre question, mais la réponse de Cheeso m'a motivé à faire une programmation Lisp pour la deuxième fois en dix ans (ma version originale était une macro clavier nommée, mais elle marchait partout anneaux). Voici ce que je suis venu avec

(defun insert-and-indent-line-above() 
    (interactive) 
    (push-mark) 
    (let* 
    ((ipt (progn (back-to-indentation) (point))) 
    (bol (progn (move-beginning-of-line 1) (point))) 
    (indent (buffer-substring bol ipt))) 
    (newline) 
    (previous-line) 
    (insert indent))) 

(global-set-key [ (control return) ] 'insert-and-indent-line-above) 

il y a probablement beaucoup de meilleures façons de le faire, mais deux heures de Lisp-piratage peut difficilement être appelé temps perdu :-)

3

Il suffit de tenir votre pensée sur la variable déclaration, finissez de taper votre instruction, puis tapez RET (bien que Cj soit généralement plus DWIM) et tapez votre ligne suivante pour la déclaration de variable, puis appuyez sur Cx Ct pour transposer les lignes.

+3

Si je pouvais tenir ma pensée jusqu'à ce que j'aie atteint la fin de la ligne, ce ne serait pas un problème - vous comprendrez quand vous obtenez «plus vieux» ;-) – thebjorn

Questions connexes