Простий спосіб такий: просто виберіть рядки (усі, крім останнього) - або використовуйте %
- та запустіть:
:'<,'>s/\n/,/
або
:'<,'>s/\n/, /
(де, звичайно, '<,'>
частина була вже вставлена після :
Vim, щоб націлити вибір)
(2-е) Оновлення:
Спираючись на вищезазначене (та коментар Сато Кацури ), ось можлива реалізація "інтерактивного приєднання", з кількістю та необов'язковою повторною підтримкою:
" ================ 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>
І власне відображення:
"================= vimrc ================================================
nmap J <Plug>(interactiveJoin)
xmap J <Plug>(interactiveJoin)
nmap gJ <Plug>(interactiveGJoin)
xmap gJ <Plug>(interactiveGJoin)
Це щось на зразок (*) J
, але інтерактивне - воно підкаже для рядка роздільника. Рядок за замовчуванням - це пробіл - так, наприклад, об'єднати рядки без роздільника, натиснути, Backspace
коли буде запропоновано, видалити символ пробілу за замовчуванням та Enter
прийняти (зараз) порожній роздільник. Підрахунок, наприклад 3J
, також працює. Якщо tpope/vim-repeat
плагін встановлено, повторюючи з «.» також буде працювати, повторно використовуючи останній роздільник і (якщо не змінено - наприклад 10.
) останній відлік або візуальний діапазон рядків.
(*) Це не зовсім так J
: хоча він видалить відступи, він не перевірить .!?
(кінець фрази), щоб вставити 2 пробіли замість одного, або вставити пробіл, лише якщо його немає (важко зробити щось на кшталт це, оскільки розділовий рядок зараз може бути будь-яким). Це також прибере пробіли (має більше сенсу).
Я думаю, що це може бути хорошим способом перевантажити обмежений простір листів :)
Ну, технічно J
це не зовсім оператор, але близький до одного - наприклад, ви не можете зробити це Jaw
, щоб приєднатися до "слова".
(пропозиції вітаються)