2012-03-29 3 views
6

일련의 행에 숫자 벡터를 추가하기 위해 emacs string-insert-rectangle 연산을 어떻게 사용할 수 있습니까? 예를 들어, 내 이맥스 버퍼에 텍스트 항목의 무리의 단축 버전을 가지고 :emacs string-insert-rectangle 숫자의 벡터입니까?

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 
[...] 

이맥스에서 string-insert-rectangle과 같은 것을 사용하여 숫자가 증가하는 새 세 번째 열을 추가하려면 어떻게해야합니까?

추신 : 저는 bash/perl/python/etc 스크립트로이 작업을 수행 할 수 있음을 알고 있습니다.이 질문에서이 작업은 emacs로 쉽게 할 수 있는지 묻습니다.

답변

24

내가 가장 간단한 해결책은 동일한 문자로 먼저 첫 번째 행의 원래 번째 열의 문자 이동 지점을 표시 생각 사용 마지막 라인의 다음 입력

구리 CXR N을RET RET id%d

직사각형, 수 라인 '` rect.el에서 대화식 컴파일 리스프 함수이다.

이것은 C-x r N에 결합되어있다.

영역 장방형 앞에

삽입 번호 (직사각형, 수 라인 END START-AT & 선택적 FORMAT 시작).

START-AT는 nil이 아닌 경우 카운팅을 시작할 숫자 여야합니다. FORMAT이 nil이 아닌 경우 라인 수와 함께 'format'으로 을 전달하는 형식 문자열이어야합니다. 대화 형으로 호출 할 때 접두사 인수로 을 입력하면 START-AT 및 FORMAT 프롬프트가 표시됩니다.

regexp-replace 및 매크로 기법은 모두 잘 알려진 범용 도구이지만 사각형 - 번호 - 선은 바로이 질문을 위해 맞춤 제작되었습니다.

편집 : 나는 시간에 주목하지 않았다, 그러나이 이맥스의 새로운 기능이 실행되는 이맥스의 24 이전 버전의 C-x r n (소문자 N)에 그 순서를 번역 할 것을 밝혀 완전히 다른 기능.

+0

새로운 기능! –

+0

거꾸로 계산하는 방법이 있습니까? – NeilenMarais

+0

이 명령에 내장되어 있지 않습니다 (숫자 접두사 인수를 사용하여 단계 값을 나타낼 수 있음). – phils

0

이 방법은 emacs에서 사용하는 방법입니다. 불행히도이 방법은 string-insert-rectangle을 사용하지 않습니다. 또한이 방법은 모든 행에 10 자 이상이 있다고 가정합니다. 그것이 사실이 아니라면 Hilarity가 계속 될 것입니다. 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 

주 I는 일치하고 교체하기위한 공간을 사용했다. 대신 탭을 사용할 수 있습니다.

버전 2 (행이 +1 기능을 계산 사용자 정의 LISP을 사용) :

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

이것은 훌륭합니다. 감사합니다! – 719016

+0

phils는 실제로 rectangle 명령을 사용하여 대답을 제공했습니다. –

+0

나는 이멕스를 25 년 동안 사용해 왔으며 \ #에 대해 알려진 적이 없다. –

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