2012-08-28 46 views
4

有时候我会看到人们参考文件名和行号来粘贴部分代码。像如何使用行+文件引用从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 ─ 
+0

你应该张贴您的代码回答你自己题。这对我很有效。谢谢! –

+0

这是一个非常好的功能家伙! – sshaw

回答

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!"))) 
+0

对于我不知道的filter-buffer-substring +1。但我不会为此使用它。它应该被称为过滤,而不是添加行。另外;;评论是特定于elisp的。当它不是零时,您可能需要使用注释开始。 – VitoshKa

+0

把它看作是一种通用的过滤方式! ;)另外,“;;”只是一个标记,不需要依赖主模式,因为被抽出的代码不应该被执行。该代码虽然没有切换机制,但... – thisirs