আমি কীভাবে এলিসপ থেকে একটি সালিসি কী ইভেন্ট অনুকরণ করতে পারি?


26

এলিসপ থেকে কোনও স্বেচ্ছাসেবী কী ইভেন্টটি অনুকরণ করা সম্ভব? আমি প্রদত্ত কীগুলির জন্য বাইন্ডিং খুঁজে পেতে এবং তারপরে ইন্টারেক্টিভভাবে কমান্ডটি কল করতে পারি সেই উপায়গুলি সম্পর্কে আমি সচেতন, তবে কী কী ইভেন্টটি কোনও আদেশের সাথে আবদ্ধ না হলে কী হবে?

একটি উদাহরণ হিসাবে , আমি যদি সমস্ত প্রসঙ্গে কী C-`হিসাবে একই আচরণ করতে বাঁধতে চাই ?ESC


মনে key-bindingsহচ্ছে এটি ভুল ট্যাগ হিসাবে মনে হয় যদি আপনি কোনও কী বাঁধাই করার চেষ্টা করছেন না। এছাড়াও, হতে পারে আপনার উদাহরণটি অন্য কোনও জায়গায় পরিবর্তন করা উচিত যাতে এটি বিভ্রান্ত না হয়।
বি 4 এবং

@ b4 এবং আমি আরও ভাল ট্যাগগুলির জন্য পরামর্শের জন্য উন্মুক্ত। কোনও key-eventsট্যাগ নেই। আমি একটি করা উচিত?
নিস্পিও

আমার কাছে যুক্তিসঙ্গত মনে হলেও ইভেন্টগুলি মাউসের ইভেন্টগুলিতে প্রযোজ্য হতে পারে বলেই এটি আরও ভাল হতে পারে।
বি 4 এবং

2
আপনি এখনও এলিস্পে কোনও মূল ইভেন্টটি অনুকরণ করতে চান কিনা তা নিয়ে আমি এখনও বিভ্রান্ত হয়ে পড়েছি বা আপনি বিশেষত কোনও মূল কীটি করার দক্ষতা চান যেন এটি অন্য কী? key-translation-mapপরবর্তীগুলির সুবিধাগুলি পছন্দ করে , সুতরাং যদি আপনি যা চান তবে আমি আরও কিছু ম্যানুয়াল না করে বরং এটি ব্যবহার করার পরামর্শ দেব।
ফিল্ডস

... এবং যদি মূল অনুবাদটি এখানে আপনি চান তবে আমার মনে হয় এটি একটি আলাদা প্রশ্ন এবং আপনার আলাদাভাবে জিজ্ঞাসা করা উচিত; এবং তারপরে এই প্রশ্নটির জন্য আপনার উদাহরণটি আবারও উচ্চারণ করুন "সাধারণ অংশে কীভাবে আমি একটি মূল ইভেন্ট অনুকরণ করব?"
ফিল্ডস 23:34

উত্তর:


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কিন্তু আমি কীভাবে এটি ব্যবহার করব তা অনুধাবন করতে সক্ষম হইনি। এটি সেট করা আমার পক্ষে কোনও প্রভাব ফেলেনি। এটি কীভাবে ব্যবহৃত হয় তার কোনও ভাল উদাহরণ রয়েছে?
নিস্পিও

ব্যবহারকারীটিকে অবিরত রাখতে স্পেস টিপতে বলার সময় আমি এটি ব্যবহার করে দেখেছি - ব্যবহারকারী যদি অন্য কিছু চাপায় তবে তা চলে যায় unread-command-events
jch

@ স্পিনপিও: unread-command-eventsএর নাম যা বলেছে ঠিক তেমনই । আপনি কোনও ইভেন্ট পরীক্ষা করতে পারেন এবং তারপরে এটি যা হয় তার উপর নির্ভর করে শর্তসাপেক্ষে এটিকে পিছনে চাপ দিন u-c-eযাতে স্বাভাবিকভাবে প্রক্রিয়া করা হবে। ইমাক্স উত্স কোডটিতে এর ব্যবহারের প্রচুর উদাহরণ রয়েছে - grepএটি আপনার বন্ধু।
ড্র হয়েছে 2

1
আমি unread-command-eventsকাজ পেতে সক্ষম হয়েছি । আমি যে টুকরোটি আগে অনুপস্থিত ছিল তা ছিল listify-key-sequenceফাংশন। আমি সবেমাত্র কাঁচা কী ভেক্টর ব্যবহার করছিলাম।
নিসপিও

1
এই উত্তরের জন্য ধন্যবাদ। আমি আমার সমাপ্তির সিস্টেমের অ-ইন্টারেক্টিভ পরীক্ষাগুলি বাস্তবায়ন করতে চেয়েছিলাম, সুতরাং আমি কোনও with-simulated-inputম্যাক্রো প্রয়োগের জন্য এই ধারণাটি ব্যবহার করেছি যা কোনও unread-command-eventsনির্দিষ্ট মূল ক্রমের সাথে আবদ্ধভাবে
রায়ান সি থম্পসন

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 ...
নিস্পিও

1
@ স্প্যানিও আমার জন্য নয় এই ত্রুটিটি একটি পরামর্শের মতো দেখায়।
মালাবারবা

@ মালবারবা আমার মনে হয় আপনি ঠিক বলেছেন। নতুন করে আরম্ভ করার পরে emacs -Qত্রুটিটি উপস্থিত নেই। যদিও আমি এখনও এই ত্রুটিটি After 0 kbd macro iterations: foo: Lisp nesting exceeds `max-lisp-eval-depth'
পেয়েছি

এটি আসলে আমি যা খুঁজছিলাম। কিছু অদ্ভুত কারণে (সম্ভবত কিছু কথোপকথনের বিশদ সহ evil) সরাসরি কাঙ্ক্ষিত ফাংশনটি কল করা আমার ক্ষেত্রে একটি অপ্রত্যাশিত প্রভাব ফেলেছিল ( evilmi-jump-items) এবং আমাকে ব্যবহার করতে হয়েছিল(execute-kbd-macro (kbd "%"))
xji

4

এই উত্তর থেকে নেওয়া , আপনি এর মতো গ্লোবাল-সেট-কী ব্যবহার করতে পারেন

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

যা C-`হিসাবে আচরণ করবেescape

এটিতে কিছু সমস্যা আছে বলে মনে হচ্ছে যদিও দ্বিতীয় সংমিশ্রণটি কোনও ফাংশন কার্যকর করে না। সুতরাং যদি এটির escapeমতো ব্যবহার করা হয় Metaতবে এটি সঠিকভাবে কাজ করে না। তবে এটি ফাংশনগুলিতে আবদ্ধ কমান্ডগুলির জন্য কাজ করে বলে মনে হচ্ছে।


@ স্প্যানিও: আসলে, এটি কাজ করে, যেহেতু দ্বিতীয় যুক্তিটি স্পষ্টভাবে একটি কীবোর্ড ম্যাক্রোতে রূপান্তরিত হয়েছে।
shosti

1
@shosti উপরে মূল্যায়ন এবং তারপর টিপে C-` আমাকে একটি ত্রুটি দেয়: After 0 kbd macro iterations: command-execute: Lisp nesting exceeds `max-lisp-eval-depth'
নিস্পিও

@ স্প্যানিও: আপনার সম্ভবত ইতিমধ্যে অন্য কোনও পদ্ধতির সাথে C-আবদ্ধ। ESCতাই এটি অসীম লুপে চলেছে।
shosti

আপনি কি ঠিক বলেছেন eval-sexpএক সেশনে অনেক বেশি চলছে। :-) তবে কিছু না করার emacs -Qকারণ C-` নিয়ে আবার চেষ্টা করা ।
নিস্পিও

আপনার সিস্টেমের উপর নির্ভর করে (kbd "<escape>")এবং (kbd "ESC")বিভিন্ন জিনিসগুলির অর্থ হতে পারে - আপনি উভয়ই চেষ্টা করেছেন?
shosti

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যা আমার কিছু বিস্তৃত লক্ষ্য অর্জনে খুব সহায়ক।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.