diff --git a/eaf.el b/eaf.el index f194cad..45e2177 100644 --- a/eaf.el +++ b/eaf.el @@ -304,6 +304,17 @@ Try not to modify this alist directly. Use `eaf-setq' to modify instead." Any new app should add the its name and the corresponding keybinding variable to this list.") +(defvar eaf-app-display-function-alist + '(("markdown-previewer" . eaf--markdown-preview-display) + ("org-previewer" . eaf--org-preview-display)) + "Mapping app names to display functions. + +Display functions are called to initilize the initial view when +starting an app. + +A display function receives the initialized app buffer as +argument and defaults to `switch-to-buffer'.") + (defvar-local eaf--bookmark-title nil) @@ -774,21 +785,42 @@ Use it as (eaf-bind-key var key eaf-app-keybinding)" (defun eaf-open-internal (url app-name arguments) (let* ((buffer (eaf-create-buffer url app-name)) - buffer-result) - (with-current-buffer buffer - (setq buffer-result (eaf-call "new_buffer" eaf--buffer-id url app-name arguments))) - (if (equal buffer-result "") - (progn - ;; Switch to new buffer if buffer create successful. - (switch-to-buffer buffer) - ;; Focus to file window if is previewer application. - (when (or (string= app-name "markdown-previewer") - (string= app-name "org-previewer")) - (other-window +1))) - ;; Kill buffer and show error message from python server. - (kill-buffer buffer) - (switch-to-buffer eaf-name) - (message buffer-result)))) + (buffer-result + (with-current-buffer buffer + (eaf-call "new_buffer" + eaf--buffer-id url app-name arguments)))) + (cond ((equal buffer-result "") + (eaf--display-app-buffer app-name buffer)) + (t + ;; Kill buffer and show error message from python server. + (kill-buffer buffer) + (switch-to-buffer eaf-name) + (message buffer-result))))) + +(defun eaf--markdown-preview-display (buf) + ;; Split window to show file and previewer. + (eaf-split-preview-windows + (buffer-local-value + 'eaf--buffer-url buf)) + (switch-to-buffer buf) + (other-window +1)) + +(defun eaf--org-preview-display (buf) + (let ((url (buffer-local-value + 'eaf--buffer-url buf))) + ;; Find file first, because `find-file' will trigger `kill-buffer' operation. + (save-excursion + (find-file url) + (org-html-export-to-html)) + ;; Add file name to `eaf-org-file-list' after command `find-file'. + (unless (member url eaf-org-file-list) + (push url eaf-org-file-list)) + ;; Split window to show file and previewer. + (eaf-split-preview-windows url) + ;; Switch to new buffer if buffer create successful. + (switch-to-buffer buf) + (other-window +1))) + ;;;###autoload (defun eaf-open-browser (url &optional arguments) @@ -844,6 +876,7 @@ When called interactively, URL accepts a file that can be opened by EAF." (when (featurep 'recentf) (recentf-add-file url)) (let* ((extension-name (file-name-extension url))) + ;; init app name, url and arguments (setq app-name (cond ((member extension-name eaf-pdf-extension-list) "pdf-viewer") @@ -852,8 +885,6 @@ When called interactively, URL accepts a file that can be opened by EAF." (setq arguments (or eaf-grip-token (read-string "Fill your own github token (or set `eaf-grip-token' with token string): "))) - ;; Split window to show file and previewer. - (eaf-split-preview-windows url) "markdown-previewer") ((member extension-name eaf-image-extension-list) "image-viewer") @@ -863,17 +894,6 @@ When called interactively, URL accepts a file that can be opened by EAF." (setq url (concat "file://" url)) "browser") ((member extension-name eaf-org-extension-list) - ;; Find file first, because `find-file' will trigger `kill-buffer' operation. - (save-excursion - (find-file url) - (with-current-buffer (buffer-name) ;FIXME: Why? - (org-html-export-to-html))) - ;; Add file name to `eaf-org-file-list' after command `find-file'. - - (unless (member url eaf-org-file-list) - (push url eaf-org-file-list)) - ;; Split window to show file and previewer. - (eaf-split-preview-windows url) "org-previewer"))))) (unless arguments (setq arguments "")) ;; Now that app-name should hopefully be set @@ -893,7 +913,7 @@ When called interactively, URL accepts a file that can be opened by EAF." ;; Switch to exists buffer, ;; if no match buffer found, call `eaf-open-internal'. (if exists-eaf-buffer - (switch-to-buffer exists-eaf-buffer) + (eaf--display-app-buffer app-name exists-eaf-buffer) (eaf-open-internal url app-name arguments))) ;; Record user input, and call `eaf-open-internal' after receive `start_finish' signal from server process. (setq eaf-first-start-url url) @@ -911,6 +931,12 @@ When called interactively, URL accepts a file that can be opened by EAF." (t "EAF: %s does not exist.")) url))) +(defun eaf--display-app-buffer (app-name buffer) + (let ((display-fun (or (cdr (assoc app-name + eaf-app-display-function-alist)) + #'switch-to-buffer))) + (funcall display-fun buffer))) + (defun eaf-split-preview-windows (url) (delete-other-windows) (find-file url)