Vim은 증분 라인을 쓸 수 있습니까? 즉, 각 줄에서 A는 B가되고 1은 2가됩니다.


8

나는 이것을 쓰고 싶었다.

A = mapping[0]
B = mapping[1]
C = mapping[2]
D = mapping[3]
E = mapping[4]
F = mapping[5]
G = mapping[6]
H = mapping[7]
I = mapping[8]
J = mapping[9]
K = mapping[10]
L = mapping[11]
M = mapping[12]
N = mapping[13]
O = mapping[14]
P = mapping[15]
Q = mapping[16]
R = mapping[17]
S = mapping[18]
T = mapping[19]
U = mapping[20]
V = mapping[21]
W = mapping[22]
X = mapping[23]
Y = mapping[24]
Z = mapping[25]

결국 LibreCalc를 사용하여 서로 다른 부분을 다른 셀에 넣고 문자와 숫자를 추가하고 결과를 연결하고 로트를 Vim에 다시 붙여 넣었습니다.

내가 쓰고 싶었던 것은 끔찍한 코드라는 것에 감사합니다. 나는 현재 파이썬을 공부하고 있으며 내가 따르는 과정 ( http://interactivepython.org/ ) 에서 나중에 다루게 될 정보를 스스로 찾지 않으려 고 노력했습니다 .

내가 vim에서 이것을하는 가장 빠른 방법은 다음과 같은 것을 입력하는 것이 었습니다.

A = mapping[0] <ESC> hh <CTRL>+<V> BBh y $ o B <ESC> y 1] <CR>

나는 vim이 매우 강력하다는 것을 알고 있습니다 (2 주 동안 사용해 왔으며 실제로 즐기고 있습니다).

vim 명령으로 원하는 것을 쓸 수 있었습니까?

답변:


11

스크립팅으로 수행 할 수 있지만 최신 버전의 Vim (예 : Arch Linux의 버전)이있는 경우 g Ctrl-a시각적 블록을 증가시키는 데 사용할 수 있습니다 . 귀하의 경우 :

  1. 원래 줄을 작성하십시오. A = mapping[0] Esc
  2. 양키 라인을 아래에 25 개 복사하십시오. yy25p
  3. 첫 번째 줄에서를 제외 하고 0문자를 포함하는 열 (을 사용하여 블록 선택)을 시각적으로 선택한 다음 (마지막 25 개의 0을 포함하는 열로 끝납니다) .Ctrl-v0g Ctrl-a
  4. 을 포함하는 열에 대해 동일한 방법을 적용하십시오 A.

( 참고 : 주석에서 알 수 있듯이 문자를 증가시킬 수 있으려면 옵션 에 추가 alpha해야합니다 nrformats. 예 : set nrformats+=alpha.My vimrc has : set nrformats=hex,alpha, 따라서 사용하지 않는 8 진 및 2 진 증가를 비활성화합니다)


yy는 나를 위해 작동하지 않습니다. www.vimcheatsheet.com에서 인쇄 한 치트 시트에서 이것이 매우 표준 명령임을 알 수 있습니다. vim --version은 pastebin.com/DcFxZh1S를 반환합니다 . 왜 작동하지 않는지 조사해야 할 것입니다 ... (시각적 명령 및 삽입 모드에서 시도했습니다). 또한 붙여 넣을 때 모두 동일한 줄에 나타납니다. 내가 g에서 시도했다 그러나 Ctrl 키 a와 내가 원하는 정확히 :) 당신에게 감사 않습니다
던컨 베츠

1
:verbose map y시작하는 매핑 y과 설정 위치를 표시해야합니다 . 그러나 yy일반 모드에서 사용해야 합니다.
VanLaser


1
어떤 버전의를 vim증가합니다 A합니다 BCtrl-a행동? 광산은 확실히 그렇지 않습니다 7.4 1-1202.
Cory Klein

4
@CoryKlein 입력 해보십시오 :set nrformats+=alpha. alpha옵션에 값 을 추가하고 알파벳 문자를 "증가" 'nrformats'할 수 있어야 Ctrl-a합니다. 이 동작이 마음에 들면 vimrc에 추가 할 수 있습니다. 그렇지 않으면 연산자로 옵션에 추가 +=하고 나중에 연산자 로 제거 할 수 있습니다 -=( :set nrformats-=alpha).
saginaw

6

@VanLaser가 사용한 시각적 증가 솔루션을 선호합니다 (참조 :h v_CTRL-A). 그러나 나는 이것이 매크로를 통해서도 가능하다는 것을 보여줄 것입니다.

로 시작 :

A = mapping[0]

다음 매크로를 선택한 매크로에 기록하십시오 (예 :) q.

yyp:set nrformats+=alpha<cr><c-a>:set nrformats-=alpha<c-a>

이것은 행을 복제 한 다음 첫 문자 (예 :) A를 증가시킨 다음 숫자 부분을 증가시킵니다. 이 매크로를 24 번 실행하면 완료됩니다 (예 :) 24@q.

  • qq -등록 기록 시작 q
  • yyp -줄을 복제
  • :set nrformats+=alpha<cr>- 기본적으로 'nrformats없습니다alpha
  • <c-a>- alpha이제 글자를 증가시킬 수 있습니다
  • :set nrformats-=alpha<cr>- 제거 alpha에서'nrformats'
  • <c-a> -다음 숫자를 증가
  • q -녹음 중지
  • 24@q-레지스터 q24 번 매크로 재생

자세한 내용은 다음을 참조하십시오.

:h q
:h @
:h yy
:h p
:h 'nrformats'
:h :set
:h CTRL-A
:h v_CTRL-A

좋은 것 :) 25?
VanLaser

1
@VanLaser : 1 (출발 선) + 1 (매크로 촬영) + 24 = 26
베드로 Rincker

4

좋은 답변은 이미 제공되었지만, 나는 그것에 대해 잘 생각하지 않았을 것입니다. 한 줄에 모든 문자를 입력 한 다음 표현식 대체 (증분 번호에 줄 번호 사용)로 텍스트와 줄 바꿈을 도입했습니다.

iABCDEFGHIJKLMNOPQRSTUVXYZ<Esc>:s/./\=submatch(0)." = mapping[".line('.')."]\n"/g

아주 멋진! (+1)
JJoao

2

거의 항상 이와 같은 일을 할 때 :substitute매크로보다 사용하도록 선택 합니다. 특히 시작시 대체 표현을 평가하는 기능이 \=종종 가능합니다 (참조 :h sub-replace-special).

빈 줄이 있으면 ( 25i<Enter><Esc>) 명령을 사용할 수 있습니다

:1,26s/^/\=nr2char(line('.')+64) . ' = mapping[' . (line('.')-1) . ']'

필요한 시퀀스는 '.'function line()에서 반환 한 현재 줄 ( 인수) 번호를 사용하고 nr2char ()를 사용하여 10 진수를 ASCII 등가로 변환 (65 = A)합니다. 필요한 줄은 다음을 사용하여 연결됩니다..


1

당신은 항상 운영 체제를 사용하려고 할 수 있습니다 ...

:r ! perl -E 'for(A..Z){say "$_ = mapping[", ord($_)-64 ,"]"}'

1
Perl이 운영 체제에 없습니다.
dash-tom-bang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.