쉼표 (또는 다른 문자)로 줄을 결합 할 수 있습니까?


19

나는 Vim의 라인 J과 그 변형 ( gJ, 등)을 연결할 수 있다는 것을 알고 있습니다 . J"들여 쓰기를 제거하고 두 칸까지 삽입" .

그러나 두 공백 대신 다른 문자를 삽입하는 간단한 방법이 있습니까? 예를 들어 쉼표 ( ,) 또는 쉼표 및 공백 ( ,)?

주어진:

8
9
10
32

나는 끝내고 싶다 :

8, 9, 10, 32

또는:

8,9,10,32

github.com/sk1418/Join (테스트되지 않음)을 좋아할 수도 있습니다 .
VanLaser

답변:


5

Join 플러그인을 작성하고 원하는 것을 할 수 있습니다.

build-in : join 명령이 제공하는 모든 기능을 제외하고 Join은 다음을 수행 할 수 있습니다.

  • 구분 기호 (문자열)로 줄 결합
  • 선행 / 트레일 링 공백을 트리밍하거나 포함하지 않고 라인 결합
  • 카운트가 음수 인 조인 라인 (뒤로 조인)
  • 라인을 반대로 결합
  • 결합 된 선을 제거하지 않고 결합 된 선 유지 및 결합 된 선 유지
  • 위의 옵션을 조합하여 라인에 참여

자세한 내용 및 스크린 샷 :

https://github.com/sk1418/Join


23

간단한 방법은 다음과 같습니다. 단순히 라인을 선택하거나 (마지막 라인 만) 또는 사용 %하고 실행하십시오.

:'<,'>s/\n/,/

또는

:'<,'>s/\n/, /

(물론 Vim에 의해 '<,'>부품이 이미 삽입 :되어 선택 대상이 됨)


(2 차) 업데이트 :

위와 Sato Katsura 의 의견을 바탕으로 카운트 및 선택적 반복 지원이 가능한 가능한 "인터랙티브 조인"구현이 있습니다.

" ================ script ===============================================
" interactive 'J', 'gJ' replacement with optional 'vim-repeat' support
" The last used separator is automatically reused as:
" a. default choice
" b. when repeating (=> non-interactive repeats: same range, same separator)
let g:last_join_separator = " "
function! s:interactiveJoin(use_last_sep,...) range
    if (a:use_last_sep == 0) "interactive, ask for separator to use
        call inputsave()
        echohl Question
        let l:sep = input("Separator:", g:last_join_separator)
        echohl None
        call inputrestore()
        redraw!
        let g:last_join_separator = l:sep "update last separator value
    else "non-interactive (when repeating with '.')
        let l:sep = g:last_join_separator
    endif
    if (a:0 == 0) "with no argument, remove indentation *and trailing spaces*
        let l:subst = 's/\s*\n\+\s*/\=' . "'" . l:sep . "'/"
    else " don't remove indentation or trailing spaces (act like 'gJ')
        let l:subst = 's/\n\+/\=' . "'" . l:sep . "'/"
    endif
    if a:firstline < a:lastline "join given range
        execute a:firstline . ',' . (a:lastline - 1) . l:subst
        let l:count = a:lastline - a:firstline + 1 "default count for repeat
    else "or join only with next line
        execute l:subst
        let l:count = 1 "default count for repeat
    endif
    "make command repeatable
    "(with the tpope/vim-repeat plugin: optional, recommended)
    if (a:0 == 0)
        silent! call repeat#set("\<Plug>(repeatJoin)", l:count)
    else
        silent! call repeat#set("\<Plug>(repeatGJoin)", l:count)
    endif
endfunction

noremap <silent> <Plug>(interactiveJoin)  :call <SID>interactiveJoin(0)<CR>
noremap <silent> <Plug>(interactiveGJoin) :call <SID>interactiveJoin(0,'g')<CR>
noremap <silent> <Plug>(repeatJoin)       :call <SID>interactiveJoin(1)<CR>
noremap <silent> <Plug>(repeatGJoin)      :call <SID>interactiveJoin(1,'g')<CR>

그리고 실제 매핑 :

"================= vimrc ================================================
nmap J <Plug>(interactiveJoin)
xmap J <Plug>(interactiveJoin)
nmap gJ <Plug>(interactiveGJoin)
xmap gJ <Plug>(interactiveGJoin)

이것은 kinda (*)와 비슷 J하지만 대화식입니다. 구분 기호 문자열을 입력하라는 메시지가 표시됩니다. 기본 문자열은 공백입니다. 예를 들어 구분 기호가없는 행을 결합하고 Backspace프롬프트가 표시되면 기본 공백 문자를 제거하고 Enter빈 구분 기호를 승인합니다. 예를 들어 카운트 3J도 작동합니다. tpope/vim-repeat플러그인이 설치된 경우 '.'으로 반복 또한 마지막 구분 기호와 (예를 들어 변경되지 않은 경우 10.) 마지막 카운트 또는 시각적 라인 범위를 재사용하여 작동 합니다.


(*) 그것은 아니다 정확히 처럼 J하지만, : 그것은 들여 쓰기를 제거하는 동안, 그것은 확인하지 않습니다 .!?이 대신 공백을 삽입 (구 끝), 또는 실종 경우에만 공백을 삽입 (이 같은 뭔가를 열심히 구분자 문자열은 이제 무엇이든 될 수 있기 때문에). 후행 공백도 제거합니다 (더 의미가 있습니다).

제한된 연산자 문자 공간을 과부하시키는 좋은 방법이라고 생각합니다. :)

글쎄, 기술적으로 J는 연산자가 아니지만 Jaw, "단어"에 참여하기 위해 할 수없는 것과 비슷합니다 .

(제안은 환영합니다)

여기에 이미지 설명을 입력하십시오


2
더 나은 방법 : :'<,'>-1s/\n/, /표시된 줄 또는 :1,$-1s/\n/, /전체 파일.
사토 카츠라

실제로, 그것은 더 낫습니다 :)
VanLaser

@SatoKatsura 설명 할 수 -1있습니까?
alxndr

1
@alxndr-범위 / 파일에서 마지막 줄을 건너 뛰는 데 사용됩니다. 예를 들어 OP 예에서는 32 이후에 쉼표를 원하지 않으며 다음 줄이 있으면 그 줄을 조인하고 싶지 않습니다. . 당신은 사용할 수 있습니다 '<,'>-s/\n/, /또는 1,$-s/\n/, /같은 -과 동일합니다 -1.
VanLaser

1
l:sepis 인 경우 &교체시 &마술 이므로 교체가 제대로 작동하지 않습니다 . 이스케이프 처리를 시도하는 대신 \=리터럴 문자열을 사용하는 것이 더 좋습니다 let l:subst = 's/\n\+/\=' . "'" . l:sep . "'/".
jamessan

3

다음은 외부 명령을 사용하는 예입니다.

:%!paste -sd,

여기서 %!현재 버퍼 (파일의 내용)를 다음 명령 으로 바꿉니다. paste -sd,(매개 변수 -s는 여러 줄을 연결하고 -d구분 문자를로 설정하는 데 사용 됩니다 ,).


3

누군가가 Regex를 입력하고 더 많은 플러그인 Ex 명령을 암기하는 것을 좋아하지 않는 경우를 대비하여 :

비주얼 블록 추가

비주얼 블록 추가]은 비주얼 블록 모드 (에서 사용할 수 있습니다 <C-v>) 및 블록 할 수 ppend을 (그리고 차단 내가 앞에 추가에 대한 nsert). (참조 : :help v_b_A, :help v_b_I)

그리고 비주얼 모드 차단의 마지막 동작이 $이면 모든 선택이 끝날 때 추가됩니다. 그렇지 않으면 추가 한 텍스트 앞에 공백이 삽입됩니다 ( )코드에서 여러 메소드 호출이 끝날 때 닫히는 것을 상상 하십시오).

아래 샘플 텍스트와 커서를 켠 상태 8:

8
9
10
12

<C-v>}$A,<C-c>. 일반 모드로 돌아 가면 ,선택된 모든 행에 추가 된 것을 볼 수 있습니다 . (없이 시도 $)

그런 다음 gv영역을 다시 선택하고 J또는을 수행하십시오 gJ. 우리는 뒤에이 ,: 8,9,10,12,그리고 $x우리는 완료됩니다.

후행이없는 경우 인서트 사용 ,

우리의 텍스트를 취소하고 ( uu..u또는 멋지게 :ea 1d<cr>:lat 1) Visual Insert를 사용해 봅시다 .

j<C-v>}I, <C-c>gJ공백없이 라인을 결합 할 수 있습니다.

잠깐만 잠깐만, 뭔가 빠졌어. 전체 "배열"을 다시 선택하는 방법? 이번에는 첫 번째 줄을 선택 gv하지 않았으므로 도움이되지 않습니다.

-또는 도움이 될 수 있습니다. gvok( gv)을 다시 선택 o하고 모서리를 k위로 두십시오 .

PS My pinky는 입력 /\하기에 빠르고 정확하지 않기 /\n때문에 Vim 내장 작업과 동작을 결합하여 Regex 사용을 피하는 것이 좋습니다. 그러나이 작업을 자주 수행하면 매핑을 사용하여 플러그인에 매핑되는 것이 더 좋습니다.


1

플러그인이나 외부 명령없이 J공간에서 원하는 문자로 조인 ( ) 을 다시 매핑하는 훨씬 간단한 방법 입니다. 예를 들어, 쉼표 및 공백과 결합하려면 다음을 수행하십시오.

:nmap J :s/\n/, /^M

끝에있는 특수 문자 줄 바꿈 ( ^M)을 누른 Ctrl-V다음 Return / Enter를 누르십시오. 탭 ( ^I) 으로 바꾸려면 Ctrl-I다음 과 같이 입력하십시오 Tab.

:nmap J :s/\n/^I/^M

이 작업은 줄 바꿈을 현재 줄의 탭으로 바꾸고 해당 동작을 J 문자로 다시 매핑하는 것입니다.

이것은 또한 4J다음 4 줄을 결합하기 위해 조합과 함께 작동 합니다.


0

매크로를 기록하여 라인을 쉼표로 결합 할 수 있습니다. 이것은 드물거나 일회성 작업 인 경우 유용하며 작업을 수행하기 위해 대체 명령과 정규식을 작성하는 방법은 기억할 수 없지만 매크로를 기록하고 실행하는 방법은 기억해야합니다.

쉼표로 줄을 연결하려면 qjgJi,Escqregister에 매크로를 기록하도록 입력 하십시오 j. 그런 다음로 매크로를 실행할 수 있습니다 @j. 을 사용하여 매크로를 다시 실행할 수 있습니다. 이렇게 @@하면 연속으로 여러 번 실행할 때 입력 시간이 절약됩니다 @. 결합하려는 줄의 끝 부분에이를 때까지 누르고 있으면 됩니다. 숫자 접두사를 사용 @j하거나 @@설정된 횟수만큼 반복 할 수도 있습니다 . 이렇게하면 앞뒤 공백이 그대로 유지되므로 원본 텍스트에 공백이 있으면 쉼표 앞뒤에 공백이 생깁니다.

쉼표와 공백으로 결합하려면 매크로를 기록 할 때 와 Space사이 에 삽입 하십시오.,Esc

매크로를 기록 할 때 J대신 gJ쉼표와 공백으로 줄을 연결하는 대신 사용할 수도 있습니다 . 그러나 현재 줄에 공백이 있으면 공백 뒤에 공백없이 쉼표가 나타납니다. 다음 라인이 시작하는 경우 또한, 공간을 포함하지 않는 )경우 및 그 쉼표 후 두 공간을두고 joinspaces설정과 함께 현재의 라인 단부 ., !또는 ?. 이 경고는 아래에 설명되어 :help J있습니다.

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