Bunun basit bir yolu şudur: satırlarınızı (sonuncusu hariç tümü) seçin - veya kullanın %
- ve çalıştırın:
:'<,'>s/\n/,/
veya
:'<,'>s/\n/, /
(tabii ki, '<,'>
bölüm :
seçimi hedeflemek için Vim tarafından zaten eklenmişti )
(2.) Güncelleme:
Yukarıdakilere (ve Sato Katsura'nın yorumuna) dayanarak, sayı ve isteğe bağlı tekrar desteği ile olası bir "etkileşimli birleştirme" uygulaması:
" ================ 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>
Ve gerçek bir harita:
"================= vimrc ================================================
nmap J <Plug>(interactiveJoin)
xmap J <Plug>(interactiveJoin)
nmap gJ <Plug>(interactiveGJoin)
xmap gJ <Plug>(interactiveGJoin)
Bu tür (*) gibidir J
, ancak interaktiftir - ayırıcı dizeyi ister. Varsayılan dize bir alandır - bu nedenle, örneğin, ayırıcısız satırları birleştirmek, Backspace
istendiğinde vurmak , varsayılan boşluk karakterini kaldırmak Enter
ve (şimdi) boş ayırıcıyı kabul etmek için kullanılır. Saymak, örneğin 3J
, de çalışır. Eğer tpope/vim-repeat
eklenti yüklendikten ile yinelenen '' son ayırıcıyı ve (değiştirilmediyse - örneğin 10.
) son sayımı veya görsel çizgi aralığını yeniden kullanarak da çalışır .
(*) Tam olarak böyle değil J
: girintiyi kaldıracak olsa da .!?
, bir tane yerine 2 boşluk eklemeyi (cümlenin sonu) kontrol etmeyecek veya sadece eksikse bir boşluk ekleyecek (gibi bir şey yapmak zor) bu, ayırıcı dize şimdi herhangi bir şey olabilir). Ayrıca arka boşlukları da kaldıracaktır (daha mantıklı).
Bence bu sınırlı operatörlerin mektup alanını aşırı yüklemenin güzel bir yolu olabilir :)
Teknik J
olarak bir operatör değil, bir taneye yakın - örneğin, Jaw
"bir kelimeye" katılmak için yapamazsınız .
(önerilerinizi bekliyoruz)