Vim으로 표시되는 텍스트를 외부 프로그램으로 편집

5598 단어 PerlPerl5Vim
이 기사는 Vim Advent Calendar 2019의 13 일째 기사입니다.

Vim은 선택 영역이거나 열려 있는 텍스트 전체에 대해 외부 프로그램에서 편집할 수 있습니다.
여기에서는 :{range}!{filter} [arg]를 소재로 움직임을 확인합니다.

자세한 내용은 :help complex-change 또는 :help filter에서 찾을 수 있습니다.

tate 명령으로 세로 쓰기로 변환



tate 명령은 텍스트를 세로로 변환하는 프로그램입니다.
$ type sample.txt | iconv -f utf-8 -t cp932
Vim で表示している

テキストを

外部プログラムで

編集する

↑ 와 같은 sample.txt 에 대해서, tate 명령을 사용하면 세로 쓰기가 됩니다.
$ type sample.txt | tate
編 外 テ V
集 部 キ i
す プ ス m
る ロ ト  
  グ を で
  ラ   表
  ム   示
  で   し
      て
      い
      る

이 동작을 Vim에서 직접 재현하는 것이 filter 명령입니다.
여기에서는 :%!tate라는 명령으로 전체 텍스트를 tate 명령으로 처리해 보겠습니다.



대체로 상정대로라고 생각합니다만, range 로 지정한 범위의 텍스트를 filter 로 지정한 프로그램의 표준 입력에 건네주어, 프로그램의 표준 출력으로 출력된 텍스트로 옮겨놓을 수가 있습니다.

그건 그렇고, tate 명령은 다음과 같습니다.

테이트
htps : // 기주 b. 코 m / 마 t / 갓

filter로 사용하기 쉬운 프로그램



sed/awk/Perl 당 원 라이너로 쓰기 쉬운 프로그램이 사용하기 쉽습니다.
자신은 Perl을 잘 사용하고 있기 때문에 몇 가지 예를 보여줍니다.

샘플 1 : 모두 대문자


A filter is a program that accepts text at standard input, changes it in some
way, and sends it to standard output.  You can use the commands below to send
some text through a filter, so that it is replaced by the filter output.
Examples of filters are "sort", which sorts lines alphabetically, and
"indent", which formats C program files (you need a version of indent that
works like a filter; not all versions do).  The 'shell' option specifies the
shell Vim uses to execute the filter command (See also the 'shelltype'
option).  You can repeat filter commands with ".".  Vim does not recognize a
comment (starting with '"') after the `:!` command.

:%!perl -anE "print uc($_)"
A FILTER IS A PROGRAM THAT ACCEPTS TEXT AT STANDARD INPUT, CHANGES IT IN SOME
WAY, AND SENDS IT TO STANDARD OUTPUT.  YOU CAN USE THE COMMANDS BELOW TO SEND
SOME TEXT THROUGH A FILTER, SO THAT IT IS REPLACED BY THE FILTER OUTPUT.
EXAMPLES OF FILTERS ARE "SORT", WHICH SORTS LINES ALPHABETICALLY, AND
"INDENT", WHICH FORMATS C PROGRAM FILES (YOU NEED A VERSION OF INDENT THAT
WORKS LIKE A FILTER; NOT ALL VERSIONS DO).  THE 'SHELL' OPTION SPECIFIES THE
SHELL VIM USES TO EXECUTE THE FILTER COMMAND (SEE ALSO THE 'SHELLTYPE'
OPTION).  YOU CAN REPEAT FILTER COMMANDS WITH ".".  VIM DOES NOT RECOGNIZE A
COMMENT (STARTING WITH '"') AFTER THE `:!` COMMAND.

샘플 2 : SREC의 S0 레코드 디코딩


443A5C446174615C5358313231325F4150495C4150495C4150495F636F64655C 가 ASCII 의 16 진수 표기가 되어 있으므로 변환한다고 하는 예.
Vim 명령 줄 모드에서 %가 파일 이름으로 변환되므로 \%를 작성해야합니다.
S02B0000443A5C446174615C5358313231325F4150495C4150495C4150495F636F64655C7475746F7269616C44

:%!perl -ape "s/^(S0......)((..)+)(..$)/sprintf qq'\%s\%s\%s', $1, pack('H*', $2), $3/e"
S02B0000D:\Data\SX1212_API\API\API_code\tutorial6C

샘플 3 : 이전 행의 타임 스탬프와의 차이를 추가하면서 ID (세 번째 열)마다의 차이도 발행


4.303006 1  1               Rx   d 8 00 00 00 00 00 00 00 00
4.413445 1  1               Rx   d 8 00 00 00 00 00 00 00 00
4.480696 1  2               Rx   d 8 00 57 00 00 00 00 00 00
4.482131 1  4               Rx   d 8 00 57 00 00 00 00 00 00
4.523533 1  1               Rx   d 8 00 00 00 00 00 00 00 00
4.634201 1  1               Rx   d 8 00 00 00 00 00 00 00 00
4.743692 1  1               Rx   d 8 00 00 00 00 00 00 00 00
4.780966 1  2               Rx   d 8 00 57 00 00 00 00 00 00
4.782392 1  4               Rx   d 8 00 57 00 00 00 00 00 00
4.853831 1  1               Rx   d 8 00 00 00 00 00 00 00 00
4.963971 1  1               Rx   d 8 00 00 00 00 00 00 00 00

:%!perl -ape "s/^/sprintf '\%.6f \%.6f ', $F[0]-$x{$F[2]}, $F[0]-$y/e; $x{$F[2]}=$F[0]; $y=$F[0]"
// 左から `ID 毎差分`、 `差分`、 `元のテキスト` を表示
4.303006   4.303006   4.303006 1  1               Rx   d 8 00 00 00 00 00 00 00 00
0.110439   0.110439   4.413445 1  1               Rx   d 8 00 00 00 00 00 00 00 00
4.480696   0.067251   4.480696 1  2               Rx   d 8 00 57 00 00 00 00 00 00
4.482131   0.001435   4.482131 1  4               Rx   d 8 00 57 00 00 00 00 00 00
0.110088   0.041402   4.523533 1  1               Rx   d 8 00 00 00 00 00 00 00 00
0.110668   0.110668   4.634201 1  1               Rx   d 8 00 00 00 00 00 00 00 00
0.109491   0.109491   4.743692 1  1               Rx   d 8 00 00 00 00 00 00 00 00
0.300270   0.037274   4.780966 1  2               Rx   d 8 00 57 00 00 00 00 00 00
0.300261   0.001426   4.782392 1  4               Rx   d 8 00 57 00 00 00 00 00 00
0.110139   0.071439   4.853831 1  1               Rx   d 8 00 00 00 00 00 00 00 00
0.110140   0.110140   4.963971 1  1               Rx   d 8 00 00 00 00 00 00 00 00

요약



이상과 같이 외부 프로그램을 사용하여 간단한 텍스트 편집이 가능했습니다.
이번에 소개한 샘플은 Perl 중심이지만 다른 프로그램에서도 마찬가지입니다.
익숙한 프로그램으로 필터링하여 텍스트 편집을 편안하게 해 봅시다.

좋은 웹페이지 즐겨찾기