From 60a3242c244766bedba491e1fc1365c4188aa132 Mon Sep 17 00:00:00 2001 From: jao Date: Sat, 6 Aug 2022 20:15:47 +0100 Subject: jao-custom-w3m --- custom/jao-custom-w3m.el | 174 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 custom/jao-custom-w3m.el (limited to 'custom') diff --git a/custom/jao-custom-w3m.el b/custom/jao-custom-w3m.el new file mode 100644 index 0000000..af4b0be --- /dev/null +++ b/custom/jao-custom-w3m.el @@ -0,0 +1,174 @@ +;; -*- lexical-binding: t -*- + +;;; browse-url and afio +(defun jao-w3m-find-url (url) + (let* ((url (w3m-canonicalize-url url)) + (fn `(lambda (b) + (with-current-buffer b + (string= ,url (w3m-canonicalize-url w3m-current-url)))))) + (when-let (b (seq-find fn (w3m-list-buffers))) + (pop-to-buffer b)))) + +(defun jao-w3m-browse-url (url &rest r) + (jao-afio--goto-www) + (select-window (frame-first-window)) + (unless (jao-w3m-find-url url) + (w3m-goto-url-new-session url))) + +(defun jao-w3m-download (arg) + (interactive "P") + (jao-download (w3m-anchor) arg)) + +(setq jao-afio-use-w3m t) +(setq jao-browse-url-function 'jao-w3m-browse-url) + +;;; multipart html renderer +(defun jao-w3m-html-renderer (handle) + (let ((w3m-message-silent t) + (w3m-fill-column 120) + (mm-w3m-safe-url-regexp nil)) + (condition-case nil + (mm-inline-text-html-render-with-w3m handle) + (error (delete-region (point) (point-max)) + (let ((shr-use-fonts nil) + (shr-use-colors nil)) + (mm-shr handle)))))) + +(setq mm-text-html-renderer #'jao-w3m-html-renderer) + +;;; org integration +(defun jao-w3m-get-link () + (let ((wb (w3m-alive-p))) + (when wb + (let ((url (with-current-buffer wb w3m-current-url)) + (title (w3m-buffer-title wb))) + (cons url title))))) + +(defun jao-insert-w3m-link () + (interactive) + (let ((link (jao-w3m-get-link))) + (when link (insert "[[" (car link) "][" (cdr link) "]]")))) + +(with-eval-after-load "org" + (require 'ol-w3m nil t) + (define-key org-mode-map "\C-cW" 'jao-insert-w3m-link)) + +;;; capture page +(defun jao-w3m-capture-page () + (interactive) + (let* ((title (w3m-current-title)) + (url w3m-current-url) + (html (y-or-n-p "Save as HTML (y) or PS (n)? ")) + (basename (concat (read-string "File name: ") + (if html ".html" ".ps"))) + (name (expand-file-name basename jao-sink-dir))) + (if html + (progn + (w3m-view-source) + (write-region (point-min) (point-max) name nil nil nil t) + (w3m-view-source)) + (progn + (split-window-horizontally 85) + (w3m-redisplay-this-page) + (ps-print-buffer name) + (delete-other-windows) + (w3m-redisplay-this-page))) + (kill-new (format "[[doc:%s][%s]] ([[%s][original]])" + basename title url)))) + +;;; consult narrowing +(with-eval-after-load "w3m-util" + (with-eval-after-load "consult" + (defvar jao-consult-w3m-buffer-history nil) + (defun jao-www--item (b) + (with-current-buffer b + (propertize (or w3m-current-title (buffer-name)) + 'buffer b + 'url (or w3m-current-url (buffer-name))))) + (defvar jao-consult-w3m-source + (list :name "www buffer" + :category 'www-buffer + :hidden t + :narrow (cons ?w "www") + :annotate (lambda (b) (when b (get-text-property 0 'url b))) + :history 'jao-consult-w3m-buffer-history + :items (lambda () + (seq-map #'jao-www--item + (seq-filter #'jao-www--buffer-p (buffer-list)))) + :action (lambda (b) + (jao-afio--goto-www) + (switch-to-buffer (get-text-property 0 'buffer b))))) + (jao-consult-add-buffer-source 'jao-consult-w3m-source "Web" ?w))) + +;;; package +(use-package w3m + :ensure t + :custom ((w3m-key-binding 'info) + (w3m-display-mode 'dual-pane)) + :init + (setq w3m-add-user-agent nil + w3m-confirm-leaving-secure-page nil + w3m-cookie-accept-bad-cookies t + w3m-cookie-accept-domains '(".github.com" + ".librarything.com" + ".goodreads.com" + ".sr.ht" + ".gnu.org" + ".codeberg.org" + "codeberg.org" + ".bookshop.org" + ".reddit.com") + w3m-cookie-reject-domains '(".") + w3m-default-save-directory "~/var/download" + w3m-do-cleanup-temp-files nil + w3m-external-view-temp-directory "/tmp" + w3m-fill-column 110 + w3m-goto-article-function 'jao-w3m-browse-url + w3m-form-input-textarea-buffer-lines 40 + w3m-history-minimize-in-new-session t + w3m-history-reuse-history-elements nil + w3m-image-no-idle-timer t + w3m-make-new-session t + w3m-profile-directory "~/.w3m" + w3m-redisplay-pages-automatically-p nil + w3m-resize-images t + w3m-safe-url-regexp nil + w3m-search-default-engine "duckduckgo" ; "google-en" + w3m-select-buffer-horizontal-window nil + w3m-select-buffer-window-ratio '(20 . 40) + w3m-session-load-last-sessions t + w3m-session-load-crashed-sessions 'ask + w3m-show-graphic-icons-in-header-line nil + w3m-show-graphic-icons-in-mode-line nil + w3m-use-tab nil + w3m-use-tab-line nil + w3m-use-title-buffer-name t + w3m-use-cookies t + w3m-use-filter nil + w3m-use-favicon nil + w3m-use-header-line nil + w3m-use-refresh nil + w3m-use-symbol t) + + :config + :bind (:map w3m-mode-map + (("+" . w3m-zoom-in-image) + ("-" . w3m-zoom-out-image) + ("C-c C-@" . tracking-next-buffer) + ("C-c C-SPC" . tracking-next-buffer) + ("C-c C-b" . nil) + ("C-l" . nil) + ("C-c c" . jao-w3m-capture-page) + ("b" . w3m-view-previous-page) + ("B" . w3m-view-next-page) + ("c" . w3m-print-this-url) + ("d" . jao-w3m-download) + ("D" . w3m-download) + ("f" . w3m-lnum-follow) + ("v" . jao-view-video) + ("w" . org-w3m-copy-for-org-mode) + ("x" . jao-rss-subscribe) + ("y" . w3m-print-current-url)))) + +;;; . +(provide 'jao-custom-w3m) -- cgit v1.2.3