Domanda

Mi trovo spesso a scrivere su una riga, quando mi rendo conto di aver bisogno di una definizione variabile (o qualcosa di simile) sulla riga sopra. Quello che vorrei è

  1. premi C-return da qualsiasi punto di una riga e fai spostare il cursore su una riga vuota appena inserita sopra, con rientro corretto (o almeno uguale alla riga originale).
  2. essere in grado di strappare qualsiasi testo ...
  3. e C-u C-space per tornare alla posizione originale

Sono riuscito a fare il n. 1, ma il mio emacs-fu non è abbastanza forte da fare il resto.

È stato utile?

Soluzione

Ecco la mia umile soluzione:

(defun my-insert-before-line ()
  (interactive)
  (save-excursion
    (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)))

Spero che sia d'aiuto.

Altri suggerimenti

Ecco cosa puoi fare se non sei un maestro Zen emacs dude.

Emacs ha una cosa record-macro, kmacro-start-macro e kmacro-end-macro.

Dopo aver registrato la tua macro, esegui name-last-kbd-macro. quindi visita .emacs e inserisci insert-kbd-macro.

Quindi hai un'istruzione fset che definisce la tua macro. Può sembrare divertente e non è mantenibile come elisp, ma se lo inserisci nei tuoi .emacs, quella macro (con quel nome) sarà disponibile per qualsiasi delle tue sessioni di editing. E puoi anche associarlo a una sequenza di tasti.

Probabilmente una pessima forma per rispondere alla mia domanda, ma la risposta di Cheeso mi ha motivato a fare un po 'di programmazione lisp per la seconda volta in dieci anni (la mia versione originale era una macro tastiera denominata, ma ha fatto un passo in tutto il kill / mark-ring ). Ecco cosa mi è venuto in mente

(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)

ci sono probabilmente molti modi migliori per farlo, ma due ore di hacking non possono essere chiamate tempo sprecato :-)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top