2012-05-21 10 views
8

Estoy usando org-mode en Emacs para documentar mis actividades de desarrollo. Una de las tareas que debo hacer continuamente a mano es describir áreas de código. Emacs tiene un muy buen Bookmark List: crear un marcador con CTRL - xrm, lista de ellos con CTRL - xrl. Esto es muy útil, pero no es exactamente lo que necesito.Emacs org-mode: referencia textual a un archivo: línea

Org-mode tiene el concepto de enlace, y el comando org-store-link registrará un enlace a la posición actual en cualquier archivo, que se puede pegar en el archivo org. El problema con esto es doble:

  • Se almacena como un enlace de organización, y la posición vinculada no está directamente visible (solo la descripción).
  • Se almacena en el formato file/search, que no es lo que quiero.

Necesito tener el marcador en forma de texto, de modo que pueda copiar y pegar en org-mode, extremo editarlo si es necesario, con un formato sencillo como esto:

absolute-file-path:line 

Y esto debe obtenerse de la posición actual del punto. El flujo de trabajo podría ser tan simple como:

  • Ir a la posición que quiero grabar
  • llamar a una función: position-to-kill-ring (I uniría a un atajo de teclado)
  • Ir a la memoria intermedia org-mode.
  • Yankee la posición.
  • Editar si es necesario (a veces tengo que cambiar las rutas absolutas por rutas relativas, ya que mi código está en una ubicación diferente en diferentes máquinas)

Desafortunadamente mi lisp es inexistente, así que no sé cómo para hacer esto. ¿Hay una solución simple a mi problema?

Respuesta

12
(defun position-to-kill-ring() 
    "Copy to the kill ring a string in the format \"file-name:line-number\" 
for the current buffer's file name, and the line number at point." 
    (interactive) 
    (kill-new 
    (format "%s:%d" (buffer-file-name) (save-restriction 
             (widen) (line-number-at-pos))))) 
+2

El formato debe ser '"% s ::% d "', es decir, con dos dos puntos –

0

Un elisp principiante yo pensé en él como un buen ejercicio et voila:

Editar: reescribió utilizando la méthode formato, pero todavía no creo almacenar al anillo de corte es menos intrusivo en mi flujo de trabajo (no sé sobre ti). También he agregado la capacidad de agregar posición de columna.

(defvar current-file-reference "" "Global variable to store the current file reference") 

(defun store-file-line-and-col() 
    "Stores the current file, line and column point is at in a string in format \"file-name:line-number-column-number\". Insert the string using \"insert-file-reference\"." 
    (interactive) 
    (setq current-file-reference (format "%s:%d:%d" (buffer-file-name) (line-number-at-pos) (current-column)))) 
(defun store-file-and-line() 
    "Stores the current file and line oint is at in a string in format \"file-name:line-number\". Insert the string using \"insert-file-reference\"." 
    (interactive) 
(setq current-file-reference (format "%s:%d" (buffer-file-name) (line-number-at-pos)))) 

(defun insert-file-reference() 
    "Inserts the value stored for current-file-reference at point." 
    (interactive) 
    (if (string= "" current-file-reference) 
     (message "No current file/line/column set!") 
    (insert current-file-reference))) 

No probado exhaustivamente pero que funciona para mí. Simplemente pulse store-file-and-line o store-file-line-and-col para almacenar la ubicación actual y insert-file-reference para insertar el valor almacenado en el punto.

5

Desea utilizar los ganchos org-create-file-search-functions y org-execute-file-search-functions.

Por ejemplo, si necesita la búsqueda que usted describe para los archivos en modo texto, utilice la siguiente:

(add-hook 'org-create-file-search-functions 
     '(lambda() 
     (when (eq major-mode 'text-mode) 
      (number-to-string (line-number-at-pos))))) 

(add-hook 'org-execute-file-search-functions 
     '(lambda (search-string) 
     (when (eq major-mode 'text-mode) 
      (goto-line (string-to-number search-string))))) 

Entonces M-x org-store-link RET va a hacer lo correcto (almacenar un número de línea que la cadena de búsqueda) y Cc Co (es decir,) abrirá el archivo y accederá a este número de línea.

Por supuesto, puede verificar otros modos y/o condiciones.

0

BTW, si quiere algo mejor que FILE: LINE, puede intentar usar add-log-current-defun (en add-log.el) que debe devolver el nombre de la función actual.

Cuestiones relacionadas