From HaskellWiki
Revision as of 23:20, 14 April 2007 by DavidHouse (talk | contribs) (New page.)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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 BSD3 license. Enjoy!


hpaste.el -- Integration with hpaste
David House <dmhouse@gmail.com>
14th April 2007

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

  1. 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? ")))
        (url (concat hpaste-server
                     (if annot-id (concat "/annotate/" annot-id)
        (url-request-method "POST")
         '(("Content-Type" . "application/x-www-form-urlencoded")))
         (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)
   (url-retrieve url 'hpaste-after-paste)))

(defun hpaste-paste-buffer ()

 "Like `hpaste-paste-region', but paste the entire buffer instead."
 (hpaste-paste-region (point-min) (point-max)))

(provide 'hpaste) </pre-lisp>