vim에서 모든 줄을 문자 순서로 묶습니다.

vim에서 모든 줄을 문자 순서로 묶습니다.

따라서 기본적으로 일부 코드를 복사/붙여넣었고 각 줄 앞에 코드를 더 추가하고 추가해야 합니다. 각 줄은 함수 호출이며 해당 용어에 따라 스위치 문에 추가됩니다.

이제 다음과 같습니다:

switch(n)
{
    case 1: retVal = foo("bar"); break;
    case 2: retVal = foo("Bar"); break;
    foo("bAr");
    foo("BAr");
    foo("BAR");
}

다음과 같이 표시되어야 합니다.

switch(n)
{
    case 1: retVal = foo("bar"); break;
    case 2: retVal = foo("Bar"); break;
    case 3: retVal = foo("bAr"); break;
    case 4: retVal = foo("BAr"); break;
    case 5: retVal = foo("BAR"); break;
}

내가 생각 해낸 최고는 다음과 같습니다.

:'<,'>s/I DONT KNOW/case SOMETHING: retVal = & break;/g

무엇이 바뀌어야 I DON'T KNOW할까요 ? SOMETHING문제는 제가 정규식에 익숙하지 않고, 무엇을 넣어야 할지 모르겠다는 것입니다. 어떤 아이디어가 있나요?

편집: Muru의 답변을 본 후 게시해야 한다는 것을 깨달았습니다.이것번호가 매겨진 섹션에 대한 링크입니다. 예제 11에서는 정규식을 사용하여 시퀀스 번호를 다시 매기는 방법 중 하나를 보여줍니다(기존 시퀀스가 ​​있다고 가정).

답변1

시각적 모드 선택이 행으로만 제한되어 있다고 가정할 때 foo(...);제가 생각할 수 있는 최선의 방법은 다음과 같습니다.

:let c=2|'<,'>g//let c=c+1|s/\v\S+/\="case ".c.": retVal = ".submatch(0)." break;"/

더 읽기 쉬운:

let counter = 2
'<,'>g//                       " for some reason, we need both markers and g// for `let` to work
   let counter = counter + 1
   s/
     \v                        " `\v` is "very magic"
     \S+/                      " used for `\S` - all non-whitespace characters
          \=                   " Indicate that replacement is an expression
             "case " .         " `.` concatenates strings
             counter . 
             ": retVal = " . 
             submatch(0) . 
             " break;"
                            /

에서 적응이 Vim 위키아 게시물.

네, 알아요. 이건 너무 추악해요. 더 좋은 방법이 있습니다.


또 다른 방법은 매크로를 사용하는 것입니다: (첫 번째 줄부터 시작, 없이 case)

qq
k:s/\v(case \d+: retVal = )(.*)\n(\s*)(.*)/\1\2\r\1\4 break;/|exe "norm \<c-a>"
j
q

@q그런 다음 남은 행만큼 여러 번 사용하십시오 .

관련 정보