अनडू (पूर्ववत)

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

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

पूर्ववत कार्यक्षमता के सामान्य घटक वे आदेश हैं जो उपयोगकर्ता द्वारा निष्पादित किए गए थे, इतिहास बफ़र जो पूर्ण किए गए कार्यों को संग्रहीत करता है, इतिहास बफ़र को नियंत्रित करने के लिए पूर्ववत/फिर से करें प्रबंधक, और उपयोगकर्ता के साथ इंटरैक्ट करने के लिए उपयोगकर्ता इंटरफ़ेस। अधिकांश Microsoft Windows अनुप्रयोगों में, पूर्ववत कमान कुंजी  लिए  कुंजीपटल संक्षिप्त रीति  Control-Z|Ctrl+Z या Alt+Backspace है, और फिर से करने के लिए शॉर्टकट Control-Y|Ctrl+Y या Control key+Shift key+Z है।

अधिकांश Apple macintosh अनुप्रयोगों में, अनडू कमांड का शॉर्टकट कमांड की-जेड है, और रीडो के लिए शॉर्टकट कमांड की-शिफ्ट की-जेड है।

सभी प्लेटफॉर्म पर, पूर्ववत/फिर से करें कार्यों को संपादन मेनू के माध्यम से भी एक्सेस किया जा सकता है।

इतिहास
लोगों द्वारा कंप्यूटर का उपयोग करने के तरीके के जवाब में कंप्यूटर पर किसी ऑपरेशन को पूर्ववत करने की क्षमता का स्वतंत्र रूप से कई बार आविष्कार किया गया था। ब्राउन विश्वविद्यालय में 1968 में शुरू हुई  फ़ाइल पुनर्प्राप्ति और संपादन प्रणाली  के बारे में कहा जाता है कि यह पहली कंप्यूटर-आधारित प्रणाली है, जिसमें अनडू फीचर है। वारेन टिटेलमैन ने 1971 तक पूर्ववत कार्य के साथ BBN-LISP के भाग के रूप में एक प्रोग्रामर सहायक विकसित किया। ज़ेरॉक्स PARC ब्रावो (सॉफ्टवेयर) टेक्स्ट एडिटर के पास 1974 में एक अनडू कमांड था। आईबीएम के लांस ए. मिलर और जॉन सी. थॉमस की 1976 की एक शोध रिपोर्ट, इंटरएक्टिव सिस्टम के उपयोग में व्यवहारिक मुद्दे, नोट किया गया कि यह उपयोगकर्ताओं को कम से कम तत्काल पूर्ववर्ती आदेश (कुछ विशेष 'पूर्ववत करें' आदेश जारी करके) 'वापस लेने' की अनुमति देने के लिए काफी उपयोगी होगा। PARC (कंपनी) अनुसंधान केंद्र के प्रोग्रामरों ने कीबोर्ड शॉर्टकट Ctrl-Z को पूर्ववत आदेश दिया, जो व्यक्तिगत कंप्यूटर युग में पाठ संपादकों और वर्ड प्रोसेसर की एक महत्वपूर्ण विशेषता बन गई। 1980 में, ज़ेरॉक्स PARC के लैरी टेस्लर ने Apple कंप्यूटर में काम करना शुरू किया। वहाँ, उन्होंने और बिल एटकिंसन ने Apple लिसा पर एक मानक स्थिरता के रूप में एक पूर्ववत आदेश की उपस्थिति की वकालत की। एटकिन्सन लिसा के एप्लिकेशन सॉफ़्टवेयर के व्यक्तिगत डेवलपर्स को पूर्ववत और फिर से करने के एकल स्तर को शामिल करने में सक्षम था, लेकिन कई स्तरों के लिए पैरवी करने में असफल रहा। जब Apple ने लिसा के उत्तराधिकारी, Macintosh को पेश किया, तो यह निर्धारित किया गया कि सभी मानक अनुप्रयोगों में "संपादन" मेनू में पहले आदेश के रूप में "पूर्ववत करें" शामिल होना चाहिए, जो आज तक macOS और Windows पर मानक बना हुआ है।

बहु-स्तरीय पूर्ववत आदेश 1980 के दशक में पेश किए गए थे, जिससे उपयोगकर्ता न केवल सबसे हालिया बल्कि कई कार्यों को वापस ले सकते थे। व्यक्तिगत कंप्यूटर सॉफ़्टवेयर से पहले EMACS और अन्य टाइमशेयर स्क्रीन संपादकों के पास यह था। सिग्नस एड पहला अमीगा पाठ संपादक था जिसमें असीमित पूर्ववत / फिर से सुविधा थी। AtariWriter, 1982 में पेश किया गया एक वर्ड-प्रोसेसिंग एप्लिकेशन, पूर्ववत चित्रित किया गया। NewWord, 1984 में NewStar द्वारा जारी किया गया एक अन्य वर्ड-प्रोसेसिंग प्रोग्राम था, जिसमें एक अनरेज़ कमांड था। IBM के VisiWord के पास एक अनडिलीट कमांड भी था।

मॉडल पूर्ववत करें और फिर से करें
पूर्ववत मॉडल को रैखिक या गैर-रैखिक के रूप में वर्गीकृत किया जा सकता है। गैर-रैखिक पूर्ववत मॉडल को स्क्रिप्ट मॉडल, यूएस के मॉडल, ट्रायडिक मॉडल और चयनात्मक पूर्ववत में उप-वर्गीकृत किया जा सकता है।

मॉडल के कुछ सामान्य गुण हैं:


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

रैखिक पूर्ववत करें
रैखिक पूर्ववत एक स्टैक (डेटा संरचना) (आखिरी में पहले बाहर (एलआईएफओ) डेटा संरचना) के साथ कार्यान्वित किया जाता है जो सभी निष्पादित आदेशों का इतिहास संग्रहीत करता है। जब कोई नया आदेश निष्पादित किया जाता है तो इसे स्टैक के शीर्ष पर जोड़ दिया जाता है। इसलिए, केवल अंतिम निष्पादित कमांड को पूर्ववत किया जा सकता है और इतिहास से हटाया जा सकता है। पूर्ववत तब तक दोहराया जा सकता है जब तक कि इतिहास खाली न हो।

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

गैर रेखीय पूर्ववत
रैखिक पूर्ववत और गैर-रैखिक पूर्ववत के बीच मुख्य अंतर यह है कि उपयोगकर्ता द्वारा निष्पादित आदेशों को मनमाने क्रम में पूर्ववत करने की संभावना है। उनके पास सबसे हालिया आदेश को पूर्ववत करने का मौका नहीं है बल्कि सूची से एक आदेश का चयन करने का मौका है। गैर रेखीय मॉडल के लिए उपवर्ग हैं जो इस मॉडल को लागू करते हैं।

स्क्रिप्ट मॉडल
स्क्रिप्ट मॉडल उपयोगकर्ता क्रियाओं को कमांड की स्क्रिप्ट संपादित करने के रूप में संभालता है। निष्पादित आदेशों की इतिहास सूची को एक स्क्रिप्ट के रूप में व्याख्या की जाती है, एक पूर्ववत प्रभाव को उसी तरह परिभाषित किया जाता है जैसे कि पूर्ववत कार्रवाई पहले कभी नहीं हुई थी। राज्य को पूर्ववत करने के परिणाम के रूप में ऐसा होना चाहिए जैसे कि पूर्ववत आदेश को कभी निष्पादित नहीं किया गया था। इस मॉडल का एक नुकसान यह है कि साइड इफेक्ट से बचने के लिए उपयोगकर्ता को पूर्ववत आदेश और वर्तमान स्थिति के बीच संबंध को जानना होगा। इनमें से एक उदाहरण के लिए दोहराव हो सकता है। अन्य समस्याएँ यह हैं कि यदि बाद के आदेशों को एक अलग स्थिति में फिर से किया जाता है कि वे मूल रूप से प्रत्यक्ष हेरफेर इंटरफेस में निष्पादित किए गए थे, तो मूल उपयोगकर्ता क्रिया की यह पुनर्व्याख्या हमेशा स्पष्ट या अच्छी तरह से परिभाषित नहीं होती है।

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

ट्रायडिक मॉडल
इस गैर-रैखिक पूर्ववत मॉडल में घुमाने की संभावना पूर्ववत और फिर से करने के अलावा है। इसकी एक ही डेटा संरचना है जो उपर्युक्त मॉडल के रूप में एक इतिहास सूची और एक अलग रीडो सूची है जिसमें रीडो ऑपरेशन शामिल हैं। रोटेट ऑपरेशन उसके सामने रीडो लिस्ट की आखिरी कमांड सेट करता है। एक तरफ इसका मतलब यह है कि अगली कमांड को फिर से करने के लिए इसे सामने रखकर चुना जा सकता है। दूसरी ओर, रोटेशन का उपयोग रीडो सूची में उस स्थान का चयन करने के लिए किया जा सकता है जहां अगला पूर्ववत ऑपरेशन कमांड डालेगा। इसलिए रीडो की सूची अनियंत्रित है। एक पृथक आदेश को पूर्ववत करने के लिए, उपयोगकर्ता को कई चरणों को पूर्ववत करना होगा, फिर से करें सूची को घुमाना होगा और फिर कई चरणों को फिर से करना होगा। फिर से करने के लिए सूची को तब तक घुमाना पड़ता है जब तक वांछित आदेश ऊपर न हो।

चयनात्मक पूर्ववत करें
जकुबेक एट अल। कहते हैं कि चयनात्मक पूर्ववत एक विशेषता है जो एक मॉडल पेश कर सकता है लेकिन चयनात्मक पूर्ववत के लिए कोई स्पष्ट परिभाषा नहीं है। लेखकों ने उन कार्यों का चयन किया जो एक मॉडल के पास होना चाहिए जब वह चयनात्मक पूर्ववत का समर्थन करता है। इतिहास बफ़र में किसी भी निष्पादित क्रिया को पूर्ववत करना संभव होना चाहिए। पूर्ववत की जा रही कार्रवाई से स्वतंत्र क्रियाओं को अछूता छोड़ देना चाहिए। ठीक वैसे ही किसी भी पूर्ववत आदेश के लिए फिर से करना संभव है। चयनात्मक पूर्ववत के लिए तीसरा कार्य यह है कि प्रत्यक्ष उपयोगकर्ता के अनुरोध के बिना इतिहास बफ़र से कोई भी आदेश स्वचालित रूप से खारिज नहीं किया जा सकता है। चयनात्मक पूर्ववत के लिए लागू होता है कि पूर्ववत और फिर से करना किसी भी संदर्भ के बाहर निष्पादन योग्य है। तीन मुख्य मुद्दे हैं। पहला यह है कि पूर्ववत आदेश मूल संदर्भ से बाहर हो सकते हैं। इसके माध्यम से मृत संदर्भ हो सकते हैं जिन्हें संभालना होगा। दूसरा मुद्दा यह है कि संशोधित आदेशों को पूर्ववत किया जा सकता है और इसलिए इसे हल करना होगा कि पूर्ववत करने के बाद कौन सी स्थिति प्रस्तुत की जाएगी। तीसरा मुद्दा कमांड की समस्याओं को दूर कर रहा है। चयनात्मक पूर्ववत का सूचियों में कोई संकेतक नहीं है, इसलिए इसका मतलब है कि स्टैक से कोई आदेश नहीं छोड़ा जाना चाहिए।

प्रत्यक्ष चयनात्मक पूर्ववत करें
प्रत्यक्ष चयनात्मक पूर्ववत एक इतिहास वृक्ष के साथ प्रतिबंधित रेखीय पूर्ववत का विस्तार है। ऑपरेशन चयनित कमांड की एक प्रति बनाता है, इसे निष्पादित करता है और इसे इतिहास सूची में जोड़ता है। वहाँ दो गैर-रैखिक संचालन चयनात्मक पूर्ववत और चयनात्मक फिर से परिभाषित किए गए हैं, इसलिए यह अधिक सममित है।

बहुउपयोगकर्ता अनुप्रयोग
जब एकाधिक उपयोगकर्ता एक ही दस्तावेज़ को एक साथ संपादित कर सकते हैं, तो बहु-उपयोगकर्ता पूर्ववत करने की आवश्यकता होती है। वैश्विक बहु-उपयोगकर्ता पूर्ववत दस्तावेज़ में की गई नवीनतम क्रिया को पूर्ववत करता है, भले ही संपादन किसने किया हो। स्थानीय बहु-उपयोगकर्ता पूर्ववत केवल स्थानीय उपयोगकर्ता द्वारा किए गए कार्यों को पूर्ववत करता है, जिसके लिए गैर-रैखिक पूर्ववत कार्यान्वयन की आवश्यकता होती है।

जहां पूर्ववत का उपयोग कई संपादनों के माध्यम से बैकट्रैक करने के लिए किया जा सकता है, फिर से करें आदेश क्रिया इतिहास के माध्यम से आगे बढ़ता है। नया संपादन करने से आमतौर पर फिर से की जाने वाली सूची साफ़ हो जाती है। यदि एक ब्रांचिंग रीडो मॉडल का उपयोग किया जाता है, तो नया संपादन क्रिया इतिहास को शाखाबद्ध करता है।

पूर्ववत की जा सकने वाली पिछली कार्रवाइयों की संख्या प्रोग्राम, संस्करण और हार्डवेयर या सॉफ़्टवेयर क्षमताओं के अनुसार भिन्न होती है। उदाहरण के लिए, Adobe Photoshop में डिफ़ॉल्ट पूर्ववत करें/फिर से करें स्टैक आकार 20 है लेकिन उपयोगकर्ता द्वारा इसे बदला जा सकता है। दूसरे उदाहरण के रूप में, पहले Microsoft पेंट के संस्करणों को पूर्ववत करने के लिए केवल तीन संपादनों तक की अनुमति है; विंडोज 7 में पेश किए गए संस्करण ने इस सीमा को बढ़ाकर 50 कर दिया।

सरलीकृत, एकल-संपादन पूर्ववत सुविधाएँ कभी-कभी पूर्ववत कमांड को पूर्ववत की जा सकने वाली क्रिया के रूप में मानकर फिर से करना बंद कर देती हैं। इसे फ्लिप पूर्ववत मॉडल के रूप में जाना जाता है, क्योंकि उपयोगकर्ता पूर्ववत आदेश का उपयोग करके दो प्रोग्राम राज्यों के बीच फ़्लिप कर सकता है। 1990 के दशक की शुरुआत में बहु-स्तरीय पूर्ववत के व्यापक रूप से अपनाने से पहले यह मानक मॉडल था।

कार्यान्वयन पूर्ववत करें
पूर्ववत विभिन्न पैटर्न के माध्यम से लागू किया जा सकता है। कमांड पैटर्न और स्मृति चिन्ह पैटर्न  सबसे आम पैटर्न हैं।

कमांड पैटर्न
कमांड पैटर्न एक सॉफ्टवेयर डिजाइन पैटर्न है जो ऑपरेशन से कमांड ऑब्जेक्ट में जानकारी को एनकैप्सुलेट करता है। इसका मतलब है कि हर क्रिया एक वस्तु में संग्रहित होती है। सार कमांड वर्ग एक अमूर्त निष्पादन ऑपरेशन को लागू करता है, इसलिए प्रत्येक कमांड ऑब्जेक्ट में एक निष्पादन ऑपरेशन होता है। अनडू के लिए अनएक्सक्यूटेड ऑपरेशन भी होना चाहिए, जो निष्पादित कमांड के प्रभाव को पूर्ववत करता है, जो एक इतिहास सूची में संग्रहीत होते हैं। पूर्ववत और फिर से लागू किया जाता है ताकि सूची को आगे और पीछे से चलाया जा सके जब निष्पादित या अन-निष्पादित आदेश कहा जाता है। एकल पूर्ववत करने के लिए केवल निष्पादित आदेश संग्रहीत किया जाता है। बहु स्तरीय पूर्ववत के विपरीत जहां न केवल आदेशों के साथ इतिहास सूची सहेजी जाती है बल्कि पूर्ववत स्तरों की संख्या भी सूची की अधिकतम लंबाई निर्धारित की जा सकती है।

मेमेंटो पैटर्न
मेमेंटो पैटर्न के साथ किसी वस्तु की आंतरिक स्थिति को संग्रहित किया जाता है। जिस वस्तु में राज्य को सहेजा जाता है, उसे स्मृति चिन्ह कहा जाता है और स्मृति चिन्ह प्रवर्तक के माध्यम से आयोजित किया जाता है। यह एक स्मृति चिन्ह लौटाता है, वर्तमान स्थिति की जानकारी के साथ आरंभ किया जाता है, जब पूर्ववत निष्पादित किया जाता है, ताकि राज्य की जाँच की जा सके। स्मृति चिन्ह केवल प्रवर्तक के लिए दृश्यमान है।

मेमेंटो पैटर्न में अनडू मैकेनिज्म को केयरटेकर कहा जाता है। यह स्मृति चिन्हों को सुरक्षित रखने के लिए जिम्मेदार है लेकिन इनकी सामग्री को कभी नहीं बदलें। पूर्ववत करने के लिए कार्यवाहक प्रवर्तक के एक स्मृति चिन्ह का अनुरोध करता है और फिर पूर्ववत आवेदन करता है।

पूर्ववत तंत्र का अधिकांश भाग विशिष्ट अनुप्रयोगों या कमांड वर्गों पर निर्भरता के बिना कार्यान्वित किया जा सकता है। इसमें इतिहास सूची का प्रबंधन, इतिहास स्क्रॉलर, पूर्ववत और फिर से करने के लिए मेनू प्रविष्टियाँ और अगले उपलब्ध कमांड के नाम के आधार पर मेनू प्रविष्टियों का अद्यतन शामिल है।

प्रत्येक कमांड क्लास में एक डू विधि होती है जिसे कमांड निष्पादित होने पर कहा जाता है। अनडू-मेथड डू-मेथड के रिवर्स ऑपरेशन को लागू करता है। रिवर्स को लागू करने के लिए कई अलग-अलग रणनीतियां हैं।


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

यह भी देखें

 * प्रतिवर्ती कंप्यूटिंग
 * रोलबैक (डेटा प्रबंधन)
 * हटाना
 * संस्करण नियंत्रण (देशी और विदेशी प्रारूप)

बाहरी संबंध

 * The Age of Undoing - Article about the linguistic history of Undo at The New York Times Magazine.
 * Cascading undo control - a paper focused on what is cascading undo and how it might be presented to users