Vim - 시각적 블록의 각 숫자를 증가시키는 방법은 무엇입니까?

Vim - 시각적 블록의 각 숫자를 증가시키는 방법은 무엇입니까?

다음과 같은 SQL이 있습니다.

update am.PERMISSIONS set PRM_ORDER = 35 PRM_VISIBLE = b'1' where PRM_ID = 3;
update am.PERMISSIONS set PRM_ORDER = [35] PRM_VISIBLE = b'1' where PRM_ID = 7;
update am.PERMISSIONS set PRM_ORDER = [40] PRM_VISIBLE = b'1' where PRM_ID = 10;
update am.PERMISSIONS set PRM_ORDER = [45] PRM_VISIBLE = b'1' where PRM_ID = 11;
...

대괄호로 묶인 시각적 블록을 선택하고 각 숫자를 5씩 늘리고 싶습니다. 어떻게 해야 하나요?

답변1

괄호 안의 텍스트를 시각적으로 강조 표시합니다.

Ctr+ V2jl

각 숫자를 5씩 늘립니다.

:norm 5Ctr+ V Ctr+ A 설명:

:norm일반 모드에서 전체 명령을 실행합니다. + CtrV필요합니다. 그렇지 않으면 커서가 줄의 시작 부분으로 다시 이동합니다. Ctr+ A숫자에 1을 더해 총 5회. 콜론을 누르면 가시 범위가 자동으로 삽입됩니다.

편집하다: Stephane이 올바르게 지적했듯이 이전 코드는 모든 줄에서 발견된 첫 번째 숫자를 증가시킵니다. 더 나은 해결책은 다음과 같습니다.

%s/\[\zs\d\+\ze\]/\=(submatch(0)+5)

괄호 안의 모든 정수에 5를 더합니다. 일치 항목에서 괄호를 제외하고 일치 하는 숫자를 반환하는 데 \zs사용됩니다 .\zesubmatch

답변2

숫자를 증가시키기 위해 시각적 모드를 종료할 필요가 없습니다.g

5 g Ctrl-a

5 ......... 5 times
g ......... globally
Ctrl-a .... increase numbers

나는 실제로 이 비법을 배웠다윔 골프도전.

답변3

이 두 명령은 동일하며 모든 숫자가 증가합니다.이내에 시각적 선택(직사각형에서도!)

:'<,'>s/\%V\d\+\%V/\=submatch(0)+1/g

:s/\%V\d\+\%V/\=submatch(0)+1/g

자르다::s / \%V \d\+ \%V / \=submatch(0)+1 / g

이는 \%V현재(또는 마지막) 선택 항목 내의 어느 위치와도 일치하는 너비가 0인 일치자입니다.

vim 도움말에서:

\%V     Match inside the Visual area.  When Visual mode has already been
        stopped match in the area that gv would reselect.
        This is a /zero-width match.  To make sure the whole pattern is
        inside the Visual area put it at the start and just before the end of
        the pattern, e.g.:
                /\%Vfoo.*ba\%Vr
        This also works if only "foo bar" was Visually selected. This:
                /\%Vfoo.*bar\%V
        would match "foo bar" if the Visual selection continues after the "r".
        Only works for the current buffer.

ctrl-a불행하게도 이것은 음수를 이해하지 못하기 때문에 그다지 스마트하지 않습니다 .

관련 정보