Prosty sposób jest następujący: po prostu wybierz swoje linie (wszystkie oprócz ostatniego) - lub użyj %
- i uruchom:
:'<,'>s/\n/,/
lub
:'<,'>s/\n/, /
(gdzie oczywiście '<,'>
część została już wstawiona :
przez Vima, aby celować w wybór)
(2.) Aktualizacja:
Opierając się na powyższym (i komentarzu Sato Katsury ), oto możliwa implementacja „interaktywnego łączenia” z liczeniem i opcjonalną obsługą powtarzania:
" ================ 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>
I rzeczywiste mapowanie:
"================= vimrc ================================================
nmap J <Plug>(interactiveJoin)
xmap J <Plug>(interactiveJoin)
nmap gJ <Plug>(interactiveGJoin)
xmap gJ <Plug>(interactiveGJoin)
Jest to trochę (*) J
, ale interaktywne - będzie monitować o ciąg separatora. Domyślnym ciągiem jest spacja - na przykład, aby połączyć linie bez separatora, nacisnąć Backspace
po wyświetleniu monitu, aby usunąć domyślny znak spacji i Enter
zaakceptować (teraz) pusty separator. Policz np. 3J
Też działa. Jeśli tpope/vim-repeat
wtyczka jest zainstalowana, powtarzanie za pomocą „.” będzie również działać, ponownie wykorzystując ostatni separator i (jeśli nie zostanie zmieniony - np. 10.
) ostatnią liczbę lub zakres linii wizualnej.
(*) Nie jest to jednak dokładnie tak J
: chociaż usunie wcięcia, nie będzie sprawdzać .!?
(końca frazy) wstawienia 2 spacji zamiast jednego lub wstawiania spacji tylko wtedy, gdy jej brakuje (ciężko jest zrobić coś takiego to, ponieważ ciąg separatora może być teraz dowolny). Usunie także końcowe spacje (ma to większy sens).
Myślę, że może to być dobry sposób na przeciążenie ograniczonej przestrzeni na litery operatorów :)
Cóż, technicznie rzecz biorąc, J
nie jest operatorem, ale zbliżonym do jednego - na przykład nie możesz tego zrobić Jaw
, aby dołączyć do „słowa”.
(sugestie są mile widziane)