-
-
Notifications
You must be signed in to change notification settings - Fork 114
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
hydra-ox.el: Emulate org-mode export dispatch
* hydra-ox.el (hydra-ox): New radiogroup. (hydra-ox-html): New hydra. (hydra-ox-latex): New hydra. (hydra-ox-text): New hydra. (hydra-ox): New hydra that includes the above three hydras. (org-mode-map): Add test binding. Re #66.
- Loading branch information
Showing
1 changed file
with
118 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
;;; hydra-ox.el --- Org mode export widget implemented in Hydra | ||
|
||
;; Copyright (C) 2015 Free Software Foundation, Inc. | ||
|
||
;; Author: Oleh Krehel | ||
|
||
;; This file is part of GNU 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: | ||
;; | ||
;; This shows how a complex dispatch menu can be built with Hydra. | ||
|
||
;;; Code: | ||
(require 'org) | ||
|
||
(defhydradio hydra-ox () | ||
(body-only) | ||
(export-scope [buffer subtree]) | ||
(async-export) | ||
(visible-only) | ||
(force-publishing)) | ||
|
||
(defhydra hydra-ox-html (:color blue) | ||
"ox-html" | ||
("H" (org-html-export-as-html | ||
hydra-ox/async-export | ||
(eq hydra-ox/export-scope 'subtree) | ||
hydra-ox/visible-only | ||
hydra-ox/body-only) | ||
"As HTML buffer") | ||
("h" (org-html-export-to-html | ||
hydra-ox/async-export | ||
(eq hydra-ox/export-scope 'subtree) | ||
hydra-ox/visible-only | ||
hydra-ox/body-only) "As HTML file") | ||
("o" (org-open-file | ||
(org-html-export-to-html | ||
hydra-ox/async-export | ||
(eq hydra-ox/export-scope 'subtree) | ||
hydra-ox/visible-only | ||
hydra-ox/body-only)) "As HTML file and open") | ||
("b" hydra-ox/body "back") | ||
("q" nil "quit")) | ||
|
||
(defhydra hydra-ox-latex (:color blue) | ||
"ox-latex" | ||
("L" org-latex-export-as-latex "As LaTeX buffer") | ||
("l" org-latex-export-to-latex "As LaTeX file") | ||
("p" org-latex-export-to-pdf "As PDF file") | ||
("o" (org-open-file (org-latex-export-to-pdf)) "As PDF file and open") | ||
("b" hydra-ox/body "back") | ||
("q" nil "quit")) | ||
|
||
(defhydra hydra-ox-text (:color blue) | ||
"ox-text" | ||
("A" (org-ascii-export-as-ascii | ||
nil nil nil nil | ||
'(:ascii-charset ascii)) | ||
"As ASCII buffer") | ||
|
||
("a" (org-ascii-export-to-ascii | ||
nil nil nil nil | ||
'(:ascii-charset ascii)) | ||
"As ASCII file") | ||
("L" (org-ascii-export-as-ascii | ||
nil nil nil nil | ||
'(:ascii-charset latin1)) | ||
"As Latin1 buffer") | ||
("l" (org-ascii-export-to-ascii | ||
nil nil nil nil | ||
'(:ascii-charset latin1)) | ||
"As Latin1 file") | ||
("U" (org-ascii-export-as-ascii | ||
nil nil nil nil | ||
'(:ascii-charset utf-8)) | ||
"As UTF-8 buffer") | ||
("u" (org-ascii-export-to-ascii | ||
nil nil nil nil | ||
'(:ascii-charset utf-8)) | ||
"As UTF-8 file") | ||
("b" hydra-ox/body "back") | ||
("q" nil "quit")) | ||
|
||
(defhydra hydra-ox () | ||
" | ||
_C-b_ Body only: % -15`hydra-ox/body-only^^^ _C-v_ Visible only: %`hydra-ox/visible-only | ||
_C-s_ Export scope: % -15`hydra-ox/export-scope _C-f_ Force publishing: %`hydra-ox/force-publishing | ||
_C-a_ Async export: %`hydra-ox/async-export | ||
" | ||
("C-b" (hydra-ox/body-only) nil) | ||
("C-v" (hydra-ox/visible-only) nil) | ||
("C-s" (hydra-ox/export-scope) nil) | ||
("C-f" (hydra-ox/force-publishing) nil) | ||
("C-a" (hydra-ox/async-export) nil) | ||
("h" hydra-ox-html/body "Export to HTML" :exit t) | ||
("l" hydra-ox-latex/body "Export to LaTeX" :exit t) | ||
("t" hydra-ox-text/body "Export to Plain Text" :exit t) | ||
("q" nil "quit")) | ||
|
||
(define-key org-mode-map (kbd "C-c C-,") 'hydra-ox/body) | ||
|
||
(provide 'hydra-ox) | ||
|
||
;;; hydra-ox.el ends here |
e342c33
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you please add a brief documentation about
hydradio
?I am trying to understand the relationship between
and
For example, where is
(hydra-ox/body-only)
defined?e342c33
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can
macroexpand
thedefhydradio
to get:It's sort of a namespaceish construct that defines
[nil t]
or e.g.[buffer subtree]
if specified(hydra-reset-radios hydra-ox/names)
You don't have to use it if you don't want to, it's just a shortcut for writing these things explicitly.
e342c33
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I forgot that I changed the parameters order, it should be:
(defhydradio hydra-ox () (body-only) (export-scope "scope" [buffer subtree]) (async-export) (visible-only) (force-publishing))
that expands to
e342c33
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you please do something about these warnings:
Not sure whether you can just declare these to be defined and then rely on them being autoloaded, or not.
e342c33
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@tarsius How do you trigger warnings in
hydra-ox.el
? I can't reproduce them.e342c33
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can only reproduce this by removing the
org-loaddefs.el
file. It's usually a mistake if that file does not exist, and loadingorg
actually causes a warning about that file not being available as you can see below.I occasionally recompile all the packages I have installed in alphabetic order after removing all byte compiled files (to avoid old macro implementations leaking into the newly created byte compiled files).
I think that during byte-compilation we should not depend on a package's autoload file being loaded when the package's "main library" is loaded. While it makes sense that Org does that due to its size, it still is quite unusual.
So you should probably add this to
hydra-ox.el
:Also note the additional warnings about the
ring
functions. You should add(require 'ring)
tohydra.el
.e342c33
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@tarsius Thanks, I just added the declares you mentioned.
e342c33
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks to you too!