diff options
author | Sébastien Delafond <sdelafond@gmail.com> | 2015-08-25 12:27:35 +0200 |
---|---|---|
committer | Sébastien Delafond <sdelafond@gmail.com> | 2015-08-25 12:27:35 +0200 |
commit | 1be13d57dc8357576a8285c6dadc03db9e3ed7b0 (patch) | |
tree | e35b32d4dbd60cb6cea09f3c0797cc8877352def /contrib/lisp/org-eldoc.el | |
parent | 4dc4918d0d667f18f3d5e3dd71e6f117ddb8af8a (diff) |
Imported Upstream version 8.3.1
Diffstat (limited to 'contrib/lisp/org-eldoc.el')
-rw-r--r-- | contrib/lisp/org-eldoc.el | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/contrib/lisp/org-eldoc.el b/contrib/lisp/org-eldoc.el new file mode 100644 index 0000000..c970b27 --- /dev/null +++ b/contrib/lisp/org-eldoc.el @@ -0,0 +1,165 @@ +;;; org-eldoc.el --- display org header and src block info using eldoc + +;; Copyright (c) 2014 Free Software Foundation, Inc. + +;; Author: Łukasz Gruner <lukasz@gruner.lu> +;; Maintainer: Łukasz Gruner <lukasz@gruner.lu> +;; Version: 6 +;; Package-Requires: ((org "8")) +;; URL: https://bitbucket.org/ukaszg/org-eldoc +;; Created: 25/05/2014 +;; Keywords: eldoc, outline, breadcrumb, org, babel, minibuffer + +;; This file is not part of 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: + +;;; Changelog: + +;; As of 01/11/14 switching license to GPL3 to allow submission to org-mode. +;; 08/11/14 switch code to automatically define eldoc-documentation-function, but don't autostart eldoc-mode. + +;;; Code: + +(require 'org) +(require 'ob-core) +(require 'eldoc) + +(defgroup org-eldoc nil "" :group 'org) + +(defcustom org-eldoc-breadcrumb-separator "/" + "Breadcrumb separator." + :group 'org-eldoc + :type 'string) + +(defcustom org-eldoc-test-buffer-name " *Org-eldoc test buffer*" + "Name of the buffer used while testing for mode-local variable values." + :group 'org-eldoc + :type 'string) + +(defun org-eldoc-get-breadcrumb () + "Return breadcrumb if on a headline or nil." + (let ((case-fold-search t) cur) + (save-excursion + (beginning-of-line) + (save-match-data + (when (looking-at org-complex-heading-regexp) + (setq cur (match-string 4)) + (org-format-outline-path + (append (org-get-outline-path) (list cur)) + (frame-width) "" org-eldoc-breadcrumb-separator)))))) + +(defun org-eldoc-get-src-header () + "Returns lang and list of header properties if on src definition line and nil otherwise." + (let ((case-fold-search t) info lang hdr-args) + (save-excursion + (beginning-of-line) + (save-match-data + (when (looking-at "^[ \t]*#\\+\\(begin\\|end\\)_src") + (setq info (org-babel-get-src-block-info 'light) + lang (propertize (nth 0 info) 'face 'font-lock-string-face) + hdr-args (nth 2 info)) + (concat + lang + ": " + (mapconcat + (lambda (elem) + (when (and (cdr elem) (not (string= "" (cdr elem)))) + (concat + (propertize (symbol-name (car elem)) 'face 'org-list-dt) + " " + (propertize (cdr elem) 'face 'org-verbatim) + " "))) + hdr-args " "))))))) + +(defun org-eldoc-get-src-lang () + "Return value of lang for the current block if in block body and nil otherwise." + (let ((case-fold-search t)) + (save-match-data + (when (org-between-regexps-p ".*#\\+begin_src" + ".*#\\+end_src") + (save-excursion + (goto-char (org-babel-where-is-src-block-head)) + (car (org-babel-parse-src-block-match))))))) + +(defvar org-eldoc-local-functions-cache (make-hash-table :size 40 :test 'equal) + "Cache of major-mode's eldoc-documentation-functions, + used by \\[org-eldoc-get-mode-local-documentation-function].") + +(defun org-eldoc-get-mode-local-documentation-function (lang) + "Check if LANG-mode sets eldoc-documentation-function and return its value." + (let ((cached-func (gethash lang org-eldoc-local-functions-cache 'empty)) + (mode-func (intern-soft (format "%s-mode" lang))) + doc-func) + (if (eq 'empty cached-func) + (when (fboundp mode-func) + (with-temp-buffer + (funcall mode-func) + (setq doc-func (and eldoc-documentation-function + (symbol-value 'eldoc-documentation-function))) + (puthash lang doc-func org-eldoc-local-functions-cache)) + doc-func) + cached-func))) + +(declare-function c-eldoc-print-current-symbol-info "c-eldoc" ()) +(declare-function css-eldoc-function "css-eldoc" ()) +(declare-function php-eldoc-function "php-eldoc" ()) +(declare-function go-eldoc--documentation-function "go-eldoc" ()) + +(defun org-eldoc-documentation-function () + "Return breadcrumbs when on a headline, args for src block header-line, + calls other documentation functions depending on lang when inside src body." + (or + (org-eldoc-get-breadcrumb) + (org-eldoc-get-src-header) + (let ((lang (org-eldoc-get-src-lang))) + (cond ((or + (string= lang "emacs-lisp") + (string= lang "elisp")) (if (fboundp 'elisp-eldoc-documentation-function) + (elisp-eldoc-documentation-function) + (let (eldoc-documentation-function) + (eldoc-print-current-symbol-info)))) + ((or + (string= lang "c") ;; http://github.com/nflath/c-eldoc + (string= lang "C")) (when (require 'c-eldoc nil t) + (c-eldoc-print-current-symbol-info))) + ;; https://github.com/zenozeng/css-eldoc + ((string= lang "css") (when (require 'css-eldoc nil t) + (css-eldoc-function))) + ;; https://github.com/zenozeng/php-eldoc + ((string= lang "php") (when (require 'php-eldoc nil t) + (php-eldoc-function))) + ((or + (string= lang "go") + (string= lang "golang")) (when (require 'go-eldoc nil t) + (go-eldoc--documentation-function))) + (t (let ((doc-fun (org-eldoc-get-mode-local-documentation-function lang))) + (when (fboundp doc-fun) (funcall doc-fun)))))))) + +;;;###autoload +(defun org-eldoc-load () + "Set up org-eldoc documentation function." + (interactive) + (setq-local eldoc-documentation-function #'org-eldoc-documentation-function)) + +;;;###autoload +(add-hook 'org-mode-hook #'org-eldoc-load) + +(provide 'org-eldoc) + +;; -*- coding: utf-8-emacs; -*- + +;;; org-eldoc.el ends here |