aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorJoakim Verona2013-04-17 08:30:36 +0200
committerJoakim Verona2013-04-17 08:30:36 +0200
commit86dfe9dc6768ae0e932b4a29ce7da5ceb613855a (patch)
tree8a835d1e7115fc80ca68738f64a9559b5a4115bc /lisp
parent70766401dd70a2b8ee380f4304f94c989a5a15f1 (diff)
parent083850a6a195c5d536bd4cd344b5917b225597cc (diff)
downloademacs-86dfe9dc6768ae0e932b4a29ce7da5ceb613855a.tar.gz
emacs-86dfe9dc6768ae0e932b4a29ce7da5ceb613855a.zip
auto upstream
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog46
-rw-r--r--lisp/abbrev.el42
-rw-r--r--lisp/gnus/ChangeLog7
-rw-r--r--lisp/gnus/shr.el17
-rw-r--r--lisp/progmodes/gdb-mi.el18
-rw-r--r--lisp/progmodes/octave-mod.el7
-rw-r--r--lisp/progmodes/python.el100
-rw-r--r--lisp/vc/vc-hg.el2
8 files changed, 192 insertions, 47 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index f62dff32008..11666c60c74 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,49 @@
12013-04-17 Fabián Ezequiel Gallina <fgallina@gnu.org>
2
3 New defun movement commands.
4 * progmodes/python.el (python-nav--syntactically)
5 (python-nav--forward-defun, python-nav-backward-defun)
6 (python-nav-forward-defun): New functions.
7
82013-04-17 Fabián Ezequiel Gallina <fgallina@gnu.org>
9
10 * progmodes/python.el (python-syntax--context-compiler-macro): New defun.
11 (python-syntax-context): Use named compiler-macro for backwards
12 compatibility with Emacs 24.x.
13
142013-04-17 Leo Liu <sdl.web@gmail.com>
15
16 * progmodes/octave-mod.el (octave-mode-map): Fix key binding to
17 octave-hide-process-buffer.
18
192013-04-17 Stefan Monnier <monnier@iro.umontreal.ca>
20
21 * vc/vc-hg.el (vc-hg-annotate-re): Disallow ": " in file names
22 (bug#14216).
23
242013-04-17 Jean-Philippe Gravel <jpgravel@gmail.com>
25
26 * progmodes/gdb-mi.el (gdbmi-bnf-incomplete-record-result):
27 Fix adjustment of offset when receiving incomplete responses from GDB
28 (bug#14129).
29
302013-04-16 Stefan Monnier <monnier@iro.umontreal.ca>
31
32 * progmodes/python.el (python-mode-skeleton-abbrev-table): Rename from
33 python-mode-abbrev-table.
34 (python-skeleton-define): Adjust accordingly.
35 (python-mode-abbrev-table): New table that inherits from it so that
36 python-skeleton-autoinsert does not affect non-skeleton abbrevs.
37
38 * abbrev.el (abbrev--symbol): New function, extracted from abbrev-symbol.
39 (abbrev-symbol): Use it.
40 (abbrev--before-point): Use it since we already handle inheritance.
41
422013-04-16 Leo Liu <sdl.web@gmail.com>
43
44 * progmodes/octave-mod.el (octave-mode-map): Remove redundant key
45 binding to info-lookup-symbol.
46
12013-04-16 Juanma Barranquero <lekktu@gmail.com> 472013-04-16 Juanma Barranquero <lekktu@gmail.com>
2 48
3 * minibuffer.el (completion--twq-all): 49 * minibuffer.el (completion--twq-all):
diff --git a/lisp/abbrev.el b/lisp/abbrev.el
index bd09653103f..cc7ebe489f7 100644
--- a/lisp/abbrev.el
+++ b/lisp/abbrev.el
@@ -669,6 +669,26 @@ either a single abbrev table or a list of abbrev tables."
669 tables)))) 669 tables))))
670 670
671 671
672(defun abbrev--symbol (abbrev table)
673 "Return the symbol representing abbrev named ABBREV in TABLE.
674This symbol's name is ABBREV, but it is not the canonical symbol of that name;
675it is interned in the abbrev-table TABLE rather than the normal obarray.
676The value is nil if that abbrev is not defined."
677 (let* ((case-fold (not (abbrev-table-get table :case-fixed)))
678 ;; In case the table doesn't set :case-fixed but some of the
679 ;; abbrevs do, we have to be careful.
680 (sym
681 ;; First try without case-folding.
682 (or (intern-soft abbrev table)
683 (when case-fold
684 ;; We didn't find any abbrev, try case-folding.
685 (let ((sym (intern-soft (downcase abbrev) table)))
686 ;; Only use it if it doesn't require :case-fixed.
687 (and sym (not (abbrev-get sym :case-fixed))
688 sym))))))
689 (if (symbol-value sym)
690 sym)))
691
672(defun abbrev-symbol (abbrev &optional table) 692(defun abbrev-symbol (abbrev &optional table)
673 "Return the symbol representing abbrev named ABBREV. 693 "Return the symbol representing abbrev named ABBREV.
674This symbol's name is ABBREV, but it is not the canonical symbol of that name; 694This symbol's name is ABBREV, but it is not the canonical symbol of that name;
@@ -678,23 +698,11 @@ Optional second arg TABLE is abbrev table to look it up in.
678The default is to try buffer's mode-specific abbrev table, then global table." 698The default is to try buffer's mode-specific abbrev table, then global table."
679 (let ((tables (abbrev--active-tables table)) 699 (let ((tables (abbrev--active-tables table))
680 sym) 700 sym)
681 (while (and tables (not (symbol-value sym))) 701 (while (and tables (not sym))
682 (let* ((table (pop tables)) 702 (let* ((table (pop tables)))
683 (case-fold (not (abbrev-table-get table :case-fixed))))
684 (setq tables (append (abbrev-table-get table :parents) tables)) 703 (setq tables (append (abbrev-table-get table :parents) tables))
685 ;; In case the table doesn't set :case-fixed but some of the 704 (setq sym (abbrev--symbol abbrev table))))
686 ;; abbrevs do, we have to be careful. 705 sym))
687 (setq sym
688 ;; First try without case-folding.
689 (or (intern-soft abbrev table)
690 (when case-fold
691 ;; We didn't find any abbrev, try case-folding.
692 (let ((sym (intern-soft (downcase abbrev) table)))
693 ;; Only use it if it doesn't require :case-fixed.
694 (and sym (not (abbrev-get sym :case-fixed))
695 sym)))))))
696 (if (symbol-value sym)
697 sym)))
698 706
699 707
700(defun abbrev-expansion (abbrev &optional table) 708(defun abbrev-expansion (abbrev &optional table)
@@ -748,7 +756,7 @@ then ABBREV is looked up in that table only."
748 (setq start (match-beginning 1)) 756 (setq start (match-beginning 1))
749 (setq end (match-end 1))))) 757 (setq end (match-end 1)))))
750 (setq name (buffer-substring start end)) 758 (setq name (buffer-substring start end))
751 (let ((abbrev (abbrev-symbol name table))) 759 (let ((abbrev (abbrev--symbol name table)))
752 (when abbrev 760 (when abbrev
753 (setq enable-fun (abbrev-get abbrev :enable-function)) 761 (setq enable-fun (abbrev-get abbrev :enable-function))
754 (and (or (not enable-fun) (funcall enable-fun)) 762 (and (or (not enable-fun) (funcall enable-fun))
diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog
index cc7897accb6..144b6482b9d 100644
--- a/lisp/gnus/ChangeLog
+++ b/lisp/gnus/ChangeLog
@@ -1,3 +1,10 @@
12013-04-16 David Edmondson <dme@dme.org>
2
3 Support <img src="data:...">.
4
5 * shr.el (shr-image-from-data): New function.
6 (shr-tag-img): Use it.
7
12013-04-14 Andrew Cohen <cohen@bu.edu> 82013-04-14 Andrew Cohen <cohen@bu.edu>
2 9
3 * nnir.el (nnir-request-set-mark): Make sure we are in the right 10 * nnir.el (nnir-request-set-mark): Make sure we are in the right
diff --git a/lisp/gnus/shr.el b/lisp/gnus/shr.el
index 5df5297ba8a..293ba2445e9 100644
--- a/lisp/gnus/shr.el
+++ b/lisp/gnus/shr.el
@@ -593,6 +593,17 @@ size, and full-buffer size."
593 (put-text-property start (point) type value)))))))))) 593 (put-text-property start (point) type value))))))))))
594 (kill-buffer image-buffer))) 594 (kill-buffer image-buffer)))
595 595
596(defun shr-image-from-data (data)
597 "Return an image from the data: URI content DATA."
598 (when (string-match
599 "\\(\\([^/;,]+\\(/[^;,]+\\)?\\)\\(;[^;,]+\\)*\\)?,\\(.*\\)"
600 data)
601 (let ((param (match-string 4 data))
602 (payload (url-unhex-string (match-string 5 data))))
603 (when (string-match "^.*\\(;[ \t]*base64\\)$" param)
604 (setq payload (base64-decode-string payload)))
605 payload)))
606
596(defun shr-put-image (data alt &optional flags) 607(defun shr-put-image (data alt &optional flags)
597 "Put image DATA with a string ALT. Return image." 608 "Put image DATA with a string ALT. Return image."
598 (if (display-graphic-p) 609 (if (display-graphic-p)
@@ -983,6 +994,12 @@ ones, in case fg and bg are nil."
983 ;; Ignore zero-sized or single-pixel images. 994 ;; Ignore zero-sized or single-pixel images.
984 ) 995 )
985 ((and (not shr-inhibit-images) 996 ((and (not shr-inhibit-images)
997 (string-match "\\`data:" url))
998 (let ((image (shr-image-from-data (substring url (match-end 0)))))
999 (if image
1000 (funcall shr-put-image-function image alt)
1001 (insert alt))))
1002 ((and (not shr-inhibit-images)
986 (string-match "\\`cid:" url)) 1003 (string-match "\\`cid:" url))
987 (let ((url (substring url (match-end 0))) 1004 (let ((url (substring url (match-end 0)))
988 image) 1005 image)
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index 8ba2822c3a3..f5e1abdd546 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -2149,19 +2149,23 @@ the end of the current result or async record is reached."
2149 ;; Search the data stream for the end of the current record: 2149 ;; Search the data stream for the end of the current record:
2150 (let* ((newline-pos (string-match "\n" gud-marker-acc gdbmi-bnf-offset)) 2150 (let* ((newline-pos (string-match "\n" gud-marker-acc gdbmi-bnf-offset))
2151 (is-progressive (equal (cdr class-command) 'progressive)) 2151 (is-progressive (equal (cdr class-command) 'progressive))
2152 (is-complete (not (null newline-pos))) 2152 (is-complete (not (null newline-pos)))
2153 result-str) 2153 result-str)
2154
2155 (when gdbmi-debug-mode
2156 (message "gdbmi-bnf-incomplete-record-result: %s"
2157 (substring gud-marker-acc gdbmi-bnf-offset newline-pos)))
2154 2158
2155 ;; Update the gdbmi-bnf-offset only if the current chunk of data can 2159 ;; Update the gdbmi-bnf-offset only if the current chunk of data can
2156 ;; be processed by the class-command handler: 2160 ;; be processed by the class-command handler:
2157 (when (or is-complete is-progressive) 2161 (when (or is-complete is-progressive)
2158 (setq result-str 2162 (setq result-str
2159 (substring gud-marker-acc gdbmi-bnf-offset newline-pos)) 2163 (substring gud-marker-acc gdbmi-bnf-offset newline-pos))
2160 (setq gdbmi-bnf-offset (+ 1 newline-pos)))
2161 2164
2162 (if gdbmi-debug-mode 2165 ;; Move gdbmi-bnf-offset past the end of the chunk.
2163 (message "gdbmi-bnf-incomplete-record-result: %s" 2166 (setq gdbmi-bnf-offset (+ gdbmi-bnf-offset (length result-str)))
2164 (substring gud-marker-acc gdbmi-bnf-offset newline-pos))) 2167 (when newline-pos
2168 (setq gdbmi-bnf-offset (1+ gdbmi-bnf-offset))))
2165 2169
2166 ;; Update the parsing state before invoking the handler in class-command 2170 ;; Update the parsing state before invoking the handler in class-command
2167 ;; to make sure it's not left in an invalid state if the handler was 2171 ;; to make sure it's not left in an invalid state if the handler was
diff --git a/lisp/progmodes/octave-mod.el b/lisp/progmodes/octave-mod.el
index 806afe5a537..4683186e603 100644
--- a/lisp/progmodes/octave-mod.el
+++ b/lisp/progmodes/octave-mod.el
@@ -223,22 +223,19 @@ parenthetical grouping.")
223 (define-key map "\C-c]" 'smie-close-block) 223 (define-key map "\C-c]" 'smie-close-block)
224 (define-key map "\C-c/" 'smie-close-block) 224 (define-key map "\C-c/" 'smie-close-block)
225 (define-key map "\C-c\C-f" 'octave-insert-defun) 225 (define-key map "\C-c\C-f" 'octave-insert-defun)
226 ;; FIXME: free C-h so it can do the describe-prefix-bindings.
227 (define-key map "\C-c\C-h" 'info-lookup-symbol)
228 (define-key map "\C-c\C-il" 'octave-send-line) 226 (define-key map "\C-c\C-il" 'octave-send-line)
229 (define-key map "\C-c\C-ib" 'octave-send-block) 227 (define-key map "\C-c\C-ib" 'octave-send-block)
230 (define-key map "\C-c\C-if" 'octave-send-defun) 228 (define-key map "\C-c\C-if" 'octave-send-defun)
231 (define-key map "\C-c\C-ir" 'octave-send-region) 229 (define-key map "\C-c\C-ir" 'octave-send-region)
232 (define-key map "\C-c\C-is" 'octave-show-process-buffer) 230 (define-key map "\C-c\C-is" 'octave-show-process-buffer)
233 (define-key map "\C-c\C-ih" 'octave-hide-process-buffer) 231 (define-key map "\C-c\C-iq" 'octave-hide-process-buffer)
234 (define-key map "\C-c\C-ik" 'octave-kill-process) 232 (define-key map "\C-c\C-ik" 'octave-kill-process)
235 (define-key map "\C-c\C-i\C-l" 'octave-send-line) 233 (define-key map "\C-c\C-i\C-l" 'octave-send-line)
236 (define-key map "\C-c\C-i\C-b" 'octave-send-block) 234 (define-key map "\C-c\C-i\C-b" 'octave-send-block)
237 (define-key map "\C-c\C-i\C-f" 'octave-send-defun) 235 (define-key map "\C-c\C-i\C-f" 'octave-send-defun)
238 (define-key map "\C-c\C-i\C-r" 'octave-send-region) 236 (define-key map "\C-c\C-i\C-r" 'octave-send-region)
239 (define-key map "\C-c\C-i\C-s" 'octave-show-process-buffer) 237 (define-key map "\C-c\C-i\C-s" 'octave-show-process-buffer)
240 ;; FIXME: free C-h so it can do the describe-prefix-bindings. 238 (define-key map "\C-c\C-i\C-q" 'octave-hide-process-buffer)
241 (define-key map "\C-c\C-i\C-h" 'octave-hide-process-buffer)
242 (define-key map "\C-c\C-i\C-k" 'octave-kill-process) 239 (define-key map "\C-c\C-i\C-k" 'octave-kill-process)
243 map) 240 map)
244 "Keymap used in Octave mode.") 241 "Keymap used in Octave mode.")
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index d1009534e49..1d7cf02ca5a 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -368,22 +368,24 @@ This variant of `rx' supports common python named REGEXPS."
368 368
369;;; Font-lock and syntax 369;;; Font-lock and syntax
370 370
371(eval-when-compile
372 (defun python-syntax--context-compiler-macro (form type &optional syntax-ppss)
373 (pcase type
374 (`'comment
375 `(let ((ppss (or ,syntax-ppss (syntax-ppss))))
376 (and (nth 4 ppss) (nth 8 ppss))))
377 (`'string
378 `(let ((ppss (or ,syntax-ppss (syntax-ppss))))
379 (and (nth 3 ppss) (nth 8 ppss))))
380 (`'paren
381 `(nth 1 (or ,syntax-ppss (syntax-ppss))))
382 (_ form))))
383
371(defun python-syntax-context (type &optional syntax-ppss) 384(defun python-syntax-context (type &optional syntax-ppss)
372 "Return non-nil if point is on TYPE using SYNTAX-PPSS. 385 "Return non-nil if point is on TYPE using SYNTAX-PPSS.
373TYPE can be `comment', `string' or `paren'. It returns the start 386TYPE can be `comment', `string' or `paren'. It returns the start
374character address of the specified TYPE." 387character address of the specified TYPE."
375 (declare (compiler-macro 388 (declare (compiler-macro python-syntax--context-compiler-macro))
376 (lambda (form)
377 (pcase type
378 (`'comment
379 `(let ((ppss (or ,syntax-ppss (syntax-ppss))))
380 (and (nth 4 ppss) (nth 8 ppss))))
381 (`'string
382 `(let ((ppss (or ,syntax-ppss (syntax-ppss))))
383 (and (nth 3 ppss) (nth 8 ppss))))
384 (`'paren
385 `(nth 1 (or ,syntax-ppss (syntax-ppss))))
386 (_ form)))))
387 (let ((ppss (or syntax-ppss (syntax-ppss)))) 389 (let ((ppss (or syntax-ppss (syntax-ppss))))
388 (pcase type 390 (pcase type
389 (`comment (and (nth 4 ppss) (nth 8 ppss))) 391 (`comment (and (nth 4 ppss) (nth 8 ppss)))
@@ -1190,6 +1192,66 @@ Returns nil if point is not in a def or class."
1190 ;; Ensure point moves forward. 1192 ;; Ensure point moves forward.
1191 (and (> beg-pos (point)) (goto-char beg-pos))))) 1193 (and (> beg-pos (point)) (goto-char beg-pos)))))
1192 1194
1195(defun python-nav--syntactically (fn poscompfn &optional pos)
1196 "Move to point using FN ignoring non-code or paren context.
1197FN must take no arguments and could be used to set match-data.
1198POSCOMPFN is a two arguments function used to compare current and
1199previous point after it is moved using FN, this is normally a
1200less-than or greater-than comparison. Optional argument POS is
1201internally used in recursive calls and should not be explicitly
1202passed."
1203 (let* ((newpos
1204 (and (funcall fn)
1205 (save-match-data
1206 (and
1207 (not (python-syntax-context-type))
1208 (point-marker)))))
1209 (current-match-data (match-data)))
1210 (cond ((or (and (not pos) newpos)
1211 (and pos newpos (funcall poscompfn newpos pos)))
1212 (set-match-data current-match-data)
1213 (point-marker))
1214 ((and (not pos) (not newpos)) nil)
1215 (t (python-nav--syntactically
1216 fn poscompfn (point-marker))))))
1217
1218(defun python-nav--forward-defun (arg)
1219 "Internal implementation of python-nav-{backward,forward}-defun.
1220Uses ARG to define which function to call, and how many times
1221repeat it."
1222 (let ((found))
1223 (while (and (> arg 0)
1224 (setq found
1225 (python-nav--syntactically
1226 (lambda ()
1227 (re-search-forward
1228 python-nav-beginning-of-defun-regexp nil t))
1229 '>)))
1230 (setq arg (1- arg)))
1231 (while (and (< arg 0)
1232 (setq found
1233 (python-nav--syntactically
1234 (lambda ()
1235 (re-search-backward
1236 python-nav-beginning-of-defun-regexp nil t))
1237 '<)))
1238 (setq arg (1+ arg)))
1239 found))
1240
1241(defun python-nav-backward-defun (&optional arg)
1242 "Navigate to closer defun backward ARG times.
1243Unlikely `python-nav-beginning-of-defun' this doesn't care about
1244nested definitions."
1245 (interactive "^p")
1246 (python-nav--forward-defun (- (or arg 1))))
1247
1248(defun python-nav-forward-defun (&optional arg)
1249 "Navigate to closer defun forward ARG times.
1250Unlikely `python-nav-beginning-of-defun' this doesn't care about
1251nested definitions."
1252 (interactive "^p")
1253 (python-nav--forward-defun (or arg 1)))
1254
1193(defun python-nav-beginning-of-statement () 1255(defun python-nav-beginning-of-statement ()
1194 "Move to start of current statement." 1256 "Move to start of current statement."
1195 (interactive "^") 1257 (interactive "^")
@@ -2654,8 +2716,8 @@ the if condition."
2654(defvar python-skeleton-available '() 2716(defvar python-skeleton-available '()
2655 "Internal list of available skeletons.") 2717 "Internal list of available skeletons.")
2656 2718
2657(define-abbrev-table 'python-mode-abbrev-table () 2719(define-abbrev-table 'python-mode-skeleton-abbrev-table ()
2658 "Abbrev table for Python mode." 2720 "Abbrev table for Python mode skeletons."
2659 :case-fixed t 2721 :case-fixed t
2660 ;; Allow / inside abbrevs. 2722 ;; Allow / inside abbrevs.
2661 :regexp "\\(?:^\\|[^/]\\)\\<\\([[:word:]/]+\\)\\W*" 2723 :regexp "\\(?:^\\|[^/]\\)\\<\\([[:word:]/]+\\)\\W*"
@@ -2668,13 +2730,13 @@ the if condition."
2668(defmacro python-skeleton-define (name doc &rest skel) 2730(defmacro python-skeleton-define (name doc &rest skel)
2669 "Define a `python-mode' skeleton using NAME DOC and SKEL. 2731 "Define a `python-mode' skeleton using NAME DOC and SKEL.
2670The skeleton will be bound to python-skeleton-NAME and will 2732The skeleton will be bound to python-skeleton-NAME and will
2671be added to `python-mode-abbrev-table'." 2733be added to `python-mode-skeleton-abbrev-table'."
2672 (declare (indent 2)) 2734 (declare (indent 2))
2673 (let* ((name (symbol-name name)) 2735 (let* ((name (symbol-name name))
2674 (function-name (intern (concat "python-skeleton-" name)))) 2736 (function-name (intern (concat "python-skeleton-" name))))
2675 `(progn 2737 `(progn
2676 (define-abbrev python-mode-abbrev-table ,name "" ',function-name 2738 (define-abbrev python-mode-skeleton-abbrev-table
2677 :system t) 2739 ,name "" ',function-name :system t)
2678 (setq python-skeleton-available 2740 (setq python-skeleton-available
2679 (cons ',function-name python-skeleton-available)) 2741 (cons ',function-name python-skeleton-available))
2680 (define-skeleton ,function-name 2742 (define-skeleton ,function-name
@@ -2682,6 +2744,10 @@ be added to `python-mode-abbrev-table'."
2682 (format "Insert %s statement." name)) 2744 (format "Insert %s statement." name))
2683 ,@skel)))) 2745 ,@skel))))
2684 2746
2747(define-abbrev-table 'python-mode-abbrev-table ()
2748 "Abbrev table for Python mode."
2749 :parents (list python-mode-skeleton-abbrev-table))
2750
2685(defmacro python-define-auxiliary-skeleton (name doc &optional &rest skel) 2751(defmacro python-define-auxiliary-skeleton (name doc &optional &rest skel)
2686 "Define a `python-mode' auxiliary skeleton using NAME DOC and SKEL. 2752 "Define a `python-mode' auxiliary skeleton using NAME DOC and SKEL.
2687The skeleton will be bound to python-skeleton-NAME." 2753The skeleton will be bound to python-skeleton-NAME."
diff --git a/lisp/vc/vc-hg.el b/lisp/vc/vc-hg.el
index f39ef568e8b..033e78c20cd 100644
--- a/lisp/vc/vc-hg.el
+++ b/lisp/vc/vc-hg.el
@@ -357,7 +357,7 @@ Optional arg REVISION is a revision to annotate from."
357;;215 Wed Jun 20 21:22:58 2007 -0700 foo.c: CONTENTS 357;;215 Wed Jun 20 21:22:58 2007 -0700 foo.c: CONTENTS
358;; i.e. VERSION_NUMBER DATE FILENAME: CONTENTS 358;; i.e. VERSION_NUMBER DATE FILENAME: CONTENTS
359(defconst vc-hg-annotate-re 359(defconst vc-hg-annotate-re
360 "^[ \t]*\\([0-9]+\\) \\(.\\{30\\}\\)\\(?:\\(: \\)\\|\\(?: +\\(.+\\): \\)\\)") 360 "^[ \t]*\\([0-9]+\\) \\(.\\{30\\}\\)\\(?:\\(: \\)\\|\\(?: +\\([^:\n]+\\(?::\\(?:[^: \n][^:\n]*\\)?\\)*\\): \\)\\)")
361 361
362(defun vc-hg-annotate-time () 362(defun vc-hg-annotate-time ()
363 (when (looking-at vc-hg-annotate-re) 363 (when (looking-at vc-hg-annotate-re)