;;; ein-file.el --- Editing files downloaded from jupyter ;; Copyright (C) 2017- John M. Miller ;; Authors: Takafumi Arakaki ;; John M. Miller ;; This file is NOT part of GNU Emacs. ;; ein-file.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-file.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-notebooklist.el. If not, see . ;;; Commentary: (defvar *ein:file-buffername-template* "'/ein:%s:%s") (ein:deflocal ein:content-file-buffer--content nil) ;; (push '("^ein:.*" . ein:content-file-handler) ;; file-name-handler-alist) (defun ein:file-buffer-name (urlport path) (format *ein:file-buffername-template* urlport path)) (defun ein:file-open (url-or-port path) (ein:content-query-contents path url-or-port nil #'ein:file-open-finish)) (defun ein:file-open-finish (content) (with-current-buffer (get-buffer-create (ein:file-buffer-name (ein:$content-url-or-port content) (ein:$content-path content))) (setq ein:content-file-buffer--content content) (insert (ein:$content-raw-content content)) (set-visited-file-name (buffer-name)) (set-auto-mode) (add-hook 'write-contents-functions 'ein:content-file-save) (pop-to-buffer (buffer-name)))) (defun ein:content-file-save () (when (boundp 'ein:content-file-buffer--content) (setf (ein:$content-raw-content ein:content-file-buffer--content) (buffer-string)) (ein:content-save ein:content-file-buffer--content) (set-buffer-modified-p nil) t)) (defun ein:content-file-name-directory (bufname) (with-current-buffer bufname (or (file-name-directory (ein:$file-path ein:content-file-buffer--info)) "/"))) (defun ein:content-file-name-nondirectory (bufname) (with-current-buffer bufname (file-name-nondirectory (ein:$file-path ein:content-file-buffer--info)))) (defun ein:content-file-handler (operation &rest args) (case operation (expand-file-name (multiple-value-bind (name dir) args name)) (file-name-directory (apply #'ein:content-file-name-directory args)) (file-name-nondirectory (apply #'ein:content-file-name-nondirectory args)) (file-name-case-insensitive-p nil) (file-remote-p (multiple-value-bind (fn id connect) args fn)) (t (let ((inhibit-file-name-handlers (cons 'ein:content-file-handler (and (eq inhibit-file-name-operation operation) inhibit-file-name-handlers))) (inhibit-file-name-operation operation)) (apply operation args))))) (put 'ein:content-file-handler 'safe-magic t) (provide 'ein-file)