Как скопировать / вставить регион из буфера emacs со строкой + ссылкой на файл?
Время от времени я вижу людей, вставляющих части кода со ссылкой на имя файла и номер строки. Что-то вроде
;; ----- line:3391 file: simple.el.gz -----;;;
(if (eq last-command 'kill-region)
(kill-append (filter-buffer-substring beg end) (< end beg))
(kill-new (filter-buffer-substring beg end)))
;; ----- line:3394 --------------------------;;;
Это в основном полезно для отправки комментариев к коду по почте. Я могу легко обернуть простую функцию для себя, но я уверен, что кто-то уже сделал это умным и красивым способом.
Благодарю.
[РЕДАКТИРОВАТЬ]
Поскольку эта функциональность необходима только изредка и только для одного действия копирования / вставки, я в конечном итоге использовал альтернативное решение переключающей версии, предложенной @thisirs.
(defun kill-with-linenum (beg end)
(interactive "r")
(save-excursion
(goto-char end)
(skip-chars-backward "\n \t")
(setq end (point))
(let* ((chunk (buffer-substring beg end))
(chunk (concat
(format "╭──────── #%-d ─ %s ──\n│ "
(line-number-at-pos beg)
(or (buffer-file-name) (buffer-name))
)
(replace-regexp-in-string "\n" "\n│ " chunk)
(format "\n╰──────── #%-d ─"
(line-number-at-pos end)))))
(kill-new chunk)))
(deactivate-mark))
Это основано на Unicode и производит этот вывод:
╭──────── #3557 ─ /usr/share/emacs/24.1.50/lisp/simple.el.gz ──
│ (if (eq this-command t)
│ (setq this-command 'yank))
│ nil)
╰──────── #3559 ─
1 ответ
Решение
Я придумал это, используя обертку:
(defun filter-buffer-substring-add-line (func beg end delete)
(concat
(format ";; line:%5d file: %s\n"
(line-number-at-pos beg)
(or (buffer-file-name) (buffer-name)))
(funcall func beg end delete)
(format "\n;; line:%5d" (line-number-at-pos end))))
(defun kill-add-line-toggle ()
(interactive)
(if (memq 'filter-buffer-substring-add-line
filter-buffer-substring-functions)
(progn
(setq filter-buffer-substring-functions
(delq 'filter-buffer-substring-add-line
filter-buffer-substring-functions))
(message "Add line is off!"))
(push 'filter-buffer-substring-add-line
filter-buffer-substring-functions)
(message "Add line is on!")))