2012-05-21 8 views
8

Ich verwende org-mode in Emacs, um meine Entwicklungsaktivitäten zu dokumentieren. Eine der Aufgaben, die ich kontinuierlich von Hand erledigen muss, ist die Beschreibung von Codebereichen. Emacs hat eine sehr schöne Bookmark List: ein Lesezeichen mit CTRL erstellen - xrm, listen Sie diese mit CTRL - xrl. Das ist sehr nützlich, ist aber nicht das, was ich brauche.Emacs org-mode: Textreferenz auf eine Datei: Zeile

Org-Modus hat das Konzept der Verknüpfung, und der Befehl org-store-link wird eine Verknüpfung zu der aktuellen Position in einer beliebigen Datei aufzeichnen, die in die Org-Datei eingefügt werden kann. Das Problem dabei ist zweifach:

  • es als org-Link gespeichert ist, und die verknüpfte Position nicht direkt sichtbar ist (nur die Beschreibung).
  • Es ist im Format file/search gespeichert, was ist nicht was ich will.

Ich brauche das Lesezeichen in Textform haben, so dass ich es kopieren Einfügen in org-Modus Ende bearbeiten sie, wenn nötig, mit einem einfachen Format wie folgt aus:

absolute-file-path:line 

Und das muss von der aktuellen Punktposition erhalten werden. Der Workflow wäre so einfach wie:

  • in die Position gehen, die ich
  • Anruf eine Funktion aufnehmen möchten: position-to-kill-ring (ich würde dies zu einer Tastenkombination binden)
  • Zum org-mode Puffer.
  • Yank die Position.
  • bearbeiten, wenn nötig (manchmal muß ich durch relative Pfade absolute Pfade ändern, da mein Code an einem anderen Ort in verschiedenen Maschinen ist)

Leider ist mein lisp nicht existent ist, so dass ich weiß nicht, wie um dies zu tun. Gibt es eine einfache Lösung für mein Problem? voila

Antwort

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

Das Format muss "% s ::% d" 'sein, d. H. Mit zwei Doppelpunkten –

0

Ein elisp selbst Anfänger ich es aber als eine gute Übung et:

Edit: schreibt es das Format Methode, aber ich denke immer noch, es nicht zu dem Kill-Ring zu speichern ist weniger aufdringlich in meinem Workflow (weiß nicht über dich). Auch ich habe die Fähigkeit hinzugefügt, Spaltenposition hinzuzufügen.

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

Nicht ausführlich getestet, aber für mich arbeiten. Drücken Sie einfach store-file-and-line oder store-file-line-und-col zum Speichern der aktuellen Position und Insert-Datei-Referenz, um den gespeicherten Wert am Punkt einzufügen.

5

Sie möchten die Haken org-create-file-search-functions und org-execute-file-search-functions verwenden.

Zum Beispiel, wenn Sie die Suche nach Text-Modus Dateien beschreiben müssen, verwenden Sie diese:

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

Dann M-x org-store-link RET wird das Richtige tun (speichern Sie eine Zeilennummer als Suchtext) und Cc Co (dh) wird die Datei öffnen und zu dieser Zeilennummer gehen.

Sie können natürlich nach anderen Modi und/oder Bedingungen suchen.

0

BTW, wenn Sie etwas besser als Datei wollen: LINE, können Sie versuchen, add-log-current-defun zu verwenden (in Add-log.el), die den Namen der aktuellen Funktion zurückkehren sollte.