merge patch by Stefan Monnier from PR#5884

git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@13253 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
master
Jacques Garrigue 2013-01-17 02:56:00 +00:00
parent dfed25213f
commit 6970ac6e71
4 changed files with 83 additions and 80 deletions

View File

@ -20,6 +20,7 @@ Compilers:
- tools/eqparsetree compare two parsetree ignoring location
- ocamlopt now uses clang as assembler on OS X if available, which enables
CFI support for OS X.
Bug fixes:
- PR#4762: ?? is not used at all, but registered as a lexer token
- PR#4994: ocaml-mode doesn't work with xemacs21
@ -58,7 +59,8 @@ Bug fixes:
coresponding module
* PR#5835: nonoptional labeled arguments can be passed with '?'
- PR#5865: assert failure when reporting undefined field label
- PR#5885: Incorrect rule for compiling C stubs when shared libraries are not supported.
- PR#5885: Incorrect rule for compiling C stubs when shared libraries are not
supported.
- ocamlbuild now picks the non-core tools like ocamlfind and menhir from PATH
Internals:
@ -78,6 +80,7 @@ Tools:
- OCamlbuild now features a bin_annot tag to generate .cmt files.
- OCamlbuild now features a strict_sequence tag to trigger the strict-sequence
option.
- PR#5884: Misc minor fixes and cleanup for emacs mode
OCaml 4.00.2:
-------------

View File

@ -25,7 +25,7 @@
(defalias 'caml-mouse-movement-p 'mouse-movement-p)
(defalias 'caml-sit-for 'sit-for)
(defmacro caml-track-mouse (&rest body) (cons 'track-mouse body))
(defalias 'caml-track-mouse 'track-mouse)
(defun caml-event-window (e) (posn-window (event-start e)))
(defun caml-event-point-start (e) (posn-point (event-start e)))
@ -37,8 +37,7 @@
(or (member 'drag modifiers)
(member 'click modifiers)))))
(if (fboundp 'string-to-number)
(defalias 'caml-string-to-int 'string-to-number)
(defalias 'caml-string-to-int 'string-to-int))
(defalias 'caml-string-to-int (if (fboundp 'string-to-number)
'string-to-number 'string-to-int))
(provide 'caml-emacs)

View File

@ -1,3 +1,4 @@
;;; caml-help.el --- Contextual completion and help to caml-mode
;(***********************************************************************)
;(* *)
;(* OCaml *)
@ -10,12 +11,12 @@
;(* *)
;(***********************************************************************)
;; caml-info.el --- contextual completion and help to caml-mode
;; Author: Didier Remy, November 2001.
;; Didier Remy, November 2001.
;;; Commentary:
;; This provides two functions completion and help
;; look for caml-complete and caml-help
;; This provides two functions: completion and help.
;; Look for caml-complete and caml-help.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
@ -32,15 +33,16 @@
;; - the viewing method and the database, so that the documentation for
;; and identifier could be search in
;; * info / html / man / mli's sources
;; * viewed in emacs or using an external previewer.
;; * viewed in Emacs or using an external previewer.
;;
;; Take all identifiers (labels, Constructors, exceptions, etc.)
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Code:
(eval-and-compile
(if (and (boundp 'running-xemacs) running-xemacs)
(if (featurep 'xemacs)
(require 'caml-xemacs)
(require 'caml-emacs)))
@ -50,11 +52,11 @@
;; variables to be customized
(defvar ocaml-lib-path 'lazy
"Path list for ocaml lib sources (mli files)
"Path list for ocaml lib sources (mli files).
'lazy means ask ocaml to find it for your at first use.")
`lazy' means ask ocaml to find it for your at first use.")
(defun ocaml-lib-path ()
"Computes if necessary and returns the path for ocaml libs"
"Compute if necessary and return the path for ocaml libs."
(if (listp ocaml-lib-path) nil
(setq ocaml-lib-path
(split-string
@ -83,13 +85,11 @@
(concat (downcase (substring s 0 1)) (substring s 1))
s))
(defun iter (f l) (while (consp l) (apply f (list (car l))) (setq l (cdr l))))
(defun ocaml-find-files (path filter &optional depth split)
(let* ((path-string
(if (stringp path)
(if (file-directory-p path) path nil)
(mapconcat '(lambda (d) (if (file-directory-p d) d))
(mapconcat (lambda (d) (if (file-directory-p d) d))
path " ")))
(command
(and path-string
@ -110,7 +110,7 @@
(defvar ocaml-module-alist 'lazy
"A-list of modules with how and where to find help information.
'delay means non computed yet")
`delay' means non computed yet.")
(defun ocaml-add-mli-modules (modules tag &optional path)
(let ((files
@ -131,13 +131,13 @@
modules))
(defun ocaml-add-path (dir &optional path)
"Extend ocaml-module-alist with modules of DIR relative to PATH"
"Extend `ocaml-module-alist' with modules of DIR relative to PATH."
(interactive "D")
(let* ((old (ocaml-lib-path))
(new
(if (file-name-absolute-p dir) dir
(concat
(or (find-if '(lambda (p) (file-directory-p (concat p "/" dir)))
(or (find-if (lambda (p) (file-directory-p (concat p "/" dir)))
(cons default-directory old))
(error "Directory not found"))
"/" dir))))
@ -146,7 +146,7 @@
(ocaml-add-mli-modules (ocaml-module-alist) 'lib new))))
(defun ocaml-module-alist ()
"Call by need value of variable ocaml-module-alist"
"Call by need value of variable `ocaml-module-alist'."
(if (listp ocaml-module-alist)
nil
;; build list of mli files
@ -249,7 +249,7 @@ When call interactively, make completion over known modules."
(defun ocaml-close-module (arg)
"*Close module of name ARG when ARG is a string.
When call interactively, make completion over visible modules.
Otherwise if ARG is true, close all modules and reset to default. "
Otherwise if ARG is true, close all modules and reset to default."
(interactive "P")
(if (= (prefix-numeric-value arg) 4)
(setq ocaml-visible-modules 'lazy)
@ -262,7 +262,7 @@ Otherwise if ARG is true, close all modules and reset to default. "
modules))
(if (equal arg "") (setq arg (caar modules))))
(setq ocaml-visible-modules
(remove-if '(lambda (m) (equal (car m) arg))
(remove-if (lambda (m) (equal (car m) arg))
ocaml-visible-modules))
))
(message "%S" (mapcar 'car (ocaml-visible-modules))))
@ -282,8 +282,7 @@ If defined Module and Entry are represented by a region in the buffer,
and are nil otherwise.
For debugging purposes, it returns the string Module.entry if called
with an optional non-nil argument.
"
with an optional non-nil argument."
(save-excursion
(let ((module) (entry))
(if (looking-at "[ \n]") (skip-chars-backward " "))
@ -320,12 +319,12 @@ with an optional non-nil argument.
(if (null pattern)
(apply 'append (mapcar 'ocaml-module-symbols list))
(let ((pat (concat "^" (regexp-quote pattern))) (res))
(iter
'(lambda (l)
(iter '(lambda (x)
(if (string-match pat (car l))
(if (member x res) nil (setq res (cons x res)))))
(ocaml-module-symbols l)))
(mapc
(lambda (l)
(mapc (lambda (x)
(if (string-match pat (car l))
(if (member x res) nil (setq res (cons x res)))))
(ocaml-module-symbols l)))
list)
res)
)))
@ -425,8 +424,7 @@ where identifier is defined."
(defvar ocaml-info-prefix "ocaml-lib"
"Prefix of ocaml info files describing library modules.
Suffix .info will be added to info files.
Additional suffix .gz may be added if info files are compressed.
")
Additional suffix .gz may be added if info files are compressed.")
;;
(defun ocaml-hevea-info-add-entries (entries dir name)
@ -472,15 +470,14 @@ Additional suffix .gz may be added if info files are compressed.
of \\[Info-default-directory-list] and the base name \\[ocaml-info-name]
of files to look for.
This uses info files produced by HeVeA.
"
This uses info files produced by HeVeA."
(let ((collect) (seen))
(iter '(lambda (d)
(if (member d seen) nil
(setq collect
(ocaml-hevea-info-add-entries
collect d ocaml-info-prefix))
(setq done (cons d seen))))
(mapc (lambda (d)
(if (member d seen) nil
(setq collect
(ocaml-hevea-info-add-entries
collect d ocaml-info-prefix))
(setq seen (cons d seen))))
Info-directory-list)
collect))
@ -518,12 +515,12 @@ of files to look for.
This uses info files produced by ocamldoc."
(require 'info)
(let ((collect) (seen))
(iter '(lambda (d)
(if (member d seen) nil
(setq collect
(ocaml-ocamldoc-info-add-entries collect d
ocaml-info-prefix))
(setq done (cons d seen))))
(mapc (lambda (d)
(if (member d seen) nil
(setq collect
(ocaml-ocamldoc-info-add-entries collect d
ocaml-info-prefix))
(setq seen (cons d seen))))
Info-directory-list)
collect))
@ -534,11 +531,11 @@ This uses info files produced by ocamldoc."
nil means do not use info.
A function to build the list lazily (at the first call). The result of
A function to build the list lazily (at the first call). The result of
the function call will be assign permanently to this variable for future
uses. We provide two default functions \\[ocaml-info-default-function]
(info produced by HeVeA is the default) and \\[ocaml-info-default-function]
(info produced by ocamldoc).
uses. We provide two default functions `ocaml-hevea-info'
\(info produced by HeVeA is the default) and `ocaml-ocamldoc-info'
\(info produced by ocamldoc).
Otherwise, this value should be an alist binding module names to info
entries of the form to \"(entry)section\" be taken by the \\[info]
@ -546,7 +543,7 @@ command. An entry may be an info module or a complete file name."
)
(defun ocaml-info-alist ()
"Call by need value of variable ocaml-info-alist"
"Call by need value of variable `ocaml-info-alist'."
(cond
((listp ocaml-info-alist))
((functionp ocaml-info-alist)
@ -572,9 +569,11 @@ command. An entry may be an info module or a complete file name."
;; Help function.
(defvar view-return-to-alist)
(defvar view-exit-action)
(defun ocaml-goto-help (&optional module entry same-window)
"Searches info manual for MODULE and ENTRY in MODULE.
"Search info manual for MODULE and ENTRY in MODULE.
If unspecified, MODULE and ENTRY are inferred from the position in the
current buffer using \\[ocaml-qualified-identifier]."
(interactive)
@ -633,6 +632,15 @@ current buffer using \\[ocaml-qualified-identifier]."
(if (window-live-p window) (select-window window))
))
(defface ocaml-help-face
'((t :background "#88FF44"))
"Face to highlight expressions and types.")
(defvar ocaml-help-ovl
(let ((ovl (make-overlay 1 1)))
(overlay-put ovl 'face 'ocaml-help-face)
ovl))
(defun caml-help (arg)
"Find documentation for OCaml qualified identifiers.
@ -640,11 +648,11 @@ It attemps to recognize an qualified identifier of the form
``Module . entry'' around point using function `ocaml-qualified-identifier'.
If Module is undetermined it is temptatively guessed from the identifier name
and according to visible modules. If this is still unsucessful, the user is
and according to visible modules. If this is still unsucessful, the user is
then prompted for a Module name.
The documentation for Module is first seach in the info manual if available,
then in the ``module.mli'' source file. The entry is then searched in the
then in the ``module.mli'' source file. The entry is then searched in the
documentation.
Visible modules are computed only once, at the first call.
@ -655,8 +663,7 @@ Prefix arg 0 forces recompilation of visible modules (and their content)
from the file content.
Prefix arg 4 prompts for Module and identifier instead of guessing values
from the possition of point in the current buffer.
"
from the possition of point in the current buffer."
(interactive "p")
(delete-overlay ocaml-help-ovl)
(let ((module) (entry) (module-entry))
@ -741,16 +748,10 @@ buffer positions."
(setq ocaml-links (cons section all))
)))))
(defvar ocaml-link-map (make-sparse-keymap))
(define-key ocaml-link-map [mouse-2] 'ocaml-link-goto)
(defvar ocaml-help-ovl (make-overlay 1 1))
(make-face 'ocaml-help-face)
(set-face-doc-string 'ocaml-help-face
"face for hilighting expressions and types")
(if (not (face-differs-from-default-p 'ocaml-help-face))
(set-face-background 'ocaml-help-face "#88FF44"))
(overlay-put ocaml-help-ovl 'face 'ocaml-help-face)
(defvar ocaml-link-map
(let ((map (make-sparse-keymap)))
(define-key map [mouse-2] 'ocaml-link-goto)
map))
(defun ocaml-help-show (arg)
(let ((right (point))
@ -761,6 +762,7 @@ buffer positions."
))
(defun ocaml-link-goto (click)
"Follow link at point."
(interactive "e")
(let* ((pos (caml-event-point-start click))
(win (caml-event-window click))
@ -785,12 +787,10 @@ buffer positions."
(if (window-live-p window) (select-window window))
)))
(cond
((and (x-display-color-p)
(not (memq 'ocaml-link-face (face-list))))
(make-face 'ocaml-link-face)
(set-face-foreground 'ocaml-link-face "Purple")))
(defface ocaml-link-face
'(((class color) :foreground "Purple"))
"Face to highlight hyperlinks.")
(defun ocaml-link-activate (section)
(let ((links (ocaml-info-links section)))
@ -851,3 +851,4 @@ buffer positions."
(provide 'caml-help)
;;; caml-help.el ends here

View File

@ -692,14 +692,14 @@ the current point."
((looking-at "[ \t]*method")
(setq method-alist (cons index method-alist)))))
;; build menu
(mapcar
'(lambda (pair)
(if (symbol-value (cdr pair))
(setq menu-alist
(cons
(cons (car pair)
(sort (symbol-value (cdr pair)) 'imenu--sort-by-name))
menu-alist))))
(mapc
(lambda (pair)
(if (symbol-value (cdr pair))
(setq menu-alist
(cons
(cons (car pair)
(sort (symbol-value (cdr pair)) 'imenu--sort-by-name))
menu-alist))))
'(("Values" . value-alist)
("Types" . type-alist)
("Modules" . module-alist)