क्या यह पता लगाने का कोई तरीका है कि क्या मैं vimscript में रिकॉर्डिंग कर रहा हूं?


11

क्या ऐसा कुछ है?

eval("is_recording()")

अगर मैं वर्तमान में मैक्रो रिकॉर्ड कर रहा हूं, तो यह पता लगाने के लिए मैं अपनी विम्सस्क्रिप्ट में कॉल कर सकता हूं? मैंने सोचा होगा कि यह काम करता है:

eval("mode(1)")

लेकिन वह सिर्फ लौटता है "n"

यह निश्चित नहीं है कि क्या यह मायने रखता है, लेकिन मैं neovim का उपयोग कर रहा हूं, इसलिए यदि यह neovim के लिए अनन्य है, तो यह ठीक है।


3
IMHO यह एक बुरा विचार होगा - "रिकॉर्डिंग", उस मामले में, एक गलत नाम बन जाएगा :) पता नहीं कि आप क्या करने की कोशिश कर रहे हैं, लेकिन शायद यह पूछकर कि इसे हल करने के लिए अलग-अलग तरीके प्रदान किए जा सकते हैं।
वानलेसर

@VanLaser झूठे नाम से आपका क्या मतलब है?
जेम्स

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

जवाबों:


4

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

अब यहाँ एक समाधान है, यह शायद आदर्श नहीं है और निश्चित रूप से बहुत मजबूत नहीं है, लेकिन आप इन पंक्तियों को अपने साथ जोड़ सकते हैं .vimrc:

let g:isRecording = 0
nnoremap Q :call ToggleRecording()<CR>q

function! ToggleRecording()
    let g:isRecording = !g:isRecording
    echo "is recording " . g:isRecording
endfunction

विचार यह है कि "रिकॉर्डिंग मोड" qसामान्य रूप से दबाने पर विशेष रूप से टॉगल किया जाता है।

इसके आधार पर आप एक वैरिएबल बनाते हैं g:isRecordingजो हर बार जब आप रिकॉर्डिंग शुरू करते हैं या रोकते हैं तो टॉगल हो जाएगा। इस तरह जब आप रिकॉर्डिंग शुरू करते हैं तो रिकॉर्डिंग बंद करने के g:isRecordingलिए 1और 0कब सेट किया जाएगा । फिर आप चर के मान के माध्यम से रिकॉर्डिंग स्थिति तक पहुंच सकते हैं।

"दोष" यह है कि पुनरावर्ती मानचित्रण से बचने के लिए, आपको Shit-q रिकॉर्डिंग शुरू करने और इसके बजाय रिकॉर्डिंग को रोकने के लिए उपयोग करना होगा q(ध्यान दें कि यह इतनी बड़ी समस्या नहीं है: मैं shift-qकुछ समय के लिए रिकॉर्ड मोड का उपयोग कर रहा हूं क्योंकि मुझे मूल shift-qव्यवहार पसंद नहीं है)

इस समाधान की मुख्य समस्या यह है कि यदि आप इसके बारे में भूल गए और qचर का उपयोग नहीं किया जाएगा, लेकिन आप अक्षम नहीं कर सकते q(जैसे nnoremap q <nop>) क्योंकि अगर आप shift-qअब काम नहीं करेंगे।


2

यह एक बहुत ही उत्सुक अनुरोध है क्योंकि मैक्रो रिकॉर्ड करने के लिए कोई "मोड" नहीं है। कुछ डॉक्स के माध्यम से खुदाई करने के बाद मैंने निम्नलिखित में पायाusr_10

आप पहली पंक्ति के पहले चरित्र पर जाकर शुरू करते हैं। अगला आप निम्नलिखित कमांड निष्पादित करते हैं:

qa रजिस्टर में मैक्रो रिकॉर्ड करना शुरू करें a

^ लाइन की शुरुआत में जाएं।

i # में लाइन की शुरुआत में "स्ट्रिंग # किंकर्ड डालें" शामिल हैं।

$ पंक्ति के अंत में जाएं।

"पंक्ति के अंत में वर्ण दोहरा उद्धरण चिह्न (") जोड़ें।

j अगली पंक्ति पर जाएँ।

Q मैक्रो रिकॉर्ड करना बंद करें।

मेरे लिए स्टैंडआउट बात "रजिस्टर में मैक्रो दर्ज करना शुरू करें" के बारे में लाइन थी

चूंकि प्रत्येक मैक्रो डिफ़ॉल्ट रूप से एक रजिस्टर में सहेजा जा रहा है, मैं उम्मीद कर रहा था कि हम इसे :regसूची में देख पाएंगे । यह पता चला है कि यह एक आकर्षण की तरह काम करता है!

उदाहरण:

सामान्य मोड में: qaisomething<Esc>

और अंदर :regहम प्रवेश देखते हैं!

"a   isomething^[

उस ज्ञान के साथ आपको रजिस्टरों पर "जासूसी" करने में सक्षम होना चाहिए, यह पुष्टि करने के लिए कि एक मैक्रो रिकॉर्ड किया जा रहा है (प्रत्येक रिकॉर्डिंग पर एक नामित रजिस्टर का उपयोग करें [मैप qहमेशा एक ही रजिस्टर का उपयोग करने के लिए (या ऐसा कुछ))

यदि आप समस्याओं में भाग लेते हैं तो मुझे बताएं और मैं आपकी मदद करने की कोशिश करूंगा (क्योंकि यह कार्यक्षमता मेरे लिए भी नई है: D)

संपादित करें याक के दौरान उपयोग किए जा रहे एक रजिस्टर के मुद्दे को संबोधित करने के लिए, मैं एक विशेष प्रकार के रजिस्टर पर ध्यान देने की सिफारिश करूंगा, जिसका उपयोग आप केवल vimLआपके लिए लिख रहे हैं (कोई याक कभी रजिस्टर पर लगे होंगे "ay) ( )

यहाँ :help registersउपलब्ध रजिस्टरों पर जानकारी का एक सा है

दस प्रकार के रजिस्टर हैं: E354 को पंजीकृत करता है

  1. अनाम रजिस्टर ""

  2. 10 नंबर रजिस्टर्ड "0 से" 9

  3. छोटे हटाएं रजिस्टर "-

  4. 26 नाम रजिस्टरों "ए टू" जेड या "ए" से "जेड"

  5. केवल तीन ही रजिस्टर ":", ","%

  6. वैकल्पिक बफर रजिस्टर "#

  7. अभिव्यक्ति रजिस्टर "=

  8. चयन और ड्रॉप रजिस्टर "*," + और "~

  9. ब्लैक होल रजिस्टर "_

  10. अंतिम खोज पैटर्न रजिस्टर "/

यह मानते हुए कि आपके पास एक रजिस्टर है जिसे आप अब उपयोग करने जा रहे हैं, यह मुद्दा "मुझे कैसे पता चलेगा कि रिकॉर्डिंग कब बंद हो गई है?"। इस मैं की देखभाल करने के लिए पर एक नज़र था autocmd-eventके लिए CursorHold; हेल्प डॉक्स में नोट काफी आशाजनक लगता है (मैं यह पता लगाने की कोशिश करूंगा कि मैं सामान्य कर्सर को कैसे अलग कर सकता हूं बनाम निष्क्रिय / गैर-मौजूद घटना जो तब होती है जब आपका रजिस्टर मैक्रो के उद्देश्यों के लिए लिखा जा रहा है)

CursorHold

जब उपयोगकर्ता 'updatetime' के साथ निर्दिष्ट समय के लिए एक कुंजी नहीं दबाता है। तब तक दोबारा ट्रिगर नहीं किया जाता जब तक कि उपयोगकर्ता ने एक कुंजी दबा दी हो (यानी अगर आप कुछ कॉफी बनाने के लिए विम को छोड़ते हैं तो हर 'updatetime' को आग नहीं देता है। :) देखें | CursorHold-example टैग्स का पूर्वावलोकन करने के लिए। यह घटना केवल सामान्य मोड में चालू है। टाइप करने के लिए कमांड तर्क, या ऑपरेटर के बाद एक आंदोलन की प्रतीक्षा करते समय यह ट्रिगर नहीं होता है। रिकॉर्डिंग करते समय CursorHold ईवेंट ट्रिगर नहीं होता है। | क्ष |


मैं वास्तव में यह नहीं देखता कि यह समस्या कैसे हल करता है: जब आप अपने मैक्रो की रिकॉर्डिंग पूरी कर लेते हैं तो एक तार को रजिस्टर में सहेजा जाता है लेकिन जब रजिस्टर में एक मैक्रो होता है या जब इसमें उदाहरण के लिए yank कमांड से कुछ आता है तो आप कैसे अंतर करते हैं। जब आप रिकॉर्डिंग समाप्त करते हैं तब भी रजिस्टर को एक शॉट के रूप में सहेजा जाता है ताकि आप देख सकें कि रजिस्टर की सामग्री बदल गई है आप अब रिकॉर्डिंग मोड में नहीं हैं।
statox

मेरी आशा थी कि आप ब्लैकहोल रजिस्टर (एक ऐसा रजिस्टर जो पहले कभी नहीं जा रहा है) का उपयोग करने में सक्षम होंगे। यदि आपके पास उस रजिस्टर को बंद कर दिया गया है, तो आप CursorHold को चेकआउट कर सकते हैं, जो रिकॉर्डिंग मोड में होने पर कुछ विशेष व्यवहार करता है (यह देखने के लिए मेरे उत्तर को कुछ और जानकारी के साथ अपडेट करेगा कि क्या यह आपकी मदद करता है)
दान ब्रैडबरी

अन्य रजिस्टरों पर कुछ जानकारी जोड़ी (यान के साथ टकराव से बचने का तरीका) और इस बात पर एक संकेत दिया कि कैसे हम CursorHold को मैक्रो रिकॉर्डिंग के दौरान सक्रिय नहीं होने के साथ "रिकॉर्डिंग" को पकड़ने में सक्षम हो सकते हैं। अगर आप उन नोटों के बाद भी इसे लड़ रहे हैं तो मुझे बताएं और मैं काम खत्म होने के बाद इसे लागू करने की कोशिश कर सकता हूं। एक नोट के रूप blackhole registerमें केवल एक संकेत और एक दिलचस्प विम टिडबिट के रूप में उल्लेख किया गया था जो कुछ को जन्म दे सकता है (मैक्रोज़ रिकॉर्ड करते समय इसका उपयोग करना उपयोगी नहीं होगा; जैसा कि @_ प्रयोग करने योग्य नहीं है।) वास्तव में आप मैक्रो को बचाने का प्रयास भी नहीं कर सकते। इसे ..
डैन ब्रैडबरी

मैंने पिछली रात इस पर कुछ समय बिताया (बियर कीबोर्ड पोस्ट स्मैशिंग) और पाया कि रिकॉर्डिंग होने और समाप्त होने पर वास्तव में यह पता लगाना मुश्किल है। वास्तव में हो रहा है (यह देखने के लिए हर समय होने वाली एक साधारण वैश्विक वेतन वृद्धि) CursorHoldके अंतराल के कारण मेरा कूबड़ एक असंभव सपना लगता है CursorHold। अभी भी अविश्वसनीय रूप से ऐसा करने के तरीके के साथ आने में दिलचस्पी है और जब तक हमारे पास समाधान नहीं होता है, तब तक मैं अपने चेहरे को मुंहतोड़ जवाब दूंगा ..
डैन ब्रैडबरी

मेरी राय में आपके पास एक हजार अलग-अलग विकल्प नहीं हैं: आपको व्यवहार को ओवरराइड qकरना होगा और इसे एक चर को चालू करना होगा और रिकॉर्डिंग शुरू / रोकना होगा। एक ऑटोकॉमैंड यहां विश्वसनीय नहीं हो सकता है क्योंकि कोई भी ऑटोकेम एक प्रमुख प्रेस पर ट्रिगर नहीं करता है, और विम के नीरस स्वभाव के कारण मतदान कार्य करना संभव नहीं है। अपने भविष्य के प्रयोगों के साथ :-) गुड लक
statox
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.