잘못 들여 쓰기 된 코드 다시 들여 쓰기


39

Vim의 스마트 들여 쓰기 기능이 마음에 들어, 잘 들여 쓰기 된 코드 블록을 만들 수 있습니다.

정기적으로 코드를 버퍼에 복사 / 붙여 넣기하지만 해당 코드의 형식이 잘못되었습니다.

스마트 인 덴트 시스템을 통해 코드를 "재 처리"하는 것이 이상적입니다.

그런 일이 가능합니까?

예를 들어, 다음 코드를 어떻게 '고정'하시겠습니까?

    else 
                {
                        m[c] = 5;
                Finished = true;
std::cout<<"(ID,R,E)"<<"-->"<<"("<<g[c]<<","<<r[c]<<","<<E1 <<")"<< std::endl;
std::cout << "\n"<<"finish-->" << r[c] << "\t" <<"E1-->"<< E1 <<"\n" ;
                }
        }

1
Vim에 붙여 넣을 때 변경되는 원래 들여 쓰기가 잘못되었거나 제대로 들여 쓰기 된 코드를 붙여 넣는 것에 대해 이야기하고 있습니까?
jamessan

붙여 넣은 코드는 처음부터 들여 쓰기가 어렵습니다. 예를 들어 보도록하겠습니다.
rolfl

답변:


48

나는 두 가지 방법 중 하나를 수행합니다.

조정 된 페이스트 들여 쓰기

먼저 버퍼의 코드가 포맷되었지만 들여 쓰기 수준이 다른 경우 ]p대신 대신 p코드를 붙여 넣는 대신 들여 쓰기를 사용 하지만 붙여 넣은 첫 번째 줄이 줄 I와 같은 깊이가되도록 들여 쓰기 됐다

버퍼에 복사 된 EG 소스

while (1) {
    dostuff();
}

붙여 넣은 EG 결과 ]p

int myfunc() {
    int i = 5; /* Cursor on this line before paste */
    while (1) {
        dostuff();
    }
 }

vim은 동안과 같은 들여 쓰기 수준을 유지 int i합니다. 이것은 빠르지 만 복사 된 코드가 제대로 들여 쓰기 된 경우에만 작동합니다.

붙여 넣기 후 다시 포맷

=vim 의 연산자는 구성된 형식 규칙에 따라 코드를 다시 형식화합니다. 짧은 붙여 넣기 스 니펫의 경우를 사용하여 시각 모드로 들어가서 v방금 붙여 넣은 선을 선택한 =다음를 눌러 형식을 다시 지정합니다.

더 큰 페이스트의 경우 커서가 첫 번째 붙여 넣은 줄로 이동하고 그 vim은 "84 더 많은 줄"과 같은 것을 사용한다는 사실을 이용합니다. 그런 다음 84==84 줄을 리플 로우하기 위해 들어갈 수 있습니다 (물론 84를 실제로 붙여 넣는 줄 수로 대체하십시오).

참고 문헌

:help ]p 조정 된 들여 쓰기 페이스트 용

:help =커버 ={motion}, [count]=={Visual}=사용자 정의를 통해 또는 들여 쓰기 규칙에 내장 필터링


6
`[v`]
craigp

1
@Badger 명확히하기 위해, 그 백틱 브래킷-v-백틱 브래킷은 무엇입니까?
phatskat

1
yup .. 텍스트 영역이 백틱에 대해
놀라서

vim의 = 연산자는 가능한 경우 +100으로 구성한 형식 규칙에 따라 코드를 다시 형식화합니다 . 나는 며칠을 구할 수있었습니다.
Wossname 2016 년

1
삽입하려면 <control + R> "을 사용하므로 삽입 모드를 벗어날 필요가 없습니다. <control + R>"과 동등한] p는 무엇입니까?
A --- B

15

=명령을 사용하여 다시 들여 쓸 수 있습니다.

대부분의 일반 모드 명령과 마찬가지로 동작에 적용 할 수 있으므로 방금 붙여 넣은 코드를로 다시 들여 쓸 수 있습니다 =']. 현재 커서 위치 ']에서 붙여 넣기의 마지막 줄인 마크 까지 다시 나타납니다 .

= 시각 모드에서도 사용할 수 있습니다.

또 다른 유용한 명령은 ]p현재 줄과 동일한 들여 쓰기 수준으로 붙여 넣습니다. 이렇게하면 주변 텍스트에 따라 들여 쓰기 깊이가 다르더라도 들여 쓰기 된 텍스트를 올바르게 붙여 넣을 수 있습니다.


7

사용 =ap (니모닉 IS '형식 단락 것은') 현재 단락을 자동 서식하는 정력 시도를해야합니다.

잠재적으로 다시 포맷하는 내용에주의를 기울이 vap려면 현재 단락을 시각적으로 선택하는 데 사용 하는 것이 더 빠르고 더 빠르다는 것을 알 수 있습니다 =. vim이 잘못 다시 포맷된다는 것을 알고 파일에서 실수로 다른 줄을 잘못 포맷하고 싶지는 않습니다.


4

버퍼에 이미있는 파일을 다시 들여 쓰려면 다음을 사용 gg=G하십시오. 들여 쓰기 수정을 참조하십시오.

파일의 일부를 다시 들여 쓰기 위해 다양한 경계를 =필터에 적용 할 수 있습니다 (예 : ==현재 행만 수정).

:set paste텍스트를 버퍼에 붙여 넣기 전에 텍스트를 붙여 넣을 때 들여 쓰기를 변경하지 않으려면 vim이 방금 붙여 넣은 텍스트를 자동 들여 쓰기하지 못하게합니다. 붙여 넣은 후에는 다시 사용하여 돌아갈 수 있습니다 set :nopaste. 여기에서 vimdoc을 참조 하십시오 .

내용을 자주 붙여 넣는 경우 VimWiki 에서이 팁 을 사용 하고 다음 행을 다음에 추가하여 "붙여 넣기 모드"토글 키를 설정하는 것이 좋습니다 .vimrc.

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

그런 다음 <F2>을 눌러 붙여 넣기 모드를 전환 할 수 있습니다 . 붙여 넣기 모드가 활성화되면 vim은 상태 표시 줄에 "PASTE"라는 단어를 표시합니다.


2
이 질문은 들여 쓰기로 코드를 붙여 넣는 것이 아니라 들여 쓰기가 잘못된 코드를 수정하는 것입니다.
rolfl

4
게시 한 댓글이 보이지 않습니다. 그러나 여전히 gg=G전체 파일을 다시 들여 쓸 수 있습니다 .
Bhargav Bhat

@rolfl 그런 경우에 보통 gg=G다음 과 같이 시작합니다. 그런 다음 vim잘못된 부분을 ​​살펴보십시오 .
muru

더 많은 제어를 원하거나 반복되는 번거 로움을 줄이려면 astyle버퍼를 저장할 때 와 같이 코드 서식 도구를 호출하는 자동 명령을 추가하는 것이 좋습니다. 자세한 내용 은 SO에 관한 질문을 참조 하십시오.
Bhargav Bhat

2

괄호 또는 괄호 블록의 전체 블록을 자동으로 다시 들여 쓰려면 커서를 괄호가있는 동일한 줄에 놓고 시도하십시오 =%. 시프트 너비를 변경하려면 예를 들어을 사용하십시오 :set sw=2.

이 방법이 예상대로 작동하지 않으면 수동으로 들여 쓰기를 줄이려면 ( outdent ) (필요한 경우)로 <%다시 시도 .하십시오. >%반대로 사용하십시오 .

그래서:

else
       {
         // some code
       }

된다 :

else
{
  // some code
}

특정 코드의 경우 한 줄 또는 몇 줄을 자동으로 다시 들여 쓰려면 다음을 시도하십시오.

  • == 현재 줄을 다시 들여 쓰기
  • 5== 5 줄을 다시 들여 쓰기

한 줄 또는 몇 줄에 대해 들여 쓰기를 수동으로 늘리거나 줄이려면 다음을 시도하십시오.

  • << 시프트 폭 공간으로 현재 줄을 들여 쓰기
  • 5<< 시프트 폭 공간으로 5 줄을 들여 쓰기
  • >> 이동 폭 공간으로 현재 줄을 들여 쓰기
  • 5>> 이동 폭 공간으로 5 줄 들여 쓰기
  • . 필요한 경우 반복

v텍스트를 선택하고 =(자동 들여 쓰기), <(들여 쓰기) 또는 >(들여 쓰기)를 눌러 시각적 모드 ( ) 에서 들여 쓰기를 수행 할 수도 있습니다 .

또 다른 방법은 다음과 같이 전체 파일의 들여 쓰기를 수정하는 것 gg=G입니다.

공백 대신 탭을 사용 :retab하는 경우 : 를 사용 하여 모든 탭을 공백으로 바꿉니다 (탭을 공백 으로 바꾸는 방법? 참조 ).


외부 방법의 경우 다음을 시도 할 수 있습니다.

  • 파이썬 코드를 재 포맷하기위한 pythonTidy , 예 :

    :%!pythonTidy
    

관련 :


1

최근에 vim-pasta ( https://github.com/sickill/vim-pasta )를 설치 했는데 붙여 넣을 때 코드 들여 쓰기가 향상되는 것 같습니다. README는 또한 다양한 코드 붙여 넣기 전략에 대한 좋은 토론을 가지고 있습니다.


1

기존 답변에 이미 많은 내용이 포함되어 있습니다. 들여 쓰기에 매우 자주 사용하는 하나의 매핑을 추가하고 싶습니다.

nnoremap <Leader>i  mzgg=G`z

이에 매핑 된 vimrc를 보았습니다 ===.

어느 쪽이든 이것은 훌륭한 매핑이며 특히 다른 곳에서 복사 한 코드를 붙여 넣을 때 거의 항상 이것을 사용합니다.

또는 autocmdVim이 변경 사항을 디스크에 쓰기 직전에 들여 쓰기 할 수 있도록 이것을 더 잘 넣습니다 .

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