summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2016-01-11 22:48:07 -0800
committerJohn Wiegley <johnw@newartisans.com>2016-01-11 22:48:07 -0800
commit8d7128c46de2af10d50c1495a075d66b702f6d21 (patch)
tree248825b1d310edff622e05241c9ee8f5d60d9c14 /lisp
parent8df9e56b4ad9704747dd8af7a049da9ee6ab3a00 (diff)
parent9ee6ecb840c57aaf87316bccc2a892265087bafe (diff)
downloademacs-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.el47
-rw-r--r--lisp/leim/quail/programmer-dvorak.el145
-rw-r--r--lisp/net/shr.el5
-rw-r--r--lisp/textmodes/flyspell.el210
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 ... */