Files
emacs.d/elpa/weechat-20180513.310/weechat-latex.el
Mateus Pinto Rodrigues 0024c08036 Update all my elpa files
2018-05-17 18:02:17 -03:00

187 lines
6.3 KiB
EmacsLisp

;;; weechat-latex --- Add LateX preview -*- lexical-binding: t -*-
;; Copyright (C) 2013 Rüdiger Sonderfeld <ruediger@c-plusplus.de>
;; Author: Rüdiger Sonderfeld <ruediger@c-plusplus.de>
;; Moritz Ulrich <moritz@tarn-vedra.de>
;; Aristid Breitkreuz <aristidb@gmail.com>
;; Keywords: irc chat network weechat
;; URL: https://github.com/the-kenny/weechat.el
;; 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 3 of the License, 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. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;;
;; The LaTeX preview is based on `org-mode's `org-format-latex'
;;; Code:
(require 'weechat)
(require 'org)
(defgroup weechat-latex nil
"WeeChat LaTeX preview."
:link '(url-link "https://github.com/the-kenny/weechat.el")
:prefix "weechat-latex"
:group 'weechat)
(defcustom weechat-latex-temp-file-prefix "weechat-latex"
"Prefix for temporary files."
:type 'string
:group 'weechat-latex)
(defcustom weechat-latex-temp-directory-prefix "weechat-latex"
"Prefix for temporary directory."
:type 'string
:group 'weechat-latex)
(defcustom weechat-latex-image-program org-latex-create-formula-image-program
"Program to convert LaTeX fragments.
See `org-latex-create-formula-image-program'"
:type '(choice
(const :tag "dvipng" dvipng)
(const :tag "imagemagick" imagemagick))
:group 'weechat-latex)
(defvar weechat-latex-temp-dir nil
"The temporary directory used for preview images.")
(defun weechat-latex--create-preview (at)
"Wrapper for `org-format-latex'.
The parameter AT should be nil or in (TYPE . POINT) format. With TYPE being a
string showing the matched LaTeX statement (e.g., ``$'') and POINT being the
POINT to replace. If AT is nil replace statements everywhere."
(org-format-latex weechat-latex-temp-file-prefix
weechat-latex-temp-dir
'overlays
"Creating images...%s"
at 'forbuffer
weechat-latex-image-program))
(defun weechat-latex--set-temp-dir ()
"Set `weechat-latex-temp-dir' unless it is already set."
(unless weechat-latex-temp-dir
(setq weechat-latex-temp-dir
(make-temp-file weechat-latex-temp-directory-prefix
'directory))))
(defun weechat-latex-preview ()
"Preview LaTeX fragments."
(interactive)
(save-excursion
(let ((inhibit-read-only t))
(weechat-latex--set-temp-dir)
(org-remove-latex-fragment-image-overlays)
(weechat-latex--create-preview nil))))
(defun weechat-latex-preview-region (beg end)
"Preview LaTeX fragments in region."
(interactive "r")
(let* ((math-regex (assoc "$" org-latex-regexps))
(regex (nth 1 math-regex))
(n (nth 2 math-regex))
matches)
(save-excursion
(goto-char beg)
(while (re-search-forward regex end t)
(setq matches (cons (cons "$" (match-beginning n)) matches)))
(let ((inhibit-read-only t))
(weechat-latex--set-temp-dir)
(dolist (i matches)
(weechat-latex--create-preview i))))))
(defvar weechat-prompt-start-marker) ;; See weechat.el
(defun weechat-latex-preview-line ()
"Preview LaTeX fragments in line."
(interactive)
(weechat-latex-preview-region (point-at-bol)
(min (point-at-eol)
weechat-prompt-start-marker)))
(defun weechat-latex-remove ()
"Remove LaTeX preview images."
(interactive)
(let ((inhibit-read-only t))
(org-remove-latex-fragment-image-overlays)))
(defun weechat-latex-is-active? ()
"Are LaTeX Previews currently displayed?"
org-latex-fragment-image-overlays)
(defun weechat-latex-toggle ()
"Toggle display of LaTeX preview."
(interactive)
(if (weechat-latex-is-active?)
(weechat-latex-remove)
(weechat-latex-preview)))
;;; auto mode
(defun weechat-latex--do-auto-mode ()
"Hook for auto LaTeX preview."
(weechat-latex-preview-region (point-min) (point-max)))
(defun weechat-latex-is-auto-mode-active? ()
"Is auto LaTeX preview active?"
(memq #'weechat-latex--do-auto-mode weechat-insert-modify-hook))
(defcustom weechat-latex-auto-mode-line-string " LaTeX-Preview"
"String displayed in mode line when `weechat-latex-auto-mode' is active."
:type 'string
:group 'weechat-latex)
(defcustom weechat-latex-auto-mode-preview-all t
"Show preview for existing LaTeX fragmetns if auto mode is activated?"
:type 'boolean
:group 'weechat-latex)
(define-minor-mode weechat-latex-auto-mode
"Automatically display LaTeX preview."
:lighter weechat-latex-auto-mode-line-string
:group 'weechat-latex
(if weechat-latex-auto-mode
(progn
(when weechat-latex-auto-mode-preview-all
(weechat-latex-preview))
(add-hook 'weechat-insert-modify-hook #'weechat-latex--do-auto-mode))
(remove-hook 'weechat-insert-modify-hook #'weechat-latex--do-auto-mode)))
;;; module
(easy-menu-add-item weechat-mode-menu nil
["LaTeX Preview" weechat-latex-toggle
:style toggle
:selected (weechat-latex-is-active?)
:help "If selected show LaTeX preview for existing buffer."]
"Toggle Hidden Lines")
(easy-menu-add-item weechat-mode-menu nil
["LaTeX Auto Preview" weechat-latex-auto-mode
:style toggle
:selected (weechat-latex-is-auto-mode-active?)
:help "If selected automatically show LaTeX preview for new messages."]
"Toggle Hidden Lines")
(defun weechat-latex-unload-function ()
"Cleanup WeeChat LaTex module."
(weechat-latex-auto-mode -1)
(weechat-latex-remove)
(easy-menu-remove-item weechat-mode-menu nil "LaTeX Preview")
(easy-menu-remove-item weechat-mode-menu nil "LaTeX Auto Preview"))
(provide 'weechat-latex)
;;; weechat-latex.el ends here