2008-09-28 8 views
36

¿Puede tener un comportamiento inteligente para la tecla de inicio en Emacs? Por inteligente quiero decir que en lugar de ir al número de carácter 0, debería ir al primer carácter que no esté en blanco, y pasar a 0 en una segunda pulsación y volver al primer elemento que no esté en blanco en un tercero, y así sucesivamente. Tener un final inteligente sería bueno también.Hogar inteligente en Emacs

Respuesta

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) 

No estoy del todo seguro de lo que haría el final inteligente. ¿Normalmente tienes muchos espacios en blanco al final?

Nota: La principal diferencia entre esta función y la de Robert Vuković es que siempre se mueve al primer carácter que no está en blanco en la primera pulsación de tecla, incluso si el cursor ya estaba allí. El mío se movería a la columna 0 en ese caso.

Además, usó (beginning-of-line-text) donde usé (back-to-indentation). Esos son muy similares, pero hay algunas diferencias entre ellos. (back-to-indentation) siempre se mueve al primer carácter que no sea de espacio en blanco en una línea. (beginning-of-line-text) a veces mueve los caracteres que no son de espacio en blanco que considera insignificantes. Por ejemplo, en una línea de solo comentario, se mueve al primer carácter del texto del comentario, no al marcador de comentario. Pero cualquiera de las funciones se puede usar en cualquiera de nuestras respuestas, dependiendo del comportamiento que prefiera.

+1

Por desgracia, no funciona con cua habilitado, en cuyo caso el cambio para la selección no funciona, cambiar a casa para seleccionar la línea completa no funciona. ¿Alguna sugerencia? –

+0

@ Alexander Stolz, nunca uso cua-mode, pero intente agregar '(ponga 'smart-beginning-of-line' CUA 'movimiento)' después de 'defun' (es decir, justo antes de' global-set-key' línea). – cjm

+0

cjm: así es exactamente cómo lo habría hecho yo también. – offby1

12

Esto funciona con GNU Emacs, no lo intenté con XEmacs.


(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

Tenga en cuenta que ya hay una función de regreso a la hendidura, que hace lo que quiere la primera función Smart-hogar de hacer, es decir, ir a la primera no está en blanco en la línea. Está obligado por defecto a M-m.

+0

Sí, si lee la respuesta aceptada, verá una discusión sobre algunas de las diferencias entre la sangría y el comienzo de la línea. – cjm

+0

para mí, lo que sería más útil que una clave de inicio inteligente sería hacer M-m inteligente en las siguientes pulsaciones, similar a cómo C-l está sobrecargado. – willwillis

6

Gracias por esta práctica función. Lo uso todo el tiempo y me encanta. He hecho sólo un pequeño cambio: (interactiva) se convierte en: ( interactivos "^")

De emacs ayuda: Si la cadena comienza con ^' and turno de selección de modo' no es nula, Emacs primero llama a la función `handle-shift-select '.

Básicamente esto hace que shift-home seleccione de la posición actual al comienzo de la línea si usa shift-select-mode. Es especialmente útil en el minibúfer.

0

me adapto código @Vucovic para saltar a primera beggining-of-line:

(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

Ahora hay un paquete que hace precisamente eso, mwim (MOVE Cuando me refiero)

Cuestiones relacionadas