2009-10-05 15 views
20

me pregunto si emacs tiene estos comandos de movimiento de cursor incorporados o si tendré que escribirlos o encontrar un fragmento en alguna parte. Los encuentro bastante atractivos y los uso en vim regularmente. no los he encontrado en la documentación de emacs hasta el momento.emacs equivalente a vim shift-h y shift-l

en vim, se ven así: turno-h -> mover el cursor a la parte superior de la pantalla turno-m -> mover el cursor a la mitad de la pantalla turno-l -> mover el cursor a la parte inferior de la pantalla

solo para aclarar, no estoy buscando mover el cursor a la parte superior/inferior del documento, solo a la parte superior/inferior de la parte visible actualmente del documento, es decir, la parte que está actualmente se muestra en la pantalla.

encontré uno de ellos hasta el momento. alt-r parece ser el equivalente del cambio-m de vim. mueve el cursor a la primera columna de la línea media.

Respuesta

28

Uso:

  • Alt+0 Alt+r - parte superior de la ventana
  • Alt+- Alt+r - parte inferior de la ventana

En sentido estricto, estos deben escribirse como M-0 M-r de la parte superior de la pantalla y M-- M-r de la parte inferior de la pantalla Donde M significa la clave Meta que generalmente se mapea a Alt.

trabajé a cabo estas pulsaciones de teclas de la siguiente manera:

M-r ejecuta el comando move-to-window-line. Descubrí esto con C-h k M-r, es decir. Ctrl+h, k, Alt+r. The key sequence C-h k means tell me what the next key sequence does. Me dijo el nombre del comando y también que puede pasar argumentos numéricos al comando para elegir la línea a la que desea ir. Si no pasa ninguno, mueve el punto al centro de la ventana como lo ha visto.

Pasa los argumentos numéricos a los comandos por typing a number while holding down Meta. Un signo menos en sí mismo significa -1. Ahora, para pasar a la parte superior de la pantalla, queremos pasar la línea 0 y para la parte inferior de la línea de pantalla -1. Esto nos da las secuencias clave arriba.

Si desea vincular move-to-window-line a una clave diferente look at Joe's answer to this question.

+2

Uso: - 'M- = Mr' - Medio de ventana – huntar

+0

smartparens une' 'Mr' a sp-empalme sexp-matar-around', por lo que puede resultar útil para cambiar el valor por defecto de Emacs ('move-to-window-line-top-bottom') a' MR'. –

8

La función que desea utilizar es move-to-window-line, cuya definición es:

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. 

Usted lo llamaría con un 0 para ir a la parte superior de la página y una -1 para ir a la parte inferior de la página . Estos pueden estar vinculados a una clave con una función anónima o una función nombrada. Se dan ejemplos de ambos.

funciones anónimas

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

funciones con nombre

(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

Si está usando Emacs 23, es simplemente C-l. La primera vez irá al centro, la segunda vez irá a la cima, la tercera vez irá al fondo.

EDIT:

Vaya, mi mal, que pone a la línea actual en el centro/superior/inferior de la ventana. Siendo útil aunque :)

2

Para añadir a Joe y respuestas de Dave, puede obtener media con:

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

(añado bp al frente de todas mis funciones para distinguirlos de los muebles empotrados, o de otras personas ... siéntase libre de eliminar eso.)

+2

Me gustaría +1 esta respuesta, pero su bloque de código no está formateado (sí, soy pedante!) – mgalgs

+0

Tenía que hacer lo siguiente para llegar al medio para trabajar, '(mover-a-ventana-línea (/ (ventana -buffer-height (get-buffer-window)) 2)) '. –

7

En Emacs 23.2, Mr hace exactamente lo que quiere.

La primera invocación de este comando mueve el punto al centro de la ventana actualmente visible, las siguientes invocaciones sucesivas se mueven hacia arriba y hacia abajo.

No se necesitan configuraciones adicionales ni funciones personalizadas.

1

He encontrado que move-to-window-line no respeta window-buffer-height. Por lo tanto, en realidad no proporciona el comportamiento que tiene Vim cuando el tamaño del búfer es menor que la ventana. Como no uso Emacs desde un terminal, ni me importa minimizar su fotograma, he elegido reutilizar su tecla de prefijo porque la 'z' me recuerda a zt, zm, y zb de Vim (y también porque yo ' Voy a usar lo siguiente en combinación con Emacs 'C-l para lograr el mismo efecto general).

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