vim: सबमक्रो में त्रुटि के बाद मैक्रो जारी रखें?


15

मैं विम का उपयोग करके कुछ स्रोत कोड को सुशोभित करने की प्रक्रिया में हूं। {1}

मैंने vim macros की एक जोड़ी बनाई है जो अलग-अलग चरणों को करती है: ट्रेलिंग व्हिपस्पेस को हटाकर, खाली लाइनों को {हटाने के बाद , खाली लाइनों को हटाने से पहले {, उस तरह का सामान।

अब, मैं एक मैक्रो बनाना चाहता हूं जो सभी व्यक्तिगत मैक्रोज़ को अनुक्रम में निष्पादित करता है। हालांकि, एक बार पहली बार पुनरावर्ती मैक्रो समाप्त हो जाता है (क्योंकि यह अब कोई मैच नहीं मिल सकता है -> मिलान त्रुटि), मेरे "रैपर" मैक्रो की समाप्ति भी।

वहाँ एक रास्ता बनाने के लिए एक vim मैक्रो जारी रखने के बाद एक submacro एक त्रुटि उत्पन्न होती है?

{1} मैं स्वचालित सुधारकों के बारे में जानता हूं । मैं अपनी वर्तमान समस्या पर उनका उपयोग भी कर सकता हूं। मैंने केवल उदाहरण के लिए स्रोत में सुधार का उल्लेख किया है। इस स्रोत ब्यूटिफायर या उस बारे में कोई उत्तर न दें । यह प्रश्न प्रति सत्र कोड सुधार के बारे में नहीं है , बल्कि विम मैक्रोज़ के बारे में है।

उदाहरण:

  • मैक्रो 1 - ट्रिमिंग ट्रेलिंग व्हाट्सएप - qw/\s\+$d$@wq
  • मैक्रो 2 -} से पहले खाली लाइनों को हटाना qe/\n\n *}dd@eq
  • रैपर मैक्रो - रीटैबिंग, मैक्रो 1, मैक्रो 2 - qr:retab@w@eq

जब मैं आवरण को निष्पादित करता हूं - @r- यह फिर से शुरू हो जाएगा, तब मैक्रो 1 को निष्पादित करें जब तक कि अधिक पीछे वाले व्हाट्सएप नहीं मिलते हैं, तब समाप्त करें ( मैक्रो 2 को निष्पादित किए बिना )।

स्पष्टीकरण:

मैं क्या देख रहा हूँ कि एक सबमैक्रो को कैसे कॉल किया जाए ताकि जब सबमैक्रो समाप्त हो जाए, तो कॉलिंग मैक्रो जारी रहे?

जवाबों:


12

मेरा सुझाव है कि आप :tryसबमरो की त्रुटि को "अवशोषित" करने के लिए उपयोग करें।

यहाँ एक मूर्खतापूर्ण उदाहरण है:

:let @a='f|dt|@a'
:let @q=':try|exe "norm! @a"|endtry^Mj0@q'
@q

आपका रैपर मैक्रो कुछ इस तरह दिखेगा:

let @r=':retab^M:try|exe "norm! @w"|endtry|try|exe "norm! @e"|endtry^M'

जबकि गैरीजोन ने एक सबमरो में त्रुटि नहीं होने के लिए एक समाधान प्रदान किया , यह एकमात्र उत्तर है जो वास्तव में ऐसी त्रुटि को संभालता है । मुझे हालांकि माफी मांगनी होगी; आपने (अब समय सीमा समाप्त) इनाम पाने के लिए मैंने आपके उत्तर की समय-समय पर जाँच नहीं की ... :((
DevSolar

26

यदि फेलिंग कमांड एक प्रतिस्थापन है जो अपने पैटर्न को नहीं ढूंढ रहा है, जैसे,

:%s/foo/bar/

जब fooबफर में मौजूद नहीं होता है, तो आप eउस त्रुटि को अनदेखा करने के लिए ध्वज को जोड़ सकते हैं , जैसे,

:%s/foo/bar/e

देख

:help :s_flags

आप कुछ से त्रुटियों को अनदेखा करने के लिए विम को बता सकते हैं: पूर्व आदेश उनके साथ पूर्ववर्ती करके :silent!। देख

:help :silent


प्रश्न में उदाहरण के जोड़ के बाद संपादित करें

मैक्रो 1 और मैक्रो 2 दोनों पुनरावर्ती हैं और न ही पुनरावृत्ति को समाप्त करने के लिए कोई स्पष्ट तंत्र है। मेरा अनुमान है कि असीमित पुनरावृत्ति के लिए विम के आंतरिक परीक्षणों में से एक को ट्रिगर किया जा रहा है, जो एक त्रुटि उत्पन्न करता है। यदि मैक्रो 1 ऐसी त्रुटि उत्पन्न कर रहा है, तो वह त्रुटि सही समय के बाद रैपर मैक्रो के निष्पादन को समाप्त कर देगी @w

मेरा सुझाव होगा कि आपके मैक्रों को जितनी बार दोबारा लिखा जाए, उतने समय तक उन्हें सीमित किया जाए: पूर्व कमांड और उन लाइनों की सीमा को सीमित करें जिन पर वे निष्पादित होते हैं। उदाहरण के लिए:

qw:%s/\s\+$//^Mq
qe:%s/\n\n *}/\r}/^Mq

जहां ^Mआपका टाइप या रिटर्न कुंजी टाइप करना है। मैंने आपके रैपर मैक्रो में एक साथ परीक्षण नहीं किया है, लेकिन मुझे लगता है कि आप किसी भी गलती को ठीक करने में सक्षम होंगे जो मैंने किया है।


यह मेरे मामले में एक प्रतिस्थापन नहीं है, लेकिन एक साधारण खोज (यानी, /foo) है। जबकि :silent!वास्तव में पुनरावर्ती सबमैक्रो की चाल ने रैपर मैक्रो को निरस्त नहीं किया था, अब सबमैक्रो बिल्कुल भी समाप्त नहीं होता है ... और मुझे संदेह है कि इसे किसी तरह फिर से समाप्त करने से फिर से आवरण मैक्रो भी समाप्त हो जाएगा। लगता है जैसे मैं फँस गया हूँ। : - \
DevSolar

यह कहना मुश्किल है कि आपके द्वारा उपयोग किए जा रहे मैक्रोज़ को देखे बिना क्या गलत हो सकता है, या एक साधारण उदाहरण जो उसी समस्या को प्रदर्शित करता है।
garyjohn

एक उदाहरण और जोड़ा।
DevSolar

2

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

nnoremap <leader>rt :silent! %s/\s\+$//e<CR>
let @r='\rt'
let @t=':try|silent! exe "norm! @r"|endtry|w^M'

मुझे लगता है कि silent!में <leader>rt, और के बीच पाइप वर्ण endtryऔर wकुंजी थे - बस के बाद लाइन ब्रेक होने endtryमें विफल रहा है। tryरों काम किया जब मैं सिर्फ उन्हें डालना होगा, लेकिन जब कोई मैक्रो के रूप में चलाने खोज पाठ के बारे में त्रुटि नहीं मिला था उठाया जा रहा रखने होगा।


1

जब मैं कई फाइलों के बीच दोहराव वाला काम करने की आवश्यकता होती है, तो मैं नियमित रूप से मैक्रोज़ ऑन-द-फ्लाई बनाता हूं। मेरे मामले में, मेरे पास NIMDtree ( http://www.vim.org/scripts/script.php?script_id=1658 ) VIM में स्थापित है, जो एक vsplitविंडो बनाते हैं, और बाईं ओर, मेरे पास सभी फ़ाइलों की एक सूची है वर्तमान निर्देशिका। एक उदाहरण में, मुझे MY_TESTफ़ाइल में स्ट्रिंग का पहला उदाहरण खोजने की आवश्यकता है , और फिर हटाएं, यदि मौजूद है, तो CUSTOM_PREFIX-उस लाइन से लेबल किया गया एक उपसर्ग , फ़ाइल को सहेजें, फिर अगले पर जाएं।

यहां बताया गया है कि वर्तमान निर्देशिका में मेरे पास लगभग 2000 फ़ाइलों पर यह मैक्रो कैसे है। मैं ऐसा करने के लिए बैश स्क्रिप्ट लिख सकता था, लेकिन यह मेरे मामले में वीआईएम में तेज है। +अर्थ है कुंजी दबाया जा रहा सिमुल

# Start recording a macro sequence to register 'A'

q,a

# Search silently for the string "MY_TEST"; DO NOT report an error
# if the string could not be found.
:silent! /MY_TEST


# Replace, on just the current line, the string "CUSTOM_PREFIX-", with
# nothing (ie: delete it), and suppress any warning messages if the
# string could not be found on the current line.
:s/CUSTOM_PREFIX-//e


# Now issue some UI commands. CTRL-W then and arrow key lets you hope
# between tabs/splits/windows within vim.

CTRL+ W,

# Scroll down to the next file in the list in NERDtree



# Open the next file

ENTER

# End the macro

q

# Run the macro a thousand times in VIM

1000 @,a

उम्मीद है की यह मदद करेगा!

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