Ein einfacher Weg ist: Wählen Sie einfach Ihre Zeilen aus (alle bis auf die letzte) - oder verwenden Sie %
- und führen Sie Folgendes aus:
:'<,'>s/\n/,/
oder
:'<,'>s/\n/, /
(wo natürlich das '<,'>
Teil schon :
von Vim nach eingefügt wurde, um die Auswahl anzuvisieren)
(2.) Update:
Aufbauend auf den obigen Ausführungen (und Sato Katsuras Kommentar) ist hier eine mögliche "interaktive Join" -Implementierung mit Zählung und optionaler Wiederholungsunterstützung:
" ================ 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>
Und ein aktuelles Mapping:
"================= vimrc ================================================
nmap J <Plug>(interactiveJoin)
xmap J <Plug>(interactiveJoin)
nmap gJ <Plug>(interactiveGJoin)
xmap gJ <Plug>(interactiveGJoin)
Dies ist ein bisschen (*) ähnlich J
, aber interaktiv - es wird nach der Trennzeichenfolge gefragt. Die Standardzeichenfolge ist ein Leerzeichen. Backspace
Um beispielsweise Zeilen ohne Trennzeichen zu verbinden, drücken Sie, wenn Sie dazu aufgefordert werden, um das Standardzeichen für das Leerzeichen zu entfernen und Enter
das (jetzt) leere Trennzeichen zu akzeptieren. Zählen 3J
funktioniert zB auch. Wenn das tpope/vim-repeat
Plugin installiert ist, wiederholen Sie dies mit '.' funktioniert auch, indem das letzte Trennzeichen und (falls nicht geändert - z. B. 10.
) der letzte Zählwert oder der visuelle Linienbereich wiederverwendet werden.
(*) Es ist jedoch nicht genau so J
: Während Einrückungen entfernt werden, wird nicht geprüft, ob .!?
2 Leerzeichen anstelle von einem (Ende des Satzes) oder nur dann ein Leerzeichen eingefügt werden, wenn es fehlt (es ist schwierig, so etwas zu tun) dies, da die Trennzeichenfolge jetzt alles sein kann). Es werden auch nachfolgende Leerzeichen entfernt (was sinnvoller ist).
Ich denke, dies könnte eine gute Möglichkeit sein, den begrenzten Buchstabenraum der Operatoren zu überlasten :)
Nun, technisch gesehen J
ist es nicht ganz ein Operator, aber in der Nähe von einem - zum Beispiel kann man nicht tun Jaw
, um sich "einem Wort" anzuschließen.
(Vorschläge sind willkommen)