एक सरल तरीका यह है: बस अपनी लाइनों का चयन करें (सभी लेकिन पिछले एक) - या उपयोग %
- और चलाएँ:
:'<,'>s/\n/,/
या
:'<,'>s/\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>
और एक वास्तविक मानचित्रण:
"================= 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
, "एक शब्द" में शामिल होने के लिए।
(सुझावों का स्वागत है)