一个简单的'复制形式命令

时间:2013-08-26 01:10:23

标签: emacs elisp text-editor text-extraction

我想要一个将表单复制到kill ring的命令。在emacs-live中,我能找到的最接近的是这个命令/键绑定

(global-set-key (kbd "M-]") 'kill-ring-save)

然而,kill-ring-save有一些不稳定的行为。 Ii通过光标复制超过1个表单。最终,我想要一个简单的功能,如下所示(这不太有用)。

(defun copy-form () 
  (kill-ring-save (line-beginning-position) (live-paredit-forward))) 

(global-set-key (kbd "M-]") 'copy-form)

我搜索过高和低(SO questionGoogle search),但似乎无法找到一个简单的工作命令来复制平衡表达式。有人已经这样做了吗?

谢谢

蒂姆

4 个答案:

答案 0 :(得分:1)

函数sexp-at-point为您提供光标处的sexp(“form”)。只需使用kill-ring将其复制到kill-ring-save即可。 E.g:

(defun copy-sexp-at-point ()
  (interactive)
  (let ((bnds  (bounds-of-thing-at-point 'sexp)))
    (kill-ring-save (car bnds) (cdr bnds))))

或者,只需使用kill-new

(defun copy-sexp-at-point ()
  (interactive)
  (kill-new (thing-at-point 'sexp)))

答案 1 :(得分:0)

您的copy-form无法绑定到某个键的原因是它是一个函数,而不是一个命令 - 它缺少interactive形式。

但是,在您的情况下,您甚至不需要编写新功能。

尝试组合

  

mark-sexp是`lisp.el'中的交互式编译Lisp函数。

     

它与C-M- @,C-M-SPC结合。

  

M-w运行命令kill-ring-save,这是一个交互式编译   Lisp函数在`simple.el'。

     

它与< C-insertchar>,M-w,<菜单栏>绑定。 <编辑> <复印>

答案 2 :(得分:0)

我不确定我是否理解这个问题,但当我需要做我认为的时候,#34;复制一个平衡的表格",我这样做:M-C-SPC M-w。如果我想切换它,我会M-C-SPC C-w

答案 3 :(得分:0)

这是我通常使用的。不知怎的,它对我来说更有用 杀死平衡表达而不是复制。如果我想要一个 相反,我先杀了,然后撤消。

如果该点位于字符串内,则此函数会终止字符串, 平衡表达式,即()[]{}<> 或者语法定义的任何内容。

(defun kill-at-point ()
  "Kill the quoted string or the list that includes the point"
  (interactive)
  (let ((p (nth 8 (syntax-ppss))))
    (cond
      ;; string
      ((eq (char-after p) ?\")
       (goto-char p)
       (kill-sexp))
      ;; list
      ((ignore-errors (when (eq (char-after) ?\()
                        (forward-char))
                      (up-list)
                      t)
       (let ((beg (point)))
         (backward-list)
         (kill-region beg (point)))))))

我还试图在这一点上添加一个特殊情况 在评论中,但我找不到通用 确定点评的界限的方法。如果有人知道, 请告诉我。

这个其他功能也是相关的。它标志着 杀戮,就像前一个一样。这件好事 每次调用时都会扩展该区域。 我将第一个绑定到 C - ,,第二个绑定到 C-。M - ,

(defun mark-at-point ()
  "Mark the quoted string or the list that includes the point"
  (interactive)
  (let ((p (nth 8 (syntax-ppss))))
    (if (eq (char-after p) ?\")
    (progn
      (goto-char p)
          (set-mark (point))
      (forward-sexp))
      (progn
        (when (eq (char-after) 40)
          (forward-char))
        (condition-case nil
            (progn
              (up-list)
              (set-mark (point))
              (let ((beg (point)))
                (backward-list)
                (exchange-point-and-mark)))
          (error
           (when (looking-back "}")
             (exchange-point-and-mark)
             ;; assumes functions are separated by one empty line
             (re-search-backward "^[^A-Z-a-z]" nil t)
             (forward-char))))))))