106 lines
3.7 KiB
EmacsLisp
106 lines
3.7 KiB
EmacsLisp
;;; erc-yank --- Automagically create a Gist if pasting more than 5 lines
|
||
|
||
;; Copyright (C) 2012 John Wiegley
|
||
|
||
;; Author: John Wiegley <jwiegley@gmail.com>
|
||
;; Created: 17 Jun 2012
|
||
;; Version: 1.0
|
||
;; Keywords: erc yank gist
|
||
;; X-URL: https://github.com/jwiegley/erc-yank
|
||
|
||
;; This program 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 2, or (at
|
||
;; your option) any later version.
|
||
|
||
;; This program 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; see the file COPYING. If not, write to the
|
||
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||
;; Boston, MA 02111-1307, USA.
|
||
|
||
;;; Commentary:
|
||
|
||
;; Automagically create a Gist if pasting more than 5 lines.
|
||
;;
|
||
;; Hook in as follows:
|
||
;;
|
||
;; (add-hook 'erc-mode-hook
|
||
;; (lambda () (define-key erc-mode-map [(control ?y)] 'erc-yank)))
|
||
;;
|
||
;; Or, if you want to use my `use-package' macro:
|
||
;;
|
||
;; (use-package erc
|
||
;; :commands erc
|
||
;; :config
|
||
;; (use-package erc-yank
|
||
;; :init
|
||
;; (bind-key "C-y" 'erc-yank erc-mode-map)))
|
||
;;
|
||
;; This module requires gist.el, from: https://github.com/defunkt/gist.el
|
||
|
||
;;; Code:
|
||
|
||
(require 'gist)
|
||
|
||
(defgroup erc-yank nil
|
||
"Automagically create a Gist if pasting more than 5 lines"
|
||
:group 'erc)
|
||
|
||
(defcustom erc-yank-flood-limit 5
|
||
"Maximum number of lines allowed to yank to an erc buffer."
|
||
:type 'integer
|
||
:group 'erc-yank)
|
||
|
||
(defcustom erc-yank-query-before-gisting t
|
||
"If non-nil, ask the user before creating a new Gist."
|
||
:type 'boolean
|
||
:group 'erc-yank)
|
||
|
||
(defcustom erc-yank-display-text-on-prompt t
|
||
"If non-nil, show the text to yank in another buffer when prompting."
|
||
:type 'boolean
|
||
:group 'erc-yank)
|
||
|
||
(defun erc-yank (&optional arg)
|
||
"Yank or make a gist depending on the size of the yanked text."
|
||
(interactive "*P")
|
||
(let* ((kill-text (current-kill (cond
|
||
((listp arg) 0)
|
||
((eq arg '-) -2)
|
||
(t (1- arg)))))
|
||
(lines (length (split-string kill-text "\n"))))
|
||
(if (and (> lines erc-yank-flood-limit)
|
||
(or (not erc-yank-query-before-gisting)
|
||
(let ((query
|
||
(format (concat "Text to yank is %d lines;"
|
||
" create a Gist instead? ") lines)))
|
||
(if erc-yank-display-text-on-prompt
|
||
(save-window-excursion
|
||
(with-current-buffer (get-buffer-create "*Yank*")
|
||
(delete-region (point-min) (point-max))
|
||
(insert kill-text)
|
||
(goto-char (point-min))
|
||
(display-buffer (current-buffer))
|
||
(fit-window-to-buffer
|
||
(get-buffer-window (current-buffer)))
|
||
(unwind-protect
|
||
(y-or-n-p query)
|
||
(kill-buffer (current-buffer)))))
|
||
(y-or-n-p query)))))
|
||
(let ((buf (current-buffer)))
|
||
(with-temp-buffer
|
||
(insert kill-text)
|
||
(gist-region (point-min) (point-max) nil
|
||
`(lambda (gist)
|
||
(with-current-buffer ,buf
|
||
(insert (oref gist :html-url)))))))
|
||
(yank arg))))
|
||
|
||
(provide 'erc-yank)
|
||
|
||
;;; erc-yank.el ends here
|