1

我想要一个将表单复制到杀戮环的命令。在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

4 回答 4

1

函数sexp-at-point为您提供光标处的 sexp(“表单”)。只需将其复制到kill-ring, 使用kill-ring-save. 例如:

(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)))
于 2013-08-26T01:19:49.887 回答
0

copy-form不能绑定到一个键的原因是它是一个函数,而不是一个命令——它缺少一个interactive表单。

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

尝试组合

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

它绑定到 CM-@、CM-SPC。

Mw 运行命令 kill-ring-save,它是 `simple.el' 中的交互式编译 Lisp 函数。

它绑定到 <C-insertchar>、Mw、<menu-bar> <edit> <copy>。

于 2013-08-26T02:43:55.540 回答
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))))))))
于 2013-08-26T17:32:33.670 回答
0

我不确定我是否理解这个问题,但是当我需要做我认为“复制平衡表格”的事情时,我会:M-C-SPC M-w. 如果我想剪掉它,我会这样做M-C-SPC C-w

于 2013-08-26T16:12:50.750 回答