답변:
Join 플러그인을 작성하고 원하는 것을 할 수 있습니다.
build-in : join 명령이 제공하는 모든 기능을 제외하고 Join은 다음을 수행 할 수 있습니다.
- 구분 기호 (문자열)로 줄 결합
- 선행 / 트레일 링 공백을 트리밍하거나 포함하지 않고 라인 결합
- 카운트가 음수 인 조인 라인 (뒤로 조인)
- 라인을 반대로 결합
- 결합 된 선을 제거하지 않고 결합 된 선 유지 및 결합 된 선 유지
- 위의 옵션을 조합하여 라인에 참여
자세한 내용 및 스크린 샷 :
간단한 방법은 다음과 같습니다. 단순히 라인을 선택하거나 (마지막 라인 만) 또는 사용 %
하고 실행하십시오.
:'<,'>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
, "단어"에 참여하기 위해 할 수없는 것과 비슷합니다 .
(제안은 환영합니다)
:'<,'>-1s/\n/, /
표시된 줄 또는 :1,$-1s/\n/, /
전체 파일.
-1
있습니까?
'<,'>-s/\n/, /
또는 1,$-s/\n/, /
같은 -
과 동일합니다 -1
.
l:sep
is 인 경우 &
교체시 &
마술 이므로 교체가 제대로 작동하지 않습니다 . 이스케이프 처리를 시도하는 대신 \=
리터럴 문자열을 사용하는 것이 더 좋습니다 let l:subst = 's/\n\+/\=' . "'" . l:sep . "'/"
.
누군가가 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 사용을 피하는 것이 좋습니다. 그러나이 작업을 자주 수행하면 매핑을 사용하여 플러그인에 매핑되는 것이 더 좋습니다.
플러그인이나 외부 명령없이 J
공간에서 원하는 문자로 조인 ( ) 을 다시 매핑하는 훨씬 간단한 방법 입니다. 예를 들어, 쉼표 및 공백과 결합하려면 다음을 수행하십시오.
:nmap J :s/\n/, /^M
끝에있는 특수 문자 줄 바꿈 ( ^M
)을 누른 Ctrl-V
다음 Return / Enter를 누르십시오. 탭 ( ^I
) 으로 바꾸려면 Ctrl-I
다음 과 같이 입력하십시오 Tab
.
:nmap J :s/\n/^I/^M
이 작업은 줄 바꿈을 현재 줄의 탭으로 바꾸고 해당 동작을 J 문자로 다시 매핑하는 것입니다.
이것은 또한 4J
다음 4 줄을 결합하기 위해 조합과 함께 작동 합니다.
매크로를 기록하여 라인을 쉼표로 결합 할 수 있습니다. 이것은 드물거나 일회성 작업 인 경우 유용하며 작업을 수행하기 위해 대체 명령과 정규식을 작성하는 방법은 기억할 수 없지만 매크로를 기록하고 실행하는 방법은 기억해야합니다.
쉼표로 줄을 연결하려면 qjgJi,Escqregister에 매크로를 기록하도록 입력 하십시오 j
. 그런 다음로 매크로를 실행할 수 있습니다 @j. 을 사용하여 매크로를 다시 실행할 수 있습니다. 이렇게 @@하면 연속으로 여러 번 실행할 때 입력 시간이 절약됩니다 @. 결합하려는 줄의 끝 부분에이를 때까지 누르고 있으면 됩니다. 숫자 접두사를 사용 @j하거나 @@설정된 횟수만큼 반복 할 수도 있습니다 . 이렇게하면 앞뒤 공백이 그대로 유지되므로 원본 텍스트에 공백이 있으면 쉼표 앞뒤에 공백이 생깁니다.
쉼표와 공백으로 결합하려면 매크로를 기록 할 때 와 Space사이 에 삽입 하십시오.,Esc
매크로를 기록 할 때 J대신 gJ쉼표와 공백으로 줄을 연결하는 대신 사용할 수도 있습니다 . 그러나 현재 줄에 공백이 있으면 공백 뒤에 공백없이 쉼표가 나타납니다. 다음 라인이 시작하는 경우 또한, 공간을 포함하지 않는 )
경우 및 그 쉼표 후 두 공간을두고 joinspaces
설정과 함께 현재의 라인 단부 .
, !
또는 ?
. 이 경고는 아래에 설명되어 :help J
있습니다.