vim r! कर्सर की स्थिति में


17

विम के साथ, अगर मैं उपयोग करता हूं

:r!date

vim अगली पंक्ति में, इसी तरह की तारीख डालें

:r!pwd

मैं कर्सर स्थिति के तहत आउटपुट कमांड कैसे डाल सकता हूं और नई लाइन में नहीं?


जवाबों:


16

" :read" के साथ विम हमेशा नई लाइन पर आउटपुट डालेगा। समाधान दुर्भाग्य से सरल नहीं है।

आप वर्तमान कर्सर स्थिति पर एक कमांड का आउटपुट सम्मिलित कर सकते हैं जब आप ControlRतब टाइप करके दबाते हैं =system('command')Enter। दुर्भाग्य से, यदि कमांड के आउटपुट में एक अनुगामी नईलाइन (जैसा कि सबसे अधिक इच्छाशक्ति) है, वह भी डाली जाएगी, इसलिए आपकी लाइन टूट जाएगी।

substitute()स्ट्रिपिंग न्यूलाइन्स के लिए कॉल को जोड़कर इसे ठीक किया जा सकता है, लेकिन इससे कमांड को अधिक परेशानी होती है, क्योंकि यह हाथ से टाइप करने लायक है।

अंतिम समाधान यह है कि किसी प्रकार की मैपिंग बनाई जाए, लेकिन इससे भी अधिक जटिल हो जाता है कि विम कैसे "कॉल फॉरवर्ड" को हैंडल करता है; जब आप कुछ ऐसा कर सकते हैं:

:nmap \e i<c-r>=substitute(system('date'),'[\r\n]*$','','')<cr><esc>

जहाँ मैपिंग में कमांड "हार्ड वायर्ड" है, आप ऐसा कुछ नहीं कर सकते:

:nmap \e i<c-r>=substitute(system(input('Command: ')),'[\r\n]*$','','')<cr><esc>

जहां आप उपयोगकर्ता को कमांड चलाने के लिए संकेत देने का प्रयास करते हैं, क्योंकि विम बस भ्रमित हो जाएगा, बीप करेगा, और इन्सर्ट मोड डालेगा।

इसलिए आपको कमांड को पहले चलाने के लिए संकेत देना होगा, इसे एक चर में संग्रहीत करना होगा, और फिर संसाधित आउटपुट डालना होगा। इस बिंदु पर एक सहायक फ़ंक्शन को संभवतः मानचित्रण को स्वयं को अव्यवस्थित रूप से गन्दा होने से बचाने के लिए आवश्यक है, इसलिए हम कुछ इस तरह से समाप्त करते हैं:

function InlineCommand()
    let l:cmd = input('Command: ')
    let l:output = system(l:cmd)
    let l:output = substitute(l:output, '[\r\n]*$', '', '')
    execute 'normal i' . l:output
endfunction

nmap <silent> \e :call InlineCommand()<CR>

ध्यान दें कि nmapमैपिंग बनाता है जो सामान्य मोड में टाइप होने पर ही निष्पादित होता है।

संयोग से, यदि आप केवल दिनांक या वर्तमान कार्यशील निर्देशिका सम्मिलित करना चाहते हैं, तो मैंने जो प्रारंभिक उत्तर दिया है वह संभव है। बस इन्सर्ट मोड डालें और टाइप करें ControlR=strftime('%c')Enterया ControlR=getcwd()Enter


क्या इसे हल करने के लिए चेन कमांड करना संभव होगा। : आर तिथि | : - | J या i \ n \ n ^ [-:! तिथि \ n -JJ
रोश

4

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

:.!date

यदि आप सटीक कर्सर स्थिति चाहते हैं, तो:

:let a=system("date") | let b=substitute(a,"[\r\n]*$","","g") | exec 'normal i'.b

लंबी कहानी छोटी: आपको स्थान बदलने की आवश्यकता है जिसके कारण आप ^ @ (शून्य वर्ण) से छुटकारा चाहते हैं, जिसे आप .s / \% x00 // g से भी बदल सकते हैं। यह कम पाइप वाला एक छोटा संस्करण है:

:exec 'normal i'.substitute(system("date"),"[\n]*$","","")

और यदि आप एक ही पंक्ति में विभिन्न बिंदुओं को बदलना चाहते हैं, तो आप टैग भी सेट कर सकते हैं:

इस पंक्ति को देखते हुए 1:

1 Date: <datehere> and also <datehere>

निष्पादित:

:let a=system("date") | exec ".s/<datehere>/".a."/g" | .s/\%x00//g

प्रतिस्थापन के बाद:

1 Date: jue ago 9 02:34:52 ART 2012 and also jue ago 9 02:34:52 ART 2012

Vim 7.2 पर परीक्षण किया गया


1

आप अपने .vimrc में इस तरह की चीज़ जोड़ सकते हैं:

" Insert the date in YYYY-MM-DD format inline just before cursor position (normal mode)
nnoremap <Leader>di me:r !date +\%F<CR>A <Esc>0D`ePJx
  • me वर्तमान स्थिति को चिह्नित करता है।
  • :r !date +\%F<CR>YYYY-MM-DD प्रारूप में अगली पंक्ति पर तारीख डालता है (आप इसे पसंद कर सकते हैं, लेकिन बस प्रत्येक के %साथ बच सकते हैं \)।
  • A <Esc> दिनांक आउटपुट के अंत में एक स्थान जोड़ता है।
  • 0Dदिनांक हटाता है, `eआपको वापस चिह्नित स्थिति में ले जाता है, और PJxदिनांक को कर्सर से पहले रखता है, लाइनों से जुड़ता है (नीचे दिए गए रिक्त स्थान से छुटकारा पाने के लिए) और अनुगामी स्थान को मारता है। जैसे ही आप फिट होते हैं, मैपिंग को संशोधित करें।

अगर आप इसे इन्सर्ट मोड से करना चाहते हैं, तो मैं इस रत्न को आज https://vimways.org/2018/the-mapping-biver/ पर पढ़ता हूं

inoremap <C-g><C-t> <C-r>=strftime("%F")<CR>

आप अपनी आवश्यकताओं के अनुरूप दिनांक आउटपुट को संशोधित कर सकते हैं ( man dateइसके साथ मदद कर सकते हैं)।


0

सामान्य मोड में (एस्केप / ब्लिप मोड) पेस्ट करें

:exec 'normal i'.system("date \| tr '\n' ' '")

वर्तमान स्थिति में सम्मिलित दिनांक प्राप्त करने के लिए। यदि आप उस लाइन को कैरिज-रिटर्न के साथ कॉपी करते हैं तो Shift + Insert आपका DateTime-Here कमांड बन जाता है।

इसके अतिरिक्त आप F12 को एक कमांड के साथ बांध सकते हैं

:inoremap <F12> <C-r>=system("date \| tr '\n' ' '")<CR>

तब आप फ़ंक्शन-की -12 के साथ दिनांक सम्मिलित कर सकते हैं, जबकि सम्मिलित मोड सक्रिय है। मैं उपयोग करता हूं

:inoremap DHRE <C-r>=system("date \| tr '\n' ' '")<CR>

(मैं ADHERE ट्रिगर के बाद पाकर डीएचआरई से बदल गया) क्योंकि मैं पहले से ही अन्य चीजों के लिए F12 का उपयोग करता हूं।

मैं उपयोग करता हूं

grep -iE "dhere" /usr/share/dict/words

मौजूदा शब्दों के साथ स्पष्ट झड़पों की जांच करने के लिए, जो सुझाव देते हैं कि आप उपयोग करने के लिए अपेक्षाकृत सुरक्षित हैं:

:inoremap PWD <C-r>=system("pwd \| tr '\n' ' '")<CR>

(जब तक आप कुछ दस्तावेज नहीं लिख रहे हैं।)

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