Một cách đơn giản là thế này: chỉ cần chọn các dòng của bạn (tất cả trừ dòng cuối cùng) - hoặc sử dụng %
- và chạy:
:'<,'>s/\n/,/
hoặc là
:'<,'>s/\n/, /
(tất nhiên, '<,'>
phần đã được :
Vim chèn vào sau , để nhắm mục tiêu lựa chọn)
(2) Cập nhật:
Dựa trên nhận xét trên (và nhận xét của Sato Katsura ), đây là một triển khai "tham gia tương tác" có thể, với số lượng và hỗ trợ lặp lại tùy chọn:
" ================ 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>
Và một bản đồ thực tế:
"================= vimrc ================================================
nmap J <Plug>(interactiveJoin)
xmap J <Plug>(interactiveJoin)
nmap gJ <Plug>(interactiveGJoin)
xmap gJ <Plug>(interactiveGJoin)
Đây là loại (*) thích J
, nhưng tương tác - nó sẽ nhắc cho chuỗi phân tách. Chuỗi mặc định là một khoảng trắng - vì vậy, ví dụ, để nối các dòng không có dấu phân cách, nhấn Backspace
khi được nhắc, để xóa ký tự Enter
khoảng trắng mặc định và chấp nhận dấu phân cách trống (bây giờ). Đếm, ví dụ 3J
, cũng hoạt động. Nếu tpope/vim-repeat
plugin được cài đặt, lặp lại với '.' cũng sẽ hoạt động, sử dụng lại dấu phân cách cuối cùng và (nếu không thay đổi - ví dụ 10.
) số đếm hoặc phạm vi dòng trực quan cuối cùng.
(*) Đó là không chính xác như J
, mặc dù: trong khi nó sẽ loại bỏ thụt đầu dòng, nó sẽ không kiểm tra .!?
(cuối cụm từ) để chèn 2 không gian thay vì một, hoặc chèn một không gian chỉ khi nó còn thiếu (thật khó để làm điều gì đó như này, vì chuỗi phân cách có thể là bất cứ điều gì bây giờ). Nó cũng sẽ loại bỏ các dấu cách (có ý nghĩa hơn).
Tôi nghĩ rằng đây có thể là một cách hay để quá tải không gian thư của nhà khai thác hạn chế :)
Chà, về mặt kỹ thuật J
không hoàn toàn là một nhà điều hành, nhưng gần với một nhà điều hành - ví dụ, bạn không thể làm gì Jaw
, để tham gia "một từ".
(đề nghị được chào đón)