diff --git a/.travis.yml b/.travis.yml index d609cde0e..57d8f1492 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,10 +22,10 @@ install: sudo apt-get install -qq emacs24 emacs24-el; fi - if [ "$EMACS" = "emacs-snapshot" ]; then - sudo add-apt-repository -y ppa:cassou/emacs && + sudo add-apt-repository -y ppa:ubuntu-elisp/ppa && sudo apt-get update -qq && sudo apt-get install -qq emacs-snapshot && - sudo apt-get install -qq emacs-snapshot-el emacs-snapshot-gtk; + sudo apt-get install -qq emacs-snapshot-el; fi script: diff --git a/haskell-commands.el b/haskell-commands.el index ed15a07b4..626d29c86 100644 --- a/haskell-commands.el +++ b/haskell-commands.el @@ -18,6 +18,8 @@ ;;; Code: (require 'cl-lib) +(require 'etags) +(require 'haskell-compat) (require 'haskell-process) (require 'haskell-font-lock) (require 'haskell-interactive-mode) @@ -310,10 +312,9 @@ jump to the tag. Remember: If GHCi is busy doing something, this will delay, but it will always be accurate, in contrast to tags, which always work but are not always accurate. - -If the definition or tag is found, the location from which you -jumped will be pushed onto `find-tag-marker-ring', so you can -return to that position with `pop-tag-mark'." +If the definition or tag is found, the location from which you jumped +will be pushed onto `xref--marker-ring', so you can return to that +position with `xref-pop-marker-stack'." (interactive "P") (let ((initial-loc (point-marker)) (loc (haskell-mode-find-def (haskell-ident-at-point)))) @@ -321,8 +322,11 @@ return to that position with `pop-tag-mark'." (haskell-mode-handle-generic-loc loc) (call-interactively 'haskell-mode-tag-find)) (unless (equal initial-loc (point-marker)) - ;; Store position for return with `pop-tag-mark' - (ring-insert find-tag-marker-ring initial-loc)))) + (save-excursion + (goto-char initial-loc) + (set-mark-command nil) + ;; Store position for return with `xref-pop-marker-stack' + (xref-push-marker-stack))))) ;;;###autoload (defun haskell-mode-goto-loc () @@ -336,7 +340,7 @@ command from GHCi." (defun haskell-mode-goto-span (span) "Jump to the span, whatever file and line and column it needs to to get there." - (ring-insert find-tag-marker-ring (point-marker)) + (xref-push-marker-stack) (find-file (expand-file-name (plist-get span :path) (haskell-session-cabal-dir (haskell-interactive-session)))) (goto-char (point-min)) diff --git a/haskell-compat.el b/haskell-compat.el index a15a79336..60b7b0b99 100644 --- a/haskell-compat.el +++ b/haskell-compat.el @@ -21,6 +21,13 @@ ;;; Commentary: ;;; Code: +(require 'etags) +(require 'ring) +(require 'outline) +(require 'xref nil t) + +(eval-when-compile + (setq byte-compile-warnings '(not cl-functions obsolete))) ;; Missing in Emacs23, stolen from Emacs24's `subr.el' (unless (fboundp 'process-live-p) @@ -29,7 +36,28 @@ A process is considered alive if its status is `run', `open', `listen', `connect' or `stop'." (memq (process-status process) - '(run open listen connect stop)))) + '(run open listen connect stop)))) + +;; Cross-referencing commands have been replaced since Emacs 25.1. +;; These aliases are required to provide backward compatibility. +(unless (fboundp 'xref-push-marker-stack) + (defalias 'xref-pop-marker-stack 'pop-tag-mark) + + (defun xref-push-marker-stack () + "Add point to the marker stack." + (ring-insert find-tag-marker-ring (point-marker)))) + +(unless (fboundp 'outline-hide-sublevels) + (defalias 'outline-hide-sublevels 'hide-sublevels)) + +(unless (fboundp 'outline-show-subtree) + (defalias 'outline-show-subtree 'show-subtree)) + +(unless (fboundp 'outline-hide-sublevels) + (defalias 'outline-hide-sublevels 'hide-sublevels)) + +(unless (fboundp 'outline-show-subtree) + (defalias 'outline-show-subtree 'show-subtree)) (provide 'haskell-compat) diff --git a/haskell-mode.el b/haskell-mode.el index 42fc30ae1..b8e273b32 100644 --- a/haskell-mode.el +++ b/haskell-mode.el @@ -171,9 +171,9 @@ When MESSAGE is non-nil, display a message with the version." (interactive) (with-current-buffer (find-file-read-only (expand-file-name "NEWS" haskell-mode-pkg-base-dir)) (goto-char (point-min)) - (hide-sublevels 1) + (outline-hide-sublevels 1) (outline-next-visible-heading 1) - (show-subtree))) + (outline-show-subtree))) ;; Are we looking at a literate script? (defvar haskell-literate nil diff --git a/inf-haskell.el b/inf-haskell.el index 5eb8abc2b..b5a39f152 100644 --- a/inf-haskell.el +++ b/inf-haskell.el @@ -32,6 +32,8 @@ (require 'comint) (require 'shell) ; For directory tracking. +(require 'etags) +(require 'haskell-compat) (require 'compile) (require 'haskell-mode) (require 'haskell-decl-scan) @@ -568,7 +570,7 @@ The returned info is cached for reuse by `haskell-doc-mode'." (setq file (expand-file-name file))) ;; Push current location marker on the ring used by `find-tag' (require 'etags) - (ring-insert find-tag-marker-ring (point-marker)) + (xref-push-marker-stack) (pop-to-buffer (find-file-noselect file)) (when line (goto-char (point-min)) diff --git a/tests/haskell-indent-tests.el b/tests/haskell-indent-tests.el index 111ee639d..172a1a65a 100644 --- a/tests/haskell-indent-tests.el +++ b/tests/haskell-indent-tests.el @@ -6,6 +6,9 @@ (ert-deftest haskell-indent-in-comment-1 () "Document bad behavior. Should not assert." :expected-result :failed + ;; Emacs 25 (snapshot) starts debugger on cl-assert + ;; even in batch mode. So we do not run this test. + (skip-unless (< emacs-major-version 25)) (should (with-temp-buffer (haskell-mode) (haskell-indent-mode)