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

时间:2010-10-12 22:04:58

标签: emacs

今天我在VI中看到了一个简洁的复制功能,你可以在其中复制整行直到停止字符。

e.g。 if( copy == this );

使用VI,他可以复制括号内的所有内容。我想知道你是否可以用emacs做到这一点? (不使用ctrl +空格并手动标记我想要杀死的内容)

5 个答案:

答案 0 :(得分:13)

尝试

M-z CHAR

通过下次出现的CHAR来杀死文本。 Aka M-x zap-to-char 。有趣的可能是Other Kill Commands的文档。

已编辑添加:根据请求,此处为zap-to-before-char,其中仅提取了zap-to-char的源代码并删除了评论(以及更新的文档字符串):

(defun zap-to-before-char (arg char)
  "Kill up to and ARGth occurrence of CHAR.
Case is ignored if `case-fold-search' is non-nil in the current buffer.
Goes backward if ARG is negative; error if CHAR not found."
  (interactive "p\ncZap to char: ")
  ;; Avoid "obsolete" warnings for translation-table-for-input.
  (with-no-warnings
    (if (char-table-p translation-table-for-input)
        (setq char (or (aref translation-table-for-input char) char))))
  (kill-region (point) (progn
                         (search-forward (char-to-string char) nil nil arg)
                         (goto-char (if (> arg 0) (1- (point)) (1+ (point))))
                         (point))))

答案 1 :(得分:2)

如果光标位于括号之间,我可以想到的复制整个括号内组(包括括号)的最短序列是C-M-u C-M-SPC M-wbackward-up-listmark-sexp,{{ 1}})。如果您想要删除该文字,kill-ring-saveC-M-u C-M-kbackward-up-sexp)。 sexp命令通常是处理带括号的组的最简单方法;其他重要命令是kill-sexpC-M-b)和backward-sexpC-M-f)(请注意forward-sexp主题。)

答案 2 :(得分:0)

当然,定义一个宏。键入c-x (开始录制宏录制内容。然后执行要重复的命令序列:

c-s (
c-space
c-s )
M-w

然后使用c-x )完成您的宏。与c-x e一起使用。

类似的东西......它可能会遇到fencepost问题。如果您不希望它移动您的标记,请保存并在宏的开头恢复它。

有关宏的更多信息(例如如何保存将它们绑定到其他键):

http://www.emacswiki.org/emacs/KeyboardMacros

答案 3 :(得分:0)

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)

此特定示例不支持语法,因此它不会处理包含转义引号或字符串内括号的字符串,但它适用于大多数情况。

答案 4 :(得分:-1)

Emacs有很多命令,所以很可能就是这样。

在这种情况下我做的是标记我的位置(使用ctrl-space),然后进行前向搜索(ctrl-s)并输入我正在搜索的内容(在你的情况下是一个终端paren,但是它可能是像Pascal的“结束My_Procedure_Name;”这样更冗长的东西。这将选择从我标记到找到搜索模式的位置的所有文本。然后我按ctrl-k将文本剪切到kill buffer中。

简而言之:

ctrl-space
ctrl-s
) return
ctrl-k

(如果你想将文字保持在原来的位置,还有一个ctrl-_

可能会更快/更好/等。各种各样的方式,但这是emacs命令的子集,我知道这些命令,而不必停下来思考它。