मैं एलिस्प से एक मध्यस्थ कुंजी घटना का अनुकरण कैसे कर सकता हूं?


26

क्या यह एक अनियंत्रित कुंजी घटना को elisp से अनुकरण करना संभव है? मुझे उन तरीकों के बारे में पता है जो मुझे किसी दिए गए कुंजी के लिए बाध्यकारी मिल सकते हैं, और फिर उस कमांड को अंतःक्रियात्मक रूप से कॉल कर सकते हैं, लेकिन क्या होगा यदि वह महत्वपूर्ण घटना एक कमांड के लिए बाध्य नहीं है?

एक उदाहरण के रूप में , क्या होगा यदि मैं सभी संदर्भों में कुंजी C-`के समान व्यवहार करने के लिए बाध्य करना चाहता था ?ESC


ऐसा लगता key-bindingsहै कि गलत टैग है यदि आप एक महत्वपूर्ण बंधन को बदलने की कोशिश नहीं कर रहे हैं। इसके अलावा, शायद आपको अपना उदाहरण किसी और चीज़ में बदलना चाहिए ताकि वह भ्रमित न हो।
b4hand

@ b4hand मैं बेहतर टैग के लिए सुझावों के लिए खुला हूँ। कोई key-eventsटैग नहीं है । क्या मुझे एक बनाना चाहिए?
nispio

मेरे लिए उचित लगता है, लेकिन घटनाएं बेहतर हो सकती हैं क्योंकि यह माउस घटनाओं पर भी लागू हो सकता है।
b4hand

2
मैं अभी भी इस उलझन में हूं कि क्या आप किसी महत्वपूर्ण घटना को अंजाम देना चाहते हैं , या आप विशेष रूप से एक प्रमुख कार्य करने की क्षमता चाहते हैं जैसे कि यह एक और कुंजी थी? key-translation-mapउत्तरार्द्ध की सुविधा पसंद है , इसलिए यदि आप यह चाहते हैं, तो मैं कुछ और मैनुअल करने के बजाय इसका उपयोग करने का सुझाव दूंगा।
फिल्स

... और अगर महत्वपूर्ण अनुवाद वास्तव में आप यहाँ चाहते हैं, तो मुझे लगता है कि यह एक अलग सवाल है, और आपको इसे अलग से पूछना चाहिए; और फिर इस सवाल के लिए अपने उदाहरण को फिर से शब्द दें कि "सामान्य रूप से किसी महत्वपूर्ण घटना का अनुकरण कैसे करूं?"
फिल्स

जवाबों:


24

आप कमांड लूप में मनमाने घटनाओं (कीस्ट्रोक, माउस क्लिक आदि) को फीड कर सकते हैं unread-command-events। उदाहरण के लिए, अगली बार चलाने के बाद कमांड लूप को ब्रेक देगा।

(setq unread-command-events (listify-key-sequence "\C-g"))

ध्यान दें कि यह केवल घटनाओं को कमांड लूप में फीड करता है, इसलिए यदि आप अपने स्वयं के कोड में लूपिंग कर रहे हैं तो यह कुछ भी दिलचस्प नहीं करेगा।

एक अलग दृष्टिकोण, जिसके बारे में आप जानते हैं, यह है कि फ़ंक्शन को दी गई कुंजी को ढूंढना है और इसे स्वयं निष्पादित करना है:

(funcall (global-key-binding "\C-g"))

यह कमांड को तुरंत निष्पादित करेगा। हालांकि, सावधान रहें कि कुछ आदेशों के आधार पर अलग-अलग व्यवहार हैं, चाहे उन्हें अंतःक्रियात्मक रूप से कहा जाए, जैसे कि डिफ़ॉल्ट तर्क। आप का उपयोग करके उस के लिए क्षतिपूर्ति करना चाहते हैं call-interactively:

(call-interactively (global-key-binding "\C-g"))

मैं इसके बारे में पढ़ता हूं unread-command-eventsलेकिन मैं इसका उपयोग कैसे कर पा रहा हूं, इसका पता नहीं लगा पाया हूं। इसे सेट करने का मेरे ऊपर कोई प्रभाव नहीं पड़ा। क्या इसका कोई अच्छा उदाहरण है कि इसका उपयोग कैसे किया जाता है?
nispio

मैंने इसका उपयोग तब किया है जब उपयोगकर्ता को जारी रखने के लिए स्पेस प्रेस करने के लिए कहा जाता है - यदि उपयोगकर्ता किसी और चीज को दबाता है, तो यह चालू हो जाता है unread-command-events
jch

@nispio: unread-command-eventsबस इसका नाम क्या है। आप किसी ईवेंट की जांच कर सकते हैं और फिर, जो है, उसके आधार पर, इसे सशर्त रूप से वापस धकेल देते हैं u-c-eताकि फिर सामान्य रूप से संसाधित किया जा सके। Emacs source कोड में इसके उपयोग के बहुत सारे उदाहरण हैं - grepआपका मित्र है।
ड्रू

1
मैं unread-command-eventsकाम करने में सक्षम था । listify-key-sequenceफंक्शन से पहले जो टुकड़ा मुझे याद आ रहा था । मैं सिर्फ कच्चे कुंजी वेक्टर का उपयोग कर रहा था।
nispio

1
इस उत्तर के लिए धन्यवाद। मैं अपनी पूर्ण प्रणाली के गैर-संवादात्मक परीक्षणों को लागू करना चाहता था, इसलिए मैंने इस विचार का उपयोग एक with-simulated-inputमैक्रो को लागू करने के लिए किया, जो किसी भी अभिव्यक्ति unread-command-eventsको एक निर्दिष्ट कुंजी अनुक्रम के साथ जाने देता है: github.com/DarwinAwardWinner/ido-ubiquitous-blob/…
रयान सी। थॉम्पसन

8

सबसे सरल तरीका जो मुझे पता है, वह है execute-kbd-macro:

(defun foo () (interactive) (execute-kbd-macro (kbd "<escape>")))
(global-set-key (kbd "C-`") 'foo)

ऊपर का मूल्यांकन और फिर दबाने C-` से मुझे एक त्रुटि मिलती है apply: Wrong number of arguments: #[(ad--addoit-function ...
nispio

1
@nispio मेरे लिए नहीं। वह त्रुटि एक सलाह की तरह लगती है।
मालाबार

@ मलबारबा मुझे लगता है कि आप सही हैं। emacs -Qउस त्रुटि के साथ नए सिरे से शुरू करने के बाद मौजूद नहीं है। मुझे अभी भी यह त्रुटि मिलती है:After 0 kbd macro iterations: foo: Lisp nesting exceeds `max-lisp-eval-depth'
nispio

यह वास्तव में मैं क्या देख रहा था। कुछ अजीब कारण के लिए (शायद कुछ बातचीत विवरण के साथ evil), सीधे वांछित फ़ंक्शन को कॉल करने से मेरे मामले में अप्रत्याशित प्रभाव पड़ा ( evilmi-jump-items), और मुझे इस्तेमाल करना पड़ा(execute-kbd-macro (kbd "%"))
xji

4

इस उत्तर से लिया गया , आप इस तरह से वैश्विक-सेट-कुंजी का उपयोग कर सकते हैं

(global-set-key (kbd "C-`") (kbd "<escape>"))

कौन सा व्यवहार करेगा C-`के रूप मेंescape

ऐसा लगता है कि कुछ समस्याएँ हैं, यदि दूसरा संयोजन किसी कार्य को निष्पादित नहीं करता है। इसलिए यदि escapeइसका उपयोग किया जा रहा है Meta, तो यह सही ढंग से काम नहीं करता है। लेकिन यह फ़ंक्शन के लिए बाध्य कमांड के लिए काम करता है।


@nispio: वास्तव में, यह काम करता है, क्योंकि दूसरा तर्क एक कीबोर्ड मैक्रो में अंतर्निहित है।
शास्त्री

1
@shosti ऊपर का मूल्यांकन और फिर दबाने C-` से मुझे एक त्रुटि मिलती है After 0 kbd macro iterations: command-execute: Lisp nesting exceeds `max-lisp-eval-depth':।
nispio

@nispio: आप शायद पहले से ही किसी अन्य विधि C-से बंधे हैं ESC, इसलिए यह एक अनंत लूप में जा रहा है।
शास्त्री

@shosti आप सही थे। eval-sexpएक सत्र में बहुत कुछ हो रहा है। :-) लेकिन बस फिर से कुछ न करने के emacs -Qकारणों के साथ फिर से कोशिश C-` करना।
nispio

आपके सिस्टम पर निर्भर करता है, (kbd "<escape>")और (kbd "ESC")अलग-अलग चीजों का मतलब हो सकता है - क्या आपने दोनों की कोशिश की है?
शास्त्री

2

उपयोग करने के लिए jch से सुझाव पढ़ने के बाद unread-command-events, मैं एक समाधान को एक साथ हैक करने में सक्षम था जो कुछ ऐसी चीजें करेगा जो मैं देख रहा हूं।

(defun my-simulate-key-event (event &optional N)
  "Simulate an arbitrary keypress event.

This function sets the `unread-command-events' variable in order to simulate a
series of key events given by EVENT. Can also For negative N, simulate the
specified key EVENT directly.  For positive N, removes the last N elements from
the list of key events in `this-command-keys' and then appends EVENT.  For N nil,
treat as N=1."
  (let ((prefix (listify-key-sequence (this-command-keys)))
         (key (listify-key-sequence event))
         (n (prefix-numeric-value N)))
     (if (< n 0)
         (setq prefix key)
       (nbutlast prefix n)
       (nconc prefix key))
       (setq unread-command-events prefix)))

वर्कआउट करने के लिए अभी भी कई किंक हैं। यदि मुझे इस फ़ंक्शन को एक बार में एक पंक्ति में दो बार कॉल किया जाता है, तो मुझे सही परिणाम नहीं मिलता है defun


पक्षीय लेख:

उपयोग करने के लिए फ़िल्स के सुझाव की जाँच करने के बाद key-translation-mapमैं यह पता लगाने में सक्षम था local-function-key-mapजो मेरे कुछ व्यापक लक्ष्यों को प्राप्त करने में बहुत सहायक है।

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