Prevent an args-out-of-range error during login/out
[riece] / lisp / riece-yank.el
1 ;;; riece-yank.el --- enter the element of kill-ring -*- lexical-binding: t -*-
2 ;; Copyright (C) 2004 Masatake YAMATO
3
4 ;; Author: Masatake YAMATO <jet@gyve.org>
5 ;; Keywords: IRC, riece
6
7 ;; This program is free software; you can redistribute it and/or modify
8 ;; it under the terms of the GNU General Public License as published by
9 ;; the Free Software Foundation; either version 2, or (at your option)
10 ;; any later version.
11
12 ;; This program is distributed in the hope that it will be useful,
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 ;; GNU General Public License for more details.
16
17 ;; You should have received a copy of the GNU General Public License
18 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
19 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 ;; Boston, MA 02110-1301, USA.
21
22 ;;; Commentary:
23
24 ;; NOTE: This is an add-on module for Riece.
25
26 ;;; Code:
27 (require 'riece-commands)
28
29 (defgroup riece-yank nil
30   "Enter the element of kill-ring."
31   :tag "Yank"
32   :prefix "riece-"
33   :group 'riece)
34
35 (defcustom riece-yank-tick 1
36   "Time span in second to send multiple lines."
37   :type 'number
38   :group 'riece-yank)
39
40 (defcustom riece-yank-strip-space nil
41   "If non-nil, strip common spaces in front of lines and blank lines
42 before/after the first/last non-blank line."
43   :type 'boolean
44   :group 'riece-yank)
45
46 (defconst riece-yank-description
47   "Enter the element of kill-ring.")
48
49 (defun riece-yank-insinuate ()
50   )
51
52 (defvar riece-command-mode-map)
53 (defun riece-yank-enable ()
54   (define-key riece-command-mode-map "\C-cy" 'riece-command-yank))
55 (defun riece-yank-disable ()
56   (define-key riece-command-mode-map "\C-cy" 'undefined))
57
58 (defun riece-yank-strip-space (string)
59   (with-temp-buffer
60     (insert string)
61     (untabify (point-min) (point-max))
62     ;; Delete blank lines before the first non-blank line.
63     (goto-char (point-min))
64     (while (looking-at " *$")
65       (delete-region (point) (progn (forward-line) (point))))
66     ;; Delete blank lines after the last non-blank line.
67     (goto-char (point-max))
68     (while (progn (beginning-of-line) (looking-at " *$"))
69       (delete-region (point) (progn (end-of-line 0) (point))))
70     ;; Delete common spaces in front of lines.
71     (let ((space-width (point-max)))
72       (while (looking-at " +")
73         (setq space-width (min space-width (length (match-string 0))))
74         (forward-line))
75       (goto-char (point-min))
76       (while (not (eobp))
77         (delete-char space-width)
78         (forward-line)))
79     (buffer-string)))
80
81 (defun riece-command-yank (arg prefix)
82   (interactive "P\nsPrefix: ")
83   (when (or (not prefix)
84             (string= prefix ""))
85     (setq prefix " "))
86   (let* ((kill (current-kill 0))
87          msg)
88     (unless kill
89       (error "Nothing to send in kill-ring"))
90     (if riece-yank-strip-space
91         (setq kill (riece-yank-strip-space kill)))
92     (setq msg (split-string kill "\n"))
93     (when (y-or-n-p (format "Send \"%s\"\n? " kill))
94       (mapcar
95        (lambda (x) 
96          (riece-command-send-message (concat prefix x) arg)
97          ;; Without next line, you will be kicked out from ircd.
98          ;; It may mean "Don't send much data at once."
99          (sit-for riece-yank-tick))
100        msg))))
101
102 (provide 'riece-yank)
103 ;;; riece-yank.el ends here