4

我不时看到人们根据文件名和行号粘贴部分代码。就像是

 ;; ----- 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 ─
4

1 回答 1

3

我想出了这个,使用包装钩:

(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!")))
于 2012-08-29T09:23:31.350 回答