sphinx: add new conventional command under , c and add , g c

New functions in rst-sphinx:
- rst-sphinx-find-conf-py-path
- rst-sphinx-open-conf
- rst-sphinx-clean
- rst-sphinx-rebuild

Modified functions:
- rst-sphinx-compile takes now an optional argument to clean the project
- rst-sphinx-find-conf has been renamed to rst-sphinx-set-variables and now use
rst-sphinx-find-conf-py-path function

New key bindings:
- "cc" --> rst-sphinx-compile
- "cC" --> rst-sphinx-clean
- "cr" --> rst-sphinx-rebuild
- "gc" --> rst-sphinx-open-conf
- "o"  --> rst-sphinx-target-open)))
This commit is contained in:
syl20bnr 2017-02-03 11:32:26 -05:00
parent 9ab4453029
commit d1d58ef9f4
2 changed files with 70 additions and 30 deletions

View File

@ -15,6 +15,8 @@
;;; Code:
(require 'compile)
(defgroup rst-sphinx nil
"Settings for support of conversion of reStructuredText
document with \\[rst-sphinx]."
@ -53,42 +55,60 @@ document with \\[rst-sphinx]."
"The Sphinx project target project directories."
:group 'rst-builders)
(defun rst-sphinx-find-conf ()
"Look for the configuration file in the parents of the current path."
(defun rst-sphinx-set-variables ()
"Set global variables used py `rst-sphinx'."
(let ((conf (rst-sphinx-find-conf-py-path)))
(when conf
(setq dir (directory-file-name (file-name-directory conf)))
(setq rst-sphinx-source dir)
(setq rst-sphinx-project (file-name-nondirectory dir))
;; not depend on local variables, put here just for convenience.
(setq rst-sphinx-target
(expand-file-name
(nth 2 (assoc rst-sphinx-project
rst-sphinx-target-projects))
rst-sphinx-target-parent))
(setq rst-sphinx-source-buffer (current-buffer)
rst-sphinx-source-file (buffer-file-name)))))
(defun rst-sphinx-find-conf-py-path ()
"Return path to conf.py or nil if not found."
;; (interactive)
(let* ((file-name "conf.py")
(buffer-file (buffer-file-name))
(dir (file-name-directory buffer-file)))
;; Move up in the dir hierarchy till we find a change log file.
(while (or (not (file-exists-p (concat dir file-name))))
(dir (file-name-directory buffer-file))
(conf-py (concat dir file-name)))
;; Move up in the dir hierarchy to find conf.py
(while (or (not buffer-file)
(not (file-exists-p conf-py)))
;; Move up to the parent dir and try again.
(setq buffer-file (directory-file-name
(file-name-directory buffer-file)))
(setq dir (file-name-directory buffer-file)))
(setq dir (directory-file-name
(file-name-directory buffer-file)))
(setq rst-sphinx-source dir)
(setq rst-sphinx-project (file-name-nondirectory dir))
;; not depend on local variables, put here just for convience.
(setq rst-sphinx-target
(expand-file-name
(nth 2 (assoc rst-sphinx-project
rst-sphinx-target-projects))
rst-sphinx-target-parent))
(setq rst-sphinx-source-buffer (current-buffer)
rst-sphinx-source-file (buffer-file-name))
))
(setq dir (file-name-directory buffer-file))
(setq conf-py (concat dir file-name)))
(if buffer-file
conf-py
(message "Cannot find conf.py file.")
nil)))
(require 'compile)
(defun rst-sphinx-compile ()
"Compile Sphinx project."
(defun rst-sphinx-open-conf ()
"Open conf.py file."
(interactive)
(let ((conf (rst-sphinx-find-conf-py-path)))
(if (file-exists-p conf)
(find-file-existing conf)
(message "Cannot find conf.py file."))))
(defun rst-sphinx-compile (&optional clean)
"Compile Sphinx project.
If CLEAN is non-nil then clean the project before compiling."
(interactive "P")
(when clean
(rst-sphinx-clean))
(if (not (string= (file-name-extension (buffer-file-name)) "rst"))
(print "Not a ReStructerdText file.")
(progn
(rst-sphinx-find-conf)
(rst-sphinx-set-variables)
(let ((builder (nth 1 (assoc rst-sphinx-project
rst-sphinx-target-projects))))
(compile (mapconcat 'identity
@ -96,8 +116,25 @@ document with \\[rst-sphinx]."
(cdr (assoc builder rst-sphinx-builder))
rst-sphinx-source
rst-sphinx-target)
" "))
))))
" "))))))
(defun rst-sphinx-clean ()
"Clean Sphinx project."
(interactive)
(let* ((conf (rst-sphinx-find-conf-py-path))
(build (when conf (concat (file-name-directory conf)
rst-sphinx-target-parent))))
(if (file-exists-p build)
(progn
(delete-directory build t)
(message "Project cleaned successfully."))
(message "Cannot find build directory \"%s\"" rst-sphinx-target-parent))))
(defun rst-sphinx-rebuild ()
"Clean and compile Sphinx project."
(interactive)
(rst-sphinx-compile 'clean))
(defun rst-sphinx-target-open ()
"Open builded Sphinx project file."
@ -105,7 +142,7 @@ document with \\[rst-sphinx]."
(if (not (string= (file-name-extension (buffer-file-name)) "rst"))
(print "Not a ReStructerdText file.")
(progn
(rst-sphinx-find-conf)
(rst-sphinx-set-variables)
(let ((builder (nth 1 (assoc rst-sphinx-project
rst-sphinx-target-projects)))
(buffer-file (nth 1 (split-string

View File

@ -21,6 +21,9 @@
(defun sphinx/post-init-rst ()
(spacemacs|use-package-add-hook rst
:post-config (spacemacs/set-leader-keys-for-major-mode 'rst-mode
"c" 'rst-sphinx-compile
"f" 'rst-sphinx-target-open)))
"cc" 'rst-sphinx-compile
"cC" ' rst-sphinx-clean
"cr" ' rst-sphinx-rebuild
"gc" 'rst-sphinx-open-conf
"o" 'rst-sphinx-target-open)))