Un modo semplice è questo: seleziona semplicemente le tue linee (tutte tranne l'ultima) - oppure usa %
- ed esegui:
:'<,'>s/\n/,/
o
:'<,'>s/\n/, /
(dove, ovviamente, la '<,'>
parte era già stata inserita dopo :
da Vim, per indirizzare la selezione)
(2 °) Aggiornamento:
Partendo da quanto sopra (e dal commento di Sato Katsura ), ecco una possibile implementazione di "join interattivo", con conteggio e supporto ripetizione opzionale:
" ================ 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>
E una vera mappatura:
"================= vimrc ================================================
nmap J <Plug>(interactiveJoin)
xmap J <Plug>(interactiveJoin)
nmap gJ <Plug>(interactiveGJoin)
xmap gJ <Plug>(interactiveGJoin)
Questo è un po '(*) simile J
, ma interattivo - richiederà la stringa di separazione. La stringa predefinita è uno spazio, quindi, ad esempio, per unire le linee senza separatore, premere Backspace
quando richiesto, rimuovere il carattere di spazio predefinito e Enter
accettare il separatore (ora) vuoto. Il conteggio, ad esempio 3J
, funziona anche. Se il tpope/vim-repeat
plugin è installato, ripetendo con '.' funzionerà anche riutilizzando l'ultimo separatore e (se non modificato - ad es. 10.
) l'ultimo conteggio o l'intervallo della linea visiva.
(*) Non è esattamente come J
, però: mentre rimuoverà il rientro, non cercherà .!?
(fine della frase) di inserire 2 spazi invece di uno, o inserire uno spazio solo se manca (è difficile fare qualcosa come questo, poiché la stringa di separazione può essere qualsiasi cosa ora). Rimuoverà anche gli spazi finali (ha più senso).
Penso che questo potrebbe essere un buon modo per sovraccaricare lo spazio lettere limitato degli operatori :)
Beh, tecnicamente J
non è proprio un operatore, ma vicino a uno - per esempio, non puoi fare Jaw
, unire "una parola".
(suggerimenti sono ben accetti)