2012-08-04 8 views
20

¿Qué problema puede ocurrir si la función goto-line se utiliza en un programa elisp no interactivo? Su docstring da una advertencia que dice que:¿Por qué es "goto-line" en Emacs solo para uso interactivo?

Esta función es generalmente lo incorrecto de usar en un programa Lisp. Lo que es probable que desee en cambio, es algo así como:

(goto-char (point-min)) (forward-line (1- N)) 

Por otra parte, cuando intento byte-compile-file mi archivo init incluyendo goto-line, recibo una advertencia desagradable como esto una vez más:

.emacs:170:19:Warning: `goto-line' used from Lisp code 
That command is designed for interactive use only 

Es usando goto-line en un programa no interactivo realmente tan peligroso? En relación con esto, ¿por qué es preferible la solución forward-line sugerida?

+0

No estoy seguro de cómo goto-line funcionaría de forma no interactiva, va a una línea en el búfer actual –

+0

@JonLin Puede encontrar un ejemplo que no usa interactivamente 'goto-line' en [EmacsWiki: AUCTeX] (http://emacswiki.org/emacs/AUCTeX#toc20):' th-evince-sync'. – dkim

+0

event_jr ha respondido a su pregunta como se planteó, pero aún * ¿por qué * estás tratando de hacer esto? Puede haber una mejor manera de lograr lo que realmente quieres. Además, señalaría que si el búfer se ha reducido yendo a cierta línea probablemente no vaya a hacer lo que usted cree que es. – scottfrazer

Respuesta

29

En primer lugar, esto evita que los programadores de Elisp caigan en malos hábitos, escribiendo código ineficiente en una línea centrada en el número de línea. es decir, en lugar de usar (forward-line 1) calculando el número de línea actual, incrementando y usando goto-line.

De la lista this de correo artículo:

En pocas palabras, la razón por la goto-line no debería ser un comando de frecuencia utilizado es que normalmente no hay razón para querer llegar a la línea número N a menos tienes un programa que te dice que hay algo interesante en esa línea.

En segundo lugar, goto-line manipula el entorno del usuario además de mover el punto (es decir push-mark). Para uso no interactivo, esto puede no ser lo que desea. Por otro lado, si después de examinar todo esto, usted cree goto-line es exactamente lo que necesita, entonces simplemente llamar así:

(defun foo() 
    (interactive) 
    (with-no-warnings 
    (goto-line N))) 

Y usted no recibirá advertencias del compilador.

+1

+1 por mencionar la manipulación de puntos. –

+0

"normalmente no hay razón para querer llegar al número de línea N a menos que tengas un programa que te indique que hay algo interesante en esa línea": ¿qué ocurre si tu programa (o código elisp) ha calculado que hay algo interesante en esa línea? ? ¿Entonces está la recomendación de restar la línea actual de esa línea, y usar forward line en su lugar? (Fácil, pero solo asegúrate). – ShreevatsaR

6

además de lo que se dijo:

"goto-line" finalmente se repite en "(avance de línea (1- line)", que en efecto hace el trabajo Todos los demás de los 43 líneas de ". goto-line "reparto de cuerpo de comando con uso interactivo. Por ejemplo, considerando un argumento posiblemente universal.

Al escribir un programa o cuando se ejecuta, su computadora está en otro estado que después de una llamada interactiva. Por lo tanto, debe abordar esto estado mediante el uso de "línea directa" directamente.

+1

La parte '(interactive arg-descriptor)' que trata con el uso interactivo parece saltearse cuando se llama a 'goto-line' desde los programas Lisp. De [el manual de referencia] (http://www.gnu.org/software/emacs/manual/html_node/elisp/Using-Interactive.html#index-interactive-1253), "Se puede llamar a un comando desde programas Lisp como cualquier otra función, pero luego la persona que llama proporciona los argumentos y _arg-descriptor_ no tiene ningún efecto ". – dkim

+0

@dkim También el código más allá del cálculo del argumento se refiere al uso interactivo: todavía hay marca de inserción, conmutación de memoria y similares. –

Cuestiones relacionadas