* bug#18010: eww: desktop support
@ 2014-07-13 12:17 Ivan Shmakov
2014-11-04 16:36 ` Ted Zlatanov
2014-11-10 21:24 ` Lars Magne Ingebrigtsen
0 siblings, 2 replies; 22+ messages in thread
From: Ivan Shmakov @ 2014-07-13 12:17 UTC (permalink / raw)
To: 18010
[-- Attachment #1: Type: text/plain, Size: 1314 bytes --]
Package: emacs
Severity: wishlist
Tags: patch
Control: block -1 by 16211
Control: tags 16211 + patch
Assuming that #16211 is resolved, adding desktop support to EWW
seems pretty natural. (Why, Info already has one.)
One thing to save is, obviously, eww-current-url. The other is
eww-history, but that has to be filtered for the overly bulky
:text, :dom, and :source properties.
The last part poses a problem, as eww-restore-history does /not/
currently handle the case where :text is missing. A possible
solution is to use (eww-reload) if :text is nil. As a side
effect, eww-current-source and eww-current-dom will also be set.
Also, AIUI, for the EWW history facility to work properly,
eww-history-position is also to be saved, which is possible via
desktop-locals-to-save.
For anyone eager to try, the patch I suggest is MIMEd.
This change looks quite substantial to be copyrightable, so I’d
like to explicitly disclaim copyright on it, as per
CC0 Public Domain Dedication [0].
For the most part, eww-desktop-history-1 function is a kind of
‘reduce’ or ‘remove-if’ for property lists. Alas, I didn’t find
any existing function for that, so I coded it the explicit way.
--
FSF associate member #7257 http://boycottsystemd.org/
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-diff, Size: 3233 bytes --]
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index 02fc575..f6ee185 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -479,6 +495,8 @@ word(s) will be searched for via `eww-search-prefix'."
(setq-local eww-history-position 0)
(when (boundp 'tool-bar-map)
(setq-local tool-bar-map eww-tool-bar-map))
+ ;; desktop support
+ (setq-local desktop-save-buffer 'eww-desktop-misc-data)
(buffer-disable-undo)
;;(setq buffer-read-only t)
)
@@ -514,15 +533,22 @@ word(s) will be searched for via `eww-search-prefix'."
(eww-restore-history (elt eww-history (1- eww-history-position))))
(defun eww-restore-history (elem)
- (let ((inhibit-read-only t))
- (erase-buffer)
- (insert (plist-get elem :text))
- (setq eww-current-source (plist-get elem :source))
- (setq eww-current-dom (plist-get elem :dom))
- (goto-char (plist-get elem :point))
- (setq eww-current-url (plist-get elem :url)
- eww-current-title (plist-get elem :title))
- (eww-update-header-line-format)))
+ (let ((inhibit-read-only t)
+ (text (plist-get elem :text))
+ (pos (plist-get elem :point)))
+ (setq eww-current-source (plist-get elem :source)
+ eww-current-dom (plist-get elem :dom)
+ eww-current-url (plist-get elem :url))
+ (if (null text)
+ (eww-reload)
+ (erase-buffer)
+ (insert text)
+ (setq eww-current-title
+ (plist-get elem :title))
+ (eww-update-header-line-format))
+ ;; FIXME: pos may no longer match the contents if the page gets reloaded
+ (when pos
+ (goto-char pos))))
(defun eww-next-url ()
"Go to the page marked `next'.
@@ -1343,6 +1371,48 @@ Differences in #targets are ignored."
(setq buffer-read-only t
truncate-lines t))
+;;; Desktop support
+
+(defvar eww-desktop-history-save
+ '(:url :title :point)
+ "List of `eww-history' values to preserve in the desktop file.")
+
+(defun eww-desktop-history-1 (alist)
+ (let ((acc nil)
+ (tail alist))
+ (while tail
+ (let ((k (car tail))
+ (v (cadr tail)))
+ (when (memq k eww-desktop-history-save)
+ (setq acc (cons k (cons v acc)))))
+ (setq tail (cddr tail)))
+ acc))
+
+(defun eww-desktop-misc-data (directory)
+ "Return a property list with data used to restore eww buffers.
+This list will contain the URI to browse as the :uri property, and, as
+:history, a copy of eww-history with the (usually overly large) :dom,
+:source and :text properties removed."
+ (list :history (mapcar 'eww-desktop-history-1 eww-history)
+ :uri eww-current-url))
+
+(defun eww-restore-desktop (file-name buffer-name misc-data)
+ "Restore an eww buffer from its desktop file record."
+ (with-current-buffer (get-buffer-create buffer-name)
+ (eww-mode)
+ ;; NB: eww-history is buffer-local per (eww-mode)
+ (setq eww-history (plist-get :history misc-data))
+ (unless file-name
+ (let ((uri (plist-get :uri misc-data)))
+ (when uri
+ (eww uri))))
+ (current-buffer)))
+
+(add-to-list 'desktop-locals-to-save
+ 'eww-history-position)
+(add-to-list 'desktop-buffer-mode-handlers
+ '(eww-mode . eww-restore-desktop))
+
(provide 'eww)
;;; eww.el ends here
^ permalink raw reply related [flat|nested] 22+ messages in thread
* bug#18010: eww: desktop support
2014-07-13 12:17 bug#18010: eww: desktop support Ivan Shmakov
@ 2014-11-04 16:36 ` Ted Zlatanov
2014-11-10 21:24 ` Lars Magne Ingebrigtsen
1 sibling, 0 replies; 22+ messages in thread
From: Ted Zlatanov @ 2014-11-04 16:36 UTC (permalink / raw)
To: Ivan Shmakov; +Cc: 18010
On Sun, 13 Jul 2014 12:17:47 +0000 Ivan Shmakov <ivan@siamics.net> wrote:
IS> Package: emacs
IS> Severity: wishlist
IS> Tags: patch
IS> Control: block -1 by 16211
IS> Control: tags 16211 + patch
IS> Assuming that #16211 is resolved, adding desktop support to EWW
IS> seems pretty natural. (Why, Info already has one.)
I'm OK with this in principle and think it's nicely useful, but the
patch is too large so Lars will have to review it.
Ted
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#18010: eww: desktop support
2014-07-13 12:17 bug#18010: eww: desktop support Ivan Shmakov
2014-11-04 16:36 ` Ted Zlatanov
@ 2014-11-10 21:24 ` Lars Magne Ingebrigtsen
2014-11-10 21:32 ` Glenn Morris
1 sibling, 1 reply; 22+ messages in thread
From: Lars Magne Ingebrigtsen @ 2014-11-10 21:24 UTC (permalink / raw)
To: Ivan Shmakov; +Cc: 18010
Ivan Shmakov <ivan@siamics.net> writes:
> Also, AIUI, for the EWW history facility to work properly,
> eww-history-position is also to be saved, which is possible via
> desktop-locals-to-save.
>
> For anyone eager to try, the patch I suggest is MIMEd.
This looks very nice, but the history saving has changed a bit (earlier
today :-), so the patch won't apply now.
> This change looks quite substantial to be copyrightable, so I’d
> like to explicitly disclaim copyright on it, as per
> CC0 Public Domain Dedication [0].
But I've never applied a patch of this size that I haven't had paperwork
for. Could someone advise here? Would this disclaimal (that should be
a word) suffice?
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#18010: eww: desktop support
2014-11-10 21:24 ` Lars Magne Ingebrigtsen
@ 2014-11-10 21:32 ` Glenn Morris
2014-11-10 21:36 ` Lars Magne Ingebrigtsen
0 siblings, 1 reply; 22+ messages in thread
From: Glenn Morris @ 2014-11-10 21:32 UTC (permalink / raw)
To: Lars Magne Ingebrigtsen; +Cc: 18010, Ivan Shmakov
Lars Magne Ingebrigtsen wrote:
>> This change looks quite substantial to be copyrightable, so I'd
>> like to explicitly disclaim copyright on it, as per
>> CC0 Public Domain Dedication [0].
>
> But I've never applied a patch of this size that I haven't had paperwork
> for. Could someone advise here? Would this disclaimal (that should be
> a word) suffice?
No, it doesn't suffice.
But the OP has an assignment on file now, so just go ahead.
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#18010: eww: desktop support
2014-11-10 21:32 ` Glenn Morris
@ 2014-11-10 21:36 ` Lars Magne Ingebrigtsen
2014-11-19 10:24 ` Ivan Shmakov
0 siblings, 1 reply; 22+ messages in thread
From: Lars Magne Ingebrigtsen @ 2014-11-10 21:36 UTC (permalink / raw)
To: Glenn Morris; +Cc: 18010, Ivan Shmakov
Glenn Morris <rgm@gnu.org> writes:
> But the OP has an assignment on file now, so just go ahead.
Great.
Ivan, if you could respin this patch to apply to eww now, I'll apply it.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#18010: eww: desktop support
2014-11-10 21:36 ` Lars Magne Ingebrigtsen
@ 2014-11-19 10:24 ` Ivan Shmakov
2014-11-19 17:23 ` Lars Magne Ingebrigtsen
0 siblings, 1 reply; 22+ messages in thread
From: Ivan Shmakov @ 2014-11-19 10:24 UTC (permalink / raw)
To: 18010
[-- Attachment #1: Type: text/plain, Size: 467 bytes --]
>>>>> Lars Magne Ingebrigtsen <larsi@gnus.org> writes:
> Ivan, if you could respin this patch to apply to eww now, I'll apply
> it.
Please consider the patch MIMEd. Albeit I’ve tested it only
somewhat superficially, it does seem to work as intended.
Beware of the line numbers being slightly offset, for I also
have other patches applied to eww.el locally.
--
FSF associate member #7257 http://boycottsystemd.org/ … 3013 B6A0 230E 334A
[-- Attachment #2: Type: text/plain, Size: 5170 bytes --]
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -65,6 +65,36 @@
:group 'eww
:type 'string)
+(defcustom eww-desktop-remove-duplicates t
+ "Whether to remove duplicates from the history when saving desktop data.
+If non-nil, repetitive EWW history entries (comprising of the URI, the
+title, and the point position) will not be saved as part of the Emacs
+desktop. Otherwise, such entries will be retained."
+ :version "24.4"
+ :group 'eww
+ :type 'boolean)
+
+(defcustom eww-restore-desktop nil
+ "How to restore EWW buffers on `desktop-restore'.
+If t or 'auto, the buffers will be reloaded automatically.
+If nil, buffers will require manual reload, and will contain the text
+specified in `eww-restore-reload-prompt' instead of the actual Web
+page contents."
+ :version "24.4"
+ :group 'eww
+ :type '(choice (const :tag "Restore all automatically" t)
+ (const :tag "Require manual reload" nil)))
+
+(defcustom eww-restore-reload-prompt
+ "\n\n *** Use \\[eww-reload] to reload this buffer. ***\n"
+ "The string to put in the buffers not reloaded on `desktop-restore'.
+This prompt will be used if `eww-restore-desktop' is nil.
+
+The string will be passed through `substitute-command-keys'."
+ :version "24.4"
+ :group 'eww
+ :type 'string)
+
(defcustom eww-use-external-browser-for-content-type
"\\`\\(video/\\|audio/\\|application/ogg\\)"
"Always use external browser for specified content-type."
@@ -583,6 +633,8 @@ define-derived-mode eww-mode nil "eww"
(setq-local eww-history-position 0)
(when (boundp 'tool-bar-map)
(setq-local tool-bar-map eww-tool-bar-map))
+ ;; desktop support
+ (setq-local desktop-save-buffer 'eww-desktop-misc-data)
(buffer-disable-undo)
(setq buffer-read-only t))
@@ -611,12 +660,15 @@
(eww-restore-history (elt eww-history (1- eww-history-position))))
(defun eww-restore-history (elem)
- (let ((inhibit-read-only t))
- (erase-buffer)
- (insert (plist-get elem :text))
- (goto-char (plist-get elem :point))
+ (let ((inhibit-read-only t)
+ (text (plist-get elem :text)))
(setq eww-data elem)
- (eww-update-header-line-format)))
+ (if (null text)
+ (eww-reload) ; FIXME: restore :point?
+ (erase-buffer)
+ (insert text)
+ (goto-char (plist-get elem :point))
+ (eww-update-header-line-format))))
(defun eww-next-url ()
"Go to the page marked `next'.
@@ -1518,6 +1585,82 @@
(setq buffer-read-only t
truncate-lines t))
+;;; Desktop support
+
+(defvar eww-desktop-data-save
+ '(:url :title :point)
+ "List of `eww-data' properties to preserve in the desktop file.
+Also used when saving `eww-history'.")
+
+(defun eww-desktop-data-1 (alist)
+ (let ((acc nil)
+ (tail alist))
+ (while tail
+ (let ((k (car tail))
+ (v (cadr tail)))
+ (when (memq k eww-desktop-data-save)
+ (setq acc (cons k (cons v acc)))))
+ (setq tail (cddr tail)))
+ acc))
+
+(defun eww-desktop-history-duplicate (a b)
+ (let ((tail a) (r t))
+ (while tail
+ (if (or (memq (car tail) '(:point)) ; ignore :point
+ (equal (cadr tail)
+ (plist-get b (car tail))))
+ (setq tail (cddr tail))
+ (setq tail nil
+ r nil)))
+ ;; .
+ r))
+
+(defun eww-desktop-misc-data (directory)
+ "Return a property list with data used to restore eww buffers.
+This list will contain, as :history, the list, whose first element is
+the value of `eww-data', and the tail is `eww-history'.
+
+If `eww-desktop-remove-duplicates' is non-nil, duplicate
+entries (if any) will be removed from the list.
+
+Only the properties listed in `eww-desktop-data-save' are included.
+Generally, the list should not include the (usually overly large)
+:dom, :source and :text properties."
+ (let ((history (mapcar 'eww-desktop-data-1
+ (cons eww-data eww-history))))
+ (list :history (if eww-desktop-remove-duplicates
+ (remove-duplicates
+ history :test 'eww-desktop-history-duplicate)
+ history))))
+
+(defun eww-restore-desktop (file-name buffer-name misc-data)
+ "Restore an eww buffer from its desktop file record.
+If `eww-restore-desktop' is t or 'auto, this function will also
+initiate the retrieval of the respective URI in the background.
+Otherwise, the restored buffer will contain a prompt to do so by using
+\\[eww-reload]."
+ (with-current-buffer (get-buffer-create buffer-name)
+ (eww-mode)
+ ;; NB: eww-history, eww-data are buffer-local per (eww-mode)
+ (setq eww-history (cdr (plist-get misc-data :history))
+ eww-data (or (car (plist-get misc-data :history))
+ ;; backwards compatibility
+ (list :url (plist-get misc-data :uri))))
+ (unless file-name
+ (when (plist-get eww-data :url)
+ (case eww-restore-desktop
+ ((t auto) (eww (plist-get eww-data :url)))
+ ((zerop (buffer-size))
+ (insert (substitute-command-keys
+ eww-restore-reload-prompt))))))
+ ;; .
+ (current-buffer)))
+
+(add-to-list 'desktop-locals-to-save
+ 'eww-history-position)
+(add-to-list 'desktop-buffer-mode-handlers
+ '(eww-mode . eww-restore-desktop))
+
(provide 'eww)
;;; eww.el ends here
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#18010: eww: desktop support
2014-11-19 10:24 ` Ivan Shmakov
@ 2014-11-19 17:23 ` Lars Magne Ingebrigtsen
2014-11-19 20:17 ` Ivan Shmakov
` (2 more replies)
0 siblings, 3 replies; 22+ messages in thread
From: Lars Magne Ingebrigtsen @ 2014-11-19 17:23 UTC (permalink / raw)
To: Ivan Shmakov; +Cc: 18010
Ivan Shmakov <ivan@siamics.net> writes:
>>>>>> Lars Magne Ingebrigtsen <larsi@gnus.org> writes:
>
> > Ivan, if you could respin this patch to apply to eww now, I'll apply
> > it.
>
> Please consider the patch MIMEd. Albeit I’ve tested it only
> somewhat superficially, it does seem to work as intended.
>
> Beware of the line numbers being slightly offset, for I also
> have other patches applied to eww.el locally.
Applied now. Could you also write a NEWS entry and possibly write
documentation for this? Either in the eww manual or somewhere in the
desktop manual, I guess.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#18010: eww: desktop support
2014-11-19 17:23 ` Lars Magne Ingebrigtsen
@ 2014-11-19 20:17 ` Ivan Shmakov
2014-11-23 15:10 ` Ivan Shmakov
2014-11-30 11:04 ` bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only Ivan Shmakov
2 siblings, 0 replies; 22+ messages in thread
From: Ivan Shmakov @ 2014-11-19 20:17 UTC (permalink / raw)
To: 18010
>>>>> Lars Magne Ingebrigtsen <larsi@gnus.org> writes:
[…]
> Could you also write a NEWS entry and possibly write documentation
> for this?
I’ll try to get to it within the next few days.
> Either in the eww manual or somewhere in the desktop manual, I guess.
As it seems, the “Saving Emacs Sessions” (emacs/misc.texi)
section is only concerned with the facilities of desktop.el
proper. Thus the documentation for eww-desktop-* belongs to
misc/eww.texi.
--
FSF associate member #7257 np. Isle of Avalon — Iron Maiden … 230E 334A
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#18010: eww: desktop support
2014-11-19 17:23 ` Lars Magne Ingebrigtsen
2014-11-19 20:17 ` Ivan Shmakov
@ 2014-11-23 15:10 ` Ivan Shmakov
2014-11-23 15:44 ` Lars Magne Ingebrigtsen
2014-11-30 11:04 ` bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only Ivan Shmakov
2 siblings, 1 reply; 22+ messages in thread
From: Ivan Shmakov @ 2014-11-23 15:10 UTC (permalink / raw)
To: 18010
[-- Attachment #1: Type: text/plain, Size: 720 bytes --]
>>>>> Lars Magne Ingebrigtsen <larsi@gnus.org> writes:
[…]
> Could you also write a NEWS entry and possibly write documentation
> for this? Either in the eww manual or somewhere in the desktop
> manual, I guess.
Please consider the patch MIMEd.
I was unsure where to put the details of the EWW desktop support
in eww.texi, so I’ve added them to the end of the “Advanced”
section, as they’re somewhat obscure and unlikely to require
much of the user’s attention.
What may require such attention is, however, the possible use of
(setq desktop-save-buffer nil) to disable this new feature.
--
FSF associate member #7257 http://boycottsystemd.org/ … 3013 B6A0 230E 334A
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/diff, Size: 2463 bytes --]
--- a/doc/misc/eww.texi 2014-11-23 10:57:19 +0000
+++ b/doc/misc/eww.texi 2014-11-23 14:57:43 +0000
@@ -219,6 +219,40 @@
variables @code{shr-color-visible-distance-min} and
@code{shr-color-visible-luminance-min} to get a better contrast.
+@cindex Desktop Support
+@cindex Saving Sessions
+ In addition to maintaining the history at run-time, EWW will also
+save the partial state of its buffers (the URIs and the titles of the
+pages visited) in the desktop file if one is used. @xref{Saving Emacs
+Sessions, , emacs, The GNU Emacs Manual}
+
+@vindex eww-desktop-remove-duplicates
+ EWW history may sensibly contain multiple entries for the same page
+URI. At run-time, these entries may still have different associated
+point positions or the actual Web page contents.
+The latter, however, tend to be overly large to preserve in the
+desktop file, so they get omitted, thus rendering the respective
+entries entirely equivalent. By default, such duplicate entries are
+not saved. Setting @code{eww-desktop-remove-duplicates} to nil will
+force EWW to save them anyway.
+
+@vindex eww-restore-desktop
+ Restoring EWW buffers' contents may prove to take too long to
+finish. When the @code{eww-restore-desktop} variable is set to
+@code{nil} (the default), EWW will not try to reload the last visited
+Web page when the buffer is restored from the desktop file, thus
+allowing for faster Emacs start-up times. When set to @code{t},
+restoring the buffers will also initiate the reloading of such pages.
+
+@vindex eww-restore-reload-prompt
+ The EWW buffer restored from the desktop file but not yet reloaded
+will contain a prompt, as specified by the
+@code{eww-restore-reload-prompt} variable. The value of this variable
+will be passed through @code{substitute-command-keys} upon each use,
+thus allowing for the use of the usual substitutions, such as
+@code{\[eww-reload]} for the current key binding of the
+@code{eww-reload} command.
+
@node History and Acknowledgments
@appendix History and Acknowledgments
--- a/etc/NEWS 2014-11-23 10:57:19 +0000
+++ b/etc/NEWS 2014-11-22 19:35:16 +0000
@@ -177,6 +177,9 @@
*** You can now use several eww buffers in parallel by renaming eww
buffers you want to keep separate.
+*** Partial state of the eww buffers (the URIs and the titles of the
+pages visited) is now preserved in the desktop file.
+
*** `eww-after-render-hook' is now called after eww has rendered
the data in the buffer.
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#18010: eww: desktop support
2014-11-23 15:10 ` Ivan Shmakov
@ 2014-11-23 15:44 ` Lars Magne Ingebrigtsen
0 siblings, 0 replies; 22+ messages in thread
From: Lars Magne Ingebrigtsen @ 2014-11-23 15:44 UTC (permalink / raw)
To: Ivan Shmakov; +Cc: 18010
Ivan Shmakov <ivan@siamics.net> writes:
> I was unsure where to put the details of the EWW desktop support
> in eww.texi, so I’ve added them to the end of the “Advanced”
> section, as they’re somewhat obscure and unlikely to require
> much of the user’s attention.
>
> What may require such attention is, however, the possible use of
> (setq desktop-save-buffer nil) to disable this new feature.
Thanks; applied.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only
2014-11-19 17:23 ` Lars Magne Ingebrigtsen
2014-11-19 20:17 ` Ivan Shmakov
2014-11-23 15:10 ` Ivan Shmakov
@ 2014-11-30 11:04 ` Ivan Shmakov
2014-11-30 19:57 ` Glenn Morris
2015-02-14 20:50 ` Ivan Shmakov
2 siblings, 2 replies; 22+ messages in thread
From: Ivan Shmakov @ 2014-11-30 11:04 UTC (permalink / raw)
To: 19226
[-- Attachment #1: Type: text/plain, Size: 314 bytes --]
Package: emacs
Tags: patch
Please consider the patch MIMEd.
* eww.el (eww-mode): Autoload, as expected by desktop.el.
(eww-restore-desktop): Use inhibit-read-only when inserting
eww-restore-reload-prompt.
--
FSF associate member #7257 np. Your Leaving — Jami Sieber … B6A0 230E 334A
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/diff, Size: 651 bytes --]
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -662,6 +662,8 @@
map)
"Tool bar for `eww-mode'.")
+;; autoload cookie needed by desktop.el
+;;;###autoload
(define-derived-mode eww-mode nil "eww"
"Mode for browsing the web.
@@ -1710,8 +1712,9 @@ defun eww-restore-desktop (file-name buffer-name misc-data)
(case eww-restore-desktop
((t auto) (eww (plist-get eww-data :url)))
((zerop (buffer-size))
- (insert (substitute-command-keys
- eww-restore-reload-prompt))))))
+ (let ((inhibit-read-only t))
+ (insert (substitute-command-keys
+ eww-restore-reload-prompt)))))))
;; .
(current-buffer)))
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only
2014-11-30 11:04 ` bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only Ivan Shmakov
@ 2014-11-30 19:57 ` Glenn Morris
2014-11-30 20:15 ` Ivan Shmakov
2015-02-14 20:50 ` Ivan Shmakov
1 sibling, 1 reply; 22+ messages in thread
From: Glenn Morris @ 2014-11-30 19:57 UTC (permalink / raw)
To: Ivan Shmakov; +Cc: 19226
Ivan Shmakov wrote:
> * eww.el (eww-mode): Autoload, as expected by desktop.el.
Then IMO desktop.el should autoload it, rather than adding a general
autoload cookie. (Yes, this may be inconsistent with some existing cases.)
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only
2014-11-30 19:57 ` Glenn Morris
@ 2014-11-30 20:15 ` Ivan Shmakov
2014-12-01 2:22 ` Glenn Morris
0 siblings, 1 reply; 22+ messages in thread
From: Ivan Shmakov @ 2014-11-30 20:15 UTC (permalink / raw)
To: 19226
>>>>> Glenn Morris <rgm@gnu.org> writes:
>>>>> Ivan Shmakov wrote:
>> * eww.el (eww-mode): Autoload, as expected by desktop.el.
> Then IMO desktop.el should autoload it, rather than adding a general
> autoload cookie.
That’s the point: as currently implemented, desktop.el uses a
general autoload cookie to map major modes (as preserved in the
desktop file) to Emacs features to load before handling any
given buffer. Consider, for instance:
514 Modules that define a major mode that needs a special handler should contain
515 code like
516
517 (defun foo-restore-desktop-buffer
518 ...
519 (add-to-list 'desktop-buffer-mode-handlers
520 '(foo-mode . foo-restore-desktop-buffer))
521
522 Furthermore the major mode function must be autoloaded.")
…
1319 (defun desktop-load-file (function)
1320 "Load the file where auto loaded FUNCTION is defined."
1321 (when (fboundp function)
1322 (autoload-do-load (symbol-function function) function)))
…
(See also the uses of desktop-load-file in desktop.el.)
> (Yes, this may be inconsistent with some existing cases.)
As for the existing cases, the change suggested exactly matches
info.el:
4222 ;; Autoload cookie needed by desktop.el
4223 ;;;###autoload
4224 (define-derived-mode Info-mode nil "Info" ;FIXME: Derive from special-mode?
…
4312 (setq-local bookmark-make-record-function #'Info-bookmark-make-record))
--
FSF associate member #7257 http://boycottsystemd.org/ … 3013 B6A0 230E 334A
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only
2014-11-30 20:15 ` Ivan Shmakov
@ 2014-12-01 2:22 ` Glenn Morris
2014-12-01 5:59 ` Ivan Shmakov
0 siblings, 1 reply; 22+ messages in thread
From: Glenn Morris @ 2014-12-01 2:22 UTC (permalink / raw)
To: 19226
Come to think of it, desktop mode could solve this itself:
When restoring foo-mode, if foo-mode is not bound, try requiring foo.
That would solve this case and many others.
For a complete solution, when desktop saves a major/minor mode to
restore, it could also save the name of the library that defines the
mode. When restoring, first of all require that library.
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only
2014-12-01 2:22 ` Glenn Morris
@ 2014-12-01 5:59 ` Ivan Shmakov
2014-12-01 13:52 ` Stefan Monnier
0 siblings, 1 reply; 22+ messages in thread
From: Ivan Shmakov @ 2014-12-01 5:59 UTC (permalink / raw)
To: 19226
>>>>> Glenn Morris <rgm@gnu.org> writes:
> Come to think of it, desktop mode could solve this itself:
> When restoring foo-mode, if foo-mode is not bound, try requiring foo.
> That would solve this case and many others.
Yet will leave some unsolved. Such as, for instance, my own
zealous-save-mode, defined in 'zealsave.
> For a complete solution, when desktop saves a major/minor mode to
> restore, it could also save the name of the library that defines the
> mode.
How would it obtain such information? Especially if the user
has modified the -mode function code and used eval-defun to
redefine it. (That’s also what I do at times.)
> When restoring, first of all require that library.
And fail miserably should the library be renamed.
Moreover, “general purpose” modes are ought to be autoloaded
anyway. I see no reason to second-guess this case at the least.
--
FSF associate member #7257 http://boycottsystemd.org/ … 3013 B6A0 230E 334A
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only
2014-12-01 5:59 ` Ivan Shmakov
@ 2014-12-01 13:52 ` Stefan Monnier
2014-12-07 18:56 ` Ivan Shmakov
0 siblings, 1 reply; 22+ messages in thread
From: Stefan Monnier @ 2014-12-01 13:52 UTC (permalink / raw)
To: 19226
>> Come to think of it, desktop mode could solve this itself:
It could, but I think this would be trying to be too clever.
> Moreover, “general purpose” modes are ought to be autoloaded
> anyway. I see no reason to second-guess this case at the least.
I tend to agree. If the major-mode is not autoloaded (as in the eww
case), it's quite likely to be a special major mode that is better
entered via some other function (e.g. store the URL and recreate the
buffer via `eww' which will take care calling eww-mode (and loading any
file that this may require)).
Stefan
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only
2014-12-01 13:52 ` Stefan Monnier
@ 2014-12-07 18:56 ` Ivan Shmakov
2014-12-08 2:54 ` Stefan Monnier
0 siblings, 1 reply; 22+ messages in thread
From: Ivan Shmakov @ 2014-12-07 18:56 UTC (permalink / raw)
To: 19226
>>>>> Stefan Monnier <monnier@IRO.UMontreal.CA> writes:
[…]
>> Moreover, “general purpose” modes are ought to be autoloaded anyway.
>> I see no reason to second-guess this case at the least.
> I tend to agree. If the major-mode is not autoloaded (as in the eww
> case), it's quite likely to be a special major mode that is better
> entered via some other function
The problem here is that desktop.el should explicitly be pointed
to the function to do all the special handling for the mode,
which is (conventionally) done like:
(add-to-list 'desktop-buffer-mode-handlers
'(eww-mode . eww-restore-desktop))
The problem is: to get /that/ evaluated, desktop.el needs to
first load eww.el, leading to a chicken and egg problem.
The current implementation suggests it to be solved as follows:
• the major mode is marked as autoloaded;
• when desktop-read encounters a major mode which is not
currently loaded, it loads the respective library (using
desktop-load-file, which in turn calls autoload-do-load);
• that library modifies desktop-buffer-mode-handlers as
appropriate (see above.)
The following “special” modes explicitly document the use of
autoloads to satisfy this desktop.el requirement:
$ grep -rF --include=\*.el -- needed\ by\ desktop.el lisp/
lisp/dired.el:;; Autoload cookie needed by desktop.el
lisp/info.el:;; Autoload cookie needed by desktop.el
lisp/mh-e/mh-folder.el:;; Autoload cookie needed by desktop.el
$
The others (doc-view-mode?) do that quietly. And I guess there
may be a few (vc-dir-mode?) that fail there.
> (e. g. store the URL and recreate the buffer via `eww' which will
> take care calling eww-mode (and loading any file that this may
> require)).
… Yet that’s by no means necessary, – it’s perfectly possible to
invoke M-x eww-mode from just any (empty) buffer, and then use
‘G’ to point EWW to the Web page of interest.
Hence, the trick mentioned in etc/NEWS isn’t necessary, either.
*** You can now use several eww buffers in parallel by renaming eww
buffers you want to keep separate.
--
FSF associate member #7257 http://boycottsystemd.org/ … 3013 B6A0 230E 334A
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only
2014-12-07 18:56 ` Ivan Shmakov
@ 2014-12-08 2:54 ` Stefan Monnier
2014-12-09 19:45 ` Ivan Shmakov
0 siblings, 1 reply; 22+ messages in thread
From: Stefan Monnier @ 2014-12-08 2:54 UTC (permalink / raw)
To: 19226
> The problem here is that desktop.el should explicitly be pointed
> to the function to do all the special handling for the mode,
> which is (conventionally) done like:
> (add-to-list 'desktop-buffer-mode-handlers
> '(eww-mode . eww-restore-desktop))
> The problem is: to get /that/ evaluated, desktop.el needs to
> first load eww.el, leading to a chicken and egg problem.
I see. Maybe the problem then is that desktop.el should be changed so
that it records `eww-restore-desktop' as the handler function for this
buffer in the desktop file. I.e. those desktop-buffer-mode-handlers
should be looked up while *saving* the desktop file rather than while
reading them.
Stefan
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only
2014-12-08 2:54 ` Stefan Monnier
@ 2014-12-09 19:45 ` Ivan Shmakov
2014-12-10 0:35 ` Stefan Monnier
0 siblings, 1 reply; 22+ messages in thread
From: Ivan Shmakov @ 2014-12-09 19:45 UTC (permalink / raw)
To: 19226
>>>>> Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> The problem here is that desktop.el should explicitly be pointed to
>> the function to do all the special handling for the mode, which is
>> (conventionally) done like:
>> (add-to-list 'desktop-buffer-mode-handlers
>> '(eww-mode . eww-restore-desktop))
>> The problem is: to get /that/ evaluated, desktop.el needs to first
>> load eww.el, leading to a chicken and egg problem.
> I see. Maybe the problem then is that desktop.el should be changed
> so that it records `eww-restore-desktop' as the handler function for
> this buffer in the desktop file. I. e. those
> desktop-buffer-mode-handlers should be looked up while *saving* the
> desktop file rather than while reading them.
Yes. Yet I fail to see how that would be an improvement?
First of all, we already can trigger .emacs.desktop
incompatibility when the format of the value stored in there
changes. Now, we also make that fail when it’s the /name/ of
the handler function that changes. (I presume that the change
in the mode name is much less likely on one side, and much more
likely to get a defalias on the other.)
Moreover, instead of (or, well, in addition to) an autoload for
the mode function, we now need an autoload for the handler.
--
FSF associate member #7257 http://boycottsystemd.org/ … 3013 B6A0 230E 334A
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only
2014-12-09 19:45 ` Ivan Shmakov
@ 2014-12-10 0:35 ` Stefan Monnier
0 siblings, 0 replies; 22+ messages in thread
From: Stefan Monnier @ 2014-12-10 0:35 UTC (permalink / raw)
To: 19226
> Yes. Yet I fail to see how that would be an improvement?
Maybe it's not worth the trouble, indeed.
> changes. Now, we also make that fail when it’s the /name/ of
> the handler function that changes. (I presume that the change
> in the mode name is much less likely on one side, and much more
> likely to get a defalias on the other.)
The issue at hand was presumably that the buffer's mode (i.e. eww-mode)
is not meant as a "normal entry point". So it's more normal to have to
keep the name of the handler stable, since that is an explicit entry point.
> Moreover, instead of (or, well, in addition to) an autoload for
> the mode function, we now need an autoload for the handler.
But this handler *is* a normal entry point.
Stefan
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only
2014-11-30 11:04 ` bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only Ivan Shmakov
2014-11-30 19:57 ` Glenn Morris
@ 2015-02-14 20:50 ` Ivan Shmakov
2015-02-16 19:12 ` Ivan Shmakov
1 sibling, 1 reply; 22+ messages in thread
From: Ivan Shmakov @ 2015-02-14 20:50 UTC (permalink / raw)
To: 19226
[-- Attachment #1: Type: text/plain, Size: 863 bytes --]
The discussion, as it seems, have lead us nowhere.
Would there be any objections against me pushing the (updated)
fix sometime within the next two days, /as well as/ a couple of
unrelated minor changes (both MIMEd)? (Somehow, I believe that
the discussion over the possible desktop.el vs. special modes
changes can safely be postponed until something specific is
suggested.)
TIA.
Fix eww.el desktop support.
* lisp/net/eww.el (eww-mode): Add autoload cookie.
(eww-restore-desktop): Use inhibit-read-only.
Fixes: debbugs:19226
Minor eww.el fixes.
* lisp/net/eww.el (eww-suggest-uris): Add autoload cookie, so that
add-hook works correctly even if the file is not yet loaded.
(eww-list-histories): Do not pad the rightmost (URIs) column.
--
FSF associate member #7257 http://boycottsystemd.org/ … 3013 B6A0 230E 334A
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/diff, Size: 702 bytes --]
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -686,6 +687,8 @@
map)
"Tool bar for `eww-mode'.")
+;; Autoload cookie needed by desktop.el.
+;;;###autoload
(define-derived-mode eww-mode special-mode "eww"
"Mode for browsing the web."
(setq-local eww-data (list :title ""))
@@ -1877,8 +1880,9 @@ defun eww-restore-desktop (file-name buffer-name misc-data)
(case eww-restore-desktop
((t auto) (eww (plist-get eww-data :url)))
((zerop (buffer-size))
- (insert (substitute-command-keys
- eww-restore-reload-prompt))))))
+ (let ((inhibit-read-only t))
+ (insert (substitute-command-keys
+ eww-restore-reload-prompt)))))))
;; .
(current-buffer)))
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: Type: text/diff, Size: 665 bytes --]
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -60,6 +60,7 @@
:group 'eww
:type 'string)
+;;;###autoload
(defcustom eww-suggest-uris
'(eww-links-at-point
url-get-url-at-point
@@ -1634,7 +1637,7 @@ defun eww-list-histories ()
(setq start (point))
(setq domain-length (max domain-length (length (plist-get history :url))))
(setq title-length (max title-length (length (plist-get history :title)))))
- (setq format (format "%%-%ds %%-%ds" title-length domain-length)
+ (setq format (format "%%-%ds %%s" title-length)
header-line-format
(concat " " (format format "Title" "URL")))
(dolist (history eww-history-trans)
^ permalink raw reply [flat|nested] 22+ messages in thread
* bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only
2015-02-14 20:50 ` Ivan Shmakov
@ 2015-02-16 19:12 ` Ivan Shmakov
0 siblings, 0 replies; 22+ messages in thread
From: Ivan Shmakov @ 2015-02-16 19:12 UTC (permalink / raw)
To: 19226-done
>>>>> Ivan Shmakov <ivan@siamics.net> writes:
[…]
> Would there be any objections against me pushing the (updated) fix
> sometime within the next two days, /as well as/ a couple of unrelated
> minor changes (both MIMEd)?
Pushed, as there were no objections; closing.
[…]
> (eww-list-histories): Do not pad the rightmost (URIs) column.
… Except for this padding change, as the same change should
probably be applied to eww-list-buffers at the same time.
[…]
commit 8b36bfafeecf5f0578c64129be1d2017483b00f7
CommitDate: 2015-02-16 19:01:50 +0000
Add autoload cookie for the eww-suggest-uris variable.
* lisp/net/eww.el (eww-suggest-uris): Add autoload cookie, so that
add-hook works correctly even if the file is not yet loaded.
commit 2ea5364ca8d1a8dc3f8ac4c9a5ba5c7f03666258
CommitDate: 2015-02-16 18:55:02 +0000
Fix eww.el desktop support.
* lisp/net/eww.el (eww-mode): Add autoload cookie.
(eww-restore-desktop): Use inhibit-read-only.
Fixes: debbugs:19226
--
FSF associate member #7257 http://boycottsystemd.org/ … 3013 B6A0 230E 334A
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2015-02-16 19:12 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-07-13 12:17 bug#18010: eww: desktop support Ivan Shmakov
2014-11-04 16:36 ` Ted Zlatanov
2014-11-10 21:24 ` Lars Magne Ingebrigtsen
2014-11-10 21:32 ` Glenn Morris
2014-11-10 21:36 ` Lars Magne Ingebrigtsen
2014-11-19 10:24 ` Ivan Shmakov
2014-11-19 17:23 ` Lars Magne Ingebrigtsen
2014-11-19 20:17 ` Ivan Shmakov
2014-11-23 15:10 ` Ivan Shmakov
2014-11-23 15:44 ` Lars Magne Ingebrigtsen
2014-11-30 11:04 ` bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only Ivan Shmakov
2014-11-30 19:57 ` Glenn Morris
2014-11-30 20:15 ` Ivan Shmakov
2014-12-01 2:22 ` Glenn Morris
2014-12-01 5:59 ` Ivan Shmakov
2014-12-01 13:52 ` Stefan Monnier
2014-12-07 18:56 ` Ivan Shmakov
2014-12-08 2:54 ` Stefan Monnier
2014-12-09 19:45 ` Ivan Shmakov
2014-12-10 0:35 ` Stefan Monnier
2015-02-14 20:50 ` Ivan Shmakov
2015-02-16 19:12 ` Ivan Shmakov
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).