模式:对文件:行的文本引用

我在Emacs使用org-mode来记录我的开发活动。 我必须手工完成的任务之一是描述代码区域。 Emacs有一个非常好的书签列表:用CTRL-x rm创建一个书签,用CTRL-x rl列出它们。 这是非常有用的,但不是我所需要的。

组织模式具有链接的概念,命令org-store-link将记录任何文件中当前位置的链接,该链接可以粘贴到组织文件中。 这个问题有两个方面:

  • 它作为组织链接存储,并且链接的位置不是直接可见的(只是描述)。
  • 它以格式file/search存储,这不是我想要的。
  • 我需要以文本形式提供书签,以便我可以将其粘贴到组织模式中,如果需要,可以使用简单的格式进行编辑:

    absolute-file-path:line
    

    这必须从当前点位置获得。 工作流程将如下简单:

  • 转到我想要录制的位置
  • 调用一个函数: position-to-kill-ring (我将它绑定到键盘快捷键)
  • 转到org-mode缓冲区。
  • 放弃这个位置。
  • 如果需要编辑(有时我需要通过相对路径更改绝对路径,因为我的代码位于不同机器的不同位置)
  • 不幸的是,我的lisp不存在,所以我不知道如何做到这一点。 有没有简单的解决我的问题?


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

    你想使用org-create-file-search-functionsorg-execute-file-search-functions钩子。

    例如,如果您需要搜索描述的文本模式文件,请使用以下命令:

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

    然后, Mx org-store-link RET将做正确的事(存储行号作为搜索字符串),而Cc Co(即Mx org-open-at-point RET )将打开文件并转到此行号。

    您当然可以检查其他模式和/或条件。


    一个elisp初学者我自己虽然它是一个很好的练习,但瞧:

    编辑:使用格式方法重写它,但我仍然认为不把它存储到杀死环是不太侵入我的工作流(不知道你)。 此外,我还添加了添加列位置的功能。

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

    没有广泛测试但为我工作。 只需点击store-file-and-linestore-file-line-and-col即可存储当前位置,并插入文件引用以在存储点插入存储的值。

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

    上一篇: mode: textual reference to a file:line

    下一篇: view for points that lie on a same plane