Vim에서 2 칸 들여 쓰기를 4 칸 들여 쓰기로 변경


93

인터넷에서 복사 한 코드 중 2 칸 들여 쓰기가 있는데 4 칸 들여 쓰기로 변경하고 싶습니다. vim 스크립트를 작성하지 않고도 작업을 수행 할 수있는 짧은 vim 루틴이 있는지 궁금합니다. 다음은 현재 HTML 파일로 수행하는 방법입니다.

  • 매크로 기록
  • 줄의 시작으로 이동
  • "<"가 처음 나타날 때까지 모든 공백을 시각적으로 선택합니다.
  • 모든 공백을 양크하여 붙여 넣습니다 (기본적으로 두 배로 지정).
  • 파일 끝까지 매크로 재생

간단히 말해서 qa0vt<yp<esc>jq

함정 :

빈 줄 또는 "<"로 시작하지 않는 줄에 대해 매크로가 실패합니다. 이 솔루션을 비 HTML 파일로 확장하는 방법을 모릅니다.

답변:


174

들여 쓰기를 변경하는 일반적인 방법은 탭 중지를 변경하는 것입니다.

파일을 빈 버퍼에 붙여 넣은 다음 :

:set ts=2 sts=2 noet
:retab!

이것은 2 개의 공백마다 TAB 문자로 변경됩니다.

:set ts=4 sts=4 et
:retab

이렇게하면 모든 TAB이 4 개의 공백으로 변경됩니다.

이 방법의 장점은 다른 방법으로도 사용할 수 있다는 것입니다. 예를 들어 4 칸에서 2 칸으로 변환 할 수 있습니다.


16
@XavierT. 실제로이 대답은 이해하기가 매우 쉽다고 생각합니다. 짧은 명령 이름이 전체 이름 ts:: = tabstop, sts: = softtabstop[no]et: =로 바뀌면 더 명확해질 것 [no]expandtab입니다.
YaOzI

retab의 주장 이 어떤 상황에서 유용 할 것이며 , 왜이 작업에 사용할 수 없습니까?
joeytwiddle 2011 년

내가 알고있는 것처럼 @joeytwiddle, 당신은 할 수 있음을 사용하고 사용하여이 대답하는 것과 같은 효과를 달성 :set sts=2 noet하고 :retab! 2이 방법이 (아마도 덜 읽을 수이기는하지만) 조금 짧은 것 때문에.
Daan Bakker

이 방법은 또한 줄의 시작뿐만 아니라 문자열 리터럴 및 기타 위치 내에서 2 개의 공백을 4 개의 공백으로 변경합니다.
nacitar sevaht

3
모두한데 모은 :set ts=2 sts=2 noet | retab! | set ts=4 sts=4 et | retab!다음 @:다른 파일에서 사용 하여 동일한 작업을 빠르게 적용합니다.
L__

59

:set shiftwidth=4및 으로 가능할 수 있습니다 gg=G.


이것이 작동하지 않으면 들여 쓰기에 다른 영향을 미치는 모드를 활성화했을 수 있습니다.
Dav Clark

1
질문이 일반적인 솔루션에 관한 것은 아니지만, 특히 파이썬 코드에서 항상 작동하는 것은 아닙니다.
0xc0de dec

5
gg=Gexatly 는 무엇을 의미합니까? gg"1,1로 이동" 을 의미하고 " G마지막 줄로 이동 " 을 의미 함을 이해합니다 .
조나단 라인 하트

5
@JonathonReinhart는 =시작부터 텍스트의 끝으로 들여 쓰기, 그것은 그래서 그냥 수단을 들여 쓰기 않습니다
알렉스

%retab문자열 리터럴 안에 포함 된 공백을 잘못 변환 한보다 더 잘 작동했습니다 .
Alnitak

34

내가하는 일은 esneider 및 cforbish의 접근 방식과 매우 유사하지만 입력하는 것이 조금 더 빠릅니다.

:%s/^\s*/&&

단순히 선행 공백 (공백 또는 탭)을 선행 공백의 두 배로 바꿉니다 ( &일치하는 표현식으로 대체 됨).


2
시각적 선택 (V)과 함께 작동하기 때문에 편리합니다 %.
Trevor Robinson

1
나는 이것도 좋아한다 b / c 내가 주석 등에있는 테이블의 수동 정렬을 엉망으로 만들지 않는다.
stephenmm

@TrevorRobinson 상위 두 가지 답변은 범위에서도 작동합니다.
Brian McCutchon 2015


3

다음 정규식을 사용했습니다 (선행 공백 수를 두 배로 늘림).

%s;^\(\s\+\);\=repeat(' ', len(submatch(0))*2);g

하지 않습니다 %s/\s\+/&&/같은 일을? BTW, 나는 생각 g플래그가 불필요 (하나, 만 1 경기가 될 것 ^pattern아니, 모든 라인?)
doubleDown

'&'를 지적 해 주셔서 감사합니다. 나는 당신이 '^' %s/^\s\+/&&/g가 더 가깝다는 것을 잊었 기 때문에 주로 당신의 것에 약간의 수정이 있습니다 .
cforbish

1
이것은 spro의 답변과 비슷하지만 약간 더 복잡한 작업을 수행해야 할 경우 쉽게 tweek 할 수 있으므로 답변에 감사드립니다.
stephenmm

3

이것은 매우 오래된 질문이지만 모든 답변이 잘못되었습니다 ... Vim은 전체 파일을 다시 들여 쓰는 매우 쉬운 방법을 제공합니다. 나는 그것을하기 위해 내 자신의 기능을 작성한 후에 이것을 배웠으므로 동일한 무지 보트에 있습니다.)

유형

gg=G

이것은 당신이 원하는대로 tabstop을 설정했다고 가정합니다. (OP의 경우 ts = 4가 될 것입니다)

http://vim.wikia.com/wiki/Fix_indentation 에서 이것을 배웠습니다.

일반 모드에서 gg = G를 입력하면 전체 파일이 다시 들여 쓰기됩니다. 이것은 특별한 경우입니다. = 연산자입니다. d 또는 y와 마찬가지로 커서 동작 명령으로 이동하는 모든 텍스트에 적용됩니다. 이 경우 gg는 커서를 첫 번째 줄에 놓고 = G는 현재 커서 위치에서 버퍼 끝까지 다시 들여 씁니다.


2
1. 맨 아래로 스크롤하면 gg = G라는 답변이 표시됩니다. 2. 항상 작동하지는 않습니다.
Lim H.

1

cforbish의 답변과 비슷하지만 (다소 더 간단합니다)이 정규식은 선행 공백을 복제합니다.

:%s/^\( \+\)/\1\1

또는이 다른 정규식을 사용하여 2 개의 공백을 4 개의 공백으로 변환하여 단일 공백 ​​(및 일반적으로 홀수)을 보존 할 수 있습니다.

:%s/^\(\(  \)\+\)/\1\1

그건,

  • 1 칸 ⇢ 1 칸
  • 2 대 ⇢ 4 대
  • 3 대 ⇢ 5 대
  • 4 대 ⇢ 8 대

1

@spro의 답변 외에도 이것을 내 .vimrc

command! -range=% Format :<line1>,<line2>s/^\s*/&&

그냥 입력하십시오 :Format.

시각적 선택을 사용하면 선택한 선의 형식 만 지정합니다.

시각적 선택없이 전체 파일 형식을 지정합니다.


0

이것은 정규식 기반 답변의 변형입니다.

내 로컬 bin 디렉토리에 줄 시작 부분의 공백을 두 배로 늘리는 bash 스크립트가 있습니다. 입력은 stdin 또는 파일 일 수 있습니다.

$ cat ~/bin/dblsp
#!/bin/bash

file=${1--}

while IFS= read -r line; do
    echo "$line" | sed 's/\s*/&&/'
done < <(cat -- "$file")

시각적으로 라인을 선택하고 다음 명령을 실행하여 vim 내에서 이것을 사용합니다.

:'<,'>!dblsp

이렇게하면 정규식을 입력 (또는 기억) 할 필요가 없습니다.

다음과 같은 맵에서도 사용합니다.

nnoremap <leader>] `[V`]!dblsp<CR>

최근 붙여 넣은 텍스트 블록에 적용됩니다. 나는 보통 다음 맵을 사용하여:set paste

nnoremap <leader>p :r !xclip -o<CR>

내 일반적인 워크 플로는 다음과 같습니다.

  • 코드 스 니펫 선택 (예 : 이 페이지 의 예제 코드 는 공백 2 개이지만 4 개 필요)
  • 코드 조각 붙여 넣기 (, p)
  • 간격 변경 (,])

또는 단순히 다른 버퍼에서 붙여 넣은 얀크 블록의 들여 쓰기를 변경합니다.

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