mode: textual reference to a file:line

I am using org-mode in Emacs to document my development activities. One of the tasks which I must continuously do by hand is to describe areas of code. Emacs has a very nice Bookmark List: create a bookmark with CTRL-x rm, list them with CTRL-x r l. This is very useful, but is not quite what I need.

Org-mode has the concept of link, and the command org-store-link will record a link to the current position in any file, which can be pasted to the org-file. The problem with this is two-fold:

  • It is stored as an org-link, and the linked position is not directly visible (just the description).
  • It is stored in the format file/search , which is not what I want.
  • I need to have the bookmark in textual form, so that I can copy paste it into org-mode, end edit it if needed, with a simple format like this:

    absolute-file-path:line
    

    And this must be obtained from the current point position. The workflow would be as simple as:

  • Go to the position which I want to record
  • Call a function: position-to-kill-ring (I would bind this to a keyboard shortcut)
  • Go to the org-mode buffer.
  • Yank the position.
  • Edit if needed (sometimes I need to change absolute paths by relative paths, since my code is in a different location in different machines)
  • Unfortunately my lisp is non-existent, so I do not know how to do this. Is there a simple solution to my problem?


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

    You want to use the org-create-file-search-functions and org-execute-file-search-functions hooks.

    For example, if you need the search you describe for text-mode files, use this:

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

    Then Mx org-store-link RET will do the right thing (store a line number as the search string) and Cc Co (ie Mx org-open-at-point RET ) will open the file and go to this line number.

    You can of course check for other modes and/or conditions.


    An elisp beginner myself I though of it as a good exercise et voila:

    Edit: Rewrote it using the format methode, but I still think not storing it to the kill-ring is less intrusive in my workflow (don't know about you). Also I have added the capability to add column position.

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

    Not tested extensively but working for me. Just hit store-file-and-line or store-file-line-and-col to store current location and insert-file-reference to insert the stored value at point.

    链接地址: http://www.djcxy.com/p/30632.html

    上一篇: 模式emacs不会导出

    下一篇: 模式:对文件:行的文本引用