在Emacs中,一次编辑多行

在Emacs中,一次编辑多行,emacs,Emacs,我相信textmate有一种模式,如果你开始打字,你选择的所有行都会输入相同的内容。emacs中有类似的东西吗?我猜有一种方法矩形可以帮助我,但我不确定…矩形是如何用于删除相邻行中相同数量的空格等简单内容的 否则,键盘宏就是最好的选择。就这么简单: 以下是一些例子: 您可以使用以下命令(和键)完成此操作: 开放矩形(C-x、r、o)添加空格 终止矩形(C-x,r,k)删除 清除矩形(C-x、r、C)并替换为空格 M-x字符串插入矩形用指定文本填充 以下是这些功能的完整描述: 解决方案之一是使

我相信textmate有一种模式,如果你开始打字,你选择的所有行都会输入相同的内容。emacs中有类似的东西吗?我猜有一种方法矩形可以帮助我,但我不确定…

矩形是如何用于删除相邻行中相同数量的空格等简单内容的

否则,键盘宏就是最好的选择。

就这么简单:

以下是一些例子:

您可以使用以下命令(和键)完成此操作:

  • 开放矩形(C-x、r、o)添加空格
  • 终止矩形(C-x,r,k)删除
  • 清除矩形(C-x、r、C)并替换为空格
  • M-x字符串插入矩形用指定文本填充
以下是这些功能的完整描述:
解决方案之一是使用CUA模式。使用
M-x cua模式激活cua模式
,选择矩形开始:首先按
C-Enter
,然后使用标准移动命令移动光标进行选择,现在,任何时候按enter键都会使光标在矩形的各个角落循环移动,使您能够在选择内容之前添加文本。

我相信您正在寻找boskom建议的cua模式。这个屏幕广播可能会让你知道如何使用它

上面显示的答案用于在列中插入文本。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 ))))
(defun追加到行(要插入的文本)
;将文本追加到区域中的每一行
(交互式“要附加的sEnter文本:”)
(省去远足
(let(点项次标记项次初始项次最终项次计数)
(如果缓冲区为只读,则为barf)
(设定点ln(位置处的线号))
(交换点和标记)
(设置标记ln(位置处的行号))
(如果(<点ln标记ln)
(程序(设置初始ln点ln最终ln标记ln)
(交换点和标记))
(设置初始ln标记ln最终ln点ln))
(setq计数初始项次)

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

它是用果酱和梅尔帕做的,所以只要:

M-x package-install multiple-cursors M-x包安装多个游标
对于那些希望在更复杂的场景中执行此操作,并且希望在不安装新模块的情况下执行此操作的人,请继续阅读。(这在Emacs中不安装MarkMultiple是可能的,尽管我个人使用并喜欢MarkMultiple)

我最近不得不将一个SQL查询输出到一个文件,然后将其格式化为MYSQL插入查询

文件看起来像:

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'),
  • 将光标放在第一行
  • C-x(
    开始录制宏 [此时,您的所有关键输入都被记录下来 因此,请仔细遵守说明]
  • C-a
    转到行首
  • 键入“(“后跟
    M-f
    向前移动一个单词,然后键入“,”
  • C-n
    转到下一行,然后是
    C-x)
    结束宏
  • C-u 11 C-x e
    重复宏n次(本例中为11次)
  • 尤里卡!现在,如果你没有失败,你会得到如下结果:

    (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
    
    在这一点上,我将让你们去弄清楚其余的事情。但是,在我离开之前,我想说的是,有很多方法可以实现这类事情。这只是其中的一种方法,而这恰好是我最喜欢的方法


    希望对您有所帮助;)

    谢谢您的链接!一张图片上写着千言万语:)。谢谢,boskom。我使用的是21.3.1版,所以这个模式似乎没有安装。我可能不会安装它,因为我发现我喜欢C-x r t。谢谢!我只是觉得cua模式是为那些不想学习emacs copy n paste bindings的人准备的:P这太棒了!如果你使用
    cua选择模式而不是
    cua模式
    ,您将不会获得不需要的剪切/复制/粘贴绑定。但是,您将获得一些可能不需要的其他功能(最值得注意的是,编辑命令替换区域)。我还没有测试过这一点,但做得不错。我对“将相同的文本添加到同一列”更感兴趣方法,但我相信这也会派上用场。这很好,但对emacs新手来说不是很有用,你能帮我解释一下吗?@cone你应该阅读内置的emacs教程。它解释了如何阅读象形文字;)。要在emacs中打开教程,按住ctrl键的同时点击“h”。然后点击“t”(对于“教程”。我已将
    C-x
    映射到剪切(cua模式),因此这不是一个好主意。可能是您的想法将
    C-x
    映射到剪切,这不好:)注意:此命令用指定的字符串替换选定的矩形,即选择行的开头以进行替换。您应该尝试以下操作:演示:如果您重新阅读此命令,您将看到,由于它最初发布,它已被Yeah、@phils、multiple-cursors.el所取代。这是一个很好的解决方案选项。非常易于使用。要从单击(包括我在内的人员丢失的标准)添加多个选择,请将
    (全局未设置键(kbd“M-”))
    (全局设置键(kbd“M-”)”mc/单击时添加光标)
    添加到您的配置中。