2009-10-05 11 views
20

ich frage mich, ob emacs diese cursor bewegungsbefehle eingebaut hat oder ob ich sie schreiben oder irgendwo einen schnipsel finden muss. Ich finde sie ziemlich schick und benutze sie regelmäßig in vim. Ich habe sie bisher in der Emacs-Dokumentation nicht gefunden.emacs äquivalent zu vim shift-h und shift-l

in vim, sie sehen wie folgt aus: Shift-h -> bewegt den Cursor an den oberen Rand des Bildschirms Shift-m -> bewegt den Cursor in die Mitte des Bildschirms Shift-l -> bewegt den Cursor auf die unten auf dem Bildschirm

nur um zu verdeutlichen, ich bin nicht auf der Suche nach dem Cursor an den oberen/unteren Rand des Dokuments, nur an den oberen/unteren Rand des derzeit sichtbaren Teil des Dokuments, dh der Teil, der derzeit ist auf dem Bildschirm angezeigt werden.

Ich habe bisher einen gefunden. alt-r scheint das Äquivalent von vims Shift-m zu sein. Es bewegt den Cursor zur ersten Spalte der mittleren Zeile.

Antwort

28

Verwendung:

  • Alt+0 Alt+r - nach oben Fenster
  • Alt+- Alt+r - Unterseite des Fenster

Streng, diese als M-0 M-r für den oberen Rand des Bildschirms und M-- M-r für den Boden geschrieben werden soll des Bildschirms. Dabei steht M für den Schlüssel Meta, der normalerweise Alt zugeordnet ist.

arbeitete ich diese Tastenanschläge wie folgt:

M-r den move-to-window-line Befehl ausgeführt wird. Ich habe das mit C-h k M-r herausgefunden, dh. Ctrl+h, k, Alt+r. The key sequence C-h k means tell me what the next key sequence does. Er sagte mir den Befehlsnamen und auch, dass Sie numerische Argumente an den Befehl übergeben können, um die Zeile auszuwählen, die Sie aufrufen möchten. Wenn Sie keine übergeben, verschiebt es den Punkt in die Mitte des Fensters, wie Sie gesehen haben.

Sie übergeben numerische Argumente an Befehle von typing a number while holding down Meta. Ein Minuszeichen allein bedeutet -1. Um nun zum oberen Bildschirmrand zu gelangen, wollen wir die Zeile 0 und unten für die Bildschirmzeile -1 übergeben. Dies gibt uns die Schlüsselsequenzen oben.

Wenn Sie move-to-window-line an einen anderen Schlüssel look at Joe's answer to this question binden möchten.

+2

Verwendung: - 'M = Mr' - Mitte des Fensters – huntar

+0

smartparens bindet' Mr' zu 'sp-Spleiß-sexp tötet-around', so dass Sie es nützlich finden kann den Emacs Standard zu ändern ('move-to-window-line-top-bottom') zu' MR'. –

8

Die Funktion, die Sie verwenden möchten move-to-window-line ist, deren Definition lautet:

move-to-window-line is an interactive built-in function in `C source 
code'. 

It is bound to M-r. 
(move-to-window-line arg) 

Position point relative to window. 
With no argument, position point at center of window. 
An argument specifies vertical position within the window; 
zero means top of window, negative means relative to bottom of window. 

Sie es mit einem 0 zum Seitenanfang gehen nennen würde und ein -1 zum Ende der Seite zu gehen . Diese können an einen Schlüssel mit einer anonymen Funktion oder einer benannten Funktion gebunden sein. Beispiele für beide sind gegeben.

Anonyme Funktionen

(global-set-key [(f4)] (function 
         (lambda() 
          "Go to top of page." 
          (interactive) 
          (move-to-window-line 0)))) 

(global-set-key [(f4)] (function 
         (lambda() 
          "Go to bottom of page." 
          (interactive) 
          (move-to-window-line -1)))) 

Benannte Funktionen

(defun my-top-of-page() 
    "Go to top of page." 
    (interactive) 
    (move-to-window-line 0)) 

(defun my-bottom-of-page() 
    "Go to bottom of page." 
    (interactive) 
    (move-to-window-line -1)) 

(global-set-key [(f4)] 'my-top-of-page) 
(global-set-key [(shift f4)] 'my-bottom-of-page) 
0

Wenn Sie Emacs verwenden 23, es ist einfach C-l. Das erste Mal wird es in die Mitte gehen, das zweite Mal wird es nach oben gehen, das dritte Mal wird es nach unten gehen.

EDIT:

Hoppla, mein schlecht, das in der Mitte/oben/unten im Fenster die aktuelle Zeile setzt. Noch nützlich aber :)

2

Joes und Daves Antworten hinzuzufügen, können Sie Mitte erhalten mit:

(defun bp-goto-center() 
    "move cursor to middle line" 
    (interactive) 
    (move-to-window-line (/ (window-height) 2))) 

(ich hinzufügen bp nach vorne all meinen Funktionen sie von Einbauten zu unterscheiden, oder andere Leute ... fühlen sich frei, das zu entfernen.)

+2

Ich würde diese Antwort +1 geben, aber Ihr Code-Block ist nicht formatiert (ja, ich bin pedantisch!) – mgalgs

+0

Ich musste Folgendes tun, um die Mitte zu arbeiten, '(move-to-window-line (/ (Fenster -buffer-height (get-buffer-window)) 2)) '. –

7

In Emacs 23.2 macht Herr genau, was Sie wollen.

Der erste Aufruf dieses Befehls verschiebt den Punkt in die Mitte des aktuell sichtbaren Fensters, die nächsten aufeinanderfolgenden Aufrufe werden nach oben und unten verschoben.

Keine zusätzliche Konfiguration oder benutzerdefinierte Funktionen erforderlich.

1

Ich habe festgestellt, dass move-to-window-line nicht window-buffer-height respektiert. Daher liefert es nicht das Verhalten, das Vim hat, wenn die Puffergröße kleiner als das Fenster ist. Da ich Emacs nicht von einem Terminal verwende und mich auch nicht darum kümmere, den Frame zu minimieren, habe ich den Prefix-Schlüssel verwendet, weil das 'z' mich an Vims zt, zm und zb erinnert (und auch weil ich Ich werde das Folgende in Kombination mit Emacs 'C-l verwenden, um denselben Gesamteffekt zu erzielen).

(define-prefix-command 'ctl-z-map) 
(defun move-to-window-line-top() 
    (interactive) 
    (move-to-window-line 0)) 
(defun move-to-window-line-middle() 
    (interactive) 
    (let* ((wb-height (window-buffer-height (get-buffer-window))) 
     (actual-height (if (> wb-height (window-height)) 
          (window-height) 
         wb-height))) 
    (move-to-window-line (/ actual-height 2)))) 
(defun move-to-window-line-bottom() 
    (interactive) 
    (move-to-window-line -1) 
    (beginning-of-line)) 
(define-key ctl-z-map (kbd "h") 'move-to-window-line-top) 
(define-key ctl-z-map (kbd "m") 'move-to-window-line-middle) 
(define-key ctl-z-map (kbd "l") 'move-to-window-line-bottom) 
(global-set-key (kbd "C-z") 'ctl-z-map) 
Verwandte Themen