2009-02-17 11 views
12

संपादित करें: मुझे लगता है कि कीबोर्ड-छोड़ने वाला है (जो आमतौर पर सी-जी से बंधे होते हैं); लेकिन मुझे यह जानने में अधिक दिलचस्पी है कि एएमएक्स (इस मामले में) के साथ आने वाले संपादन कार्यों से कैसे निपटता है। मैं समय-समय पर इस तरह की स्थितियों में भाग लेता हूं जब मैं कुछ बिल्ड-इन फ़ंक्शंस को बदलना चाहता हूं।, कीबोर्ड-से बचने के लिए सबसे अच्छा तरीका क्या है- अन्य विंडो को नष्ट न करें?

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

(defun keyboard-escape-quit() 
    "Exit the current \"mode\" (in a generalized sense of the word). 
This command can exit an interactive command such as `query-replace', 
can clear out a prefix argument or a region, 
can get out of the minibuffer or other recursive edit, 
cancel the use of the current buffer (for special-purpose buffers), 
or go back to just one window (by deleting all but the selected window)." 
    (interactive) 
    (cond ((eq last-command 'mode-exited) nil) 
    ((> (minibuffer-depth) 0) 
    (abort-recursive-edit)) 
    (current-prefix-arg 
    nil) 
    ((and transient-mark-mode mark-active) 
    (deactivate-mark)) 
    ((> (recursion-depth) 0) 
    (exit-recursive-edit)) 
    (buffer-quit-function 
    (funcall buffer-quit-function)) 
    ((not (one-window-p t)) 
    (delete-other-windows)) 
    ((string-match "^ \\*" (buffer-name (current-buffer))) 
    (bury-buffer)))) 

और मैं देख सकता हूँ कि मैं लाइनों नहीं करना चाहती:

((not (one-window-p t)) 
    (delete-other-windows)) 

लेकिन क्या सबसे अच्छा तरीका यह संशोधित करने के लिए है समारोह? मैं केवल दो तरीकों को देख सकता हूं: 1) simple.el 2 को संशोधित करें) इस फ़ंक्शन को मेरी .emacs फ़ाइल में कॉपी करें और वहां संशोधन करें। दोनों तरीके वास्तव में अच्छा नहीं हैं; आदर्श रूप में मैं defadvice की रेखा पर कुछ देखना चाहता हूं, लेकिन मैं नहीं देख सकता कि मैं इस मामले में इसे कैसे कर सकता हूं।

उत्तर

14

आप सलाह के आसपास का उपयोग करें और अपमानजनक समारोह को फिर से परिभाषित कर सकता है कि तुम क्या (यानी एक खिड़की-p हमेशा टी लौटना चाहिए) करना चाहते हैं एक (चलो ...) की तरह, लेकिन अधिक जटिल होना चाहिए क्योंकि आपको एक चर के बजाय सीमित स्कोप के लिए फ़ंक्शन ओवरराइड करने की आवश्यकता है।

+4

एक बेहतर एक लाइनर संस्करण flet का उपयोग कर (यानी देना का कार्य संस्करण): (defadvice कुंजीपटल-एस्केप छोड़ने (मेरी-कुंजीपटल-एस्केप छोड़ने सक्रिय चारों ओर) (फलेट ((एक-विंडो-पी (और वैकल्पिक नामांकित ऑल-फ्रेम) टी)) विज्ञापन-डू-इट)) – polyglot

+0

फ्लेट काम करने के लिए सीएल एक्सटेंशन की आवश्यकता है। – Alan

+0

आपको 'flet' को' cl-flet' में बदलने की भी आवश्यकता हो सकती है। – Alan

7

मुझे आमतौर पर लगता है कि 'कीबोर्ड-छोड़ने (सी-जी) उन सभी स्थितियों से बाहर निकलने के लिए काम करता है।

हालांकि, अगर आप वास्तव में इस फ़ंक्शन का एक संस्करण चाहते हैं, तो मुझे लगता है कि आपकी .emacs फ़ाइल (और नामकरण, मैं आमतौर पर बीपी का उपसर्ग) की प्रतिलिपि बना रहा हूं और संपादन करने के लिए शायद सबसे अच्छा विकल्प है।

संपादन के जवाब में संपादित करें: सामान्य रूप से, जब भी मैं एक एमैक्स फ़ंक्शन का संपादित संस्करण चाहता हूं, तो मैं या तो इसे स्वयं लिखता हूं, या इसे अपने .emacs पर कॉपी करता हूं, इसे बीपी-व्हाटवेवर का नाम देता हूं और फिर उचित संपादन करता हूं।

इसका नकारात्मक पक्ष यह है कि मेरा .emac बड़ा है, और शायद पुराने कार्यों के साथ अतिरिक्त क्रूरता है जो उलझन में हैं ... उल्टा यह है कि जब भी मुझे कुछ नया लिखना पड़ता है, तो मुझे बहुत सारे नमूने मिलते हैं

(defadvice keyboard-escape-quit (around my-keyboard-escape-quit activate) 
    (let (orig-one-window-p) 
    (fset 'orig-one-window-p (symbol-function 'one-window-p)) 
    (fset 'one-window-p (lambda (&optional nomini all-frames) t)) 
    (unwind-protect 
     ad-do-it 
     (fset 'one-window-p (symbol-function 'orig-one-window-p))))) 

में कार्य करता है इस तरह की: कोड को देखने के लिए ...

0

डिफ़ॉल्ट रूप से एस्केप कुंजी का एक भी प्रेस, मेटा उपसर्ग कुंजी के रूप में कार्य करता है; वह है, एक कीबाइंडिंग जिसमें मेटा कुंजी शामिल है।

एस्केप कुंजी को ट्रिपल-दबाने से कीबोर्ड-एस्केप-छोड़ना होगा, जो कुंजीपटल से बाहर निकलता है, लेकिन "मेरा क्या मतलब है" व्यवहार के साथ।

यह कोड आपके उपयोग के मामले में मदद कर सकता है।आप अपने Emacs init फाइल में इस का उपयोग कर सकते हैं:

;;; esc always quits 
(define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit) 
(define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit) 
(define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit) 
(define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit) 
(define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit) 
(global-set-key [escape] 'keyboard-quit) 
1

यहाँ एक और, सलाह के सरल टुकड़ा है कि तथ्य का लाभ लेता है कि keyboard-escape-quit कॉल buffer-quit-function बंद करने खिड़कियों से पहले:

Emacs 25.1 के साथ
(defadvice keyboard-escape-quit 
    (around keyboard-escape-quit-dont-close-windows activate) 
    (let ((buffer-quit-function (lambda()()))) 
    ad-do-it)) 

काम करता है। (मैं मूल रूप से @ scottfrazer की सलाह के लिए इस्तेमाल किया है, लेकिन यह 25.1 में दुखी है। अभी तक डिबगिंग परवाह नहीं है।)

1

मैं और अधिक के बारे में पता करने के लिए इच्छुक हूँ कैसे संपादन कार्यों है कि इस में की तरह (Emacs के साथ आते हैं के साथ एक सौदों मामला)। मैं समय-समय पर इस तरह की स्थितियों में भाग लेता हूं जब मैं कुछ बिल्ड-इन फ़ंक्शंस को बदलना चाहता हूं।

यह वही उद्देश्य है जिसके लिए मैंने पुस्तकालय el-patch बनाया है। आप अपने init फाइल में रखते हैं:

(el-patch-defun keyboard-escape-quit() 
    "Exit the current \"mode\" (in a generalized sense of the word). 
This command can exit an interactive command such as `query-replace', 
can clear out a prefix argument or a region, 
can get out of the minibuffer or other recursive edit, 
cancel the use of the current buffer (for special-purpose buffers), 
or go back to just one window (by deleting all but the selected window)." 
    (interactive) 
    (cond ((eq last-command 'mode-exited) nil) 
    ((> (minibuffer-depth) 0) 
    (abort-recursive-edit)) 
    (current-prefix-arg 
    nil) 
    ((and transient-mark-mode mark-active) 
    (deactivate-mark)) 
    ((> (recursion-depth) 0) 
    (exit-recursive-edit)) 
    (buffer-quit-function 
    (funcall buffer-quit-function)) 
    (el-patch-remove 
     ((not (one-window-p t)) 
     (delete-other-windows))) 
    ((string-match "^ \\*" (buffer-name (current-buffer))) 
    (bury-buffer)))) 
संबंधित मुद्दे