Commit c8d78f71 authored by Antonino D'Annaç's avatar Antonino D'Annaç

some improvements

parent 3824eb87
;;; bdio-mode.el --- View .bdio files using lsbdio ;;; bdio-mode.el --- View .bdio files using lsbdio -*- lexical-binding: t; -*-
(require 's) (require 's)
(require 'f) (require 'f)
(defvar bdio-mode-hook nil) (defvar-local bdio-mode--source-file nil)
(defvar source-file nil)
(defvar lsbdio "lsbdio")
(defun bdio--render-file (file) (defgroup bdio nil
"BDIO viewer."
:group 'tools)
(defcustom bdio-lsbdio "lsbdio"
"Path to the lsbdio executable."
:type 'string
:group 'bdio)
(defun bdio-mode--render-file (file)
"Render FILE using lsbdio into current buffer." "Render FILE using lsbdio into current buffer."
(let ((inhibit-read-only t)) (let ((inhibit-read-only t))
(erase-buffer) (erase-buffer)
(let ((exit-code (let ((exit-code
(call-process lsbdio nil t nil file "-c 0"))) (call-process bdio-lsbdio nil t nil file "-c 0")))
(unless (eq exit-code 0) (unless (eq exit-code 0)
(insert (format "Error running lsbdio on %s\n" file)))) (insert (format "Error running lsbdio on %s\n" file))))
(goto-char (point-min)) (goto-char (point-min))
...@@ -24,26 +32,25 @@ ...@@ -24,26 +32,25 @@
)))) ))))
(defun bdio-open-file () (defun bdio-mode--open-file ()
"Open .bdio file using lsbdio." "Open .bdio file using lsbdio."
(setq source-file buffer-file-name) ;;(setq-local bdio-mode--source-file buffer-file-name)
(let ((file (buffer-file-name))) (let ((file (buffer-file-name)))
(when file (when file
(rename-buffer (rename-buffer
(format "*BDIO* %s" (file-name-nondirectory file)) t) (format "*BDIO* %s" (file-name-nondirectory file)) t)
(set-visited-file-name nil t) (set-visited-file-name nil t)
(bdio-mode) (bdio-mode)
(bdio--render-file file)))) (bdio-mode--render-file file))))
(defun bdio-toggle-record () (defun bdio-mode--toggle-record ()
"Expand/collapse current record." "Expand/collapse current record."
(interactive) (interactive)
(setq bdio-file source-file) (let ((bdio-file bdio-mode--source-file)
(setq lstart (line-beginning-position) (setq lstart (line-beginning-position))
lend (line-end-position) (lend (line-end-position))
cpoint (point)) (cpoint (point)))
(let* ((record (get-text-property lstart 'bdio-record)) (let* ((record (get-text-property lstart 'bdio-record))
(inhibit-read-only t)) (inhibit-read-only t))
(when record (when record
...@@ -61,17 +68,14 @@ ...@@ -61,17 +68,14 @@
(insert "\n") (insert "\n")
(let ((output-start (point))) (let ((output-start (point)))
;; insert command output ;; insert command output
(call-process lsbdio nil t nil bdio-file "-d" (number-to-string record))) (call-process bdio-lsbdio nil t nil bdio-file "-d" (number-to-string record)))
;; mark inserted region ;; mark inserted region
(put-text-property lstart lend 'bdio-expanded t))))) (put-text-property lstart lend 'bdio-expanded t)))))
(goto-char cpoint)) (goto-char cpoint)))
;; ;; optional face
;; (add-text-properties
;; output-start
;; (point)
;; '(face shadow)))))))))
(setq-local revert-buffer-function #'bdio-revert-buffer) (defun bdio-mode--refresh-file (&rest ARGS)
(interactive)
(bdio-mode--render-file bdio-mode--source-file))
(defun bdio-mode--clone-repo (dir) (defun bdio-mode--clone-repo (dir)
(message "cloning bdio in " dir) (message "cloning bdio in " dir)
...@@ -91,42 +95,40 @@ ...@@ -91,42 +95,40 @@
(defun bdio-mode--make-tools (bdio-dir) (defun bdio-mode--make-tools (bdio-dir)
(message "making tools") (message "making tools")
(defvar current-dir default-directory) (let ((default-directory bdio-dir))
(cd bdio-dir) (call-process "make" nil nil nil))
(call-process "make" nil nil nil)
(cd "tools")
(call-process "make" nil nil nil)
(cd current-dir))
(defun bdio-mode--get-lsbdio () (let ((default-directory (expand-file-name "tools" bdio-dir)))
(defvar bdio-dir (f-join package-user-dir "bdio")) (call-process "make" nil nil nil)))
(if (not (file-directory-p bdio-dir)) (defun bdio-mode--get-lsbdio ()
(let* ((bdio-dir (expand-file-name "bdio" package-user-dir))
(lsbdio-path
(expand-file-name "tools/lsbdio" bdio-dir)))
(unless (file-directory-p bdio-dir)
(bdio-mode--clone-repo bdio-dir)) (bdio-mode--clone-repo bdio-dir))
(defvar lsbdio-path (f-join bdio-dir "tools" lsbdio)) (unless (file-exists-p lsbdio-path)
(if (not (file-exists-p lsbdio-path))
(bdio-mode--make-tools bdio-dir)) (bdio-mode--make-tools bdio-dir))
(setq lsbdio (f-join bdio-dir "tools" lsbdio))) (setq bdio-lsbdio lsbdio-path)))
(defun bdio-mode--check-for-lsbdio () (defun bdio-mode--check-for-lsbdio ()
(interactive) (interactive)
(if (not (executable-find lsbdio)) (unless (executable-find bdio-lsbdio)
(bdio-mode--get-lsbdio))) (bdio-mode--get-lsbdio)))
;;;###autoload ;;;###autoload
(add-to-list 'auto-mode-alist '("\\.bdio\\'" . bdio-open-file)) (add-to-list 'auto-mode-alist '("\\.bdio\\'" . bdio-mode))
(defvar bdio-mode-map (defvar bdio-mode-map
(let ((map (make-sparse-keymap))) (let ((map (make-sparse-keymap)))
(keymap-set map "<tab>" #'bdio-toggle-record) (keymap-set map "<tab>" #'bdio-mode--toggle-record)
map)) map))
(define-derived-mode bdio-mode special-mode "BDIO" (define-derived-mode bdio-mode special-mode "BDIO"
"Major mode for viewing BDIO files via lsbdio." "Major mode for viewing BDIO files via lsbdio."
(use-local-map bdio-mode-map)
(bdio-mode--check-for-lsbdio) (bdio-mode--check-for-lsbdio)
(setq buffer-read-only t)) (setq-local revert-buffer-function #'bdio-mode--refresh-file)
(setq-local bdio-mode--source-file buffer-file-name)
(when bdio-mode--source-file (bdio-mode--render-file bdio-mode--source-file)))
(provide 'bdio-mode) (provide 'bdio-mode)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment