Una manera simple es esta: simplemente seleccione sus líneas (todas menos la última), o use %
, y ejecute:
:'<,'>s/\n/,/
o
:'<,'>s/\n/, /
(donde, por supuesto, la '<,'>
parte ya fue insertada después :
por Vim, para apuntar a la selección)
(2º) Actualización:
Sobre la base de lo anterior (y el comentario de Sato Katsura ), aquí hay una posible implementación de "unión interactiva", con conteo y soporte de repetición opcional:
" ================ 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>
Y un mapeo real:
"================= vimrc ================================================
nmap J <Plug>(interactiveJoin)
xmap J <Plug>(interactiveJoin)
nmap gJ <Plug>(interactiveGJoin)
xmap gJ <Plug>(interactiveGJoin)
Esto es un poco (*) como J
, pero interactivo: solicitará la cadena de separación. La cadena predeterminada es un espacio; por ejemplo, para unir líneas sin separador, presione Backspace
cuando se le solicite, para eliminar el carácter de espacio predeterminado y Enter
para aceptar el separador vacío (ahora). Contar, por ejemplo 3J
, también funciona. Si el tpope/vim-repeat
complemento está instalado, repita con '.' también funcionará, reutilizando el último separador y (si no se modifica, por ejemplo 10.
) el último recuento o rango de línea visual.
(*) Sin embargo, no es exactamente así J
: aunque eliminará la sangría, no buscará .!?
(fin de la frase) para insertar 2 espacios en lugar de uno, o inserta un espacio solo si falta (es difícil hacer algo como esto, ya que la cadena de separación puede ser cualquier cosa ahora). También eliminará los espacios finales (tiene más sentido).
Creo que esta podría ser una buena manera de sobrecargar el espacio limitado de letras de los operadores :)
Bueno, técnicamente J
no es un operador, pero está cerca de uno, por ejemplo, no se puede hacer Jaw
, para unir "una palabra".
(sugerencias son bienvenidas)