9

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

org-mode有链接的概念,该命令org-store-link会在任意文件中记录一个指向当前位置的链接,可以粘贴到org-file中。这个问题有两个方面:

  • 它存储为 org-link,链接的位置不是直接可见的(只是描述)。
  • 它以 format 存储file/search,这不是我想要的。

我需要有文本形式的书签,这样我就可以将它复制粘贴到 org-mode,如果需要,结束编辑它,使用如下简单格式:

absolute-file-path:line

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

  • 转到我要记录的位置
  • 调用函数:(position-to-kill-ring我会将其绑定到键盘快捷键)
  • 转到org-mode缓冲区。
  • 拉下位置。
  • 根据需要进行编辑(有时我需要通过相对路径更改绝对路径,因为我的代码位于不同机器中的不同位置)

不幸的是,我lisp的不存在,所以我不知道该怎么做。我的问题有简单的解决方案吗?

4

5 回答 5

14
(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)))))
于 2012-05-21T09:10:46.887 回答
7

你想使用org-create-file-search-functionsandorg-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)))))

然后M-x org-store-link RET将做正确的事情(将行号存储为搜索字符串)并且C-c C-o(即M-x org-open-at-point RET)将打开文件并转到该行号。

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

于 2012-05-21T16:44:30.113 回答
0

我自己是一个 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来存储当前位置和insert-file-reference以在点插入存储的值。

于 2012-05-21T09:20:30.120 回答
0

顺便说一句,如果你想要比 FILE:LINE 更好的东西,你可以尝试使用add-log-current-defun(在 add-log.el 中)它应该返回当前函数的名称。

于 2012-05-21T20:50:43.607 回答
0
;; Insert a org link to the function in the next window
(defun insert-org-link-to-func ()
  (interactive)
  (insert (with-current-buffer (window-buffer (next-window))
        (org-make-link-string
         (concat "file:" (buffer-file-name)
             "::" (number-to-string (line-number-at-pos)))
         (which-function)
         ))))

该函数生成以函数名作为描述的链接。打开两个窗口,一个是org文件,一个是src代码。然后M-x insert-org-link-to-func RET

于 2019-03-21T03:16:55.190 回答