2009-10-05 12 views
20

Mi chiedo se emacs abbia questi comandi di spostamento del cursore integrati o se devo scrivere o trovare uno snippet da qualche parte. li trovo piuttosto sprezzanti e li uso regolarmente in vim. non li ho ancora trovati nella documentazione di emacs.emacs equivalente di vim's shift-h e shift-l

in vim, essi appaiono così: shift-h -> sposta il cursore all'inizio dello schermo shift-m -> sposta il cursore al centro dello schermo shift-l -> cursore passaggio al parte inferiore dello schermo

solo per chiarire, non sto cercando di spostare il cursore nella parte superiore/inferiore del documento, solo nella parte superiore/inferiore della parte attualmente visibile del documento, cioè la parte che è attualmente viene visualizzato sullo schermo.

ho trovato uno di loro finora. alt-r sembra essere l'equivalente del turno di m-m. sposta il cursore sulla prima colonna della linea centrale.

risposta

28

Usa:

  • Alt+0 Alt+r - parte superiore della finestra
  • Alt+- Alt+r - parte inferiore della finestra

In senso stretto, questi dovrebbero essere scritto come M-0 M-r per la parte superiore dello schermo e M-- M-r per il fondo dello schermo. Dove M indica la chiave Meta che di solito è mappata su Alt.

ho lavorato questi tasti come segue:

M-r corre il comando move-to-window-line. Ho trovato questo fuori con C-h k M-r, vale a dire. Ctrl+h, k, Alt+r. The key sequence C-h k means tell me what the next key sequence does. Mi ha detto il nome del comando e anche che è possibile passare argomenti numerici al comando per selezionare la linea che si desidera raggiungere. Se non lo passi, sposta il punto al centro della finestra come hai visto.

È possibile passare argomenti numerici ai comandi di typing a number while holding down Meta. Un segno meno da solo è inteso per significare -1. Ora, per passare alla parte superiore dello schermo, vogliamo passare la linea 0 e per la parte inferiore della linea dello schermo -1. Questo ci dà le sequenze chiave sopra.

Se si desidera associare move-to-window-line a una chiave diversa look at Joe's answer to this question.

+2

impiego: - 'M- = Mr' - Medio di finestra – huntar

+0

smartparens lega' Mr' a 'sp-giunzione-sexp-uccisione-around', quindi potrebbe essere utile per modificare il valore predefinito di Emacs ('move-to-window-line-top-bottom') a' MR'. –

8

La funzione che si desidera utilizzare è move-to-window-line, la cui definizione è:

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. 

si potrebbe chiamare con un 0 per andare alla parte superiore della pagina e un -1 per andare al fondo della pagina . Questi possono essere associati a una chiave con una funzione anonima o una funzione con nome. Gli esempi di entrambi sono dati.

funzioni anonime

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

funzioni denominate

(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

Se si utilizza Emacs 23, è semplicemente C-l. La prima volta andrà al centro, la seconda volta andrà in cima, la terza volta andrà verso il basso.

EDIT:

Oops, il mio male, che mette la riga corrente al centro/superiore/inferiore della finestra. Ancora utile però :)

2

Per aggiungere a Joe e risposte di Dave, è possibile ottenere centrale con:

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

(aggiungo bp alla parte anteriore di tutte le mie funzioni per distinguerli dai built-in, o le altre persone ... sentitevi liberi di rimuoverlo.)

+2

Vorrei fare +1 su questa risposta ma il tuo blocco di codice non è formattato (sì, sono pedante!) – mgalgs

+0

Avevo bisogno di fare quanto segue per mettermi in mezzo al lavoro, '(sposta-a-finestra-finestra (/ (finestra -buffer-height (get-buffer-window)) 2)) '. –

7

In Emacs 23.2, Mr fa esattamente quello che volete.

La prima chiamata di questo comando sposta il punto al centro della finestra attualmente visibile, le successive chiamate successive si spostano in alto e in basso.

Nessuna configurazione aggiuntiva o funzioni personalizzate necessarie.

1

Ho trovato che move-to-window-line non rispetta lo window-buffer-height. Quindi, in realtà non fornisce il comportamento di Vim quando la dimensione del buffer è inferiore alla finestra. Dato che non uso Emacs da un terminale, né tengo a minimizzare la sua cornice, ho scelto di riutilizzare la sua chiave di prefisso perché la 'z' mi ricorda Vim di zt, zm e zb (e anche perché I ' useremo quanto segue in combinazione con lo C-l di Emacs per ottenere lo stesso effetto complessivo).

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