diff options
-rw-r--r-- | luwak.el | 75 |
1 files changed, 67 insertions, 8 deletions
@@ -1,10 +1,29 @@ ;; -*- lexical-binding: t; -*- (defvar luwak-buffer "*luwak*") + +(defvar-local luwak-data nil) +(defvar-local luwak-history nil) + (defun luwak-lynx-buffer (url) (format "*luwak-lynx %s*" url)) +(define-derived-mode luwak-mode special-mode "luwak" + "Major mode for browsing the web using lynx -dump.") + +(defvar luwak-mode-map + (let ((kmap (make-sparse-keymap))) + (define-key kmap "\t" 'forward-button) + (define-key kmap [backtab] 'backward-button) + (define-key kmap "g" 'luwak-reload) + (define-key kmap "l" 'luwak-history-backward) + (define-key kmap "r" 'luwak-history-forward) + kmap)) + (defun luwak-open (url) (interactive "sUrl to open: ") (setq url (eww--dwim-expand-url url)) + (luwak-open-internal url current-prefix-arg 'luwak-add-to-history)) + +(defun luwak-open-internal (url no-tor &optional cb) (set-process-sentinel (start-process-with-torsocks current-prefix-arg @@ -12,16 +31,56 @@ "lynx" "-dump" "--display_charset" "utf-8" url) (lambda (process _) (with-current-buffer (get-buffer-create luwak-buffer) - (erase-buffer) - (insert-buffer-substring (process-buffer process)) - (kill-buffer (process-buffer process)) - (goto-char (point-min)) - (luwak-render-links (luwak-get-links))) + (let ((inhibit-read-only t)) + (erase-buffer) + (insert-buffer-substring (process-buffer process)) + (kill-buffer (process-buffer process)) + (goto-char (point-min)) + (luwak-render-links (luwak-get-links))) + (unless (derived-mode-p 'luwak-mode) (luwak-mode)) + (if luwak-data + (plist-put luwak-data :url url) + (setq luwak-data (list :url url :no-tor no-tor :history-pos 0))) + (when cb (funcall cb))) (display-buffer luwak-buffer)))) +(defun luwak-add-to-history () + (let ((history-delete-duplicates nil)) + (setq luwak-history (nthcdr (plist-get luwak-data :history-pos) + luwak-history)) + (add-to-history 'luwak-history (plist-get luwak-data :url)) + (plist-put luwak-data :history-pos 0))) + +(defun luwak-history-backward () + (interactive) + (let ((history-pos + (1+ (plist-get luwak-data :history-pos)))) + (when (<= (length luwak-history) history-pos) + (error "Already at the earliest history.")) + (plist-put luwak-data :history-pos history-pos) + (luwak-open-internal (nth history-pos luwak-history) + (plist-get luwak-data :no-tor)))) + +(defun luwak-history-forward () + (interactive) + (let ((history-pos + (1- (plist-get luwak-data :history-pos)))) + (when (< history-pos 0) + (error "Already at the latest history.")) + (plist-put luwak-data :history-pos history-pos) + (luwak-open-internal (nth history-pos luwak-history) + (plist-get luwak-data :no-tor)))) + +(defun luwak-reload () + (interactive) + (luwak-open-internal + (plist-get luwak-data :url) + (plist-get luwak-data :no-tor))) + (defun luwak-follow-link (marker) - (luwak-open - (get-text-property marker 'url))) + (let ((url (get-text-property marker 'url))) + (luwak-open-internal + url (plist-get luwak-data :no-tor) 'luwak-add-to-history))) (defun luwak-render-links (urls) (with-current-buffer luwak-buffer @@ -31,7 +90,7 @@ (dolist (url urls) (when (re-search-forward (format "\\[%d\\]" i) nil t) (replace-match "") - (make-text-button (point) (1+ (point)) + (make-text-button (point) (progn (forward-sexp) (point)) 'url url 'action 'luwak-follow-link 'face 'button)) |