有没有办法在Emacs中复制整行直到停止字符?

有没有办法在Emacs中复制整行直到停止字符?,emacs,Emacs,今天我在VI中看到了一个整洁的复制函数,在这个函数中,你可以复制整行直到一个停止字符 e、 g.if(copy==this) 有了VI,他可以复制括号内的所有内容。我想知道你是否也可以用emacs来做?(无需使用ctrl+space并手动标记要终止的内容)当然,请定义宏。通过键入c-x()开始宏录制。然后执行要重复的命令序列: c-s ( c-space c-s ) M-w 然后用c-x)完成宏。与c-x e一起使用 像这样的事。。。可能是栅栏柱出了问题。如果不希望它移动标记,请保存该标记,并

今天我在VI中看到了一个整洁的复制函数,在这个函数中,你可以复制整行直到一个停止字符

e、 g.
if(copy==this)


有了VI,他可以复制括号内的所有内容。我想知道你是否也可以用emacs来做?(无需使用ctrl+space并手动标记要终止的内容)

当然,请定义宏。通过键入
c-x(
)开始宏录制。然后执行要重复的命令序列:

c-s (
c-space
c-s )
M-w
然后用
c-x)
完成宏。与
c-x e
一起使用

像这样的事。。。可能是栅栏柱出了问题。如果不希望它移动标记,请保存该标记,并在宏开始时将其还原

有关宏的更多信息(如如何保存宏并将其绑定到其他键)请参见:


Emacs有无数的命令,所以很可能有一个能做到这一点

在这种情况下,我要做的是标记我的位置(使用ctrl空格),然后进行前向搜索(ctrl-s)并键入我要搜索的内容(在您的例子中是end paren,但它可能更详细,如Pascal的“end my_Procedure_Name;”)。这将选择从我标记到找到搜索模式的所有文本。然后我按ctrl-k键将文本剪切到kill缓冲区中

简言之:

ctrl-space
ctrl-s
) return
ctrl-k
(如果要将文本保持在原来的位置,请使用
ctrl-

可能有更快/更好的方法,但这是我非常熟悉的emacs命令的子集,无需停下来思考。

试试看

M-z CHAR
它通过下一次出现的
CHAR
终止文本。又名M-x对字符的攻击。感兴趣的可能是的文档

编辑为添加:根据请求,这里是
zap to before char
,它只是获取了
zap to char
的源代码,并删除了注释(和更新的文档字符串):


如果光标位于圆括号之间,我能想到的复制整个圆括号组(包括圆括号)的最短顺序是
C-M-u C-M-SPC M-w
backward-up list
mark sexp
kill ring save
)。如果您想删除该文本,
C-M-u C-M-k
backward-up-sexp
kill-sexp
)。sexp命令通常是处理括号组的最简单方法;其他重要的命令是
C-M-b
backward-sexp
)和
C-M-f
forward-sexp
)(请注意
C-M-
主题)。

Emacs的美妙之处在于编写一些elisp非常容易,以使其实现您想要的功能:

(defun mark-inside-delimiters ()
"Mark all chars inside the balanced expression point is in"
  (interactive)
  (let (p start pairs stop)
    (skip-chars-backward "^<({[\"'")
    (setq p (point))
    (setq start (char-to-string (preceding-char)))
    (setq pairs '(("<" . ">")("(" . ")")("{" . "}")
                  ("[" . "]")("\"" . "\"")("'" . "'")))
    (setq stop (cdr (assoc start pairs)))
    (skip-chars-forward (concat"^" stop))
    (set-mark p)))

(global-set-key (kbd "C-c m") 'mark-inside-delimiters)
(在分隔符()内取消标记)
“标记平衡表达式点中的所有字符”
(互动)
(让(p开始对停止)

(向后跳过字符)"^如果我需要做一次,我就是这样做的。如果我需要有规律地做,我会做一个宏…我希望regexp有M-x zap,或者至少在char之前有M-x zap。@aartist
zap to before char
很容易-我已经修改了答案,将其包括在内,更改在源代码中,刚刚注释掉。听起来你好像不是首先,我想要这个。我不是一个emacs黑客,但我应该在emacs中的什么地方添加该部分?在你的.emacs文件中,该文件包含你所有的emacs设置。在emacs中,按
C-x C-f
(按住Ctrl键,然后按下并释放x,然后按下f键)。系统将提示您输入文件名。键入
~/.emacs
,然后按enter键。将上述代码粘贴到该文件中您喜欢的任何位置。
(defun mark-inside-delimiters ()
"Mark all chars inside the balanced expression point is in"
  (interactive)
  (let (p start pairs stop)
    (skip-chars-backward "^<({[\"'")
    (setq p (point))
    (setq start (char-to-string (preceding-char)))
    (setq pairs '(("<" . ">")("(" . ")")("{" . "}")
                  ("[" . "]")("\"" . "\"")("'" . "'")))
    (setq stop (cdr (assoc start pairs)))
    (skip-chars-forward (concat"^" stop))
    (set-mark p)))

(global-set-key (kbd "C-c m") 'mark-inside-delimiters)