Un moyen simple est le suivant: sélectionnez simplement vos lignes (toutes sauf la dernière) - ou utilisez %
- et exécutez:
:'<,'>s/\n/,/
ou
:'<,'>s/\n/, /
(où, bien sûr, la '<,'>
partie a déjà été insérée :
par Vim, pour cibler la sélection)
(2e) Mise à jour:
Sur la base de ce qui précède (et du commentaire de Sato Katsura ), voici une implémentation possible de "jointure interactive", avec comptage et prise en charge répétée facultative:
" ================ 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>
Et une cartographie réelle:
"================= vimrc ================================================
nmap J <Plug>(interactiveJoin)
xmap J <Plug>(interactiveJoin)
nmap gJ <Plug>(interactiveGJoin)
xmap gJ <Plug>(interactiveGJoin)
C'est un peu comme (*) J
, mais interactif - il vous demandera la chaîne de séparation. La chaîne par défaut est un espace - donc, par exemple, pour joindre des lignes sans séparateur, appuyez sur Backspace
lorsque vous y êtes invité, pour supprimer le caractère d'espace par défaut et Enter
pour accepter le séparateur (maintenant) vide. Count, par exemple 3J
, fonctionne également. Si le tpope/vim-repeat
plugin est installé, répétez avec '.' fonctionnera également, en réutilisant le dernier séparateur et (s'il n'est pas modifié - par exemple 10.
) le dernier décompte ou la plage de ligne visuelle.
(*) Ce n'est pas exactement comme ça J
, cependant: alors qu'il supprimera l'indentation, il ne vérifiera pas .!?
(fin de la phrase) pour insérer 2 espaces au lieu d'un, ou insérer un espace uniquement s'il est manquant (il est difficile de faire quelque chose comme cela, puisque la chaîne de séparation peut être n'importe quoi maintenant). Il supprimera également les espaces de fin (plus logique).
Je pense que cela pourrait être un bon moyen de surcharger l'espace limité des lettres des opérateurs :)
Eh bien, techniquement, ce J
n'est pas tout à fait un opérateur, mais proche de celui-ci - par exemple, vous ne pouvez pas Jaw
, pour rejoindre "un mot".
(les suggestions sont les bienvenues)