Personal tools

Hpaste.el

From HaskellWiki

Revision as of 23:23, 14 April 2007 by DavidHouse (Talk | contribs)

Jump to: navigation, search

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 GPL license. Enjoy!

;;; hpaste.el -- Integration with hpaste: http://hpaste.org.

;; Author: David House <[email protected]>
;; Created: 14th April 2007
;; Version: 1.0
;; License: GPL

(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)