Cara sederhana adalah ini: cukup pilih baris Anda (semua kecuali yang terakhir) - atau gunakan %
- dan jalankan:
:'<,'>s/\n/,/
atau
:'<,'>s/\n/, /
(di mana, tentu saja, '<,'>
bagian itu sudah dimasukkan setelah :
oleh Vim, untuk menargetkan pemilihan)
(2) Pembaruan:
Membangun di atas (dan komentar Sato Katsura ), berikut ini kemungkinan implementasi "gabung interaktif", dengan jumlah dan dukungan pengulangan opsional:
" ================ 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>
Dan pemetaan aktual:
"================= vimrc ================================================
nmap J <Plug>(interactiveJoin)
xmap J <Plug>(interactiveJoin)
nmap gJ <Plug>(interactiveGJoin)
xmap gJ <Plug>(interactiveGJoin)
Ini agak (*) seperti J
, tetapi interaktif - ini akan meminta string pemisah. String default adalah spasi - jadi, misalnya, untuk bergabung dengan garis tanpa pemisah, tekan Backspace
saat diminta, untuk menghapus karakter spasi default, dan Enter
untuk menerima pemisah kosong (sekarang). Hitung, misalnya 3J
, juga berfungsi. Jika tpope/vim-repeat
plugin diinstal, ulangi dengan '.' juga akan berfungsi, menggunakan kembali pemisah terakhir dan (jika tidak diubah - mis. 10.
) hitungan terakhir atau rentang garis visual.
(*) Ini tidak persis seperti J
, meskipun: sementara itu akan menghapus lekukan, itu tidak akan memeriksa .!?
(akhir frase) untuk memasukkan 2 spasi, bukan satu, atau menyisipkan spasi hanya jika itu hilang (sulit untuk melakukan sesuatu seperti ini, karena string pemisah dapat berupa apa saja sekarang). Ini juga akan menghapus spasi tambahan (lebih masuk akal).
Saya pikir ini mungkin cara yang bagus untuk membebani ruang surat operator yang terbatas :)
Yah, secara teknis J
bukan operator, tetapi dekat dengan satu - misalnya, Anda tidak dapat melakukan Jaw
, untuk bergabung dengan "sepatah kata".
(saran dipersilahkan)