;;; ein-helm.el --- Helm/anything commands ;; Copyright (C) 2012 Takafumi Arakaki ;; Author: Takafumi Arakaki ;; This file is NOT part of GNU Emacs. ;; ein-helm.el 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. ;; ein-helm.el 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 ein-helm.el. If not, see . ;;; Commentary: ;; ;;; Code: (declare-function anything-other-buffer "anything") (declare-function helm-other-buffer "helm") (require 'ein-kernel) ;;; Macros (defmacro ein:helm-export-source (name) (let* ((orig-source (intern (format "ein:helm-source-%s" name))) (any-source (intern (format "anything-c-source-ein-%s" name))) (helm-source (intern (format "helm-c-source-ein-%s" name))) (docstring (format "Alias to `%s'" orig-source))) `(progn (defvaralias ',helm-source ',orig-source ,docstring) (defvaralias ',any-source ',orig-source ,docstring)))) ;;; Dynamic Variables (defvar ein:helm-pattern 'helm-pattern "Dynamically bound to one of `helm-pattern' or `anything-pattern'.") (defvar ein:helm-kernel nil "Dynamically bound to a kernel object.") ;;; History search (defcustom ein:helm-kernel-history-search-auto-pattern t "Automatically construct search pattern when non-`nil'. 1. Single space is converted to \"*\". 2. A backslash followed by a space is converted to a single space. 3. A \"*\" is added at the beginning and end of the pattern. This variable applies to both `helm-ein-kernel-history' and `anything-ein-kernel-history'." :type 'boolean :group 'ein) (defun ein:helm-kernel-history-search-construct-pattern (pattern) (when ein:helm-kernel-history-search-auto-pattern (setq pattern (replace-regexp-in-string "[^\\\\ ]\\( \\)[^\\\\ ]" "*" pattern nil nil 1)) (setq pattern (replace-regexp-in-string "\\\\ " " " pattern)) (setq pattern (concat "*" pattern "*"))) pattern) (defun ein:helm-kernel-history-search-get-candidates () "Retrieve search result from kernel. It requires the following dynamical variables: * `ein:helm-pattern' * `ein:helm-kernel'" (let* ((pattern (ein:helm-kernel-history-search-construct-pattern (eval ein:helm-pattern))) (candidates (ein:kernel-history-search-synchronously ein:helm-kernel pattern :unique t))) ;; Most recent history first: (nreverse candidates))) (defvar ein:helm-source-kernel-history '((name . "IPython history") (candidates . ein:helm-kernel-history-search-get-candidates) (requires-pattern . 3) ;; There is no need to filter out candidates: (match . (identity)) (volatile) (action . insert) (delayed) (multiline)) "Helm/anything source for searching kernel history.") ;;;###autoload (defun anything-ein-kernel-history () "Search kernel execution history then insert the selected one." (interactive) (let ((ein:helm-pattern 'anything-pattern) (ein:helm-kernel (ein:get-kernel-or-error))) (anything-other-buffer ein:helm-source-kernel-history "*anything ein*"))) ;;;###autoload (defun helm-ein-kernel-history () "Search kernel execution history then insert the selected one." (interactive) (let ((ein:helm-pattern 'helm-pattern) (ein:helm-kernel (ein:get-kernel-or-error))) (helm-other-buffer ein:helm-source-kernel-history "*helm ein*"))) ;;; Notebook buffers (defvar ein:helm-source-notebook-buffers '((name . "All IPython notebook buffers") (candidates . ein:notebook-opened-buffer-names) (type . buffer)) "Helm/anything source for all opened notebook buffers.") (defvar ein:helm-source-modified-notebook-buffers '((name . "Modified IPython notebook buffers") (candidates . (lambda () (ein:notebook-opened-buffer-names #'ein:notebook-modified-p))) (type . buffer)) "Helm/anything source for modified notebook buffers.") (defvar ein:helm-source-saved-notebook-buffers '((name . "Saved IPython notebook buffers") (candidates . (lambda () (ein:notebook-opened-buffer-names (lambda (nb) (not (ein:notebook-modified-p nb)))))) (type . buffer)) "Helm/anything source for saved notebook buffers.") ;;; "Export" sources to `helm/anything-c-source-*' (ein:helm-export-source notebook-buffers) (ein:helm-export-source modified-notebook-buffers) (ein:helm-export-source saved-notebook-buffers) ;;; Helm/anything commands (defvar ein:helm-notebook-buffer-sources '(ein:helm-source-modified-notebook-buffers ein:helm-source-saved-notebook-buffers)) ;;;###autoload (defun anything-ein-notebook-buffers () "Choose opened notebook using anything.el interface." (interactive) (anything-other-buffer ein:helm-notebook-buffer-sources "*anything ein*")) ;;;###autoload (defun helm-ein-notebook-buffers () "Choose opened notebook using helm interface." (interactive) (helm-other-buffer ein:helm-notebook-buffer-sources "*helm ein*")) (provide 'ein-helm) ;;; ein-helm.el ends here