2012-03-29 36 views
6

如何使用emacs字符串插入矩形操作將數字向量添加到一系列行中?例如,我在我的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輕鬆完成。

回答

24

我認爲最簡單的解決方案是將標記在第一行中的原第三列的第一個字符,移動指向相同的字符最後一行,並然後鍵入:

CX- [RñRETid%dRET

矩形數線是 `rect.el互動編譯Lisp函數」。

它被綁定到C-x r N.

(矩形數行START END START-AT &可選FORMAT)

插入數在該區域矩形的前面。

START-AT,如果非零,應該是一個從開始計數的數字 。如果非零,FORMAT應該是一個格式字符串,將 與行數一起傳遞給`format'。當用前綴參數互動地調用 時,提示輸入START-AT和FORMAT。

正則表達式替換和宏技術都是非常好用的通用工具,但矩形編號行幾乎是爲這個問題定製的。

編輯:我沒有在當時注意到了,但事實證明,這是在Emacs中的一項新功能24的Emacs的早期版本將是序列翻譯C-x r n(小寫n)的它運行的完全不同的功能。

+0

偉大的新功能! – 2012-08-29 23:23:12

+0

有沒有辦法向後計數? – NeilenMarais 2015-04-16 15:27:51

+0

未內置到此命令中,否(儘管發生在我身上的是數字前綴參數可用於指示步長值,這是一個方便的增強功能)。 – phils 2015-04-16 22:16:21

0

這是一種在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))))) 
7

您可以直接使用query-replace-regexp,通過增加與匹配新的列數\#

這些匹配查找由空格分隔的3列,它們將存儲在子匹配字符串\1\3之間。被替換的字符串使用匹配計數添加一個新列。

版本1(簡單,但是從0開始):

M-x query-replace-regexp RET 
^\(\w+\)\ +\(\w+\)\ +\(\w+\)$ RET 
\1 \2 id\# \3 RET 

注意我用於匹配和更換的空間。您可以使用標籤。

第2版(使用LISP自定義行與+1功能計數):

M-x query-replace-regexp RET 
^\(\w+\)\ +\(\w+\)\ +\(\w+\)$ RET 
\,(format "%s %s id%d %s" \1 \2 (+1 \#) \3) RET 
+0

這太棒了,謝謝! – 719016 2012-03-29 17:36:24

+0

注意到phils實際上使用矩形命令提供了答案。 – 2012-03-30 12:16:42

+0

我已經使用Emacs 25年了,從來不知道\# - 這太棒了! – 2012-08-29 23:22:53

1

下面是一個日誌怎麼可以用一個鍵盤宏解決它。 AFAIK你不能解決這個只有string-insert-rectangle

在需要的寄存器的輸入,我用一個

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