9

私は自分の開発活動を文書化するために使用org-modeしています。Emacs私が手作業で継続的に実行しなければならないタスクの1つは、コードの領域を記述することです。Emacsとても素敵なブックマークリストがあります: -でブックマークを作成し、CTRL-x r mでリストします。これは非常に便利ですが、私が必要としているものではありません。CTRLx r l

Org-modeにはリンクの概念があり、コマンドorg-store-linkは現在の位置へのリンクを任意のファイルに記録し、org-fileに貼り付けることができます。これに伴う問題は2つあります。

  • これはorg-linkとして保存され、リンクされた位置は直接表示されません(説明のみ)。
  • 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-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)))))

次に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の初心者自身、私はそれを良いエクササイズと思っています。

編集: format methodeを使用して書き直しましたが、それでもキルリングに保存しない方がワークフローの邪魔にならないように思います(あなたのことはわかりません)。また、列の位置を追加する機能を追加しました。

(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-lineまたはstore-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)
         ))))

この関数は、関数名を説明として持つリンクを生成します。2つのウィンドウを開きます。1つはorgファイルで、もう1つはsrcコードです。それでM-x insert-org-link-to-func RET

于 2019-03-21T03:16:55.190 に答える