]> git.siccegge.de Git - dotfiles/emacs.git/commitdiff
Import elisp libraries
authorChristoph Egger <christoph@christoph-egger.org>
Fri, 6 Nov 2015 13:53:42 +0000 (14:53 +0100)
committerChristoph Egger <christoph@christoph-egger.org>
Fri, 6 Nov 2015 13:53:42 +0000 (14:53 +0100)
lisp/dpaste.el [new file with mode: 0644]
lisp/smart-tabs-mode.el [new file with mode: 0644]

diff --git a/lisp/dpaste.el b/lisp/dpaste.el
new file mode 100644 (file)
index 0000000..66efe16
--- /dev/null
@@ -0,0 +1,100 @@
+;;; pastebin.el --- A simple interface to the www.pastebin.com webservice
+
+;;; Copyright (C) 2008 by Tapsell-Ferrier Limited
+
+;;; 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 this program; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc.,   51 Franklin Street, Fifth Floor,
+;;; Boston, MA  02110-1301  USA
+
+;;; Commentary:
+;;;
+;;; Load this file and run:
+;;;
+;;;   M-x pastebin-buffer
+;;;
+;;; to send the whole buffer or select a region and run
+;;;
+;;;  M-x pastebin
+;;;
+;;; to send just the region.
+;;;
+;;; In either case the url that pastebin generates is left on the kill
+;;; ring and the paste buffer.
+
+
+;;; Code:
+
+(defvar dpastebin-type-assoc
+  '((emacs-lisp-mode . "887")
+    (scheme-mode . "887")
+    (python-mode . "795")
+    (nxml-mode . "840")))
+
+(defvar dpastebin-retrieved nil)
+
+(defvar dpastebin-expire-history '())
+
+(defun dpastebin-buffer (&optional expire)
+  "Send the whole buffer to paste.q0a.de."
+  (interactive (if current-prefix-arg
+                   (list (read-string "pastebin expire:" nil 'dpastebin-expire-history))))
+  (dpastebin (point-min) (point-max) expire))
+
+(defun dpastebin (start end &optional expire)
+  "An interface to the pastebin code snippet www service.
+
+See pastebin.com for more information about pastebin.
+
+Called interactively pastebin uses the current region for
+preference for sending... if the mark is NOT set then the entire
+buffer is sent.
+
+Argument START is the start of region.
+Argument END is the end of region.
+
+If PREFIX is used pastebin prompts for a prefix to be used as the
+virtual host to use.  For example use 'emacs' for 'emacs.pastebin.com'."
+  (interactive
+   (let ((pastebin-expire
+          (if current-prefix-arg
+              (read-string "pastebin expire:" nil 'dpastebin-expire-history))))
+     (if (mark)
+         (list (region-beginning) (region-end) pastebin-expire)
+       (list (point-min) (point-max) pastebin-expire))))
+  ;; Main function
+  (let* ((data (buffer-substring-no-properties start end))
+         (pastebin-url (format "http://paste.debian.net"))
+         (url-request-method "POST")
+         (url-request-extra-headers
+          '(("Content-Type" . "multipart/form-data")))
+         (url-request-data
+          (concat (format "paste=Send&lang=%s&expiry=%s&poster=%s&code=%s"
+                          (assoc-default major-mode dpastebin-type-assoc nil "878")
+                          (or expire "d")
+                          (user-full-name)
+                          (url-hexify-string data))))
+         (content-buf (url-retrieve pastebin-url
+                                    (lambda (arg)
+                                      (cond
+                                       ((equal :error (car arg))
+                                        (message (cdr arg)))
+                                       ((equal :redirect (car arg))
+                                        (setq pastebin-retrieved (cadr arg))
+                                        (with-temp-buffer
+                                          (insert pastebin-retrieved)
+                                          (clipboard-kill-ring-save (point-min) (point-max)))))))))
+    (car kill-ring)))
+
+(provide 'debian-pastebin)
+;;; pastebin.el ends here
diff --git a/lisp/smart-tabs-mode.el b/lisp/smart-tabs-mode.el
new file mode 100644 (file)
index 0000000..5a0c952
--- /dev/null
@@ -0,0 +1,320 @@
+;;; smart-tabs-mode.el --- Intelligently indent with tabs, align with spaces!
+
+;; Copyright © 2011 John Croisant <jacius@gmail.com>
+;; Copyright © 2011 Joel C. Salomon <joelcsalomon@gmail.com>
+;; Copyright © 2012 Alan Pearce <alan@alanpearce.co.uk>
+;; Copyright © 2012 Daniel Dehennin <daniel.dehennin@baby-gnu.org>
+;; Copyright © 2013 Matt Renaud <mrenaud92@gmail.com>
+
+;; Author: John Croisant <jacius@gmail.com>
+;;         Alan Pearce <alan@alanpearce.co.uk>
+;;         Daniel Dehennin <daniel.dehennin@baby-gnu.org>
+;;         Matt Renaud <mrenaud92@gmail.com>
+;; Maintainer: Joel C. Salomon <joelcsalomon@gmail.com>
+;; URL: http://www.emacswiki.org/emacs/SmartTabs
+;; Created: 19 Sep 2011
+;; Version: 1.0
+;; Keywords: languages
+
+;; This file is not part of GNU Emacs.
+
+;;; License:
+
+;; This file 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 of the License, or
+;; (at your option) any later version.
+;;
+;; This file 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 this file.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package provide a semantic way of using tab characters in
+;; source code: tabs for indentation, spaces for alignment.
+;;
+;; It is derived from <http://www.emacswiki.org/emacs/SmartTabs>
+;; with modifications by the various authors listed above.
+;;
+;; Modification history is at <https://github.com/jcsalomon/smarttabs>.
+
+;;; Installation:
+
+;; The easiest and preferred way to install smart-tabs-mode is to use
+;; the package available on MELPA.
+;;
+;; Manual installation:
+;;
+;; Save smart-tabs-mode.el to a a directory on your load-path
+;; (e.g., ~/.emacs.d/elisp), then add the following to your .emacs file:
+;;
+;;  (autoload 'smart-tabs-mode "smart-tabs-mode"
+;;    "Intelligently indent with tabs, align with spaces!")
+;;  (autoload 'smart-tabs-mode-enable "smart-tabs-mode")
+;;  (autoload 'smart-tabs-advice "smart-tabs-mode")
+;;  (autoload 'smart-tabs-insinuate "smart-tabs-mode")
+;;
+
+;;; Enabling smart-tabs-mode within language modes:
+
+;; As of version 1.0 of this package, the easiest and preferred way to
+;; enable smart-tabs-mode is with the smart-tabs-insinuate function;
+;; for example,
+;;
+;;  (smart-tabs-insinuate 'c 'c++ 'java 'javascript 'cperl 'python
+;;                        'ruby 'nxml)
+;;
+;; will enable smart-tabs-mode with all supported language modes.
+;;
+;; (See below for instructions on adding additional language support.)
+;;
+;; The old method of manually enabling smart-tabs-mode is still
+;; available, but is no longer recommended; smart-tabs-insinuate
+;; wraps the functionality below in a convenient manner.
+;;
+;; For reference, the basic manual method looks like this:
+;;
+;;  (add-hook 'MODE-HOOK 'smart-tabs-mode-enable)
+;;  (smart-tabs-advice INDENT-FUNC TAB-WIDTH-VAR)
+;;
+;; Note that it might be preferable to delay calling smart-tabs-advice
+;; until after the major mode is loaded and evaluated, so the lines
+;; above would be better written like this:
+;;
+;;  (add-hook 'MODE-HOOK (lambda ()
+;;                         (smart-tabs-mode-enable)
+;;                         (smart-tabs-advice INDENT-FUNC TAB-WIDTH-VAR)))
+;;
+;; Here are some specific examples for a few popular languages:
+;;
+;;  ;; C
+;;  (add-hook 'c-mode-hook 'smart-tabs-mode-enable)
+;;  (smart-tabs-advice c-indent-line c-basic-offset)
+;;  (smart-tabs-advice c-indent-region c-basic-offset)
+;;
+;;  ;; JavaScript
+;;  (add-hook 'js2-mode-hook 'smart-tabs-mode-enable)
+;;  (smart-tabs-advice js2-indent-line js2-basic-offset)
+;;
+;;  ;; Perl (cperl-mode)
+;;  (add-hook 'cperl-mode-hook 'smart-tabs-mode-enable)
+;;  (smart-tabs-advice cperl-indent-line cperl-indent-level)
+;;
+;;  ;; Python
+;;  (add-hook 'python-mode-hook 'smart-tabs-mode-enable)
+;;  (smart-tabs-advice python-indent-line-1 python-indent)
+
+;;; Adding language support
+
+;; Language support can be added through the use of the macro
+;; `smart-tabs-add-language-support'. Pass in the symbol you wish
+;; to use to identify the language, the mode hook, and a list
+;; of cons cells containing (indent-line-function . offset-variable).
+;; For example, if C++ mode was not provided by default it could be
+;; added as follows:
+;;
+;; (smart-tabs-add-language-support c++ c++-mode-hook
+;;   ((c-indent-line . c-basic-offset)
+;;    (c-indent-region . c-basic-offset)))
+;;
+;; NOTE: All language support must be added before the call to
+;;      `smart-tabs-insinuate'.
+
+;;; Code:
+\f
+(require 'advice)
+(require 'cl-lib)
+
+(defvar smart-tabs-mode nil
+  "Define if smart-tabs-mode is enabled")
+
+
+;;;###autoload
+(defmacro smart-tabs-when (condition advice-list)
+  (declare (indent 1))
+  `(when ,condition
+     ,@(smart-tabs-create-advice-list advice-list)))
+
+
+;;;###autoload
+(defmacro smart-tabs-create-advice-list (advice-list)
+  `(cl-loop for (func . offset) in ,advice-list
+            collect `(smart-tabs-advice ,func ,offset)))
+
+
+;;;###autoload
+(defmacro smart-tabs-create-language-advice (lang mode-hook advice-list &rest body)
+  "Create a cons cell containing the actions to take to enable
+`smart-tabs-mode' for the language LANG. This usually involved enabling
+`smart-tabs-mode' through `smart-tabs-mode-enable' and adding a lambda
+function to the MODE-HOOK for the specified language. This macro
+simplifies the creation of such a cons cell."
+  (declare (indent 2))
+  `'(,lang . (lambda ()
+               (add-hook ',mode-hook
+                         (lambda ()
+                           (smart-tabs-mode-enable)
+                           ,@(smart-tabs-create-advice-list advice-list)
+                           ,@(cl-loop for form in body
+                                      collect (macroexpand form)))))))
+
+
+(defvar smart-tabs-insinuate-alist
+  `(,(smart-tabs-create-language-advice c c-mode-hook
+       ((c-indent-line . c-basic-offset)
+        (c-indent-region . c-basic-offset)))
+
+    ,(smart-tabs-create-language-advice c++ c++-mode-hook
+       ((c-indent-line . c-basic-offset)
+        (c-indent-region . c-basic-offset)))
+
+    ,(smart-tabs-create-language-advice java java-mode-hook
+       ((c-indent-line . c-basic-offset)
+        (c-indent-region . c-basic-offset)))
+
+    ,(smart-tabs-create-language-advice javascript js2-mode-hook
+       ((js2-indent-line . js2-basic-offset)))
+
+    ,(smart-tabs-create-language-advice cperl cperl-mode-hook
+       ((cperl-indent-line . cperl-indent-level)))
+
+    ,(smart-tabs-create-language-advice python python-mode-hook
+       ((python-indent-line . python-indent-offset)
+        (python-indent-region . python-indent-offset))
+       (smart-tabs-when (featurep 'python-mode)
+         ((py-indent-line . py-indent-offset)
+          (py-newline-and-indent . py-indent-offset)
+          (py-indent-region . py-indent-offset))))
+
+    ,(smart-tabs-create-language-advice ruby ruby-mode-hook
+       ((ruby-indent-line . ruby-indent-level)))
+
+    ,(smart-tabs-create-language-advice nxml nxml-mode-hook
+       ((nxml-indent-line . nxml-child-indent))))
+
+  "Alist of language name and their activation code.
+Smarttabs is enabled in mode hook.")
+
+
+
+(defmacro smart-tabs-mode/no-tabs-mode-advice (function)
+  `(unless (ad-find-advice ',function 'around 'smart-tabs)
+     (defadvice ,function (around smart-tabs activate)
+       (if smart-tabs-mode
+           (let ((indent-tabs-mode nil)) ad-do-it)
+         ad-do-it))))
+
+;;;###autoload
+(define-minor-mode smart-tabs-mode
+  "Intelligently indent with tabs, align with spaces!"
+
+  (progn
+    (smart-tabs-mode/no-tabs-mode-advice align)
+    (smart-tabs-mode/no-tabs-mode-advice align-regexp)
+    (smart-tabs-mode/no-tabs-mode-advice indent-relative)
+    (smart-tabs-mode/no-tabs-mode-advice comment-dwim)
+    (smart-tabs-mode/no-tabs-mode-advice comment-box)
+    (smart-tabs-mode/no-tabs-mode-advice comment-indent)
+
+    (unless
+        (ad-find-advice 'indent-according-to-mode 'around 'smart-tabs)
+      (defadvice indent-according-to-mode (around smart-tabs activate)
+        (if smart-tabs-mode
+            (let ((indent-tabs-mode indent-tabs-mode))
+              (if (memq indent-line-function
+                        '(indent-relative
+                          indent-relative-maybe))
+                  (setq indent-tabs-mode nil))
+              ad-do-it)
+          ad-do-it)))
+    ))
+
+;;;###autoload
+(defun smart-tabs-mode-enable ()
+  "Enable smart-tabs-mode."
+  (smart-tabs-mode t))
+
+;;;###autoload
+(defmacro smart-tabs-advice (function offset)
+  `(progn
+     (defadvice ,function (around smart-tabs activate)
+       (cond
+        (smart-tabs-mode
+         (save-excursion
+           (beginning-of-line)
+           (while (looking-at "\t*\\( +\\)\t+")
+             (replace-match "" nil nil nil 1)))
+         (setq tab-width tab-width)
+         (let ((indent-tabs-mode t)
+               (tab-width fill-column)
+               (,offset fill-column))
+           (unwind-protect
+               (progn ad-do-it))))
+        (t
+         ad-do-it)))))
+
+;;;###autoload
+(defun smart-tabs-insinuate (&rest languages)
+  "Enable smart-tabs-mode for LANGUAGES.
+LANGUAGES is a list of SYMBOL or NAME as defined in
+'smart-tabs-insinuate-alist' alist or a language using standard named
+indent function and indent level.
+"
+  (mapc (lambda (lang)
+          (let ((lang-map (assoc lang smart-tabs-insinuate-alist))
+                (lang-param (smart-tabs-get-standard-language lang)))
+            (cond ((and (null lang-map)
+                        (not (null (car lang-param)))
+                        (not (null (nth 1 lang-param)))
+                        (not (null (nth 2 lang-param))))
+                   (smart-tabs-guess-insinuate lang-param))
+                  ((null lang-map)
+                   (error (format "Unknown smart-tab-mode capable language '%s'" lang)))
+                  (t (funcall (cdr lang-map))))))
+        languages))
+
+
+;;;###autoload
+(defmacro smart-tabs-add-language-support (lang mode-hook advice-list &rest body)
+  "Add support for a language not already in the `smart-tabs-insinuate-alist'."
+  (declare (indent 2))
+  `(add-to-list
+    'smart-tabs-insinuate-alist
+    (smart-tabs-create-language-advice ,lang ,mode-hook
+      ,advice-list ,@body)))
+
+
+(defun smart-tabs-guess-insinuate (lang-param)
+  "Enable smart-tabs-mode if language respect standard naming.
+Several languages define a '<LANGUAGE>-indent-line' function and
+'<LANGUAGE>-indent-level' variable to control indentation.
+LANG-PARAM is a list of HOOK INDENT-FUNCTION INDENT-LEVEL, if
+thoses are defined, we use them."
+  (let ((lang-hook (car lang-param))
+        (indent-function (nth 1 lang-param))
+        (indent-level (nth 2 lang-param)))
+    (if (and (not (null lang-hook))
+             (and (not (null indent-function))
+                  (fboundp indent-function))
+             (and (not (null indent-level))
+                  (boundp indent-level)))
+        (add-hook lang-hook
+                  `(lambda ()
+                     (smart-tabs-mode-enable)
+                     (smart-tabs-advice ,indent-function ,indent-level))))))
+
+(defun smart-tabs-get-standard-language (language)
+  "Return a list of HOOK INDENT-FUNCTION INDENT-LEVEL for a language."
+  (let ((indent-function (intern-soft (concat (symbol-name language) "-indent-line")))
+        (indent-level (intern-soft (concat (symbol-name language) "-indent-level")))
+        (lang-hook (intern-soft (concat (symbol-name language) "-mode-hook"))))
+    (list lang-hook indent-function indent-level)))
+
+(provide 'smart-tabs-mode)
+
+;;; smart-tabs-mode.el ends here