2012-03-30 5 views
4

Wie wird das Standardverhalten der Emacs-Markenabsatzfunktion so geändert, dass die erste leere Zeile nicht ausgewählt wird?Ändern des Verhaltens von Markenabsatzparametern

my emacs http://dl.dropbox.com/u/1019877/e2.PNG


Ich habe gemacht Bohzidars Version aktualisiert und es funktioniert auch für die erste Zeile.

(global-set-key (kbd "M-h") (lambda() 
        (interactive) 
        (mark-paragraph) 
        (if (> (line-number-at-pos) 1) 
         (next-line))      
        (beginning-of-line))) 

danke Jungs für die Tipps.

Antwort

2

Sie können das Verhalten von mark-paragraph ändern, aber Sie können einen anderen Befehl an die C-M-h Tastendruck leicht binden (das Original M-h ähneln):

(global-set-key (kbd "C-M-h") (lambda() 
        (interactive) 
        (mark-paragraph) 
        (next-line) 
        (beginning-of-line))) 

So etwas sollte es tun.

+0

Dies ist ein bisschen zu naiv, wie es fehlschlägt, z. B. wenn der Absatz am Anfang der Datei beginnt. Aber der grundlegende Ansatz ist richtig. – deong

+0

Sie haben natürlich Recht, aber für den ersten Absatz kann man noch 'M-h' drücken :-) –

+0

thnks Ich habe die Frage mit dem Arbeitscode aktualisiert –

1

Ich bin mir nicht sicher, ich sehe eine bequeme Möglichkeit, dies zu tun. mark-paragraph Aufrufe forward-paragraph und backward-paragraph, um den Großteil der Arbeit zu tun, und in der Dokumentation für backward-paragraph, haben wir "wenn die erste echte Zeile eines Absatzes eine leere Zeile vorangestellt ist, beginnt der Absatz bei dieser leeren Zeile."

Die relevantesten zu betrachtenden Variablen scheinen paragraph-start und paragraph-separate zu sein, zwei reguläre Ausdrücke, die in paragles.el benutzt werden, um diese Art von Dingen herauszufinden. Ich würde sie jedoch ändern, da sie eine ganze Reihe anderer Effekte haben werden.

Eine weitere Möglichkeit ist eine eigene Funktion zu schreiben, die in etwa wie folgt funktioniert:

(defun dg-mark-paragraph() 
    (interactive) 
    (mark-paragraph) 
    (goto-char (region-beginning)) 
    (when (= (string-match paragraph-separate (thing-at-point 'line)) 0) 
    (forward-line))) 
3

Die derzeit akzeptierte Antwort hat zwei Nachteile: 1) keine Argumente akzeptieren und 2) darf nicht zu Markieren Sie weitere Absätze durch wiederholte Aufrufe (besonders das ist sehr nützlich). Hier ist meine Lösung - es ist der ursprüngliche Mark-Absatz mit einem Next-Line-Befehl am Ende. Die Bedingung stellt sicher, dass es auch am ersten der Datei funktioniert.

Möglicherweise ist eine wirtschaftlichere Lösung, Ratschläge zu verwenden, aber ich weiß nicht, wie man sie noch benutzt :).

(defun rs-mark-paragraph (&optional arg allow-extend) 
"The original default mark-paragraph, but doesn't mark the first 
empty line. Put point at beginning of this paragraph, mark at 
end. The paragraph marked is the one that contains point or 
follows point. 

With argument ARG, puts mark at end of a following paragraph, so that 
the number of paragraphs marked equals ARG. 

If ARG is negative, point is put at end of this paragraph, mark is put 
at beginning of this or a previous paragraph. 

Interactively, if this command is repeated 
or (in Transient Mark mode) if the mark is active, 
it marks the next ARG paragraphs after the ones already marked." 
    (interactive "p\np") 
    (unless arg (setq arg 1)) 
    (when (zerop arg) 
    (error "Cannot mark zero paragraphs")) 
    (cond ((and allow-extend 
      (or (and (eq last-command this-command) (mark t)) 
      (and transient-mark-mode mark-active))) 
    (set-mark 
     (save-excursion 
     (goto-char (mark)) 
     (forward-paragraph arg) 
     (point)))) 
    (t 
    (forward-paragraph arg) 
    (push-mark nil t t) 
    (backward-paragraph arg) 
    (if (/= (line-number-at-pos) 1) 
         (next-line))))) 
Verwandte Themen