Hpaste.el
hpaste.el is an Emacs Lisp library that integrates hpaste into Emacs. It provides two functions, hpaste-paste-region
and hpaste-paste-buffer
, which send the region or buffer to the hpaste server as required. Most things are customisable: do M-x customize and browse to the Hpaste group to see what you can change. Code is available under the BSD3 license. Enjoy!
<pre-lisp>
- hpaste.el -- Integration with hpaste
- Author
- David House <dmhouse@gmail.com>
- Created
- 14th April 2007
- Version
- 1.0
- License
- BSD3
(require 'url)
(defgroup hpaste nil "Integration with the hpaste pastebin") (defcustom hpaste-server "http://hpaste.org"
"Base URL for the hpaste server." :type '(string) :group 'hpaste)
(defcustom hpaste-default-nick nil
"What to tell the server your nick is. If NIL, then prompt every time." :type '(choice (string) (const :tag "Ask every time" nil)) :group 'hpaste)
(defcustom hpaste-blank-title nil
"If non-NIL, don't send a title to the server." :type '(boolean) :group 'hpaste)
(defcustom hpaste-announce 'ask
"Whether to announce the paste in the #haskell channel on
Freenode. If ALWAYS, then announce every time. If ASK, then prompt every time. If NEVER, then never announce."
:type '(choice (const :tag "Always announce" always) (const :tag "Ask each time" ask) (const :tag "Never announce" never)) :group 'hpaste)
(defvar hpaste-last-paste-id nil
"Numerical ID of the last paste.")
(defun hpaste-after-paste (&optional redirect url)
(message "Paste successful") (if redirect (progn (string-match "/\\([0-9]*\\)\\(#.*\\)?$" url) (let ((id (match-string 1 url))) (if id (setq hpaste-last-paste-id id))))))
(defun hpaste-prompt-for-annotate ()
(if (y-or-n-p "Send as annotation? ") (let* ((prompt (if hpaste-last-paste-id (format "Paste to annotate (default %s): " hpaste-last-paste-id) "Paste to annotate: ")) (input (read-from-minibuffer prompt))) (if (> (length input) 0) input hpaste-last-paste-id))))
(defun hpaste-paste-region (beg end)
"Send the region to the hpaste server specified in
`hpaste-server'. Use the nick in `hpaste-default-nick', or prompt for one if that is NIL. You can still appear as (anonymous) by just not filling out a nick when prompted (just hit RET). Prompt for a title, unless `hpaste-blank-title' is non-NIL, in which case just send a blank title. Pastes will be announced in
- haskell on Freenode according to `hpaste-announce', see the
docstring of that variable for more information.
For more information on hpaste, see http://hpaste.org"
(interactive "r") (let* ((nick (or hpaste-default-nick (read-from-minibuffer "Nick: "))) (title (if hpaste-blank-title "" (read-from-minibuffer "Title: "))) (annot-id (hpaste-prompt-for-annotate)) (announce (if (or (eq hpaste-announce 'always) (and (eq hpaste-announce 'ask) (y-or-n-p "Announce paste? "))) "&announce=true" ""))
(url (concat hpaste-server (if annot-id (concat "/annotate/" annot-id) "/new"))) (url-request-method "POST") (url-request-extra-headers '(("Content-Type" . "application/x-www-form-urlencoded"))) (url-request-data (format "content=%s&nick=%s&title=%s%s&x=0&y=0\r\n" (url-hexify-string (buffer-substring-no-properties beg end)) (url-hexify-string nick) (url-hexify-string title) announce))) (url-retrieve url 'hpaste-after-paste)))
(defun hpaste-paste-buffer ()
"Like `hpaste-paste-region', but paste the entire buffer instead." (interactive) (hpaste-paste-region (point-min) (point-max)))
(provide 'hpaste) </pre-lisp>