diff options
author | John Wiegley <johnw@newartisans.com> | 2016-01-11 22:48:07 -0800 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2016-01-11 22:48:07 -0800 |
commit | 8d7128c46de2af10d50c1495a075d66b702f6d21 (patch) | |
tree | 248825b1d310edff622e05241c9ee8f5d60d9c14 /lisp | |
parent | 8df9e56b4ad9704747dd8af7a049da9ee6ab3a00 (diff) | |
parent | 9ee6ecb840c57aaf87316bccc2a892265087bafe (diff) | |
download | emacs-8d7128c46de2af10d50c1495a075d66b702f6d21.tar.gz emacs-8d7128c46de2af10d50c1495a075d66b702f6d21.tar.bz2 emacs-8d7128c46de2af10d50c1495a075d66b702f6d21.zip |
Merge from origin/emacs-25
9ee6ecb lisp/emacs-lisp/chart.el (chart-new-buffer): Move to silence byte compiler.
526d80c Port chart.el methods to cl-generic.
410bb69 Add nt/INSTALL.W64 build instructions
8f5b524 Add new input method 'programmer-dvorak'
6d11f6e Allow to invoke original M-TAB binding in 'flyspell-prog-mode'
bb83bb1 Fix EWW rendering of long RTL lines
b1a8509 fix bug#21054
ce5ad12 Clean up cairo printing code
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/emacs-lisp/chart.el | 47 | ||||
-rw-r--r-- | lisp/leim/quail/programmer-dvorak.el | 145 | ||||
-rw-r--r-- | lisp/net/shr.el | 5 | ||||
-rw-r--r-- | lisp/textmodes/flyspell.el | 210 |
4 files changed, 285 insertions, 122 deletions
diff --git a/lisp/emacs-lisp/chart.el b/lisp/emacs-lisp/chart.el index c0a42038e94..aa7d8dd9880 100644 --- a/lisp/emacs-lisp/chart.el +++ b/lisp/emacs-lisp/chart.el @@ -60,6 +60,7 @@ ;; with all the bitmaps you want to use. (require 'eieio) +(eval-when-compile (require 'cl-generic)) ;;; Code: (define-obsolete-variable-alias 'chart-map 'chart-mode-map "24.1") @@ -124,14 +125,6 @@ too much in text characters anyways.") (font-lock-mode -1) ;Isn't it off already? --Stef ) -(defun chart-new-buffer (obj) - "Create a new buffer NAME in which the chart OBJ is displayed. -Returns the newly created buffer." - (with-current-buffer (get-buffer-create (format "*%s*" (oref obj title))) - (chart-mode) - (setq chart-local-object obj) - (current-buffer))) - (defclass chart () ((title :initarg :title :initform "Emacs Chart") @@ -156,7 +149,15 @@ Returns the newly created buffer." ) "Superclass for all charts to be displayed in an Emacs buffer.") -(defmethod initialize-instance :AFTER ((obj chart) &rest _fields) +(defun chart-new-buffer (obj) + "Create a new buffer NAME in which the chart OBJ is displayed. +Returns the newly created buffer." + (with-current-buffer (get-buffer-create (format "*%s*" (oref obj title))) + (chart-mode) + (setq chart-local-object obj) + (current-buffer))) + +(cl-defmethod initialize-instance :after ((obj chart) &rest _fields) "Initialize the chart OBJ being created with FIELDS. Make sure the width/height is correct." (oset obj x-width (- (window-width) 10)) @@ -201,7 +202,7 @@ Make sure the width/height is correct." :initform vertical)) "Subclass for bar charts (vertical or horizontal).") -(defmethod chart-draw ((c chart) &optional buff) +(cl-defmethod chart-draw ((c chart) &optional buff) "Start drawing a chart object C in optional BUFF. Erases current contents of buffer." (save-excursion @@ -221,19 +222,19 @@ Erases current contents of buffer." (message "Rendering chart...done") )) -(defmethod chart-draw-title ((c chart)) +(cl-defmethod chart-draw-title ((c chart)) "Draw a title upon the chart. Argument C is the chart object." (chart-display-label (oref c title) 'horizontal 0 0 (window-width) (oref c title-face))) -(defmethod chart-size-in-dir ((c chart) dir) +(cl-defmethod chart-size-in-dir ((c chart) dir) "Return the physical size of chart C in direction DIR." (if (eq dir 'vertical) (oref c y-width) (oref c x-width))) -(defmethod chart-draw-axis ((c chart)) +(cl-defmethod chart-draw-axis ((c chart)) "Draw axis into the current buffer defined by chart C." (let ((ymarg (oref c y-margin)) (xmarg (oref c x-margin)) @@ -247,7 +248,7 @@ Argument C is the chart object." ymarg (+ ymarg xlen))) ) -(defmethod chart-axis-draw ((a chart-axis) &optional dir margin zone start end) +(cl-defmethod chart-axis-draw ((a chart-axis) &optional dir margin zone start end) "Draw some axis for A in direction DIR with MARGIN in boundary. ZONE is a zone specification. START and END represent the boundary." @@ -257,7 +258,7 @@ START and END represent the boundary." 1 0)) start end (oref a name-face))) -(defmethod chart-translate-xpos ((c chart) x) +(cl-defmethod chart-translate-xpos ((c chart) x) "Translate in chart C the coordinate X into a screen column." (let ((range (oref (oref c x-axis) bounds))) (+ (oref c x-margin) @@ -266,7 +267,7 @@ START and END represent the boundary." (float (- (cdr range) (car range)))))))) ) -(defmethod chart-translate-ypos ((c chart) y) +(cl-defmethod chart-translate-ypos ((c chart) y) "Translate in chart C the coordinate Y into a screen row." (let ((range (oref (oref c y-axis) bounds))) (+ (oref c x-margin) @@ -276,7 +277,7 @@ START and END represent the boundary." (float (- (cdr range) (car range))))))))) ) -(defmethod chart-axis-draw ((a chart-axis-range) &optional dir margin zone _start _end) +(cl-defmethod chart-axis-draw ((a chart-axis-range) &optional dir margin zone _start _end) "Draw axis information based upon a range to be spread along the edge. A is the chart to draw. DIR is the direction. MARGIN, ZONE, START, and END specify restrictions in chart space." @@ -313,7 +314,7 @@ MARGIN, ZONE, START, and END specify restrictions in chart space." (setq i (+ i j)))) ) -(defmethod chart-translate-namezone ((c chart) n) +(cl-defmethod chart-translate-namezone ((c chart) n) "Return a dot-pair representing a positional range for a name. The name in chart C of the Nth name resides. Automatically compensates for direction." @@ -329,7 +330,7 @@ Automatically compensates for direction." (+ m -1 (round (* lpn (+ 1.0 (float n)))))) )) -(defmethod chart-axis-draw ((a chart-axis-names) &optional dir margin zone _start _end) +(cl-defmethod chart-axis-draw ((a chart-axis-names) &optional dir margin zone _start _end) "Draw axis information based upon A range to be spread along the edge. Optional argument DIR is the direction of the chart. Optional arguments MARGIN, ZONE, START and END specify boundaries of the drawing." @@ -368,7 +369,7 @@ Optional arguments MARGIN, ZONE, START and END specify boundaries of the drawing s (cdr s)))) ) -(defmethod chart-draw-data ((c chart-bar)) +(cl-defmethod chart-draw-data ((c chart-bar)) "Display the data available in a bar chart C." (let* ((data (oref c sequences)) (dir (oref c direction)) @@ -413,7 +414,7 @@ Optional arguments MARGIN, ZONE, START and END specify boundaries of the drawing (setq data (cdr data)))) ) -(defmethod chart-add-sequence ((c chart) &optional seq axis-label) +(cl-defmethod chart-add-sequence ((c chart) &optional seq axis-label) "Add to chart object C the sequence object SEQ. If AXIS-LABEL, then the axis stored in C is updated with the bounds of SEQ, or is created with the bounds of SEQ." @@ -445,7 +446,7 @@ or is created with the bounds of SEQ." ;;; Charting optimizers -(defmethod chart-trim ((c chart) max) +(cl-defmethod chart-trim ((c chart) max) "Trim all sequences in chart C to be at most MAX elements long." (let ((s (oref c sequences))) (while s @@ -455,7 +456,7 @@ or is created with the bounds of SEQ." (setq s (cdr s)))) ) -(defmethod chart-sort ((c chart) pred) +(cl-defmethod chart-sort ((c chart) pred) "Sort the data in chart C using predicate PRED. See `chart-sort-matchlist' for more details." (let* ((sl (oref c sequences)) diff --git a/lisp/leim/quail/programmer-dvorak.el b/lisp/leim/quail/programmer-dvorak.el new file mode 100644 index 00000000000..a74fb5bc6b6 --- /dev/null +++ b/lisp/leim/quail/programmer-dvorak.el @@ -0,0 +1,145 @@ +;;; programmer-dvorak.el --- Quail package for the programmer Dvorak layout + +;; Copyright (C) 2015 Free Software Foundation, Inc. + +;; Author: Joakim Jalap <joakim.jalap@fastmail.com> + +;; Keywords: input method, Dvorak + +;; This file is released under the terms of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;;; This file provides an input method for the programmers Dvorak keyboard +;;; layout by Roland Kaufman (<http://www.kaufmann.no/roland/dvorak/>). + +;;; Code: + +(require 'quail) + +(quail-define-package + "programmer-dvorak" "English" "DVP@" t + "An English (ASCII) dvorak layout optimized for programming, with for example + brackets and parens more easily reachable." + nil t t t t nil nil nil nil nil t) + +;; &% [7 {5 }3 (1 =9 *0 )2 +4 ]6 !8 #` $~ +;; ;: ,< .> pP yY fF gG cC rR lL /? @^ +;; aA oO eE uU iI dD hH tT nN sS -_ \| +;; '" qQ jJ kK xX bB mM wW vV zZ +;; + +(quail-define-rules + ("-" ?!) + ("=" ?#) + ("`" ?$) + ("q" ?\;) + ("w" ?,) + ("e" ?.) + ("r" ?p) + ("t" ?y) + ("y" ?f) + ("u" ?g) + ("i" ?c) + ("o" ?r) + ("p" ?l) + ("[" ?/) + ("]" ?@) + ("a" ?a) + ("s" ?o) + ("d" ?e) + ("f" ?u) + ("g" ?i) + ("h" ?d) + ("j" ?h) + ("k" ?t) + ("l" ?n) + (";" ?s) + ("'" ?-) + ("\\" ?\\) + ("z" ?\') + ("x" ?q) + ("c" ?j) + ("v" ?k) + ("b" ?x) + ("n" ?b) + ("m" ?m) + ("," ?w) + ("." ?v) + ("/" ?z) + + ("_" ?8) + ("+" ?`) + ("~" ?~) + ("Q" ?:) + ("W" ?<) + ("E" ?>) + ("R" ?P) + ("T" ?Y) + ("Y" ?F) + ("U" ?G) + ("I" ?C) + ("O" ?R) + ("P" ?L) + ("{" ??) + ("}" ?^) + ("A" ?A) + ("S" ?O) + ("D" ?E) + ("F" ?U) + ("G" ?I) + ("H" ?D) + ("J" ?H) + ("K" ?T) + ("L" ?N) + (":" ?S) + ("\"" ?_) + ("|" ?|) + ("Z" ?\") + ("X" ?Q) + ("C" ?J) + ("V" ?K) + ("B" ?X) + ("N" ?B) + ("M" ?M) + ("<" ?W) + (">" ?V) + ("?" ?Z) + + ("1" ?&) + ("2" ?\[) + ("3" ?{) + ("4" ?}) + ("5" ?\() + ("6" ?=) + ("7" ?\*) + ("8" ?\)) + ("9" ?+) + ("0" ?\]) + + ("!" ?%) + ("@" ?7) + ("#" ?5) + ("$" ?3) + ("%" ?1) + ("^" ?9) + ("&" ?0) + ("*" ?2) + ("(" ?4) + (")" ?6) + ) + +;;; programmer-dvorak.el ends here diff --git a/lisp/net/shr.el b/lisp/net/shr.el index 0effa93b197..7ee382f2f22 100644 --- a/lisp/net/shr.el +++ b/lisp/net/shr.el @@ -259,6 +259,11 @@ DOM should be a parse tree as generated by (* (frame-char-width) 2) 0))))) bidi-display-reordering) + ;; If the window was hscrolled for some reason, shr-fill-lines + ;; below will misbehave, because it silently assumes that it + ;; starts with a non-hscrolled window (vertical-motion will move + ;; to a wrong place otherwise). + (set-window-hscroll nil 0) (shr-descend dom) (shr-fill-lines start (point)) (shr-remove-trailing-whitespace start (point)) diff --git a/lisp/textmodes/flyspell.el b/lisp/textmodes/flyspell.el index 6c4a731629c..8d13aa1dd5b 100644 --- a/lisp/textmodes/flyspell.el +++ b/lisp/textmodes/flyspell.el @@ -399,6 +399,9 @@ like <img alt=\"Some thing.\">." (interactive) (setq flyspell-generic-check-word-predicate #'flyspell-generic-progmode-verify) + (setq-local flyspell--prev-meta-tab-binding + (or (local-key-binding "\M-\t" t) + (global-key-binding "\M-\t" t))) (flyspell-mode 1) (run-hooks 'flyspell-prog-mode-hook)) @@ -1904,105 +1907,114 @@ before point that's highlighted as misspelled." "Correct the current word. This command proposes various successive corrections for the current word." (interactive) - (let ((pos (point)) - (old-max (point-max))) - ;; Use the correct dictionary. - (flyspell-accept-buffer-local-defs) - (if (and (eq flyspell-auto-correct-pos pos) - (consp flyspell-auto-correct-region)) - ;; We have already been using the function at the same location. - (let* ((start (car flyspell-auto-correct-region)) - (len (cdr flyspell-auto-correct-region))) - (flyspell-unhighlight-at start) - (delete-region start (+ start len)) - (setq flyspell-auto-correct-ring (cdr flyspell-auto-correct-ring)) - (let* ((word (car flyspell-auto-correct-ring)) - (len (length word))) - (rplacd flyspell-auto-correct-region len) - (goto-char start) - (if flyspell-abbrev-p - (if (flyspell-already-abbrevp (flyspell-abbrev-table) - flyspell-auto-correct-word) - (flyspell-change-abbrev (flyspell-abbrev-table) - flyspell-auto-correct-word - word) - (flyspell-define-abbrev flyspell-auto-correct-word word))) - (funcall flyspell-insert-function word) - (flyspell-word) - (flyspell-display-next-corrections flyspell-auto-correct-ring)) - (flyspell-ajust-cursor-point pos (point) old-max) - (setq flyspell-auto-correct-pos (point))) - ;; Fetch the word to be checked. - (let ((word (flyspell-get-word))) - (if (consp word) - (let ((start (car (cdr word))) - (end (car (cdr (cdr word)))) - (word (car word)) - poss ispell-filter) - (setq flyspell-auto-correct-word word) - ;; Now check spelling of word.. - (ispell-send-string "%\n") ;Put in verbose mode. - (ispell-send-string (concat "^" word "\n")) - ;; Wait until ispell has processed word. - (while (progn - (accept-process-output ispell-process) - (not (string= "" (car ispell-filter))))) - ;; Remove leading empty element. - (setq ispell-filter (cdr ispell-filter)) - ;; Ispell process should return something after word is sent. - ;; Tag word as valid (i.e., skip) otherwise. - (or ispell-filter - (setq ispell-filter '(*))) - (if (consp ispell-filter) - (setq poss (ispell-parse-output (car ispell-filter)))) - (cond - ((or (eq poss t) (stringp poss)) - ;; Don't correct word. - t) - ((null poss) - ;; Ispell error. - (error "Ispell: error in Ispell process")) - (t - ;; The word is incorrect, we have to propose a replacement. - (let ((replacements (if flyspell-sort-corrections - (sort (car (cdr (cdr poss))) 'string<) - (car (cdr (cdr poss)))))) - (setq flyspell-auto-correct-region nil) - (if (consp replacements) - (progn - (let ((replace (car replacements))) - (let ((new-word replace)) - (if (not (equal new-word (car poss))) - (progn - ;; the save the current replacements - (setq flyspell-auto-correct-region - (cons start (length new-word))) - (let ((l replacements)) - (while (consp (cdr l)) - (setq l (cdr l))) - (rplacd l (cons (car poss) replacements))) - (setq flyspell-auto-correct-ring - replacements) - (flyspell-unhighlight-at start) - (delete-region start end) - (funcall flyspell-insert-function new-word) - (if flyspell-abbrev-p - (if (flyspell-already-abbrevp - (flyspell-abbrev-table) word) - (flyspell-change-abbrev - (flyspell-abbrev-table) - word - new-word) - (flyspell-define-abbrev word - new-word))) - (flyspell-word) - (flyspell-display-next-corrections - (cons new-word flyspell-auto-correct-ring)) - (flyspell-ajust-cursor-point pos - (point) - old-max)))))))))) - (setq flyspell-auto-correct-pos (point)) - (ispell-pdict-save t))))))) + ;; If we are not in the construct where flyspell should be active, + ;; invoke the original binding of M-TAB, if that was recorded. + (if (and (local-variable-p 'flyspell--prev-meta-tab-binding) + (commandp flyspell--prev-meta-tab-binding t) + (fboundp flyspell-generic-check-word-predicate) + (not (funcall flyspell-generic-check-word-predicate)) + (equal (where-is-internal 'flyspell-auto-correct-word nil t) + [?\M-\t])) + (call-interactively flyspell--prev-meta-tab-binding) + (let ((pos (point)) + (old-max (point-max))) + ;; Use the correct dictionary. + (flyspell-accept-buffer-local-defs) + (if (and (eq flyspell-auto-correct-pos pos) + (consp flyspell-auto-correct-region)) + ;; We have already been using the function at the same location. + (let* ((start (car flyspell-auto-correct-region)) + (len (cdr flyspell-auto-correct-region))) + (flyspell-unhighlight-at start) + (delete-region start (+ start len)) + (setq flyspell-auto-correct-ring (cdr flyspell-auto-correct-ring)) + (let* ((word (car flyspell-auto-correct-ring)) + (len (length word))) + (rplacd flyspell-auto-correct-region len) + (goto-char start) + (if flyspell-abbrev-p + (if (flyspell-already-abbrevp (flyspell-abbrev-table) + flyspell-auto-correct-word) + (flyspell-change-abbrev (flyspell-abbrev-table) + flyspell-auto-correct-word + word) + (flyspell-define-abbrev flyspell-auto-correct-word word))) + (funcall flyspell-insert-function word) + (flyspell-word) + (flyspell-display-next-corrections flyspell-auto-correct-ring)) + (flyspell-ajust-cursor-point pos (point) old-max) + (setq flyspell-auto-correct-pos (point))) + ;; Fetch the word to be checked. + (let ((word (flyspell-get-word))) + (if (consp word) + (let ((start (car (cdr word))) + (end (car (cdr (cdr word)))) + (word (car word)) + poss ispell-filter) + (setq flyspell-auto-correct-word word) + ;; Now check spelling of word.. + (ispell-send-string "%\n") ;Put in verbose mode. + (ispell-send-string (concat "^" word "\n")) + ;; Wait until ispell has processed word. + (while (progn + (accept-process-output ispell-process) + (not (string= "" (car ispell-filter))))) + ;; Remove leading empty element. + (setq ispell-filter (cdr ispell-filter)) + ;; Ispell process should return something after word is sent. + ;; Tag word as valid (i.e., skip) otherwise. + (or ispell-filter + (setq ispell-filter '(*))) + (if (consp ispell-filter) + (setq poss (ispell-parse-output (car ispell-filter)))) + (cond + ((or (eq poss t) (stringp poss)) + ;; Don't correct word. + t) + ((null poss) + ;; Ispell error. + (error "Ispell: error in Ispell process")) + (t + ;; The word is incorrect, we have to propose a replacement. + (let ((replacements (if flyspell-sort-corrections + (sort (car (cdr (cdr poss))) 'string<) + (car (cdr (cdr poss)))))) + (setq flyspell-auto-correct-region nil) + (if (consp replacements) + (progn + (let ((replace (car replacements))) + (let ((new-word replace)) + (if (not (equal new-word (car poss))) + (progn + ;; the save the current replacements + (setq flyspell-auto-correct-region + (cons start (length new-word))) + (let ((l replacements)) + (while (consp (cdr l)) + (setq l (cdr l))) + (rplacd l (cons (car poss) replacements))) + (setq flyspell-auto-correct-ring + replacements) + (flyspell-unhighlight-at start) + (delete-region start end) + (funcall flyspell-insert-function new-word) + (if flyspell-abbrev-p + (if (flyspell-already-abbrevp + (flyspell-abbrev-table) word) + (flyspell-change-abbrev + (flyspell-abbrev-table) + word + new-word) + (flyspell-define-abbrev word + new-word))) + (flyspell-word) + (flyspell-display-next-corrections + (cons new-word flyspell-auto-correct-ring)) + (flyspell-ajust-cursor-point pos + (point) + old-max)))))))))) + (setq flyspell-auto-correct-pos (point)) + (ispell-pdict-save t)))))))) ;;*---------------------------------------------------------------------*/ ;;* flyspell-auto-correct-previous-pos ... */ |