विम में एक आदेश का उपनाम


151

Vim जब मैं प्रोग्राम करता हूं, तो मेरा पसंदीदा टेक्स्ट एडिटर होता है और इस तरह मैं हमेशा एक विशेष रूप से कष्टप्रद मुद्दे पर चलता हूं।

अक्सर, जब मुझे जल्दी से बफर को बचाने और किसी अन्य विविध कार्य को जारी रखने की आवश्यकता होती है, तो मैं विशिष्ट कार्य करता हूं

:w

हालांकि, मैं - जो समय के 50% से अधिक की तरह प्रतीत होता है - हमेशा इसे भुनाने का प्रबंधन करता हूं :w। स्वाभाविक रूप से, विम मुझ पर चिल्लाता है क्योंकि Wएक अमान्य आदेश है

E492: Not an editor command: W

मेरा सवाल यह है कि कोई भी अन्य उपनिवेशवादी आदेशों का पालन कैसे कर सकता है । विशेष रूप से, आप कैसे उर्फ Wकरने के लिए अनुकरणीय सकता है w

मुझे कुछ आदेशों की चाबियाँ मैप करने की प्रक्रिया के बारे में पता है । दुर्भाग्य से, यह वह नहीं है जिसकी मुझे तलाश है।



1
से बचने के लिए :Wआप बचत करने के लिए एक नक्शे की कुंजी बना सकते हैं यदि आप Ctrl-s के साथ सहेजने वाले कुछ प्रोग्राम के लिए उपयोग किए जाते हैं, तो $ VIM / mswin.vim से ये मैपिंग हैं:" Use CTRL-S for saving, also in Insert mode noremap <C-S> :update<CR> vnoremap <C-S> <C-C>:update<CR> inoremap <C-S> <C-O>:update<CR>
mMontu

वी स्टैक एक्सचेंज में इसी तरह का प्रश्न: vi.stackexchange.com/q/2665/7244
फ़्लिक

जवाबों:


127

पूर्ण अछूता छोड़ने के लिए, उपयोग करने का प्रयास करें

cnoreabbrev W w

, यह Wकमांड लाइन के साथ बदल देगा w, लेकिन केवल अगर इसका न तो पालन किया जाता है और न ही शब्द चरित्र से पहले, इसलिए :W<CR>इसे बदल दिया जाएगा :w<CR>, लेकिन :Writeनहीं। (ध्यान दें कि यह उन आदेशों को प्रभावित करता है जो आप सहित मेल खाते हैं, जिसकी आप उम्मीद नहीं कर सकते हैं, उदाहरण के लिए कमांड :saveas W Zको बदल दिया जाएगा :saveas w Z, इसलिए इसके लिए सावधान रहें।)

अपडेट करें

यहाँ है कि मैं इसे अब कैसे लिखूंगा :

cnoreabbrev <expr> W ((getcmdtype() is# ':' && getcmdline() is# 'W')?('w'):('W'))

एक समारोह के रूप में:

fun! SetupCommandAlias(from, to)
  exec 'cnoreabbrev <expr> '.a:from
        \ .' ((getcmdtype() is# ":" && getcmdline() is# "'.a:from.'")'
        \ .'? ("'.a:to.'") : ("'.a:from.'"))'
endfun
call SetupCommandAlias("W","w")

यह जांचता है कि कमांड प्रकार क्या है :और कमांड है W, इसलिए यह सिर्फ सुरक्षित है cnoreabbrev W w


2
यह उत्तर मेरे लिए सबसे सुरक्षित और विश्वसनीय है।
सीन

2
यदि आप अनुशंसित समाधान का उपयोग करते हैं, तो कृपया अवगत :%s/W/foo/g<CR> :%s/w/foo/g<CR>
रहें

2
वास्तव में, इसका अर्थ है कि W को कमांड बार में कहीं भी प्रतिस्थापित किया जाएगा , उदाहरण के लिए, खोजों में, इसलिए s / W foo / bar / g को s / w foo / bar / g में बदल दिया जाएगा। यह वास्तव में तेजी से कष्टप्रद हो सकता है। एक व्यापक समाधान के लिए मेरा जवाब देखें।
हवाई

4
पूर्ण रूप से; यह एक भयानक विचार है। आप चाहिए कभी नहीं , कभी , कभी यह करते हैं।
क्रिस मॉर्गन

4
:cnoreabbrev <expr> W getcmdtype()==':'&&getcmdline()=~#'^W'?'w':'W'
केव।

97

पूरक खोज के साथ, मैंने पाया है कि किसी ने I के समान प्रश्न पूछा था ।

:command <AliasName> <string of command to be aliased>

चाल चलेगा।

कृपया ध्यान रखें कि, जैसा कि रिचो बताते हैं, उपयोगकर्ता कमांड को एक बड़े अक्षर से शुरू करना चाहिए।


5
उपयोग करना: कमांड अच्छा समाधान है। : cnoreabbrev cmd1 | cmd2 को नहीं समझता,: कमांड करता है।
पावेल स्ट्रखोव

1
इसे लिखने का एक कम भ्रमित तरीका है,:command AliasName string of command to be aliased
एलेक जैकबसन

8
इस संभाल नहीं होगा / आगे किसी भी commandतर्क, जैसे -nargs, -completeआदि
blueyed

किस बारे में :Q!या :W!?
जैक

5
बस बहुत शाब्दिक होने के लिए: फ़ाइल :command W wमें डाल दिया .vimrc
isomorphismes

20

मुझे लगता है कि ;कुंजी को मैप :करना एक बेहतर समाधान होगा, और आपको अन्य कमांड टाइप करने के लिए अधिक उत्पादक बना देगा।

nnoremap ; :
vnoremap ; :

यह विम के लिए सिंगल बेस्ट टिप है। मैं अब इसके लिए अभ्यस्त हो गया हूं कि हर बार जब मैं सामान्य व्यवहार का सामना करता हूं, तो मुझे अपने दिमाग को फिर से पाने के लिए कुछ प्रयास करने पड़ते हैं।
हवाई

यह सवाल का जवाब नहीं है।
फ्लिक

5
@ फीलम नहीं, लेकिन यह ओपी के मुद्दे को दूर कर देता है।
डंकन एक्स सिम्पसन

1
उपयोग करते समय tया f, आमतौर पर ;अगली घटना में जाने के लिए उपयोग किया जा सकता है। एक सुरक्षित रूप से नक्शा कर सकता है कि दूसरा तरीका, भले ही आप अर्धविराम को बृहदान्त्र में मैप करें। एक उपनाम लूप नहीं होगा। nnoremap : ;
लुक

9

सबसे अच्छा समाधान में संक्षिप्तीकरण के लिए एक कस्टम फ़ंक्शन लिखना शामिल है जो केवल कमांड बार की शुरुआत में होता है।

इसके लिए, अपनी vimrc फ़ाइल या अन्य कहीं भी जोड़ें।

" cabs - less stupidity                                                      {{{
fu! Single_quote(str)
  return "'" . substitute(copy(a:str), "'", "''", 'g') . "'"
endfu
fu! Cabbrev(key, value)
  exe printf('cabbrev <expr> %s (getcmdtype() == ":" && getcmdpos() <= %d) ? %s : %s',
    \ a:key, 1+len(a:key), Single_quote(a:value), Single_quote(a:key))
endfu
"}}}

 

" use this custom function for cabbrevations. This makes sure that they only
" apply in the beginning of a command. Else we might end up with stuff like
"   :%s/\vfoo/\v/\vbar/
" if we happen to move backwards in the pattern.

" For example:
call Cabbrev('W', 'w')

स्रोत सामग्री से कुछ उपयोगी संक्षिप्त विवरण जहाँ मुझे यह सामग्री मिली:

call Cabbrev('/',   '/\v')
call Cabbrev('?',   '?\v')

call Cabbrev('s/',  's/\v')
call Cabbrev('%s/', '%s/\v')

call Cabbrev('s#',  's#\v')
call Cabbrev('%s#', '%s#\v')

call Cabbrev('s@',  's@\v')
call Cabbrev('%s@', '%s@\v')

call Cabbrev('s!',  's!\v')
call Cabbrev('%s!', '%s!\v')

call Cabbrev('s%',  's%\v')
call Cabbrev('%s%', '%s%\v')

call Cabbrev("'<,'>s/", "'<,'>s/\v")
call Cabbrev("'<,'>s#", "'<,'>s#\v")
call Cabbrev("'<,'>s@", "'<,'>s@\v")
call Cabbrev("'<,'>s!", "'<,'>s!\v")

1
एक अंतर्निहित फ़ंक्शन string()है जो आपके समान काम करता है Single_quote()
ZyX

6

हो सकता है कि आप अपने फंक्शन कीज़ (F1..F12) में से किसी एक को मैप करना चाहें: w? फिर इसे अपने .vimrc में डालें:

noremap  <f1> :w<return>
inoremap <f1> <c-o>:w<return>

(सम्मिलित मोड में ctrl-o अस्थायी रूप से सामान्य मोड में स्विच करता है)।


6

मान लीजिए कि आप gvim में tabnew कमांड के लिए उपनाम जोड़ना चाहते हैं। आप अपनी .vimrc फाइल में निम्न कमांड टाइप कर सकते हैं (यदि होम फोल्डर में नहीं है तो एक बनाएं)

cabbrev t tabnew

1
इस तरह एक आदेश का कारण होगा :saveas t exampleके साथ प्रतिस्थापित किया:saveas tabnew example
Flimm

5

सबसे सुरक्षित और आसान है एक प्लगइन जैसे कि cmdalias.vim या मेरा हालिया अपडेट vim-alias जो इसे ध्यान में रखता है

  • पूर्ववर्ती ब्लैंक या संशोधक जैसे , :sil(ent)(!)या:redi(r)
  • '<,'>वर्तमान दृश्य चयन के लिए रेंज संशोधक ,
  • विशेष वर्ण जैसे कि उद्धरण और
  • यदि चयनित उपनाम एक मान्य कमांड लाइन संक्षिप्त नाम है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.