mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-05 22:20:24 -08:00
Update Android port
* doc/emacs/input.texi (On-Screen Keyboards): Document `touch-screen-always-display'. * doc/lispref/commands.texi (Misc Events): Improve documentation of text conversion events. * java/org/gnu/emacs/EmacsDialog.java (toAlertDialog, display1): Reorder buttons to make more sense. * lisp/elec-pair.el (electric-pair-analyze-conversion): New function. * lisp/simple.el (analyze-text-conversion): Improve integration with electric pair modes. * lisp/term.el (term-mode): Always display the onscreen keyboard. * lisp/touch-screen.el (touch-screen-display-keyboard) (touch-screen-handle-point-up): Respect new options. * src/textconv.c (really_set_composing_text): Stop widenining unnecessarily. (really_delete_surrounding_text): Really delete surrounding text. Give text conversion analyzers the buffer text. (syms_of_textconv): Update doc string.
This commit is contained in:
parent
fa1b27930e
commit
a61f9cb77c
8 changed files with 124 additions and 51 deletions
|
|
@ -94,6 +94,12 @@ If it is, then Emacs looks up whether or not the text under the point
|
|||
is read-only; if not, it activates the on-screen keyboard, assuming
|
||||
that the user is about to enter text in to the current buffer.
|
||||
|
||||
@vindex touch-screen-always-display
|
||||
The user option @code{touch-screen-display-keyboard} forces Emacs to
|
||||
always display the on screen keyboard; it may also be bound buffer
|
||||
locally, meaning to always display the keyboard when the buffer is
|
||||
selected.
|
||||
|
||||
Emacs also provides a set of functions to show or hide the on-screen
|
||||
keyboard. For more details, @pxref{On-Screen Keyboards,,, elisp, The
|
||||
Emacs Lisp Reference Manual}.
|
||||
|
|
|
|||
|
|
@ -2227,9 +2227,10 @@ form:
|
|||
Where @var{ephemeral} is the buffer which was modified,
|
||||
@var{beg} and @var{end} are the positions of the edit at the
|
||||
time it was completed, and @var{ephemeral} is either a string,
|
||||
containing any text which was inserted, @code{t}, meaning that
|
||||
the edit is a temporary edit made by the input method, and
|
||||
@code{nil}, meaning that some text was deleted.
|
||||
containing any text which was inserted, or any text before point
|
||||
which was deleted, @code{t}, meaning that the edit is a
|
||||
temporary edit made by the input method, and @code{nil}, meaning
|
||||
that some text was deleted after point.
|
||||
|
||||
@vindex text-conversion-style
|
||||
Whether or not this event is sent depends on the value of the
|
||||
|
|
|
|||
|
|
@ -166,14 +166,14 @@ public class EmacsDialog implements DialogInterface.OnDismissListener
|
|||
if (size >= 2)
|
||||
{
|
||||
button = buttons.get (1);
|
||||
dialog.setButton (DialogInterface.BUTTON_NEUTRAL,
|
||||
dialog.setButton (DialogInterface.BUTTON_NEGATIVE,
|
||||
button.name, button);
|
||||
}
|
||||
|
||||
if (size >= 3)
|
||||
{
|
||||
button = buttons.get (2);
|
||||
dialog.setButton (DialogInterface.BUTTON_NEGATIVE,
|
||||
dialog.setButton (DialogInterface.BUTTON_NEUTRAL,
|
||||
button.name, button);
|
||||
}
|
||||
}
|
||||
|
|
@ -274,10 +274,8 @@ public class EmacsDialog implements DialogInterface.OnDismissListener
|
|||
if (size >= 2)
|
||||
{
|
||||
button = buttons.get (1);
|
||||
dialog.setButton (DialogInterface.BUTTON_NEUTRAL,
|
||||
button.name, button);
|
||||
buttonView
|
||||
= dialog.getButton (DialogInterface.BUTTON_NEUTRAL);
|
||||
= dialog.getButton (DialogInterface.BUTTON_NEGATIVE);
|
||||
buttonView.setEnabled (button.enabled);
|
||||
}
|
||||
|
||||
|
|
@ -285,7 +283,7 @@ public class EmacsDialog implements DialogInterface.OnDismissListener
|
|||
{
|
||||
button = buttons.get (2);
|
||||
buttonView
|
||||
= dialog.getButton (DialogInterface.BUTTON_NEGATIVE);
|
||||
= dialog.getButton (DialogInterface.BUTTON_NEUTRAL);
|
||||
buttonView.setEnabled (button.enabled);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -162,6 +162,20 @@ Before attempting a skip, if `electric-pair-skip-whitespace' is
|
|||
non-nil, this function is called. It move point to a new buffer
|
||||
position, presumably skipping only whitespace in between.")
|
||||
|
||||
(defun electric-pair-analyze-conversion (string)
|
||||
"Notice that STRING has been deleted by an input method.
|
||||
If the last character of STRING is an electric pair character,
|
||||
and the character after point is too, then delete that other
|
||||
character."
|
||||
(let* ((prev (aref string (1- (length string))))
|
||||
(next (char-after))
|
||||
(syntax-info (electric-pair-syntax-info prev))
|
||||
(syntax (car syntax-info))
|
||||
(pair (cadr syntax-info)))
|
||||
(when (and next pair (memq syntax '(?\( ?\" ?\$))
|
||||
(eq pair next))
|
||||
(delete-char 1))))
|
||||
|
||||
(defun electric-pair--skip-whitespace ()
|
||||
"Skip whitespace forward, not crossing comment or string boundaries."
|
||||
(let ((saved (point))
|
||||
|
|
|
|||
|
|
@ -10877,6 +10877,10 @@ If the buffer doesn't exist, create it first."
|
|||
;; Actually in textconv.c.
|
||||
(defvar text-conversion-edits)
|
||||
|
||||
;; Actually in elec-pair.el.
|
||||
(defvar electric-pair-preserve-balance)
|
||||
(declare-function electric-pair-analyze-conversion "elec-pair.el")
|
||||
|
||||
(defun analyze-text-conversion ()
|
||||
"Analyze the results of the previous text conversion event.
|
||||
|
||||
|
|
@ -10890,35 +10894,61 @@ For each insertion:
|
|||
line breaking of the previous line when `auto-fill-mode' is
|
||||
enabled.
|
||||
|
||||
- Look for the deletion of a single electric pair character,
|
||||
and delete the adjascent pair if
|
||||
`electric-pair-delete-adjacent-pairs'.
|
||||
|
||||
- Run `post-self-insert-functions' for the last character of
|
||||
any inserted text so that modes such as `electric-pair-mode'
|
||||
can work."
|
||||
(interactive)
|
||||
(dolist (edit text-conversion-edits)
|
||||
;; The list must be processed in reverse.
|
||||
(dolist (edit (reverse text-conversion-edits))
|
||||
;; Filter out ephemeral edits and deletions.
|
||||
(when (and (not (eq (nth 1 edit) (nth 2 edit)))
|
||||
(stringp (nth 3 edit)))
|
||||
(when (and (stringp (nth 3 edit)))
|
||||
(with-current-buffer (car edit)
|
||||
(let* ((inserted (nth 3 edit))
|
||||
;; Get the first and last characters.
|
||||
(start (aref inserted 0))
|
||||
(end (aref inserted (1- (length inserted))))
|
||||
;; Figure out whether or not to auto-fill.
|
||||
(auto-fill-p (or (aref auto-fill-chars start)
|
||||
(aref auto-fill-chars end)))
|
||||
;; Figure out whether or not a newline was inserted.
|
||||
(newline-p (string-search "\n" inserted)))
|
||||
(save-excursion
|
||||
(if (and auto-fill-function newline-p)
|
||||
(progn (goto-char (nth 2 edit))
|
||||
(previous-logical-line)
|
||||
(funcall auto-fill-function))
|
||||
(when (and auto-fill-function auto-fill-p)
|
||||
(progn (goto-char (nth 2 edit))
|
||||
(funcall auto-fill-function)))))
|
||||
(goto-char (nth 2 edit))
|
||||
(let ((last-command-event end))
|
||||
(run-hooks 'post-self-insert-hook)))))))
|
||||
(if (not (eq (nth 1 edit) (nth 2 edit)))
|
||||
;; Process this insertion. (nth 3 edit) is the text which
|
||||
;; was inserted.
|
||||
(let* ((inserted (nth 3 edit))
|
||||
;; Get the first and last characters.
|
||||
(start (aref inserted 0))
|
||||
(end (aref inserted (1- (length inserted))))
|
||||
;; Figure out whether or not to auto-fill.
|
||||
(auto-fill-p (or (aref auto-fill-chars start)
|
||||
(aref auto-fill-chars end)))
|
||||
;; Figure out whether or not a newline was inserted.
|
||||
(newline-p (string-search "\n" inserted))
|
||||
;; FIXME: this leads to an error in
|
||||
;; `atomic-change-group', seemingly because
|
||||
;; buffer-undo-list is being modified or
|
||||
;; prematurely truncated. Turn it off for now.
|
||||
(electric-pair-preserve-balance nil))
|
||||
(save-excursion
|
||||
(if (and auto-fill-function newline-p)
|
||||
(progn (goto-char (nth 2 edit))
|
||||
(previous-logical-line)
|
||||
(funcall auto-fill-function))
|
||||
(when (and auto-fill-function auto-fill-p)
|
||||
(progn (goto-char (nth 2 edit))
|
||||
(funcall auto-fill-function)))))
|
||||
(goto-char (nth 2 edit))
|
||||
(let ((last-command-event end))
|
||||
(run-hooks 'post-self-insert-hook)))
|
||||
;; Process this deletion before point. (nth 2 edit) is the
|
||||
;; text which was deleted. Input methods typically prefer
|
||||
;; to edit words instead of deleting characters off their
|
||||
;; ends, but they seem to always send proper requests for
|
||||
;; deletion for punctuation.
|
||||
(when (and (boundp 'electric-pair-delete-adjacent-pairs)
|
||||
(symbol-value 'electric-pair-delete-adjacent-pairs)
|
||||
;; Make sure elec-pair is loaded.
|
||||
(fboundp 'electric-pair-analyze-conversion)
|
||||
;; Only do this if only a single edit happened.
|
||||
text-conversion-edits)
|
||||
(save-excursion
|
||||
(goto-char (nth 2 edit))
|
||||
(electric-pair-analyze-conversion (nth 3 edit)))))))))
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1136,6 +1136,9 @@ Entry to this mode runs the hooks on `term-mode-hook'."
|
|||
(setq-local term-last-input-end (make-marker))
|
||||
(setq-local term-last-input-match "")
|
||||
|
||||
;; Always display the onscreen keyboard.
|
||||
(setq-local touch-screen-display-keyboard t)
|
||||
|
||||
;; These local variables are set to their local values:
|
||||
(make-local-variable 'term-saved-home-marker)
|
||||
(make-local-variable 'term-saved-cursor)
|
||||
|
|
|
|||
|
|
@ -49,6 +49,14 @@ keyboard after a mouse command is executed in response to a
|
|||
"Timer used to track long-presses.
|
||||
This is always cleared upon any significant state change.")
|
||||
|
||||
(defcustom touch-screen-display-keyboard nil
|
||||
"If non-nil, always display the on screen keyboard.
|
||||
A buffer local value means to always display the on screen
|
||||
keyboard when the buffer is selected."
|
||||
:type 'boolean
|
||||
:group 'mouse
|
||||
:version "30.1")
|
||||
|
||||
(defcustom touch-screen-delay 0.7
|
||||
"Delay in seconds before Emacs considers a touch to be a long-press."
|
||||
:type 'number
|
||||
|
|
@ -417,8 +425,12 @@ is not read-only."
|
|||
(call-interactively command nil
|
||||
(vector event))
|
||||
(when (memq command touch-screen-set-point-commands)
|
||||
(if (not (or buffer-read-only
|
||||
(get-text-property (point) 'read-only)))
|
||||
(if (and (or (not buffer-read-only)
|
||||
touch-screen-display-keyboard)
|
||||
;; Detect the splash screen and avoid
|
||||
;; displaying the on screen keyboard
|
||||
;; there.
|
||||
(not (equal (buffer-name) "*GNU Emacs*")))
|
||||
;; Once the on-screen keyboard has been opened,
|
||||
;; add `touch-screen-window-selection-changed'
|
||||
;; as a window selection change function This
|
||||
|
|
|
|||
|
|
@ -702,11 +702,8 @@ really_set_composing_text (struct frame *f, ptrdiff_t position,
|
|||
}
|
||||
else
|
||||
{
|
||||
/* Delete the text between the start of the composition region
|
||||
and its end. TODO: avoid this widening. */
|
||||
record_unwind_protect (save_restriction_restore,
|
||||
save_restriction_save ());
|
||||
Fwiden ();
|
||||
/* Delete the text between the start of the composing region and
|
||||
its end. */
|
||||
start = marker_position (f->conversion.compose_region_start);
|
||||
end = marker_position (f->conversion.compose_region_end);
|
||||
del_range (start, end);
|
||||
|
|
@ -844,6 +841,7 @@ really_delete_surrounding_text (struct frame *f, ptrdiff_t left,
|
|||
specpdl_ref count;
|
||||
ptrdiff_t start, end, a, b, a1, b1, lstart, rstart;
|
||||
struct window *w;
|
||||
Lisp_Object text;
|
||||
|
||||
/* If F's old selected window is no longer live, fail. */
|
||||
|
||||
|
|
@ -888,21 +886,25 @@ really_delete_surrounding_text (struct frame *f, ptrdiff_t left,
|
|||
start = max (BEGV, lstart - left);
|
||||
end = min (ZV, rstart + right);
|
||||
|
||||
del_range (start, end);
|
||||
record_buffer_change (start, start, Qnil);
|
||||
text = del_range_1 (start, end, false, true);
|
||||
record_buffer_change (start, start, text);
|
||||
}
|
||||
else
|
||||
{
|
||||
start = max (BEGV, lstart - left);
|
||||
end = lstart;
|
||||
|
||||
del_range (start, end);
|
||||
record_buffer_change (start, start, Qnil);
|
||||
/* Don't record a deletion if the text which was deleted lies
|
||||
after point. */
|
||||
|
||||
start = rstart;
|
||||
end = min (ZV, rstart + right);
|
||||
del_range (start, end);
|
||||
record_buffer_change (start, start, Qnil);
|
||||
text = del_range_1 (start, end, false, true);
|
||||
record_buffer_change (start, start, Qnil);
|
||||
|
||||
/* Now delete what must be deleted on the left. */
|
||||
|
||||
start = max (BEGV, lstart - left);
|
||||
end = lstart;
|
||||
text = del_range_1 (start, end, false, true);
|
||||
record_buffer_change (start, start, text);
|
||||
}
|
||||
|
||||
/* if the mark is now equal to start, deactivate it. */
|
||||
|
|
@ -1701,7 +1703,8 @@ syms_of_textconv (void)
|
|||
DEFSYM (Qtext_conversion, "text-conversion");
|
||||
DEFSYM (Qpush_mark, "push-mark");
|
||||
DEFSYM (Qunderline, "underline");
|
||||
DEFSYM (Qoverriding_text_conversion_style, "overriding-text-conversion-style");
|
||||
DEFSYM (Qoverriding_text_conversion_style,
|
||||
"overriding-text-conversion-style");
|
||||
|
||||
DEFVAR_LISP ("text-conversion-edits", Vtext_conversion_edits,
|
||||
doc: /* List of buffers that were last edited as a result of text conversion.
|
||||
|
|
@ -1722,8 +1725,14 @@ changes to the text, so any actions that would otherwise be taken
|
|||
place; otherwise, it is a string describing the text which was
|
||||
inserted.
|
||||
|
||||
If a deletion occured, then BEG and END are the same, and EPHEMERAL is
|
||||
nil. */);
|
||||
If a deletion occured before point, then BEG and END are the same, and
|
||||
EPHEMERAL is the text which was deleted.
|
||||
|
||||
If a deletion occured after point, then BEG and END are also the same,
|
||||
but EPHEMERAL is nil.
|
||||
|
||||
The list contents are ordered later edits first, so you must iterate
|
||||
through the list in reverse. */);
|
||||
Vtext_conversion_edits = Qnil;
|
||||
|
||||
DEFVAR_LISP ("overriding-text-conversion-style",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue