Text emacs字符串插入数字的矩形向量?

Text emacs字符串插入数字的矩形向量?,text,emacs,Text,Emacs,如何使用emacs字符串插入矩形操作将数字向量添加到一系列行中?例如,我在emacs缓冲区中有一组文本条目的缩短版本: element01 8 111111111011010000100000001100101000001111101111011111111000 element01 8 111101101010101001111111111000111110111111011110100101010111 element01 8 11111101100100111011

如何使用emacs字符串插入矩形操作将数字向量添加到一系列行中?例如,我在emacs缓冲区中有一组文本条目的缩短版本:

element01   8   111111111011010000100000001100101000001111101111011111111000
element01   8   111101101010101001111111111000111110111111011110100101010111
element01   8   111111011001001110111010111111100111010110101011111010110011
element01   8   111111111111111111111111010111101101011101011111000001100000
element01   8   111100111111011111100110110000001011110101000011111011111101
element01   8   111001001011000000011100000101001001100101101011101101011011
element01   8   111011111101101111111111111101101010111110111011111101011011
element01   8   101101111101101111000110111101111010111011101111001101001011
element02   6   110101110101100101100101000111010101110111001001101111111011
element02   6   111001011001001011101110111100111101101011111111111011111101
element02   6   101111100111010111111010010101111101111111101101111011111011
element02   6   111101111111111100111110110111101011111001001101101100111111
element02   6   111111010111101111010011110111001100001000101010111111111101
element02   6   111110111001101111111100111011110000011011100100100111111010
element03   13  110011011111111111101011100111111110011111110100111010011111
element03   13  100011101000111110101101000000000001110110110011110110111101
element03   13  101100011100011111110111110110101101111111110110110100101111
element03   13  111111011110101110101011010111110000010111111011100100011111
element03   13  011100110110110111100101110101111110111100101110010111110011
element03   13  100111111111100100111110110110111111111101011101110110110111
element03   13  101111111111110101110110111011111110111101110110111111111111
element03   13  111110010111110110101111110110111111111110101111111101110011
element03   13  100111111101110110110110111110111010111110110011111111110111
element03   13  110100110111110110110100111010110100110110110110110101111111
element03   13  011111011010111101101001011100111110010111111011111101011010
element03   13  011101111110010000111000000101101010111110100010110110110110
element03   13  110100110110110010101010100011100011000000110011011100110100
element03   13  010101101010110010111100101001001010111001100111110000011011
[...]
我想在第二列和第三列之间添加一列,如下所示:

element01   8   id1 111111111011010000100000001100101000001111101111011111111000
element01   8   id2 111101101010101001111111111000111110111111011110100101010111
element01   8   id3 111111011001001110111010111111100111010110101011111010110011
element01   8   id4 111111111111111111111111010111101101011101011111000001100000
element01   8   id5 111100111111011111100110110000001011110101000011111011111101
element01   8   id6 111001001011000000011100000101001001100101101011101101011011
element01   8   id7 111011111101101111111111111101101010111110111011111101011011
element01   8   id8 101101111101101111000110111101111010111011101111001101001011
element02   6   id9 110101110101100101100101000111010101110111001001101111111011
element02   6   id10    111001011001001011101110111100111101101011111111111011111101
element02   6   id11    101111100111010111111010010101111101111111101101111011111011
element02   6   id12    111101111111111100111110110111101011111001001101101100111111
element02   6   id13    111111010111101111010011110111001100001000101010111111111101
element02   6   id14    111110111001101111111100111011110000011011100100100111111010
element03   13  id15    110011011111111111101011100111111110011111110100111010011111
element03   13  id16    100011101000111110101101000000000001110110110011110110111101
element03   13  id17    101100011100011111110111110110101101111111110110110100101111
element03   13  id18    111111011110101110101011010111110000010111111011100100011111
element03   13  id19    011100110110110111100101110101111110111100101110010111110011
element03   13  id20    100111111111100100111110110110111111111101011101110110110111
element03   13  id21    101111111111110101110110111011111110111101110110111111111111
element03   13  id22    111110010111110110101111110110111111111110101111111101110011
element03   13  id23    100111111101110110110110111110111010111110110011111111110111
element03   13  id24    110100110111110110110100111010110100110110110110110101111111
element03   13  id25    011111011010111101101001011100111110010111111011111101011010
element03   13  id26    011101111110010000111000000101101010111110100010110110110110
element03   13  id27    110100110110110010101010100011100011000000110011011100110100
element03   13  id28    010101101010110010111100101001001010111001100111110000011011
[...]
我如何在emacs中使用类似字符串插入矩形的东西来增加这个新的第三列的数量


PS:我知道我可以用bash/perl/python/etc脚本来实现这一点,在这个问题上我想问的是,这是否可以用emacs轻松实现。

这是在emacs中实现的一种方法,不幸的是,这种方法不使用字符串插入矩形。此外,这种方法粗暴地假设每行有10个以上的字符。如果不是这样的话,欢闹就会接踵而至。M-x doit将调用它

(defun doit ()
  (interactive)
  (save-excursion
    (beginning-of-buffer)
     (let ((n 1))
      (while (< (point) (point-max))
        (forward-char 10)
        (insert "id" (int-to-string n) " ")
        (end-of-line)
        (forward-line)
        (incf n)))))
(defun doit()
(互动)
(省去远足
(缓冲区的开始)
(让((n 1))
(同时(<(点)(最大点))
(转发字符10)
(插入“id”(int到string n)”)
(行尾)
(前线)
(incf n(()))

您可以直接使用
query replace regexp
,方法是添加一个带有匹配计数的新列
\\\

匹配项查找由空格分隔的3列,这些列将存储在子匹配字符串
\1
\3
中。替换的字符串使用匹配计数添加新列

版本1(更简单,但从0开始):

注:我使用空格进行匹配和替换。您可以改为使用选项卡

版本2(使用lisp通过
+1
函数自定义行数):


下面是一个如何使用键盘宏解决此问题的日志。好吧,你不能用
字符串插入矩形来解决这个问题

在需要寄存器输入的地方,我使用了


我认为最简单的解决方案是在第一行中标记原始第三列的第一个字符,将点移动到最后一行的相同字符,然后键入:

C-uC-XRRET
id%d
RET

矩形编号行是中的一个交互式编译Lisp函数 `矩形

它被绑定到C-xrn

(矩形编号行开始-结束-开始-结束&可选格式)

在区域矩形前插入数字

START-AT(如果不是nil)应该是一个开始的数字 计数。如果格式为非nil,则应为要传递的格式字符串 与行计数一起“格式化”。当以交互方式调用时 使用前缀参数,提示输入起始和格式

regexp replace和macro技术都是非常棒的通用工具,但是矩形数字线是为这个问题定制的


编辑:我当时没有注意到,但事实证明这是Emacs 24中的一个新特性。早期版本的Emacs会将该序列转换为运行完全不同功能的
C-x r n
(小写n)。

是否有向后计数的方法?此命令中没有内置,没有(尽管我觉得可以使用数字前缀参数来指示步长值,这是一种方便的增强)。
M-x query-replace-regexp RET
^\(\w+\)\ +\(\w+\)\ +\(\w+\)$ RET
\1 \2 id\# \3 RET
M-x query-replace-regexp RET
^\(\w+\)\ +\(\w+\)\ +\(\w+\)$ RET
\,(format "%s %s id%d %s" \1 \2 (+1 \#) \3) RET
C-1 C-x r n
           number-to-register
C-x (      kmacro-start-macro
C-M-f      forward-sexp [3 times]
C-M-b      backward-sexp
C-u C-x r i
           insert-register
C-x r +    increment-register
C-x )      kmacro-end-macro
C-SPC      set-mark-command
M->        end-of-buffer
C-x C-k r  apply-macro-to-region-lines