2009-03-07 7 views
10

yukarıda girinti çizgi Sık sık ben (ed) Yukarıdaki satırda bir değişken tanımı (ya da bir şey benzer) ihtiyaç fark edince ben, çizgi üzerinde yazarak bulmak emrediyorum. Ne istiyorum yerde bir hat üzerinde gelenEmacs takıp imlecin

  1. pres C-dönüşüne ve doğru girinti ile yukarıda yeni eklenen boş satıra imleci hareket var (ya da orijinal çizgi olarak en azından aynı).
  2. herhangi bir metin yank edebilmek ...
  3. ve Cu C-uzay
  4. ben 1. yapmak başardınız

orijinal konumuna geri almak için, ama benim emacs-Fu değil gerisini yapmak için yeterince güçlü.

cevap

6

İşte benim mütevazı bir çözüm. Ben Yolun sonuna kadar benim düşünce tutabilseydim

+1

İlginç olsun anlayacaksınız. IIUC, çözümünüz, imleci durağan ve "otomatik yanıkları" yukarıdaki doğru girintili bir çizgide tutar. Kullanım modelimin istediğimden daha iyi olabileceğini düşünüyorum. Teşekkür ederim :-) – thebjorn

+1

Kod 'save-excursion'ı kullanmalı,' 'yank''ı kullanmaktan kaçınmalı ve metnin arabellek sonunda (' point-max') olmadığında ele alınacak genel olmalıdır. – ashawley

+0

@aaronhawley - neden 'kaydetme-gezi'? Markayı doğru şekilde ele almıyorum ve yukarıdaki kod tamponun ezilmesini neredeyse hiç zorlayamaz. "Tamponun sonunda metin olmadığında" hakkında daha spesifik olabilir misiniz? Gördüğüm noktada – Serge

3

Eğer bir Zen ustası emacs ahbabı değilseniz, bunu yapabilirsiniz.

Emacs kmacro-makro başlangıç ​​ve kmacro uç-makro rekor makro şey vardır.

Makronuzu kaydettikten sonra, ad-last-kbd-makrosu yapın. Ardından, .emacs adresini ziyaret edin ve insert-kbd-macro yazın.

Makronuzu tanımlayan bir fset deyiminiz var. Komik görünebilir ve elisp kadar sürdürülemez, ancak bunları sizin .emac'lere eklerseniz, bu makro (bu adla) düzenleme oturumlarınızdan herhangi birinde kullanılabilir olacaktır. Ve bunu bir anahtar diziye de bağlayabilirsiniz.

3

Kendi soruyu cevaplamak için muhtemelen kötü bir biçim, ancak Cheeso'nun cevabı beni on yıl içinde ikinci kez lisp programlama yapmak için motive etti (orijinal versiyonum adlandırılmış bir klavye makrosuydu, fakat tüm öldürme/işaretlemenin üzerine attı. halkalar). İşte bunu yapmanın muhtemelen çok daha iyi yolları vardır ben

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

ile geldi buydu, ama pek

3

:-) boşa zaman çağrılabilir lisp-hack iki saatlik Sadece değişken üzerinde düşünce tutun beyanı, ifadenizi yazmayı bitirin, sonra RET yazın (Cj genellikle daha fazla DWIM olsa da) ve değişken bildirimi için bir sonraki satırı yazın, sonra satırları dönüştürmek için Cx Ct'ye basın.

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

Umarım yardımcı olur:

+3

, bu bir sorun olmaz - Eğer "eski" ;-) – thebjorn