在Emacs中,一次编辑多行

时间:2009-04-17 18:46:27

标签: emacs

我相信textmate有一种模式,如果你开始输入,你将在你选择的所有行上输入相同的内容。在emacs中有类似的东西吗?我猜是矩形可以帮助我,但我不确定如何......

8 个答案:

答案 0 :(得分:86)

就这么简单:C-x r t

答案 1 :(得分:50)

您绝对需要尝试安装多个游标:

https://github.com/magnars/multiple-cursors.el

只有橘子酱和梅尔帕才这样:

M-x package-install multiple-cursors

答案 2 :(得分:21)

其中一个解决方案是使用CUA模式。使用M-x cua-mode激活cua模式,选择矩形开始:首先按C-Enter然后用标准移动命令移动光标进行选择,现在按任何时候输入将光标循环通过矩形的角落,使您可以预先添加或将文字附加到选择中。

答案 3 :(得分:19)

您可以使用以下命令(和键)来完成此任务:

  • 开放式矩形(C-x,r,o)添加空格
  • kill-rectangle(C-x,r,k)删除
  • clear-rectangle(C-x,r,c)替换为空格
  • 带有指定文字的M-x字符串插入矩形填充

以下是这些功能的完整说明: http://www.gnu.org/software/emacs/manual/html_node/emacs/Rectangles.html

答案 4 :(得分:16)

对于那些想要在更复杂的场景中执行此操作但想要在不安装新模块的情况下执行此操作的人,请继续阅读。 (这可以在没有安装MarkMultiple的Emacs中使用,虽然我个人使用并喜欢MarkMultiple)

我最近不得不将SQL查询输出到文件,然后将其格式化为MYSQL INSERT查询。以下是Emacs如何让我的生活变得轻松......

文件看起来像:

1   I am a random text
2   I am not
3   G, you've gone mad
4   Click on this link
5   Transfer in progress (we've started the transfer process)
6   But transfer happend yesterday
7   No you are
8   Oh please! this is getting too much!
9   I love emacs
10  I cant be bothered with this any more
11  its time to raise the bar
12  show me how to expand my territory

我希望看起来像:

(1,   ,'I am a random text'),
(2,   ,'I am not'),
(3,   ,'G, youve gone mad'),
(4,   ,'Click on this link'),
(5,   ,'Transfer in progress (weve started the transfer process)'),
(6,   ,'But transfer happend yesterday'),
(7,   ,'No you are'),
(8,   ,'Oh please! this is getting too much!'),
(9,   ,'I love emacs'),
(10,  ,'I cant be bothered with this any more'),
(11,  ,'its time to raise the bar'),
(12,  ,'show me how to expand my territory'),
  1. 将光标放在第一行
  2. C-x (开始录制宏 [此时正在记录所有关键输入 所以请仔细按照说明进行操作]
  3. C-a转到该行的开头
  4. 键入“(”后跟M-f以前进一个单词,然后键入“,”
  5. C-n转到下一行,然后C-x )结束宏
  6. C-u 11 C-x e重复宏n(本例中为11)次
  7. Eureka!到现在如果你没有失败,你会得到一些看起来像这样的东西:

    (1,   I am a random text
    (2,   I am not
    (3,   G, youve gone mad
    (4,   Click on this link
    (5,   Transfer in progress (weve started the transfer process)
    (6,   But transfer happend yesterday
    (7,   No you are
    (8,   Oh please! this is getting too much!
    (9,   I love emacs
    (10,  I cant be bothered with this any more
    (11,  its time to raise the bar
    (12,  show me how to expand my territory
    

    此时我将离开你去弄清楚其余部分。但是,在我离开之前,我想提到有很多方法可以实现这种目的。这只是其中一种方式,它恰好是我最喜欢的方式。

    希望你发现它有用;)

答案 5 :(得分:4)

我相信你正在寻找boskom建议的cua模式。 http://www.vimeo.com/1168225?pg=embed&sec=1168225此截屏视频可能会让您了解如何使用此功能。

答案 6 :(得分:3)

矩形用于简单的操作,例如删除相邻行中相同数量的空格。

否则键盘宏就可以了。

答案 7 :(得分:2)

上面显示的答案是用于在列中插入文本。 TextMate的“在选择中编辑每一行”在每行中插入相同的文本,而不管每行的长度。我现在正在学习Lisp,所以作为练习我写了一个函数来做到这一点:

(defun append-to-lines (text-to-be-inserted)
  ;;Appends text to each line in region
  (interactive "sEnter text to append: ")
  (save-excursion
    (let (point-ln mark-ln initial-ln final-ln count)
      (barf-if-buffer-read-only)
      (setq point-ln (line-number-at-pos))
      (exchange-point-and-mark)
      (setq mark-ln (line-number-at-pos))
      (if (< point-ln mark-ln)
          (progn (setq initial-ln point-ln final-ln mark-ln)
                 (exchange-point-and-mark))
        (setq initial-ln mark-ln final-ln point-ln))
      (setq count initial-ln)
      (while (<= count final-ln)
        (progn (move-end-of-line 1)
               (insert text-to-be-inserted)
               (next-line)
               (setq count (1+ count))))
      (message "From line %d to line %d." initial-ln final-ln ))))

首先进行包含您想要影响的所有行的选择,然后使用M-x追加到行来运行该函数。