वीम कमांड (एस) का इस्तेमाल शब्दों को उद्धृत करने / अनक् वॉट करने के लिए किया जा सकता है?


204

मैं कैसे जल्दी से उद्धरण / शब्दों 'को हटा सकता हूं और "विम में उद्धरण (जैसे से ) तक बदल सकता हूं ? मैं चारों ओर के बारे में जानता हूँ ।im प्लगइन, लेकिन मैं सिर्फ विम का उपयोग करना चाहूंगा।


एक समाधान वास्तव में संदर्भ पर निर्भर करता है। क्या आप इसे केवल एक लाइन पर, या पूरी फ़ाइल में, या केवल एक उद्धृत स्ट्रिंग के लिए करना चाहते हैं?
लुकास ओमान

एक शब्द या एक पंक्ति में सभी शब्दों के लिए। उदाहरण के लिए जब शब्दों को स्ट्रिंग शाब्दिक में परिवर्तित किया जाए।
यूजीन यर्मश

जवाबों:


251

चारों ओर.विम आपका सबसे आसान जवाब होने जा रहा है। यदि आप वास्तव में इसका उपयोग करने के खिलाफ सेट हैं, तो यहां कुछ उदाहरण दिए गए हैं कि आप क्या कर सकते हैं। जरूरी नहीं कि सबसे कुशल हो, लेकिन इसीलिए चारों ओर से.विम लिखा गया।

  • एकल उद्धरण का उपयोग करते हुए एक शब्द उद्धरण
    ciw'Ctrl+r"'
    • ciw - कर्सर जिस शब्द पर है, उसे हटाएं और इन्सर्ट मोड में समाप्त करें।
    • ' - पहला उद्धरण जोड़ें।
    • Ctrl+r"- "रजिस्टर की सामग्री डालें , अंतिम यान उर्फ ​​/ हटाएं।
    • ' - समापन उद्धरण जोड़ें।

  • एक शब्द जो एकल उद्धरणों में संलग्न है को रेखांकित करें
    di'hPl2x
    • di' - सिंगल कोट्स द्वारा बताए गए शब्द को डिलीट करें।
    • hP - कर्सर को एक स्थान पर छोड़ दें (शुरुआती उद्धरण के शीर्ष पर) और बोली से पहले बस हटाए गए पाठ को डालें।
    • l - कर्सर को दाईं ओर एक स्थान पर ले जाएं (शुरुआती भाव के ऊपर)।
    • 2x - दो कोट्स को डिलीट करें।

  • सिंगल कोट्स को डबल कोट्स में बदलें
    va':s/\%V'\%V/"/g
    • va' - देखे हुए शब्द और उद्धरणों का चयन करें।
    • :s/ - एक प्रतिस्थापन शुरू करें।
    • \%V'\%V - केवल सिंगल कोट्स का मिलान करें जो नेत्रहीन चयनित क्षेत्र के भीतर हैं।
    • /"/g - उन सभी को डबल कोट्स से बदलें।

1
ये मेरे लिए ठीक काम करते हैं। बस googled कि इन्सर्ट मोड में पेस्ट करना Ctrl + op के साथ भी संभव है।
यूजीन यर्मश

1
रिकॉर्ड मोड (q) के साथ संयोजन में प्रयुक्त, त्वरित नौकरियों के लिए एक आकर्षण की तरह काम करता है।
बिशप

ciwसिर्फ और सिर्फ क्यों cw? मुझे पहली उलझन और दूसरी ठीक लगी।
बिग मैकलारेग्यूज

17
@Koveras यह ciwपरवाह किए बिना काम करता है कि आपका कर्सर शब्द में कहां है। cwकेवल तभी काम करता है जब आपका कर्सर शब्द के प्रारंभ में हो। देख लो :help iw
जामसेन

10
एक अच्छा सा ट्रिक देने के लिए शीर्ष उत्तर को हाइजैक करना: यदि आपके पास दोहरे उद्धरण में एकल उद्धरण को बदलने के लिए कई शब्द हैं, तो आप देख सकते हैं कि @jamessan का पहला समाधान .कमांड के साथ काम नहीं करता है । इसे काम करने के लिए, उपयोग करें ciw' Ctrl+r Ctrl+p"। फिर .जैसा आप इसे निम्न शब्द के लिए चाहते हैं वैसा ही व्यवहार करेंगे: रजिस्टर की सामग्री को याद रखने के बजाय, यह आपको याद रखेगा कि आप अभी रजिस्टर में हैं जो चाहते हैं (समझाने के लिए कठिन है, लेकिन यदि आप दोनों की कोशिश करते हैं, तो यह स्पष्ट हो जाएगा :-))
ऑटो

182

एकल उद्धरण का उपयोग करते हुए एक शब्द उद्धरण

ciw'Ctrl+r"'

मेरे लिए इस तरह से करना आसान था

ciw '' Esc P

8
दुर्भाग्य से, यह अनुमति देने के लिए प्रतीत नहीं होता है। (दोहराने)।
विल मूर III

2
मैं इसे पसंद करता हूं क्योंकि मैं इसे टर्मिनलों पर उपयोग कर सकता हूं / vim मोड के साथ उत्तर देता है क्योंकि Ctrl + r आमतौर पर पहले से ही रिवर्स इतिहास खोज के लिए उपयोग किया जाता है।
19'15

3
@wilmoore एक मैक्रो के रूप में ऊपर रिकॉर्ड करें, फिर से खेलना।
क्रिस्टोफर

30

यहां कुछ मानचित्रण हैं जो मदद कर सकते हैं:

:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P

यदि आपने मैपलीडर वैरिएबल नहीं बदला है, तो मैपिंग को सक्रिय करें \q" \q'या साथ करें \qd। वे कर्सर के नीचे शब्द के चारों ओर दोहरे उद्धरण जोड़ते हैं, कर्सर के नीचे शब्द के चारों ओर एकल उद्धरण, कर्सर के नीचे शब्द के आसपास किसी भी उद्धरण को क्रमशः हटाते हैं।


गजब का विचार! मैंने वर्तमान स्थिति से पंक्ति के अंत तक एकल उद्धरण टिप्पणियाँ सम्मिलित करने के map <Leader>' gewi'<Esc>A'<Esc>लिए अपनी .vimrcफ़ाइल में जोड़ना समाप्त कर दिया ; जिसने मुझे कुछ MSDOS स्क्रिप्ट्स को बैश करने में मदद की।
ILMostro_7

@Geoff, यह एकल उद्धरण के लिए ठीक काम करता है। लेकिन दोहरे उद्धरणों के लिए यह "" "" "शब्द का
उल्लंघन

@RameshVel यह संभव है कि आपके पास अपने स्वयं के कुछ मैक्रो थे जो मानचित्रण के दाहिने हाथ को प्रभावित करते थे। मैंने मैपिंग कमांड को nnoremap पर अपडेट किया है ताकि अन्य मैपिंग का विस्तार न हो। मैंने मैपिंग में भी सुधार किया। पिछले लोगों को समस्या थी जब एक लाइन पर पहले शब्द पर कर्सर होता है।
जेफ

यह भी उद्धरण के साथ चयन को घेरने के लिए दृश्य मोड के लिए आसानी से अनुकूलित किया जा सकता है :vnoremap <leader>q c""<esc>P
डोमिनिक

27

अन्य आदेशों के अलावा, यह सभी शब्दों को दोहरे उद्धरणों में एक पंक्ति में संलग्न करेगा (आपकी टिप्पणी के अनुसार)

:s/\(\S\+\)/"\1"/

या यदि आप बैकस्लैश की संख्या कम करना चाहते हैं, तो आप \vपैटर्न की शुरुआत में एक (बहुत-जादू) संशोधक डाल सकते हैं

:s/\v(\S+)/"\1"/

मेरे कॉपी किए गए पाठ में भी कॉमा थे, इसलिए मैंने बस इसे बदल दिया:s/\v([a-Z]+)/"\1"/g
tsukimi

22

स्थूल तरीके!

  1. प्रेस qऔर qक्यू रजिस्टर में रिकॉर्डिंग के लिए (हम "उद्धरण" याद रखने के लिए शॉर्टकट के रूप में "q" का उपयोग करते हैं)।

  2. प्रेस shift+ bवर्तमान शब्द के सामने से कदम कर्सर

  3. प्रेस iप्रकार '(एक उद्धरण)

  4. प्रेस escतब eशब्द के अंत में जाने के लिए दबाएं

  5. प्रेस करें aफिर 'उद्धरण के साथ शब्द को घेरने के लिए फिर से दबाएं ।

  6. escसामान्य मोड में आने के लिए दबाएँ ।

  7. अंत qमें इसे qरजिस्टर में दर्ज करने के लिए दबाएं ।

कैसे इस्तेमाल करे

  1. कर्सर को एक वांछित शब्द पर ले जाएं।
  2. @qकिसी शब्द को उद्धरण के साथ घेरने के लिए दबाएँ ।
  3. @@यदि आप इसे दूसरे शब्द में दोहराना चाहते हैं तो दबाएँ ।

आप किसी step 4भी चीज़ के साथ बदल सकते हैं जैसे {एक पंक्ति, एक शब्द जब तक कुछ वर्ण नहीं मिला, आदि}।

दर्ज मैक्रो को लगातार करें

  1. खुला है
  2. फ़ाइल के अंत में जाएं
  3. डालने मोड में परिवर्तन। इसे लगातार बनाए रखने के लिए इसे टाइप करें:
चलो @ क्यू = ' ctrl+ r ctrl+ rक्यू'
  1. सेव करके छोड़ो

  2. अपनी फ़ाइलें खोलें, कुछ शब्दों पर जाएं

  3. अब दबाएँ @q

यदि आप इसे सही तरीके से करते हैं, तो जादू की बातें आपके शब्दों में प्रकट होनी चाहिए।

आप अन्य मैक्रो के लिए इस चरण को कर सकते हैं जिसे आप प्यार करते थे।


3
कहना है मुझे यह समाधान पसंद है। कोई घेर नहीं है। मैक्रों के लिए आवश्यक और आसान आमंत्रण और निर्माण। इसके अलावा आसानी से जो कुछ भी आप की आवश्यकता होगी के लिए प्रयोग करने योग्य है (उदाहरण के लिए मेरे लिए लाइन के अंत तक वर्तमान शब्द को उद्धृत, ansible के लिए एकदम सही)। मैक्रो को दिखाने के लिए: "qp। इसे सहेजने के लिए .vimrc पर जाएँ और करें: @q = 'मैक्रो कंटेंट' (सिर्फ पूर्णता के लिए)
th3p पेंगुइनinisisperer

मुझे यह बहुत पसंद है। आप इन मैक्रोज़ को भी घोंसला बना सकते हैं। तो आप रजिस्टर j में रिकॉर्ड कर सकते हैं @q wऔर फिर आप अगले nशब्दों को उद्धरण चिह्नों के साथ लपेट सकते हैं n@j
छिपे हुए-उपयोगकर्ता नाम

1
मैक्रो को लगातार बनाए रखने के लिए मैंने कुछ कदम जोड़े।
ब्रेन 90

1
विम में पद्यात्मक, लेकिन, शब्द और शब्द अलग हैं। Shift + b = B, इसलिए चरण 2 को आदर्श रूप से "... वर्तमान WORD के सामने" में बदल दिया जाना चाहिए। यदि आपका मतलब शब्द की शुरुआत है, तो आपको Shift का उपयोग करने की आवश्यकता नहीं है।
अंबरीश

इस बात के लिए धन्यवाद। मैं WORD से निपटने के लिए शिफ्ट + b जानबूझकर उपयोग करता हूं। मैक्रो शब्द या शब्द में चलना चाहिए [को ०]। वास्तव में चरण 3 को भी शिफ्ट + ई में बदलना चाहिए। [0] stackoverflow.com/a/14390568/341959
Brain90

18

एकल उद्धरण (उदाहरण के लिए) में लपेटने के लिए ciw'<C-r>"'<esc>काम करता है, लेकिन दोहराना काम नहीं करेगा। प्रयत्न:

ciw'<C-r><C-o>"'<esc>

यह डिफ़ॉल्ट रजिस्टर "शाब्दिक" की सामग्री डालता है। अब आप इसे .किसी भी शब्द पर उद्धरण में लपेटने के लिए दबा सकते हैं । :h[elp] i_ctrl-rटेक्स्ट ऑब्जेक्ट्स के बारे में और अधिक देखने और जानने के लिए:h text-objects

स्रोत: http://vimcasts.org/episodes/pasting-from-insert-mode/


2
बहुत बढ़िया टिप! अगर किसी को भी इसमें से कोई मैपिंग करनी है, तो उचित अंकन है ciw'<C-R><C-O>"'<Esc>
चमक

<Cr> "वास्तव में क्या करता है?
कोडकॉक

@ कोडकोड यह CTRL-R है। CTRL-R कर्सर पर रजिस्टर की सामग्री सम्मिलित करता है और सम्मिलित मोड में रहता है।
इरविन रूइजाक्कर्स

यह आपके द्वारा उल्लेखित के रूप में दोहराए जाने योग्य है, लेकिन जब एक मैक्रो में संग्रहीत किया जाता है, तो मैक्रो को दोहराते .हुए अंतिम वास्तविक कॉल की सामग्री को फिर से लिखना होगा।
Sbu

7

VSCodeVim के उपयोगकर्ताओं के लिए आप कर सकते हैं

vwS"

  • आप "जिस चीज से लपेटना चाहते हैं उसे बदल सकते हैं ।
  • आप wकिसी अन्य चयन ऑपरेटर से बदल सकते हैं

2
इसने मैकविम पर भी मेरे लिए अच्छा काम किया लेकिन मुझे इसका उपयोग करना पड़ा viwS'जिसने इस शब्द को सिंगल कोट्स में लपेट दिया। अब तक सबसे आसान।
मैट ग्रैनरी

यह तभी काम करता है जब आप शब्द की शुरुआत में हों। यदि आप इसे शब्द के भीतर कहीं से भी करना चाहते हैं, तो आप कर सकते हैं:viwS"
जॉय

6

मैं इसके लिए कोई बिल्ट विम कमांड नहीं जानता, लेकिन r"f'r"' r'f"r'पहले से खड़े होने पर' को 'से' में बदलने और "से 'काम करने के लिए' में बदल जाता है।" कमांड r'आपके कर्सर के नीचे जो भी चरित्र होता है उसे बदल देता है । " और f"आपको अगले की ओर अग्रसर करता है ”।


1
मेरे लिए सबसे सहज "मैनुअल" समाधान। दूसरी प्रतिस्थापन कमांड ( 'rऔर "r) के बजाय , आप बस टाइप कर सकते हैं .और यदि आप अधिक उद्धरण बदलना चाहते हैं, ;और ,आपको अगले या पिछले एक पर ले जाते हैं क्योंकि वे f/F/t/Tक्रमशः अंतिम खोज को उसी दिशा में या विपरीत एक को दोहराते हैं।
एंड्रे दोनों

5

उद्धरण जोड़ना

मैंने अपने इस त्वरित और गंदे कार्य का उपयोग करना शुरू कर दिया .vimrc:

vnoremap q <esc>:call QuickWrap("'")<cr>
vnoremap Q <esc>:call QuickWrap('"')<cr>

function! QuickWrap(wrapper)
  let l:w = a:wrapper
  let l:inside_or_around = (&selection == 'exclusive') ? ('i') : ('a')
  normal `>
  execute "normal " . inside_or_around . escape(w, '\')
  normal `<
  execute "normal i" . escape(w, '\')
  normal `<
endfunction

तो अब, मैं नेत्रहीन रूप से जो कुछ भी चाहता हूं (आमतौर पर के माध्यम से viw- नेत्रहीन शब्द के अंदर चयन करें ) को उद्धरण और प्रेस में चुनता हूंQ दोहरे उद्धरण चिह्नों के लिए , या qएकल उद्धरणों के लिए दबाता ।

उद्धरण निकालना

vnoremap s <esc>:call StripWrap()<cr>

function! StripWrap()
  normal `>x`<x
endfunction

मैं vim-textobj-quotes का उपयोग करता हूं, ताकि विम एक टेक्स्ट ऑब्जेक्ट के रूप में उद्धरण व्यवहार करता है। इसका मतलब है कि मैं कर सकता हूं vaq(नेत्रहीन रूप से उद्धरण के आसपास का चयन करें । यह निकटतम उद्धरण पाता है और नेत्रहीन उन्हें चुनता है। (यह वैकल्पिक है, आप बस कुछ ऐसा कर सकते हैं f"vww)। फिर मैं चयन से उद्धरणों sको पट्टी करने के लिए दबाता हूं ।

बदलते हुए भाव

चुम्मा। मैं उद्धरण हटाता हूं फिर उद्धरण जोड़ता हूं । उदाहरण के लिए, सिंगल कोट्स को डबल कोट्स से बदलने के लिए, मैं चरणों का पालन करूंगा: 1. सिंगल कोट्स को हटा दें:, vaqs2. नए कोट्स को जोड़ें vwQ:।



4

यदि आप विम प्लगइन का उपयोग करते हैं https://github.com/tpope/vim-surround (या VSCode Vim प्लगइन का उपयोग करें, जो विम-सराउंड प्री-इंस्टॉल के साथ आता है), तो यह बहुत ही सुंदर है!

जोड़ना

ysiw' // surround in word `'`

ड्रॉप

ds' // drop surround `'`

परिवर्तन

cs'" // change surround from `'` to `"`

यह html टैग्स के लिए भी काम करता है!

cst<em> // change surround from current tag to `<em>`

बेहतर उदाहरणों के लिए गिटहब पर रीडमी देखें


2

यहाँ कुछ सरल मैपिंग का उपयोग किया जा सकता है जो किसी शब्द को उद्धृत करने और अनक्लोक्ट करने के लिए उपयोग किए जा सकते हैं:

" 'quote' a word
nnoremap qw :silent! normal mpea'<Esc>bi'<Esc>`pl
" double "quote" a word
nnoremap qd :silent! normal mpea"<Esc>bi"<Esc>`pl
" remove quotes from a word
nnoremap wq :silent! normal mpeld bhd `ph<CR>

1
यदि आप अपना उत्तर विस्तृत कर सकते हैं: कैसे मैपिंग जोड़ना, उन्हें कैसे कॉल करें आदि के लिए यह बहुत अच्छा होगा। धन्यवाद
कारल्स अल्कोलीआ

1
मैं कहूंगा कि बोली लगाने के लिए, डबल कोट और अनक्वॉट आपको करना चाहिएqw qd wq
nilon

किसी कारण के लिए, डबल शब्द "शब्द" की तरह अंत में अतिरिक्त उद्धरण
लौटाता है

@ShuaiWang शायद आपने ऑटोपेयर या कुछ इसी तरह का एक्सटेंशन स्थापित किया है? मेरे लिए उस बग को हटा देना।
नेफिलिम

2

VIM vs vs के लिए यह पर्याप्त नहीं है। यदि आप vscode का उपयोग नहीं करते हैं तो यह एक विम-सराउंड आधारित है ।

कुछ उदाहरण:

"टेस्ट" कोट के अंदर कर्सर के साथ सीएस टाइप करें '' को 'टेस्ट' के साथ समाप्त करें

परीक्षण के साथ समाप्त करने के लिए उद्धरण चिह्नों के अंदर कर्सर के साथ "परीक्षण"

"टेस्ट" उद्धरण चिह्नों के साथ सीएस टाइप करें "t> और 123> एंट्री के साथ <123> टेस्ट समाप्त करें

(परीक्षण) के साथ समाप्त करने के लिए शब्द परीक्षण प्रकार ysaw पर कर्सर के साथ परीक्षण (परीक्षण)


1

मैं अपने .vimrc में nnoremap का उपयोग कर रहा हूं

एक शब्द बोली के लिए:

nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl

उद्धरण हटाने के लिए (दोहरे उद्धरण चिह्नों पर भी काम करता है):

nnoremap qs :silent! normal mpeld bhd `ph<CR>

याद रखने का नियम: 'वर्ग' = एकल उद्धरण।


0

इस बारे में कैसा है?

 :%s/\'/"/g

2
यह कमांड पूरी फाइल पर काम करता है। मुझे सिर्फ एक शब्द बदलने की जरूरत है।
यूजीन यर्मश

4
इसके बिना %, यह केवल वर्तमान पंक्ति पर काम करेगा जब तक कि आपने पूरी फाइल को नहीं चुना है
एमिली

0

मैंने एक स्क्रिप्ट लिखी है जो ऐसा करती है:

function! WrapSelect (front)
    "puts characters around the selected text.
    let l:front = a:front
    if (a:front == '[')
        let l:back = ']'
    elseif (a:front == '(')
        let l:back = ')'
    elseif (a:front == '{')
        let l:back = '}'
    elseif (a:front == '<')
        let l:back = '>'
    elseif (a:front =~ " ")
        let l:split = split(a:front)
        let l:back = l:split[1]
        let l:front = l:split[0]
    else
        let l:back = a:front
    endif
    "execute: concat all these strings. '.' means "concat without spaces"
    "norm means "run in normal mode and also be able to use \<C-x> characters"
    "gv means "get the previous visual selection back up"
    "c means "cut visual selection and go to insert mode"
    "\<C-R> means "insert the contents of a register. in this case, the
    "default register"
    execute 'norm! gvc' . l:front. "\<C-R>\""  . l:back
endfunction
vnoremap <C-l> :<C-u>call WrapSelect(input('Wrapping? Give both (space separated) or just the first one: '))<cr>

उपयोग करने के लिए, बस कुछ हाइलाइट करें, नियंत्रण एल को हिट करें और फिर एक चरित्र लिखें। यदि यह उन पात्रों में से एक है, जिनके बारे में फ़ंक्शन जानता है, तो यह सही समाप्ति वर्ण प्रदान करेगा। यदि यह नहीं है, तो यह दोनों ओर सम्मिलित करने के लिए एक ही वर्ण का उपयोग करेगा।

चारों ओर से। इस से अधिक कर सकते हैं, लेकिन यह मेरी जरूरतों के लिए पर्याप्त था।


-1

दृश्य मोड मानचित्र उदाहरण पाठ के चयनित ब्लॉक के आसपास एकल उद्धरण जोड़ने के लिए:

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