26
You can feed arbitrary events (keystrokes, mouse clicks, etc.) to the command loop by putting them onto unread-command-events. For example, the following will cause the command loop to execute a break the next time it is run:
(setq unread-command-events (listify-key-sequence "\C-g"))
Note that this only feeds events to the command loop, so it will do ...
12
The simplest way I know of is just to use execute-kbd-macro:
(defun foo () (interactive) (execute-kbd-macro (kbd "<escape>")))
(global-set-key (kbd "C-`") 'foo)
7
You could try:
(defun my-run-fkpiawh ()
(remove-hook 'pre-command-hook #'my-run-fkpiawh)
(run-hooks 'first-keypress-in-a-while-hook))
(run-with-idle-timer 1200 t (lambda ()
(add-hook 'pre-command-hook
#'my-run-fkpiawh)))
After which you can use add functions to first-keypress-in-a-...
6
I guess a solution of your problem is setting a flag with an idle timer, https://www.gnu.org/software/emacs/manual/html_node/elisp/Idle-Timers.html
and checking/unsetting it with post-self-insert-hook or a similar hook of your choice.
The following works for me:
(defvar *my-idle-flag* nil)
(run-with-idle-timer 900 t (lambda () (setq *my-idle-flag* t)))
(...
6
Best method seems to be found in eldoc that also displays temporary info in minibuffer:
;; Decide whether now is a good time to display a message.
(defun eldoc-display-message-p ()
(and (eldoc-display-message-no-interference-p)
;; If this-command is non-nil while running via an idle
;; timer, we're still in the middle of executing a command,
...
6
Does
(execute-kbd-macro (kbd "Hello"))
work by any chance?
4
Taken from this answer, you can use global-set-key like this
(global-set-key (kbd "C-`") (kbd "<escape>"))
Which will treat C-` as escape
This does seem to have some problems though if the second combination doesn't execute a function. So if escape is being used like Meta, then it doesn't work correctly. But it seems to work for commands bound to ...
4
I think you want event-basic-type. E.g. (event-basic-type ?\C-;) returns ?;.
If you want to only stop the control modifier but keep the other modifiers (e.g. the shift modifier), then you can try something like:
(require 'cl-lib)
(defun my-strip-control (event)
(event-convert-list
(append (cl-set-difference (event-modifiers event)
...
4
Okay, so my first answer has a number of shortcomings as detailed in its comments.
execute-kbd-macro is a built-in function in C source code.
(execute-kbd-macro MACRO &optional COUNT LOOPFUNC)
Execute MACRO as string of editor command characters.
MACRO can also be a vector of keyboard events. If MACRO is a symbol,
its function definition ...
3
There is a list of functions with the posn prefix to extract that information and more from mouse events. One caveat is that many of them require a start/end event:
(let ((e (read-event)))
(when (mouse-event-p e)
(let ((x-y (posn-x-y (event-start e))))
(message "Mouse event at: %d|%d" (car x-y) (cdr x-y)))))
3
If a single key/character, just use function single-key-description.
(single-key-description 19) ; => "C-s"
If a list of characters, convert them to a string and use function key-description.
(key-description (string 19 25 20 5 43)) ; => "C-s C-y C-c C-e +"
If a key sequence as a string, use function key-description. (Here I write "^Y" etc when I ...
3
Ok: the answer really is just to use read-char-exclusive instead of read-char. It works perfectly.
I wasn't working for me because of some problem in my configurations.
2
After reading the suggestion from jch to use unread-command-events, I was able to hack together a solution that will do some of the things that I am looking for.
(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 ...
2
function-key-map and input-decode-map definitely apply in the middle of a key-sequence as well.
2
How can i achieve my goal? Should i take another approach?
IIUC the problem arises from a misuse of nconc. The value of unread-command-events is often nil, in which case nconc will not alter it in-place, as there is no cdr to modify. Instead, you should probably be using push or setq to record the value change of unread-command-events.
invocation of ...
2
The answer to “I want to detect (…) event” is usually to use the appropriate hook. The manual has a list of standard hooks. There's no hook that triggers on a line change, so the next thing is to look for a hook that triggers on any motion. There's no hook specifically for that either, to you're down to a hook that runs every command.
Keep track of the ...
answered Apr 14 '17 at 20:17
Gilles 'SO- stop being evil'
17.3k44 gold badges4444 silver badges8080 bronze badges
1
This is expected behavior, but you can circumvent this problem by let-binding executing-kbd-macro to t, which will convince the minibuffer commands to read from unread-command-events rather than from stdin.
1
my-count-clocks in the following Elisp section defines a function that counts clocks in the current org-mode section. It does not descent into sub-sections. You can easily modify my-count-clocks to fit your special needs, e.g., work recursive on sub-sections.
That function has a predicate function as argument. The predicate gets a timestamp as argument and ...
1
Release of a keyboard key is not an event that is detected by Emacs. (But release of a mouse button is an event seen by Emacs.)
Maybe change from reading and acting on a single character to acting on two keys, separately: Act on the first key by doing what you describe first: "perform the replacement but "pause" the loop until" the second key is pressed. ...
1
For y-or-n-p, you could check the value of input-method-use-echo-area. It is turned on by read-key-sequence, which is indirectly used by y-or-n-p – and quite likely by various other commands you'd like to treat the same way.
Detecting an active read-event seems to be harder. Perhaps it's preferable to call it via a wrapper which rebinds some variable to let ...
1
If you have to stay in emacs, then the two options I've tried are:
(process-send-string "my-vm-1" "command to vm")
where I'd change my-vm-1 to my-vm-2 and so on in a macro. The other option I use now is to run gnu-parallel via M-x !.
A more recent solution for VMs to use their own mgmt interface to send commands to to multiple instances. This may turn out ...
1
Based on phils' comment, this is what I needed to do to make it work:
(setq doubletap-flag nil)
(defun doubletap (doubletap-key1 doubletap-key2 doubletap-wait doubletap-function)
(setq doubletap-flag 't)
(let ((doubletap-event (read-event nil nil doubletap-wait)))
(if doubletap-event
(if (equal doubletap-event doubletap-key2)
(...
1
You need to manually move the point in your function like this:
(defun mouse-test (event)
"Move the point to the clicked position and message the thing at point."
(interactive "e")
(let ((es (event-start event)))
(select-window (posn-window es))
(goto-char (posn-point es))
(message (thing-at-point 'word))))
Do C-hfinteractive to ...
Only top voted, non community-wiki answers of a minimum length are eligible
Related Tags
events × 24mouse × 6
keystrokes × 5
key-bindings × 4
keyboard-macros × 2
point × 2
event-sequence × 2
org-mode × 1
elisp × 1
hooks × 1
files × 1
terminal-emacs × 1
mode-line × 1
colors × 1
minibuffer × 1
commands × 1
process × 1
string × 1
shell-command × 1
interactive × 1
motion × 1
testing × 1
timers × 1
idle-timer × 1
irc × 1