2008-09-28 6 views
36

Können Sie Smart Verhalten für den Home-Key in Emacs haben? Mit smart meine ich, dass, anstatt zu der Zeichenzahl 0 zu gehen, es zu dem ersten nicht-leeren Zeichen gehen sollte, und zu einem zweiten Drücken auf 0 und zurück zu dem ersten Nicht-Leerzeichen in einem dritten und so weiter gehen soll. Mit smart Ende wäre auch schön.Smart Home in Emacs

Antwort

58
(defun smart-beginning-of-line() 
    "Move point to first non-whitespace character or beginning-of-line. 

Move point to the first non-whitespace character on this line. 
If point was already at that position, move point to beginning of line." 
    (interactive "^") ; Use (interactive) in Emacs 22 or older 
    (let ((oldpos (point))) 
    (back-to-indentation) 
    (and (= oldpos (point)) 
     (beginning-of-line)))) 

(global-set-key [home] 'smart-beginning-of-line) 

Ich bin nicht ganz sicher, welches intelligente Ende tun würde. Haben Sie normalerweise viele Leerzeichen?

Hinweis: Der Hauptunterschied zwischen dieser Funktion und Robert Vukovićs besteht darin, dass er beim ersten Tastendruck immer zum ersten nicht leeren Zeichen wechselt, selbst wenn der Cursor bereits vorhanden war. Meine würde in diesem Fall zur Spalte 0 gehen.

Auch er verwendete (beginning-of-line-text), wo ich (back-to-indentation) verwendet. Diese sind sehr ähnlich, aber es gibt einige Unterschiede zwischen ihnen. (back-to-indentation) bewegt sich immer zum ersten Nicht-Leerzeichen in einer Zeile. (beginning-of-line-text) bewegt sich manchmal an Nicht-Whitespace-Zeichen vorbei, die es als unbedeutend ansieht. In einer Nur-Kommentar-Zeile wird beispielsweise das erste Zeichen des Kommentartextes und nicht die Kommentarmarkierung angezeigt. Aber jede Funktion kann in jeder unserer Antworten verwendet werden, je nachdem, welches Verhalten Sie bevorzugen.

+1

Leider ist es nicht mit CUA arbeiten aktiviert, in diesem Fall Schicht für Auswahl nicht funktioniert, Schicht nach Hause zur Auswahl der vollständigen Linie funktioniert nicht. Irgendwelche Vorschläge? –

+0

@Alexander Stolz, ich benutze nie cua-mode, aber versuche, '' put 'smart-beginning-of-line' CUA 'move) 'nach dem' defun' (also direkt vor der 'global-set-key') hinzuzufügen Linie). – cjm

+0

cjm: das ist _exactly_ wie hätte ich es auch gemacht. – offby1

12

Dies funktioniert mit GNU Emacs, ich habe es nicht mit XEmacs versucht.


(defun My-smart-home() "Odd home to beginning of line, even home to beginning of text/code." 
    (interactive) 
    (if (and (eq last-command 'My-smart-home) 
      (/= (line-beginning-position) (point))) 
    (beginning-of-line) 
    (beginning-of-line-text)) 
) 

(global-set-key [home] 'My-smart-home) 
4

Beachten Sie, dass es bereits eine Funktion Back-to-Vertiefung ist, die tut, was Sie die erste Smart-Home-Funktion, das heißt gehen auf den ersten Nicht-Leerzeichen auf der Linie tun wollen. Es ist standardmäßig an M-m gebunden.

+0

Ja, wenn Sie die akzeptierte Antwort gelesen haben, werden Sie eine Diskussion über einige der Unterschiede zwischen Zurück-zu-Einrückung und Zeilenanfang-Text bemerken. – cjm

+0

für mich, was nützlicher wäre als ein Smart-Home-Schlüssel würde M-m Smart auf nachfolgenden Pressen, ähnlich wie C-l ist überlastet. – willwillis

6

Danke für diese praktische Funktion. Ich benutze es die ganze Zeit und liebe es. Ich habe nur eine kleine Änderung vorgenommen: (interaktiv) wird: (interactive "^")

Von Emacs Hilfe: Wenn die Zeichenfolge mit beginnt ^' and Shift-select-Modus‘ist nicht gleich Null, Emacs ruft zuerst die Funktion `handle-shift-select 'auf.

Im Grunde wird damit Shift-Home von der aktuellen Position zum Zeilenanfang gewählt, wenn Sie den Shift-Select-Modus verwenden. Es ist besonders nützlich im Minipuffer.

0

Ich passe @Vucovic Code beggining-of-line zuerst zu springen:

(defun my-smart-beginning-of-line() 
    "Move point to beginning-of-line. If repeat command it cycle 
position between `back-to-indentation' and `beginning-of-line'." 
    (interactive "^") 
    (if (and (eq last-command 'my-smart-beginning-of-line) 
      (= (line-beginning-position) (point))) 
     (back-to-indentation) 
    (beginning-of-line))) 

(global-set-key [home] 'my-smart-beginning-of-line) 
2

Es gibt jetzt ein Paket, das genau das tut, mwim (Move Wo ich meine)