공백을 만들지 않고 라인을 결합하는 방법은 무엇입니까?


72

J줄을 연결 하는 표준 명령은 줄 바꿈 문자를 공백으로 바꿉니다. '문학'을 편집 할 때 유용하지만 불필요한 공간을 제거하는 것을 잊어 버린 경우 수동으로 16 진 덤프를 편집하면 문제가 될 수 있습니다.

두 줄 사이에 공백을 만들지 않고 두 줄을 결합하는 빠르고 쉬운 방법이 있습니까?

답변:


86

gJ조합이 수행; 부터 :help gJ:

최소 두 줄로 [count] 줄을 결합하십시오. 공백을 삽입하거나 제거하지 마십시오.

J키 입력을 저장하려는 경우에 리 바인드 할 수 있습니다.

:nnoremap J gJ

이것은 공백을 제거 하지 않으므로 현재 행이 공백으로 끝나거나 다음 행이 하나 이상의 공백으로 시작 하면 그대로 유지됩니다 .

그래서:

Hello
    world

된다 :

Hello    world

우리 Jx 이 경우에 사용할 있습니다 Helloworld. 그러나 그것은 모든 경우에 작동하지는 않습니다. 도움에서 :

강조 표시된 줄을 최소 두 줄로 연결하십시오. 들여 쓰기를 제거하고 최대 2 개의 공백을 삽입하십시오

[...]

"gJ"를 제외한이 명령은 후행 공백이 없거나 다음 줄이 ')'로 시작하지 않는 한 공백 대신 하나의 공백을 삽입합니다.

따라서 어떤 경우에는 두 개 이상의 공백이 있거나 공백이 삽입되지 않습니다. 내가 볼 수있는 한,이 행동을 바꾸는 쉬운 방법은 없습니다. gJ공백없이 항상 결합 하도록 수정하는 함수를 만들었습니다 .

" Like gJ, but always remove spaces
fun! JoinSpaceless()
    execute 'normal gJ'

    " Character under cursor is whitespace?
    if matchstr(getline('.'), '\%' . col('.') . 'c.') =~ '\s'
        " When remove it!
        execute 'normal dw'
    endif
endfun

" Map it to a key
nnoremap <Leader>J :call JoinSpaceless()<CR>

참조 : :help J,:help 'joinspaces'


이 기능을 사용할 때 커서 위치를 유지하기 위해 "보존"기능을 사용할 수 있습니까? 아니면이 결과를 얻는 방법은 무엇입니까?
SergioAraujo

8

시도해 볼 다른 트릭은 바꾸기를 사용하는 것입니다. 때로는 이것이 유용 할 수 있습니다.

%s/$\n//g

시나리오 : 마지막 문자를 삭제하고 다음 줄과 결합하십시오.

%s/=$\n\(.\)/\1/g

예를 들어

xxxx=
123

된다 :

xxxx123

3

매크로를 작성하여 재사용하십시오.

qaJxq

이제 공간없이 두 줄을 연결하려는 위치를 a사용하여 매크로를 재생하십시오 @a.

@@이전 매크로를 반복합니다. @여러 줄을 연결하기 만하면 됩니다.


1
입력 @a할 수있는 이유는 무엇 Jx입니까? 같은 수의 키 누름과 SHIFT 누름!
Shahbaz

2
@Shahbaz 아마도 마지막 줄 때문에 : "@ 만 붙잡고있을 수 있습니다"
muru

1
@muru, 사실이야!
Shahbaz

4
또한 반복 가능한 명령이되므로 3@a3 줄을 결합 하는 데 사용할 수 있지만 3Jx3 줄을 공백으로 결합한 다음 두 번째 줄과 3 번째 줄 사이의 공백을 삭제하고 다른 줄 사이에 공백을 남겨 둡니다.
Haegin

1

항상 단일 공간과 결합하려면 다음을 수행하십시오.

nmap J gJi <ESC>ciW <ESC>

공백없이 연결하려면 (후행 + 선행 공백 제거) :

nmap <C-J> gJi <ESC>diW

1
이 사이트에 오신 것을 환영합니다! 귀하의 매핑은 저에게 약간 과장되어 보입니다. 작동 방식에 대한 설명을 조금 더 추가하면 도움이 될 것입니다.
statox

1

병합하려는 행을 선택하고 정상 모드에서 콜론 을 입력하여 Ex 명령을 입력 :하십시오. 그런 다음이 명령을 입력하십시오.

s/$\n\s*//gc

전체 명령은 다음과 같아야합니다.

:'<,'>s/$\n\s*//gc

이것은 실제로 줄 바꿈 문자뿐만 아니라 공백 들여 쓰기를 대체하는 @insidepower 명령의 수정 된 버전입니다 .

설명:

  • '<,'> 시각적 모드에서 선택한 선만 수정한다는 의미입니다.

  • /$\n\s*A는 정규식 패턴. 우리는 $줄 바꿈 문자로 끝나고 그 후에 \n결정되지 않은 수의 공백이 있는 일치 항목을 찾고 *있습니다.

  • s/pattern//gc패턴 을 찾아 확인시 빈 문자로 바꾸는 대체 명령 입니다.

Vim의 정규 표현식에 대한 플래그 및 메타 문자에 대한 자세한 내용은 Vim Reference의이 장을 참조하십시오.


2
안녕 ubique, Vi와 Vim에 오신 것을 환영합니다 ! 거기에는 꽤 잘 쓰여진 대답이 있습니다. 그것을위한 kudos. 내 nitpick은 vim 정규 표현식 = / = python 정규 표현식이며 때로는 사용자에게 혼란 스럽습니다. 어쩌면 Vim 정규식에 대한 도움말 문서로 연결됩니까?
D. Ben Knoble

2
두 번째 니트 : 당신이 참조하는 대답은 @ insidepower에 의해 작성 되었고 Peter에 의해 편집되었습니다.
D. Ben Knoble
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.