code

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

codestyles 2020. 9. 20. 09:58
반응형

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


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

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

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

함정 :

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


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

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

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

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

:set ts=4 sts=4 et
:retab

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

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


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


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

:%s/^\s*/&&

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


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

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

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

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

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

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

그건,

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

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

유형

gg=G

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

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

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


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

I have a bash script in my local bin directory that will double the amount of whitespace at the start of a line. Input can be stdin or a file:

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

file=${1--}

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

I use this within vim by visually selecting a line and issuing the following command:

:'<,'>!dblsp

This saves me the need to type (or remember) the regex.

I also use it in maps like the following:

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

which will apply it to a block of recently pasted text. I usually use the following map to paste rather than :set paste

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

My usual workflow is:

  • select code snippet (eg the example code on this page is 2 spaces but I want 4)
  • paste code snippet (,p)
  • change spacing (,])

or simply changing the indent on yanked blocks pasted from another buffer.


In addition to @spro's answer, I put this in my .vimrc

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

Just type :Format.

With visual selection, this only formats the selected lines.

Without visual selection, this formats the whole file.

참고URL : https://stackoverflow.com/questions/16888658/change-2-space-indent-to-4-space-in-vim

반응형