我想要一个将表单复制到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 question和Google search),但似乎无法找到一个简单的工作命令来复制平衡表达式。有人已经这样做了吗?
谢谢
蒂姆答案 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))))))))