क्या मैं अल्पविराम (या किसी अन्य वर्ण) के साथ लाइनें जोड़ सकता हूं?


19

मुझे पता है कि मैं विम के साथ लाइनों में शामिल हो सकता हूं Jऔर इसके कई संस्करण ( gJ, आदि); Jहोगा "मांगपत्र निकालें और दो रिक्त स्थान के लिए सम्मिलित"

लेकिन क्या दो स्थानों के बजाय एक और चरित्र डालने का एक सीधा तरीका है? उदाहरण के लिए अल्पविराम ( ,) या अल्पविराम और स्थान ( ,)?

दिया हुआ:

8
9
10
32

मैं इसके साथ समाप्त करना चाहता हूं:

8, 9, 10, 32

या:

8,9,10,32

आप github.com/sk1418/Join (परीक्षण नहीं किया गया) भी पसंद कर सकते हैं ।
VanLaser

जवाबों:


5

मैंने एक Join प्लगइन लिखा, जो आप चाहते हैं वह कर सकते हैं, और बहुत कुछ।

बिल्ड-इन द्वारा प्रदान की गई सभी सुविधाओं को छोड़कर: कमांड से जुड़ें, ज्वाइन कर सकते हैं:

  • विभाजक (स्ट्रिंग) के साथ लाइनें जुड़ें
  • अग्रणी / अनुगामी व्हाट्सएप को ट्रिम किए बिना या उसके साथ लाइनों को मिलाएं
  • ऋणात्मक संख्या के साथ रेखाएँ जुड़ें (पीछे की ओर जुड़ें)
  • रिवर्स में लाइनों को मिलाएं
  • लाइनों में शामिल हों और लाइनों को जोड़े रखें (सम्मिलित लाइनों को हटाए बिना)
  • उपरोक्त विकल्पों के किसी भी संयोजन के साथ लाइनों को मिलाएं

अधिक जानकारी और स्क्रीनशॉट:

https://github.com/sk1418/Join


23

एक सरल तरीका यह है: बस अपनी लाइनों का चयन करें (सभी लेकिन पिछले एक) - या उपयोग %- और चलाएँ:

:'<,'>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, "एक शब्द" में शामिल होने के लिए।

(सुझावों का स्वागत है)

यहाँ छवि विवरण दर्ज करें


2
बेहतर अभी तक: :'<,'>-1s/\n/, /चिह्नित लाइनों के लिए, या :1,$-1s/\n/, /पूरी फ़ाइल के लिए।
सातो कट्सुरा

वास्तव में, यह और भी बेहतर है :)
VanLaser

@SatoKatsura आप समझा सकते हैं -1?
alxndr

1
@alxndr - इसका उपयोग सीमा / फ़ाइल में अंतिम पंक्ति को छोड़ने के लिए किया जाता है: उदाहरण के लिए, ओपी उदाहरण में, आप 32 के बाद अल्पविराम नहीं चाहते हैं, और यदि आप मौजूद हैं तो भी अगली पंक्ति में शामिल नहीं होना चाहते हैं। । आप भी उपयोग कर सकते हैं '<,'>-s/\n/, /या 1,$-s/\n/, /जैसा -है वैसा ही है -1
वैनलेसर

1
यदि l:sepकोई है &, तो आपका प्रतिस्थापन गलत तरीके से काम करेगा, क्योंकि &प्रतिस्थापन में जादू है। भागने से बचने की कोशिश करने के बजाय \=शाब्दिक स्ट्रिंग का उपयोग करने के लिए बेहतर हो सकता है let l:subst = 's/\n\+/\=' . "'" . l:sep . "'/"
जैमसेन

3

यहाँ बाहरी आदेश का उपयोग करके उदाहरण दिया गया है:

:%!paste -sd,

जहां %!कमांड के साथ वर्तमान बफर (फ़ाइल की सामग्री) को बदलता है: paste -sd,(मापदंडों -sका उपयोग कई लाइनों में शामिल होने के लिए किया जाता है और -dसीमांकक वर्ण सेट करता है ,)।


3

बस अगर किसी को रेगेक्स टाइप करना और अधिक प्लगइन पूर्व कमांड को याद करना पसंद नहीं है:

दृश्य-ब्लॉक परिशिष्ट

दृश्य-ब्लॉक संलग्न दृश्य ब्लॉक मोड (में उपलब्ध है <C-v>) और एक ब्लॉक कर सकते हैं एक ppend (और ब्लॉक मैं आगे जोड़ते के लिए nsert)। (संदर्भ: :help v_b_A, :help v_b_I)

और यदि ब्लॉक विजुअल मोड में अंतिम गति है $, तो सभी चयनों के अंत में एपेंड किया जाएगा; या आपके द्वारा संलग्न पाठ से पहले रिक्त स्थान डाले जाएंगे (कल्पना करें )कि कोड में कई विधि कॉल के अंत में समापन को संरेखित करें )।

नीचे दिए गए नमूना पाठ और कर्सर पर 8:

8
9
10
12

<C-v>}$A,<C-c>। सामान्य मोड में वापस जाने के बाद, हम देख सकते हैं ,कि सभी चयनित लाइनों से जोड़ दिया गया है। (बिना कोशिश $)

फिर gvक्षेत्र और Jया फिर से चयन करने के लिए करते हैं gJ। हमारे पास एक अनुगामी है ,: 8,9,10,12,और $xहम काम कर रहे हैं।

नो ट्रेलिंग के लिए इन्सर्ट का प्रयोग करें ,

चलो हमारे पाठ को पूर्ववत करें (यह uu..uया एक फैंसी हो :ea 1d<cr>:lat 1), और विज़ुअल इंसर्ट आज़माएं:

j<C-v>}I, <C-c>और फिर हम gJबिना किसी रिक्त स्थान के साथ लाइनों में शामिल हो सकते हैं ।

रुको रुको रुको, कुछ याद आ रही है। पूरे "सरणी" को फिर से कैसे चुनें? इस बार हमने पहली पंक्ति का चयन नहीं किया ... इसलिए gvमदद नहीं करता है।

- या यह मदद कर सकता है, gvokफिर से चयन ( gv), opposite कोने और kऊपर है।

पुनश्च मेरे कनिष्ठा नहीं त्वरित और सटीक पर्याप्त टाइप करने के लिए है /\के लिए /\nहै, इसलिए मैं Regex का उपयोग करके से बचने के लिए संयोजन विम में निर्मित संचालन और आंदोलनों की तरह। हालाँकि अगर मैं यह लगातार पर्याप्त करता हूं, तो मैपिंग का उपयोग करते हुए - शायद प्लगइन्स के लिए मानचित्र बेहतर होना चाहिए।


1

प्लग-इन या रीमैप को शामिल किए बिना बहुत सरल तरीका है Jकि आप जो भी चरित्र पसंद करते हैं, उसमें शामिल होने के लिए एक स्थान से रीमैप करें ( )। उदाहरण के लिए, अल्पविराम और स्थान के साथ जुड़ना:

:nmap J :s/\n/, /^M

अंत में विशेष वर्ण के लिए नई लाइन ( ^M) दबाएँ Ctrl-Vऔर फिर वापस / दर्ज करें। यदि आप टैब ( ^I) के साथ प्रतिस्थापित करना चाहते हैं तो भी वही होता है , Ctrl-Iफिर टाइप करें Tab

:nmap J :s/\n/^I/^M

यह जो कर रहा है वह वर्तमान लाइन पर एक टैब के साथ एक नई पंक्ति की जगह ले रहा है और उस व्यवहार को जे अक्षर से निकाल रहा है।

यह संयोजन के साथ भी काम करता है, जैसे 4Jकि अगली 4 पंक्तियों में शामिल होने के लिए।


0

आप एक अल्पविराम के साथ लाइनों में शामिल होने के लिए एक मैक्रो रिकॉर्ड कर सकते हैं। यह उपयोगी है अगर यह एक दुर्लभ या एक-बंद कार्य है, और आप याद नहीं कर सकते कि कार्य करने के लिए एक स्थानापन्न कमांड और नियमित अभिव्यक्ति कैसे लिखें, लेकिन आप याद रखें कि मैक्रो कैसे रिकॉर्ड और चलाएं।

एक अल्पविराम से लाइनों में शामिल होने के लिए, qjgJi,Escqरजिस्टर में मैक्रो रिकॉर्ड करने के लिए टाइप करें j। फिर आप मैक्रो के साथ चला सकते हैं @j। आप मैक्रो को फिर से चला सकते हैं @@, जो एक पंक्ति में कई बार चलने पर टाइपिंग पर बचाता है - आप तब तक बस पकड़ सकते हैं @जब तक कि आप उन लाइनों के अंत के पास नहीं पहुंच जाते जिन्हें आप शामिल करना चाहते हैं। आप एक संख्यात्मक उपसर्ग का उपयोग करके @jया @@इसे कई बार सेट कर सकते हैं। यह अंतरिक्ष को अग्रणी और पीछे छोड़ देता है, इसलिए अल्पविराम से पहले या बाद में रिक्त स्थान होंगे यदि आपके मूल पाठ में स्थान था।

अल्पविराम और एक स्थान के साथ जुड़ने के लिए, मैक्रो को रिकॉर्ड करते समय और Spaceउसके बीच डालें ।,Esc

तुम भी उपयोग कर सकते हैं Jके बजाय gJजब मैक्रो, जो आमतौर पर एक अल्पविराम और एक अंतरिक्ष के साथ लाइनों में शामिल हो जाएगा रिकॉर्डिंग। हालाँकि, यदि वर्तमान लाइन में व्हॉट्सएप का निशान है, तो कॉमा व्हाट्सएप के बाद दिखाई देगा, उसके बाद बिना स्पेस के। इसके अलावा, यह अंतरिक्ष अगर अगली पंक्ति के साथ शुरू होता शामिल नहीं है ), और यह अल्पविराम के बाद दो रिक्त स्थान रखता है, तो joinspacesसाथ वर्तमान पंक्ति को समाप्त सेट कर दिया जाता है और ., !या, ?। इन गुत्थियों का वर्णन नीचे किया गया है :help J

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.