emacs-emojify

fork of https://github.com/iqbalansari/emacs-emojify
Log | Files | Refs | LICENSE

commit 3a495d9399e85b93c24ac14164bb5b4d232da1c7
parent 42096418904146623d38f7a5eed75eef077e52a5
Author: Iqbal Ansari <iqbalansari02@yahoo.com>
Date:   Sun, 22 Nov 2015 18:02:48 +0530

Handle cases where keymap from emojify are invoked outside an emoji

This happens if point is immediately after an emoji, in which case the
keymap property is inherited from the preceding emoji. This could have
been disabled using the 'rear-nonsticky' text property but that breaks
the backspaces keybinding, since point will then need to be 'inside' an
emoji for emojify's keybinding to be invoked. As such backspace
immediately after an emoji simply deletes the preceding char, unemojifing
the text (thus removing the emojify keymap as well) making the backspace
key bind added by emojify useless.

The current simply invokes whatever non-emojify keybinding is active at
the point

Diffstat:
Memojify.el | 38+++++++++++++++++++++++++++++++++-----
1 file changed, 33 insertions(+), 5 deletions(-)

diff --git a/emojify.el b/emojify.el @@ -498,6 +498,25 @@ mark the start and end of region containing the text." (< new-point match-beginning))) (emojify-redisplay-emojis match-beginning match-end)))) +(defun emojify--find-key-binding-ignoring-emojify-keymap (key) + "Find the binding for given KEY ignoring the text properties at point. + +This is needed since `key-binding' looks up in keymap text property as well +which is not what we want when falling back in `emojify-delete-emoji'" + (let* ((minor-mode-binding (minor-mode-key-binding key)) + (local-binding (local-key-binding key)) + (global-binding (global-key-binding key)) + (key-binding (or minor-mode-binding + local-binding + global-binding))) + (when key-binding + (or (command-remapping key-binding + nil + (seq-filter (lambda (keymap) + (not (equal keymap emojify-emoji-keymap))) + (current-active-maps))) + key-binding)))) + (defun emojify--get-image-display (data) "Get the display text property to display the emoji specified in DATA as an image." (let* ((image-file (expand-file-name (ht-get data "image") @@ -638,19 +657,28 @@ BEG and END are the beginning and end of the region respectively" 'emojify-start t 'emojify-end t 'keymap t - 'help-echo t)))) + 'help-echo t + 'rear-nonsticky t)))) ;; Setup the next iteration (setq beg emoji-end))))) +(defun emojify-delete-emoji (point) + "Delete emoji at POINT." + (if (get-text-property point 'emojified) + (delete-region (get-text-property point 'emojify-start) + (get-text-property point 'emojify-end)) + (call-interactively (emojify--find-key-binding-ignoring-emojify-keymap (this-command-keys))))) + (defun emojify-delete-emoji-forward () + "Delete emoji after point." (interactive) - (delete-region (get-text-property (point) 'emojify-start) - (get-text-property (point) 'emojify-end))) + (emojify-delete-emoji (point))) (defun emojify-delete-emoji-backward () + "Delete emoji before point." (interactive) - (delete-region (get-text-property (1- (point)) 'emojify-start) - (get-text-property (1- (point)) 'emojify-end))) + (emojify-delete-emoji (1- (point)))) + (defun emojify-redisplay-emojis (&optional beg end) "Redisplay emojis in region between BEG and END.