Code Monkey home page Code Monkey logo

mu4e-dashboard's Introduction

mu4e Dashboard

mu4e dashboard provides a new mu4e org link type that allows to execute various mu4e queries when clicked. Such links can be organised into a dashboard, by simply writing an org file as shown below:

Screenshot 1: Full page dashboard

./dashboard.png

Screenshot 2: Side dashboard

./dashboard-2.png

Installation

Evaluate the buffer and you’re good to go. It is your responsibility to write an org file with links pointing to varius queries on your mailboxes.

Configuration

Links

The link syntax is quite intuitive:

[[mu:query|format|count][description]]

query must be a valid mu4e query and count (optional) is the maximum number of results to be returned. When the link is clicked, mu4e-headers-search is called with the proper query.

[[mu:flag:unread][All unread]]
[[mu:flag:unread||10][Last 10 unread]]

format can be used to specify that query results are to be counted in order to update the description using the given format:

[[mu:flag:unread|%3d][---]]

With the example above, when the link is cliked, the --- part will be replaced by the number of unread mails.

Using mu4e-bookmarks

Queries can include references to mu4e-bookmarks. A bookmark is denoted with bm:<bookmarkName>

bookmarkName cannot contain spaces nor ]. A query can contain several bookmarks, but their expansion is not recursive.

For example, assuming the following bookmark exists:

(add-to-list 'mu4e-bookmarks
     '(:name "Unread"
           :query "flag:unread and not flag:trashed"
           :key ?f)
     t)

the dashboard query:

mu:bm:Unread and date:7d..now

will be expanded to:

mu:(flag:unread and not flag:trashed) and date:7d..now

Note that parenthesis are added around the bookmark to make sure the expansion is hygienic.

Key bindings

Keybindings can be configured using the KEYMAP keyword in your org file:

#+KEYMAP: key | elisp function

For example, if you want to bind ; to context switch, you would write:

#+KEYMAP: ; | mu4e-context-switch

Query test

In the provided dashboard.org, there’s a definition for a mu query that can be called directly inside the org file using org-babel. This can be convenient if you want to test a query before creating a link. Usage is quite simple:

#+CALL: query(flag:unread, 10)
#+RESULTS:

Just type C-c C-c on the call line and you should see query results under the RESULTS line.

Usage

To activate the dashboard, type mu4e-dashboard-mode. This will turn on mu4e-dashboard-mode minor mode and install any custom keybindings in the current buffer.

To edit the org file, you’ll need to turn off mu4e-dashboard-mode.

Related

There is a fork of this software which is designed to be used with notmuch instead of with mu4e. It replaces the standard notmuch-hello dashboard with an org-mode version. You can find it here.

mu4e-dashboard's People

Contributors

agenbite avatar airwan avatar gitmsr avatar marlinstrub avatar nickanderson avatar pmatos avatar rougier avatar sodaware avatar sp1ff avatar stsquad avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mu4e-dashboard's Issues

usage

Hello
I have modified the side-dashboard.org, but it looks like this
2021-11-21-115539_2560x1440_scrot
2021-11-21-115559_2560x1440_scrot

Thanks for your time

What does ++++++++ mean when using format?

I did a simple search and replace on the example for Richard Stallman but my counts show + instead of the count.

[[mu:from:[email protected]][Nick Anderson]] /[[mu:from:[email protected]|(%3d)][+++++]]/ ............................ [[mu:mu:from:[email protected]||100][100]] - [[mu:from:[email protected]||500][500]] - [[mu:from:[email protected]||9999][all]]

[[mu:from:[email protected]][Richard Stallman]] /[[mu:from:[email protected]|(%3d)][(  0)]]/ ............................ [[mu:mu:from:[email protected]||100][100]] - [[mu:from:[email protected]||500][500]] - [[mu:from:[email protected]||9999][all]]

image

Results in

image

It does seem to work for some addresses that have very few results for.

\_(ツ)_/ Have I made some simple mistake that I can't see?

Counts without format

I want to get as close as possible to links like "Inbox: N/M", where N is the unread and M the total. I'm thus not interested in formatting, since I want each number to occupy as much space as needed.

I've tried removing the format string (with and without a spare |), and I've also tried to use %d as a format string. However, it doesn't seem to work, either the whole file fails ("format: Wrong type argument: wholenump, -1") or the numbers are not updated. I only get the actual counts if I use a proper format string and if the link name is filled up with as many characters as indicated by the format string.

Is there a way to get counts without formatting?

I think this read-only test is backwards

In mu4e-dashboard-update, we find the following code:

        (if buffer-read-only
            (mu4e-dashboard-update-all-async)
          (error "Dashboard cannot be updated only in read-only mode"))))))

Shouldn't the two options be reversed?

A version for notmuch

Just for fun, I've replicated this package for notmuch. The result is here.

The main advantage that I see with respect to the standard notmuch-hello dashboard is that one can easily show unread/total counts for each search. It's not much, indeed.

sent back to dashboard when quitting a mailbox

This might be useful to some of you. This code replaces the main mu4e view with the dashboard, but only if the dashboard has been loaded.

This assumes that there is a function mu4e-dashboard, which is part of #44

    (defun dmg-mu4e-view (orig &rest args)
      (interactive)
       (if (find-buffer-visiting mu4e-dashboard-file)
           (mu4e-dashboard)
          (apply orig args)
         ))

    (advice-add 'mu4e--main-view :around #'dmg-mu4e-view)

mu4e-error: unrecognized link

My dashboard.org

[[mu4e:flag:unread][All unread]]

I enabled mu4e-dashboard-mode and and clicking on the "All unread" link is displaying this error:

"mu4e-error: \[mu4e\] mu4e: unrecognized link type 'flag:unread||10'"

I have mu4e client configured and working without issues.
Emacs 27.2
mu version 1.0

shelling out to "mu find" is brittle and should be replaced

I'm finding a bunch of my queries are not updating because of escaping issues when calling (shell-command-to-string) with my default shell (fish). At a minimum it would probably make sense to factor out all the queries to a single common function where we can be sure of getting the escaping right. However going forward we should investigate if @djcb could consider an public API to make queries of the "mu" daemon which already has the database loaded in memory and could probably just count the number of hits for you and respond with that.

Key binding and link displays

Context: I open my dashboard.org file manually and switch to mu4e-dashboard-mode, nothing fancy - no sidebars, dedicated buffers, or hooks attached to this mode yet. I'm using Evil as well as general.el to define some custom leader-based bindings.

My "Unread" link.

I've used the example dashboard to start with, but I wanted to limit query to a single inbox rather than showing ALL the unread messages.

The documentation and examples seem to show that a single | character separates the query from the desired format options, however, I could only ever get that to show a link that looks like ++++++++. While the + are present, the link doesn't go anywhere when clicked.
Here's an example:

  [[mu:m:/Home/inbox and flag:unread|%3d Unread][---]]

Purely by coincidence, I got the link to become clickable and actually take me to my query by adding a second |.

The below option never shows any format other than ---, but it does take me to the results of the query.

  [[mu:m:/Home/inbox and flag:unread||%3d Unread][---]]

What might I be doing wrong here?

Keybinding issues

I'm not sure where to begin with these - they just seem to never register at all. Evaluating (current-local-keymap) shows none of the options from the file's #+KEYMAP entries and examining the entries using something like describe-key or describe-key-briefly doesn't show anything at all.

This is my first encounter with local keymaps as org properties like this (using #+KEYMAP), so I'm not exactly sure how to debug from here and would appreciate any advice. I was in the midst of defining a minor-mode map for this when I decided I should probably just ask about this first.

Thanks in advance!

named queries?

Have just started using the dashboard today and it's fantastic. The only thing I don't love about it is the code duplication that is required in creating links. So for instance, I generally use bookmarks rather than mailboxes, so my standard view will look like this:

 [[mu:maildir:/inbox AND NOT (contact:[email protected] OR contact:[email protected] OR ilcontact:[email protected] OR contact:[email protected]) AND NOT flag:trashed][Inbox]] 

to make keyboard shortcuts and show counts, etc, I have to maintain 3 or 4 copies of this search. can you see a good way to write the query just once instead? perhaps an alist of queries matched to names?

thanks again

Why not a minor mode?

This is more a question than an issue, but I'm wondering why you chose the approach of updating a single buffer (mu4e-dashboard-buffer) rather than a minor mode? I, for one, would like to have multiple dashboards active at any one time (say, one summary with just a few counts & one "live" dashboard like your "side" example).

mu4e-dashboard-update-all-async erroring

Just downloaded; trying it out on a trivial dashboard & got Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p nil).
Stack trace below, but I think the problem is in:

      (lambda (link)
        (when (string= (org-element-property :type link) "mu4e")
          (let* ((path  (org-element-property :path link))
                 (query (string-trim (nth 0 (split-string path "|"))))
                 (fmt   (nth 1 (split-string path "|")))
                 (beg   (org-element-property :contents-begin link))
                 (end   (org-element-property :contents-end link))
                 (size  (- end beg))) ;; <============= here

You should make sure beg and end are non-nil, first.
Stack trace:

  -(nil nil)
  (let* ((path (org-element-property :path link)) (query (string-trim (nth 0 (split-string path "|")))) (fmt (nth 1 (split-string path "|"))) (beg (org-element-property :contents-begin link)) (end (org-element-property :contents-end link)) (size (- end beg))) (if (and fmt (> (length fmt) 0)) (let ((command (format "mu find %s 2> /dev/null | wc -l" query))) (async-shell-command-to-string command #'(lambda (output) (save-current-buffer (set-buffer buffer) (let ... ... ...)))))))
  (progn (let* ((path (org-element-property :path link)) (query (string-trim (nth 0 (split-string path "|")))) (fmt (nth 1 (split-string path "|"))) (beg (org-element-property :contents-begin link)) (end (org-element-property :contents-end link)) (size (- end beg))) (if (and fmt (> (length fmt) 0)) (let ((command (format "mu find %s 2> /dev/null | wc -l" query))) (async-shell-command-to-string command #'(lambda (output) (save-current-buffer ... ...)))))))
  (if (string= (org-element-property :type link) "mu4e") (progn (let* ((path (org-element-property :path link)) (query (string-trim (nth 0 (split-string path "|")))) (fmt (nth 1 (split-string path "|"))) (beg (org-element-property :contents-begin link)) (end (org-element-property :contents-end link)) (size (- end beg))) (if (and fmt (> (length fmt) 0)) (let ((command (format "mu find %s 2> /dev/null | wc -l" query))) (async-shell-command-to-string command #'(lambda ... ...)))))))
  (closure ((buffer . #<buffer dashboard.org>) t) (link) (if (string= (org-element-property :type link) "mu4e") (progn (let* ((path (org-element-property :path link)) (query (string-trim ...)) (fmt (nth 1 ...)) (beg (org-element-property :contents-begin link)) (end (org-element-property :contents-end link)) (size (- end beg))) (if (and fmt (> ... 0)) (let (...) (async-shell-command-to-string command ...)))))))((link (:type "mu4e" :path "m:/inria" :format plain :raw-link "mu4e:m:/inria" :application nil :search-option nil :begin 925 :end 938 :contents-begin nil :contents-end nil :post-blank 0 :parent (italic (:begin 922 :end 939 :contents-begin 923 :contents-end 938 :post-blank 0 :parent (paragraph (:begin 110 :end 1105 :contents-begin 110 :contents-end 1105 :post-blank 0 :post-affiliated 110 :parent (section ... #41)) (link (:type "mu4e" :path "flag:unread" :format bracket :raw-link "mu4e:flag:unread" :application nil :search-option nil :begin 110 :end 139 :contents-begin 130 :contents-end 136 :post-blank 1 :parent #41) #("Unread" 0 6 ...)) (italic (:begin 139 :end 175 :contents-begin 140 :contents-end 173 :post-blank 1 :parent #41) (link ... ...)) #(".... [u]  " 0 10 (:parent #41)) (link (:type "mu4e" :path "date:today..now" :format bracket :raw-link "mu4e:date:today..now" :application nil :search-option nil :begin 185 :end 217 :contents-begin 209 :contents-end 214 :post-blank 1 :parent #41) #("Today" 0 5 ...)) (italic (:begin 217 :end 257 :contents-begin 218 :contents-end 255 :post-blank 1 :parent #41) (link ... ...)) #(".......... [t]  " 0 16 (:parent #41)) (bold (:begin 273 :end 283 :contents-begin 274 :contents-end 281 :post-blank 1 :parent #41) #("Compose" 0 7 ...)) #("...... [C]\n" 0 11 (:parent #41)) (link (:type "mu4e" :path "m:/inria/inbox or m:/gmail/inbox or m:/univ/inbox" :format bracket :raw-link "mu4e:m:/inria/inbox or m:/gmail/inbox or m:/univ/i..." :application nil :search-option nil :begin 294 :end 361 :contents-begin 352 :contents-end 357 :post-blank 2 :parent #41) #("Inbox" 0 5 ...)) (italic (:begin 361 :end 435 :contents-begin 362 :contents-end 433 :post-blank 1 :parent #41) (link ... ...)) #(".... [i]  " 0 10 (:parent #41)) (link (:type "mu4e" :path "date:2d..today and not date:today..now" :format bracket :raw-link "mu4e:date:2d..today and not date:today..now" :application nil :search-option nil :begin 445 :end 504 :contents-begin 492 :contents-end 501 :post-blank 1 :parent #41) #("Yesterday" 0 9 ...)) (italic (:begin 504 :end 567 :contents-begin 505 :contents-end 565 :post-blank 1 :parent #41) (link ... ...)) #("...... [y]  " 0 12 (:parent #41)) (bold (:begin 579 :end 588 :contents-begin 580 :contents-end 586 :post-blank 1 :parent #41) #("Update" 0 6 ...)) #("....... [U]\n" 0 12 (:parent #41)) (link (:type "mu4e" :path "m:/inria/drafts or m:/gmail/drafts or m:/univ/draf..." :format bracket :raw-link "mu4e:m:/inria/drafts or m:/gmail/drafts or m:/univ..." :application nil :search-option nil :begin 600 :end 670 :contents-begin 661 :contents-end 667 :post-blank 1 :parent #41) #("Drafts" 0 6 ...)) (italic (:begin 670 :end 747 :contents-begin 671 :contents-end 745 :post-blank 1 :parent #41) (link ... ...)) #(".... [d]  " 0 10 (:parent #41)) (link (:type "mu4e" :path "date:7d..now" :format bracket :raw-link "mu4e:date:7d..now" :application nil :search-option nil :begin 757 :end 790 :contents-begin 778 :contents-end 787 :post-blank 1 :parent #41) #("Last week" 0 9 ...)) (italic (:begin 790 :end 828 :contents-begin 791 :contents-end 826 :post-blank 1 :parent #41) (link ... ...)) #("..... [w]  " 0 11 (:parent #41)) (bold (:begin 839 :end 856 :contents-begin 840 :contents-end 854 :post-blank 1 :parent #41) #("Switch context" 0 14 ...)) #("[;]\n" 0 4 (:parent #41)) (link (:type "mu4e" :path "m:/inria/sent or m:/gmail/sent or m:/univ/sent" :format bracket :raw-link "mu4e:m:/inria/sent or m:/gmail/sent or m:/univ/sen..." :application nil :search-option nil :begin 860 :end 922 :contents-begin 915 :contents-end 919 :post-blank 1 :parent #41) #("Sent" 0 4 ...)) #27 #("sent or m:/gmail/sent or m:/univ/sent|(%5d)][( 708..." 0 66 (:parent #41)) (link (:type "mu4e" :path "date:4w..now" :format bracket :raw-link "mu4e:date:4w..now" :application nil :search-option nil :begin 1005 :end 1039 :contents-begin 1026 :contents-end 1036 :post-blank 1 :parent #41) #("Last month" 0 10 ...)) (italic (:begin 1039 :end 1074 :contents-begin 1040 :contents-end 1072 :post-blank 1 :parent #41) (link ... ...)) #(".... [m]  " 0 10 (:parent #41)) (bold (:begin 1084 :end 1091 :contents-begin 1085 :contents-end 1089 :post-blank 1 :parent #41) #("Quit" 0 4 ...)) #("......... [q]\n" 0 14 (:parent #41)))) #("[[" 0 2 (:parent #27)) #1))))
  #f(compiled-function (--data) #<bytecode -0x5feeebb3b3d94c3>)((link (:type "mu4e" :path "m:/inria" :format plain :raw-link "mu4e:m:/inria" :application nil :search-option nil :begin 925 :end 938 :contents-begin nil :contents-end nil :post-blank 0 :parent (italic (:begin 922 :end 939 :contents-begin 923 :contents-end 938 :post-blank 0 :parent (paragraph (:begin 110 :end 1105 :contents-begin 110 :contents-end 1105 :post-blank 0 :post-affiliated 110 :parent (section ... #41)) (link (:type "mu4e" :path "flag:unread" :format bracket :raw-link "mu4e:flag:unread" :application nil :search-option nil :begin 110 :end 139 :contents-begin 130 :contents-end 136 :post-blank 1 :parent #41) #("Unread" 0 6 ...)) (italic (:begin 139 :end 175 :contents-begin 140 :contents-end 173 :post-blank 1 :parent #41) (link ... ...)) #(".... [u]  " 0 10 (:parent #41)) (link (:type "mu4e" :path "date:today..now" :format bracket :raw-link "mu4e:date:today..now" :application nil :search-option nil :begin 185 :end 217 :contents-begin 209 :contents-end 214 :post-blank 1 :parent #41) #("Today" 0 5 ...)) (italic (:begin 217 :end 257 :contents-begin 218 :contents-end 255 :post-blank 1 :parent #41) (link ... ...)) #(".......... [t]  " 0 16 (:parent #41)) (bold (:begin 273 :end 283 :contents-begin 274 :contents-end 281 :post-blank 1 :parent #41) #("Compose" 0 7 ...)) #("...... [C]\n" 0 11 (:parent #41)) (link (:type "mu4e" :path "m:/inria/inbox or m:/gmail/inbox or m:/univ/inbox" :format bracket :raw-link "mu4e:m:/inria/inbox or m:/gmail/inbox or m:/univ/i..." :application nil :search-option nil :begin 294 :end 361 :contents-begin 352 :contents-end 357 :post-blank 2 :parent #41) #("Inbox" 0 5 ...)) (italic (:begin 361 :end 435 :contents-begin 362 :contents-end 433 :post-blank 1 :parent #41) (link ... ...)) #(".... [i]  " 0 10 (:parent #41)) (link (:type "mu4e" :path "date:2d..today and not date:today..now" :format bracket :raw-link "mu4e:date:2d..today and not date:today..now" :application nil :search-option nil :begin 445 :end 504 :contents-begin 492 :contents-end 501 :post-blank 1 :parent #41) #("Yesterday" 0 9 ...)) (italic (:begin 504 :end 567 :contents-begin 505 :contents-end 565 :post-blank 1 :parent #41) (link ... ...)) #("...... [y]  " 0 12 (:parent #41)) (bold (:begin 579 :end 588 :contents-begin 580 :contents-end 586 :post-blank 1 :parent #41) #("Update" 0 6 ...)) #("....... [U]\n" 0 12 (:parent #41)) (link (:type "mu4e" :path "m:/inria/drafts or m:/gmail/drafts or m:/univ/draf..." :format bracket :raw-link "mu4e:m:/inria/drafts or m:/gmail/drafts or m:/univ..." :application nil :search-option nil :begin 600 :end 670 :contents-begin 661 :contents-end 667 :post-blank 1 :parent #41) #("Drafts" 0 6 ...)) (italic (:begin 670 :end 747 :contents-begin 671 :contents-end 745 :post-blank 1 :parent #41) (link ... ...)) #(".... [d]  " 0 10 (:parent #41)) (link (:type "mu4e" :path "date:7d..now" :format bracket :raw-link "mu4e:date:7d..now" :application nil :search-option nil :begin 757 :end 790 :contents-begin 778 :contents-end 787 :post-blank 1 :parent #41) #("Last week" 0 9 ...)) (italic (:begin 790 :end 828 :contents-begin 791 :contents-end 826 :post-blank 1 :parent #41) (link ... ...)) #("..... [w]  " 0 11 (:parent #41)) (bold (:begin 839 :end 856 :contents-begin 840 :contents-end 854 :post-blank 1 :parent #41) #("Switch context" 0 14 ...)) #("[;]\n" 0 4 (:parent #41)) (link (:type "mu4e" :path "m:/inria/sent or m:/gmail/sent or m:/univ/sent" :format bracket :raw-link "mu4e:m:/inria/sent or m:/gmail/sent or m:/univ/sen..." :application nil :search-option nil :begin 860 :end 922 :contents-begin 915 :contents-end 919 :post-blank 1 :parent #41) #("Sent" 0 4 ...)) #27 #("sent or m:/gmail/sent or m:/univ/sent|(%5d)][( 708..." 0 66 (:parent #41)) (link (:type "mu4e" :path "date:4w..now" :format bracket :raw-link "mu4e:date:4w..now" :application nil :search-option nil :begin 1005 :end 1039 :contents-begin 1026 :contents-end 1036 :post-blank 1 :parent #41) #("Last month" 0 10 ...)) (italic (:begin 1039 :end 1074 :contents-begin 1040 :contents-end 1072 :post-blank 1 :parent #41) (link ... ...)) #(".... [m]  " 0 10 (:parent #41)) (bold (:begin 1084 :end 1091 :contents-begin 1085 :contents-end 1089 :post-blank 1 :parent #41) #("Quit" 0 4 ...)) #("......... [q]\n" 0 14 (:parent #41)))) #("[[" 0 2 (:parent #27)) #1))))
  mapc(#f(compiled-function (--data) #<bytecode -0x5feeebb3b3d94c3>) (#("[[" 0 2 (:parent (italic (:begin 922 :end 939 :contents-begin 923 :contents-end 938 :post-blank 0 :parent (paragraph (:begin 110 :end 1105 :contents-begin 110 :contents-end 1105 :post-blank 0 :post-affiliated 110 :parent ...) (link ... ...) (italic ... ...) #(".... [u]  " 0 10 ...) (link ... ...) (italic ... ...) #(".......... [t]  " 0 16 ...) (bold ... ...) #("...... [C]\n" 0 11 ...) (link ... ...) (italic ... ...) #(".... [i]  " 0 10 ...) (link ... ...) (italic ... ...) #("...... [y]  " 0 12 ...) (bold ... ...) #("....... [U]\n" 0 12 ...) (link ... ...) (italic ... ...) #(".... [d]  " 0 10 ...) (link ... ...) (italic ... ...) #("..... [w]  " 0 11 ...) (bold ... ...) #("[;]\n" 0 4 ...) (link ... ...) #6 #("sent or m:/gmail/sent or m:/univ/sent|(%5d)][( 708..." 0 66 ...) (link ... ...) (italic ... ...) #(".... [m]  " 0 10 ...) (bold ... ...) #("......... [q]\n" 0 14 ...))) . #2))) (link (:type "mu4e" :path "m:/inria" :format plain :raw-link "mu4e:m:/inria" :application nil :search-option nil :begin 925 :end 938 :contents-begin nil :contents-end nil :post-blank 0 :parent (italic (:begin 922 :end 939 :contents-begin 923 :contents-end 938 :post-blank 0 :parent (paragraph (:begin 110 :end 1105 :contents-begin 110 :contents-end 1105 :post-blank 0 :post-affiliated 110 :parent ...) (link ... ...) (italic ... ...) #(".... [u]  " 0 10 ...) (link ... ...) (italic ... ...) #(".......... [t]  " 0 16 ...) (bold ... ...) #("...... [C]\n" 0 11 ...) (link ... ...) (italic ... ...) #(".... [i]  " 0 10 ...) (link ... ...) (italic ... ...) #("...... [y]  " 0 12 ...) (bold ... ...) #("....... [U]\n" 0 12 ...) (link ... ...) (italic ... ...) #(".... [d]  " 0 10 ...) (link ... ...) (italic ... ...) #("..... [w]  " 0 11 ...) (bold ... ...) #("[;]\n" 0 4 ...) (link ... ...) #30 #("sent or m:/gmail/sent or m:/univ/sent|(%5d)][( 708..." 0 66 ...) (link ... ...) (italic ... ...) #(".... [m]  " 0 10 ...) (bold ... ...) #("......... [q]\n" 0 14 ...))) . #2)))))
  #f(compiled-function (--data) #<bytecode -0x5feeebb3b3d94c3>)((italic (:begin 922 :end 939 :contents-begin 923 :contents-end 938 :post-blank 0 :parent (paragraph (:begin 110 :end 1105 :contents-begin 110 :contents-end 1105 :post-blank 0 :post-affiliated 110 :parent (section ... #15)) (link (:type "mu4e" :path "flag:unread" :format bracket :raw-link "mu4e:flag:unread" :application nil :search-option nil :begin 110 :end 139 :contents-begin 130 :contents-end 136 :post-blank 1 :parent #15) #("Unread" 0 6 ...)) (italic (:begin 139 :end 175 :contents-begin 140 :contents-end 173 :post-blank 1 :parent #15) (link ... ...)) #(".... [u]  " 0 10 (:parent #15)) (link (:type "mu4e" :path "date:today..now" :format bracket :raw-link "mu4e:date:today..now" :application nil :search-option nil :begin 185 :end 217 :contents-begin 209 :contents-end 214 :post-blank 1 :parent #15) #("Today" 0 5 ...)) (italic (:begin 217 :end 257 :contents-begin 218 :contents-end 255 :post-blank 1 :parent #15) (link ... ...)) #(".......... [t]  " 0 16 (:parent #15)) (bold (:begin 273 :end 283 :contents-begin 274 :contents-end 281 :post-blank 1 :parent #15) #("Compose" 0 7 ...)) #("...... [C]\n" 0 11 (:parent #15)) (link (:type "mu4e" :path "m:/inria/inbox or m:/gmail/inbox or m:..." :format bracket :raw-link "mu4e:m:/inria/inbox or m:/gmail/inbox ..." :application nil :search-option nil :begin 294 :end 361 :contents-begin 352 :contents-end 357 :post-blank 2 :parent #15) #("Inbox" 0 5 ...)) (italic (:begin 361 :end 435 :contents-begin 362 :contents-end 433 :post-blank 1 :parent #15) (link ... ...)) #(".... [i]  " 0 10 (:parent #15)) (link (:type "mu4e" :path "date:2d..today and not date:today..now" :format bracket :raw-link "mu4e:date:2d..today and not date:today..." :application nil :search-option nil :begin 445 :end 504 :contents-begin 492 :contents-end 501 :post-blank 1 :parent #15) #("Yesterday" 0 9 ...)) (italic (:begin 504 :end 567 :contents-begin 505 :contents-end 565 :post-blank 1 :parent #15) (link ... ...)) #("...... [y]  " 0 12 (:parent #15)) (bold (:begin 579 :end 588 :contents-begin 580 :contents-end 586 :post-blank 1 :parent #15) #("Update" 0 6 ...)) #("....... [U]\n" 0 12 (:parent #15)) (link (:type "mu4e" :path "m:/inria/drafts or m:/gmail/drafts or ..." :format bracket :raw-link "mu4e:m:/inria/drafts or m:/gmail/draft..." :application nil :search-option nil :begin 600 :end 670 :contents-begin 661 :contents-end 667 :post-blank 1 :parent #15) #("Drafts" 0 6 ...)) (italic (:begin 670 :end 747 :contents-begin 671 :contents-end 745 :post-blank 1 :parent #15) (link ... ...)) #(".... [d]  " 0 10 (:parent #15)) (link (:type "mu4e" :path "date:7d..now" :format bracket :raw-link "mu4e:date:7d..now" :application nil :search-option nil :begin 757 :end 790 :contents-begin 778 :contents-end 787 :post-blank 1 :parent #15) #("Last week" 0 9 ...)) (italic (:begin 790 :end 828 :contents-begin 791 :contents-end 826 :post-blank 1 :parent #15) (link ... ...)) #("..... [w]  " 0 11 (:parent #15)) (bold (:begin 839 :end 856 :contents-begin 840 :contents-end 854 :post-blank 1 :parent #15) #("Switch context" 0 14 ...)) #("[;]\n" 0 4 (:parent #15)) (link (:type "mu4e" :path "m:/inria/sent or m:/gmail/sent or m:/u..." :format bracket :raw-link "mu4e:m:/inria/sent or m:/gmail/sent or..." :application nil :search-option nil :begin 860 :end 922 :contents-begin 915 :contents-end 919 :post-blank 1 :parent #15) #("Sent" 0 4 ...)) #1 #("sent or m:/gmail/sent or m:/univ/sent|..." 0 66 (:parent #15)) (link (:type "mu4e" :path "date:4w..now" :format bracket :raw-link "mu4e:date:4w..now" :application nil :search-option nil :begin 1005 :end 1039 :contents-begin 1026 :contents-end 1036 :post-blank 1 :parent #15) #("Last month" 0 10 ...)) (italic (:begin 1039 :end 1074 :contents-begin 1040 :contents-end 1072 :post-blank 1 :parent #15) (link ... ...)) #(".... [m]  " 0 10 (:parent #15)) (bold (:begin 1084 :end 1091 :contents-begin 1085 :contents-end 1089 :post-blank 1 :parent #15) #("Quit" 0 4 ...)) #("......... [q]\n" 0 14 (:parent #15)))) #("[[" 0 2 (:parent #1)) (link (:type "mu4e" :path "m:/inria" :format plain :raw-link "mu4e:m:/inria" :application nil :search-option nil :begin 925 :end 938 :contents-begin nil :contents-end nil :post-blank 0 :parent #1))))
  mapc(#f(compiled-function (--data) #<bytecode -0x5feeebb3b3d94c3>) ((link (:type "mu4e" :path "flag:unread" :format bracket :raw-link "mu4e:flag:unread" :application nil :search-option nil :begin 110 :end 139 :contents-begin 130 :contents-end 136 :post-blank 1 :parent ...) #("Unread" 0 6 ...)) (italic (:begin 139 :end 175 :contents-begin 140 :contents-end 173 :post-blank 1 :parent ...) (link ... ...)) #(".... [u]  " 0 10 (:parent ...)) (link (:type "mu4e" :path "date:today..now" :format bracket :raw-link "mu4e:date:today..now" :application nil :search-option nil :begin 185 :end 217 :contents-begin 209 :contents-end 214 :post-blank 1 :parent ...) #("Today" 0 5 ...)) (italic (:begin 217 :end 257 :contents-begin 218 :contents-end 255 :post-blank 1 :parent ...) (link ... ...)) #(".......... [t]  " 0 16 (:parent ...)) (bold (:begin 273 :end 283 :contents-begin 274 :contents-end 281 :post-blank 1 :parent ...) #("Compose" 0 7 ...)) #("...... [C]\n" 0 11 (:parent ...)) (link (:type "mu4e" :path "m:/inria/inbox or m:/gmail..." :format bracket :raw-link "mu4e:m:/inria/inbox or m:/..." :application nil :search-option nil :begin 294 :end 361 :contents-begin 352 :contents-end 357 :post-blank 2 :parent ...) #("Inbox" 0 5 ...)) (italic (:begin 361 :end 435 :contents-begin 362 :contents-end 433 :post-blank 1 :parent ...) (link ... ...)) #(".... [i]  " 0 10 (:parent ...)) (link (:type "mu4e" :path "date:2d..today and not dat..." :format bracket :raw-link "mu4e:date:2d..today and no..." :application nil :search-option nil :begin 445 :end 504 :contents-begin 492 :contents-end 501 :post-blank 1 :parent ...) #("Yesterday" 0 9 ...)) (italic (:begin 504 :end 567 :contents-begin 505 :contents-end 565 :post-blank 1 :parent ...) (link ... ...)) #("...... [y]  " 0 12 (:parent ...)) (bold (:begin 579 :end 588 :contents-begin 580 :contents-end 586 :post-blank 1 :parent ...) #("Update" 0 6 ...)) #("....... [U]\n" 0 12 (:parent ...)) (link (:type "mu4e" :path "m:/inria/drafts or m:/gmai..." :format bracket :raw-link "mu4e:m:/inria/drafts or m:..." :application nil :search-option nil :begin 600 :end 670 :contents-begin 661 :contents-end 667 :post-blank 1 :parent ...) #("Drafts" 0 6 ...)) (italic (:begin 670 :end 747 :contents-begin 671 :contents-end 745 :post-blank 1 :parent ...) (link ... ...)) #(".... [d]  " 0 10 (:parent ...)) (link (:type "mu4e" :path "date:7d..now" :format bracket :raw-link "mu4e:date:7d..now" :application nil :search-option nil :begin 757 :end 790 :contents-begin 778 :contents-end 787 :post-blank 1 :parent ...) #("Last week" 0 9 ...)) (italic (:begin 790 :end 828 :contents-begin 791 :contents-end 826 :post-blank 1 :parent ...) (link ... ...)) #("..... [w]  " 0 11 (:parent ...)) (bold (:begin 839 :end 856 :contents-begin 840 :contents-end 854 :post-blank 1 :parent ...) #("Switch context" 0 14 ...)) #("[;]\n" 0 4 (:parent ...)) (link (:type "mu4e" :path "m:/inria/sent or m:/gmail/..." :format bracket :raw-link "mu4e:m:/inria/sent or m:/g..." :application nil :search-option nil :begin 860 :end 922 :contents-begin 915 :contents-end 919 :post-blank 1 :parent ...) #("Sent" 0 4 ...)) (italic (:begin 922 :end 939 :contents-begin 923 :contents-end 938 :post-blank 0 :parent ...) #("[[" 0 2 ...) (link ...)) ...))
  #f(compiled-function (--data) #<bytecode -0x5feeebb3b3d94c3>)((paragraph (:begin 110 :end 1105 :contents-begin 110 :contents-end 1105 :post-blank 0 :post-affiliated 110 :parent (section ... #1)) (link (:type "mu4e" :path "flag:unread" :format bracket :raw-link "mu4e:flag:unread" :application nil :search-option nil :begin 110 :end 139 :contents-begin 130 :contents-end 136 :post-blank 1 :parent #1) #("Unread" 0 6 ...)) (italic (:begin 139 :end 175 :contents-begin 140 :contents-end 173 :post-blank 1 :parent #1) (link ... ...)) #(".... [u]  " 0 10 (:parent #1)) (link (:type "mu4e" :path "date:today..now" :format bracket :raw-link "mu4e:date:today..now" :application nil :search-option nil :begin 185 :end 217 :contents-begin 209 :contents-end 214 :post-blank 1 :parent #1) #("Today" 0 5 ...)) (italic (:begin 217 :end 257 :contents-begin 218 :contents-end 255 :post-blank 1 :parent #1) (link ... ...)) #(".......... [t]  " 0 16 (:parent #1)) (bold (:begin 273 :end 283 :contents-begin 274 :contents-end 281 :post-blank 1 :parent #1) #("Compose" 0 7 ...)) #("...... [C]\n" 0 11 (:parent #1)) (link (:type "mu4e" :path "m:/inria/inbox or m:/gmail..." :format bracket :raw-link "mu4e:m:/inria/inbox or m:/..." :application nil :search-option nil :begin 294 :end 361 :contents-begin 352 :contents-end 357 :post-blank 2 :parent #1) #("Inbox" 0 5 ...)) (italic (:begin 361 :end 435 :contents-begin 362 :contents-end 433 :post-blank 1 :parent #1) (link ... ...)) #(".... [i]  " 0 10 (:parent #1)) (link (:type "mu4e" :path "date:2d..today and not dat..." :format bracket :raw-link "mu4e:date:2d..today and no..." :application nil :search-option nil :begin 445 :end 504 :contents-begin 492 :contents-end 501 :post-blank 1 :parent #1) #("Yesterday" 0 9 ...)) (italic (:begin 504 :end 567 :contents-begin 505 :contents-end 565 :post-blank 1 :parent #1) (link ... ...)) #("...... [y]  " 0 12 (:parent #1)) (bold (:begin 579 :end 588 :contents-begin 580 :contents-end 586 :post-blank 1 :parent #1) #("Update" 0 6 ...)) #("....... [U]\n" 0 12 (:parent #1)) (link (:type "mu4e" :path "m:/inria/drafts or m:/gmai..." :format bracket :raw-link "mu4e:m:/inria/drafts or m:..." :application nil :search-option nil :begin 600 :end 670 :contents-begin 661 :contents-end 667 :post-blank 1 :parent #1) #("Drafts" 0 6 ...)) (italic (:begin 670 :end 747 :contents-begin 671 :contents-end 745 :post-blank 1 :parent #1) (link ... ...)) #(".... [d]  " 0 10 (:parent #1)) (link (:type "mu4e" :path "date:7d..now" :format bracket :raw-link "mu4e:date:7d..now" :application nil :search-option nil :begin 757 :end 790 :contents-begin 778 :contents-end 787 :post-blank 1 :parent #1) #("Last week" 0 9 ...)) (italic (:begin 790 :end 828 :contents-begin 791 :contents-end 826 :post-blank 1 :parent #1) (link ... ...)) #("..... [w]  " 0 11 (:parent #1)) (bold (:begin 839 :end 856 :contents-begin 840 :contents-end 854 :post-blank 1 :parent #1) #("Switch context" 0 14 ...)) #("[;]\n" 0 4 (:parent #1)) ...))
  mapc(#f(compiled-function (--data) #<bytecode -0x5feeebb3b3d94c3>) ((paragraph (:begin 110 :end 1105 :contents-begin 110 :contents-end 1105 :post-blank 0 :post-affiliated 110 :parent (section ... . #2)) (link (:type "mu4e" :path "flag:unread" :format bracket :raw-link "mu4e:flag:unread" :application nil :search-option nil :begin 110 :end 139 :contents-begin 130 :contents-end 136 :post-blank 1 :parent #3) #("Unread" 0 6 ...)) (italic (:begin 139 :end 175 :contents-begin 140 :contents-end 173 :post-blank 1 :parent #3) (link ... ...)) #(".... [u]  " 0 10 (:parent #3)) (link (:type "mu4e" :path "date:today..now" :format bracket :raw-link "mu4e:date:today..now" :application nil :search-option nil :begin 185 :end 217 :contents-begin 209 :contents-end 214 :post-blank 1 :parent #3) #("Today" 0 5 ...)) (italic (:begin 217 :end 257 :contents-begin 218 :contents-end 255 :post-blank 1 :parent #3) (link ... ...)) #(".......... [t]  " 0 16 (:parent #3)) (bold (:begin 273 :end 283 :contents-begin 274 :contents-end 281 :post-blank 1 :parent #3) #("Compose" 0 7 ...)) #("...... [C]\n" 0 11 (:parent #3)) (link (:type "mu4e" :path "m:/inria/inbox or m:/gmail/inbox..." :format bracket :raw-link "mu4e:m:/inria/inbox or m:/gmail/..." :application nil :search-option nil :begin 294 :end 361 :contents-begin 352 :contents-end 357 :post-blank 2 :parent #3) #("Inbox" 0 5 ...)) (italic (:begin 361 :end 435 :contents-begin 362 :contents-end 433 :post-blank 1 :parent #3) (link ... ...)) #(".... [i]  " 0 10 (:parent #3)) (link (:type "mu4e" :path "date:2d..today and not date:toda..." :format bracket :raw-link "mu4e:date:2d..today and not date..." :application nil :search-option nil :begin 445 :end 504 :contents-begin 492 :contents-end 501 :post-blank 1 :parent #3) #("Yesterday" 0 9 ...)) (italic (:begin 504 :end 567 :contents-begin 505 :contents-end 565 :post-blank 1 :parent #3) (link ... ...)) #("...... [y]  " 0 12 (:parent #3)) (bold (:begin 579 :end 588 :contents-begin 580 :contents-end 586 :post-blank 1 :parent #3) #("Update" 0 6 ...)) #("....... [U]\n" 0 12 (:parent #3)) (link (:type "mu4e" :path "m:/inria/drafts or m:/gmail/draf..." :format bracket :raw-link "mu4e:m:/inria/drafts or m:/gmail..." :application nil :search-option nil :begin 600 :end 670 :contents-begin 661 :contents-end 667 :post-blank 1 :parent #3) #("Drafts" 0 6 ...)) (italic (:begin 670 :end 747 :contents-begin 671 :contents-end 745 :post-blank 1 :parent #3) (link ... ...)) #(".... [d]  " 0 10 (:parent #3)) (link (:type "mu4e" :path "date:7d..now" :format bracket :raw-link "mu4e:date:7d..now" :application nil :search-option nil :begin 757 :end 790 :contents-begin 778 :contents-end 787 :post-blank 1 :parent #3) #("Last week" 0 9 ...)) (italic (:begin 790 :end 828 :contents-begin 791 :contents-end 826 :post-blank 1 :parent #3) (link ... ...)) #("..... [w]  " 0 11 (:parent #3)) (bold (:begin 839 :end 856 :contents-begin 840 :contents-end 854 :post-blank 1 :parent #3) #("Switch context" 0 14 ...)) #("[;]\n" 0 4 (:parent #3)) (link (:type "mu4e" :path "m:/inria/sent or m:/gmail/sent o..." :format bracket :raw-link "mu4e:m:/inria/sent or m:/gmail/s..." :application nil :search-option nil :begin 860 :end 922 :contents-begin 915 :contents-end 919 :post-blank 1 :parent #3) #("Sent" 0 4 ...)) (italic (:begin 922 :end 939 :contents-begin 923 :contents-end 938 :post-blank 0 :parent #3) #("[[" 0 2 ...) (link ...)) #("sent or m:/gmail/sent or m:/univ..." 0 66 (:parent #3)) (link (:type "mu4e" :path "date:4w..now" :format bracket :raw-link "mu4e:date:4w..now" :application nil :search-option nil :begin 1005 :end 1039 :contents-begin 1026 :contents-end 1036 :post-blank 1 :parent #3) #("Last month" 0 10 ...)) (italic (:begin 1039 :end 1074 :contents-begin 1040 :contents-end 1072 :post-blank 1 :parent #3) (link ... ...)) #(".... [m]  " 0 10 (:parent #3)) ...)))
  #f(compiled-function (--data) #<bytecode -0x5feeebb3b3d94c3>)((section (:begin 110 :end 1106 :contents-begin 110 :contents-end 1105 :post-blank 1 :post-affiliated 110 :parent (headline (:raw-value "Mu for Emacs (mu4e)             ..." :begin 2 :end 1106 :pre-blank 1 :contents-begin 110 :contents-end 1105 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 2 ...) #1)) (paragraph (:begin 110 :end 1105 :contents-begin 110 :contents-end 1105 :post-blank 0 :post-affiliated 110 :parent #1) (link (:type "mu4e" :path "flag:unread" :format bracket :raw-link "mu4e:flag:unread" :application nil :search-option nil :begin 110 :end 139 :contents-begin 130 :contents-end 136 :post-blank 1 :parent #4) #("Unread" 0 6 ...)) (italic (:begin 139 :end 175 :contents-begin 140 :contents-end 173 :post-blank 1 :parent #4) (link ... ...)) #(".... [u]  " 0 10 (:parent #4)) (link (:type "mu4e" :path "date:today..now" :format bracket :raw-link "mu4e:date:today..now" :application nil :search-option nil :begin 185 :end 217 :contents-begin 209 :contents-end 214 :post-blank 1 :parent #4) #("Today" 0 5 ...)) (italic (:begin 217 :end 257 :contents-begin 218 :contents-end 255 :post-blank 1 :parent #4) (link ... ...)) #(".......... [t]  " 0 16 (:parent #4)) (bold (:begin 273 :end 283 :contents-begin 274 :contents-end 281 :post-blank 1 :parent #4) #("Compose" 0 7 ...)) #("...... [C]\n" 0 11 (:parent #4)) (link (:type "mu4e" :path "m:/inria/inbox or m:/gmail/inbox..." :format bracket :raw-link "mu4e:m:/inria/inbox or m:/gmail/..." :application nil :search-option nil :begin 294 :end 361 :contents-begin 352 :contents-end 357 :post-blank 2 :parent #4) #("Inbox" 0 5 ...)) (italic (:begin 361 :end 435 :contents-begin 362 :contents-end 433 :post-blank 1 :parent #4) (link ... ...)) #(".... [i]  " 0 10 (:parent #4)) (link (:type "mu4e" :path "date:2d..today and not date:toda..." :format bracket :raw-link "mu4e:date:2d..today and not date..." :application nil :search-option nil :begin 445 :end 504 :contents-begin 492 :contents-end 501 :post-blank 1 :parent #4) #("Yesterday" 0 9 ...)) (italic (:begin 504 :end 567 :contents-begin 505 :contents-end 565 :post-blank 1 :parent #4) (link ... ...)) #("...... [y]  " 0 12 (:parent #4)) (bold (:begin 579 :end 588 :contents-begin 580 :contents-end 586 :post-blank 1 :parent #4) #("Update" 0 6 ...)) #("....... [U]\n" 0 12 (:parent #4)) (link (:type "mu4e" :path "m:/inria/drafts or m:/gmail/draf..." :format bracket :raw-link "mu4e:m:/inria/drafts or m:/gmail..." :application nil :search-option nil :begin 600 :end 670 :contents-begin 661 :contents-end 667 :post-blank 1 :parent #4) #("Drafts" 0 6 ...)) (italic (:begin 670 :end 747 :contents-begin 671 :contents-end 745 :post-blank 1 :parent #4) (link ... ...)) #(".... [d]  " 0 10 (:parent #4)) (link (:type "mu4e" :path "date:7d..now" :format bracket :raw-link "mu4e:date:7d..now" :application nil :search-option nil :begin 757 :end 790 :contents-begin 778 :contents-end 787 :post-blank 1 :parent #4) #("Last week" 0 9 ...)) (italic (:begin 790 :end 828 :contents-begin 791 :contents-end 826 :post-blank 1 :parent #4) (link ... ...)) #("..... [w]  " 0 11 (:parent #4)) (bold (:begin 839 :end 856 :contents-begin 840 :contents-end 854 :post-blank 1 :parent #4) #("Switch context" 0 14 ...)) #("[;]\n" 0 4 (:parent #4)) (link (:type "mu4e" :path "m:/inria/sent or m:/gmail/sent o..." :format bracket :raw-link "mu4e:m:/inria/sent or m:/gmail/s..." :application nil :search-option nil :begin 860 :end 922 :contents-begin 915 :contents-end 919 :post-blank 1 :parent #4) #("Sent" 0 4 ...)) (italic (:begin 922 :end 939 :contents-begin 923 :contents-end 938 :post-blank 0 :parent #4) #("[[" 0 2 ...) (link ...)) #("sent or m:/gmail/sent or m:/univ..." 0 66 (:parent #4)) (link (:type "mu4e" :path "date:4w..now" :format bracket :raw-link "mu4e:date:4w..now" :application nil :search-option nil :begin 1005 :end 1039 :contents-begin 1026 :contents-end 1036 :post-blank 1 :parent #4) #("Last month" 0 10 ...)) (italic (:begin 1039 :end 1074 :contents-begin 1040 :contents-end 1072 :post-blank 1 :parent #4) (link ... ...)) #(".... [m]  " 0 10 (:parent #4)) ...)))
  mapc(#f(compiled-function (--data) #<bytecode -0x5feeebb3b3d94c3>) ((section (:begin 110 :end 1106 :contents-begin 110 :contents-end 1105 :post-blank 1 :post-affiliated 110 :parent (headline (:raw-value "Mu for Emacs (mu4e)                   ..." :begin 2 :end 1106 :pre-blank 1 :contents-begin 110 :contents-end 1105 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 2 :title ... :parent ...) . #2)) (paragraph (:begin 110 :end 1105 :contents-begin 110 :contents-end 1105 :post-blank 0 :post-affiliated 110 :parent #3) (link (:type "mu4e" :path "flag:unread" :format bracket :raw-link "mu4e:flag:unread" :application nil :search-option nil :begin 110 :end 139 :contents-begin 130 :contents-end 136 :post-blank 1 :parent #6) #("Unread" 0 6 ...)) (italic (:begin 139 :end 175 :contents-begin 140 :contents-end 173 :post-blank 1 :parent #6) (link ... ...)) #(".... [u]  " 0 10 (:parent #6)) (link (:type "mu4e" :path "date:today..now" :format bracket :raw-link "mu4e:date:today..now" :application nil :search-option nil :begin 185 :end 217 :contents-begin 209 :contents-end 214 :post-blank 1 :parent #6) #("Today" 0 5 ...)) (italic (:begin 217 :end 257 :contents-begin 218 :contents-end 255 :post-blank 1 :parent #6) (link ... ...)) #(".......... [t]  " 0 16 (:parent #6)) (bold (:begin 273 :end 283 :contents-begin 274 :contents-end 281 :post-blank 1 :parent #6) #("Compose" 0 7 ...)) #("...... [C]\n" 0 11 (:parent #6)) (link (:type "mu4e" :path "m:/inria/inbox or m:/gmail/inbox or m:..." :format bracket :raw-link "mu4e:m:/inria/inbox or m:/gmail/inbox ..." :application nil :search-option nil :begin 294 :end 361 :contents-begin 352 :contents-end 357 :post-blank 2 :parent #6) #("Inbox" 0 5 ...)) (italic (:begin 361 :end 435 :contents-begin 362 :contents-end 433 :post-blank 1 :parent #6) (link ... ...)) #(".... [i]  " 0 10 (:parent #6)) (link (:type "mu4e" :path "date:2d..today and not date:today..now" :format bracket :raw-link "mu4e:date:2d..today and not date:today..." :application nil :search-option nil :begin 445 :end 504 :contents-begin 492 :contents-end 501 :post-blank 1 :parent #6) #("Yesterday" 0 9 ...)) (italic (:begin 504 :end 567 :contents-begin 505 :contents-end 565 :post-blank 1 :parent #6) (link ... ...)) #("...... [y]  " 0 12 (:parent #6)) (bold (:begin 579 :end 588 :contents-begin 580 :contents-end 586 :post-blank 1 :parent #6) #("Update" 0 6 ...)) #("....... [U]\n" 0 12 (:parent #6)) (link (:type "mu4e" :path "m:/inria/drafts or m:/gmail/drafts or ..." :format bracket :raw-link "mu4e:m:/inria/drafts or m:/gmail/draft..." :application nil :search-option nil :begin 600 :end 670 :contents-begin 661 :contents-end 667 :post-blank 1 :parent #6) #("Drafts" 0 6 ...)) (italic (:begin 670 :end 747 :contents-begin 671 :contents-end 745 :post-blank 1 :parent #6) (link ... ...)) #(".... [d]  " 0 10 (:parent #6)) (link (:type "mu4e" :path "date:7d..now" :format bracket :raw-link "mu4e:date:7d..now" :application nil :search-option nil :begin 757 :end 790 :contents-begin 778 :contents-end 787 :post-blank 1 :parent #6) #("Last week" 0 9 ...)) (italic (:begin 790 :end 828 :contents-begin 791 :contents-end 826 :post-blank 1 :parent #6) (link ... ...)) #("..... [w]  " 0 11 (:parent #6)) (bold (:begin 839 :end 856 :contents-begin 840 :contents-end 854 :post-blank 1 :parent #6) #("Switch context" 0 14 ...)) #("[;]\n" 0 4 (:parent #6)) (link (:type "mu4e" :path "m:/inria/sent or m:/gmail/sent or m:/u..." :format bracket :raw-link "mu4e:m:/inria/sent or m:/gmail/sent or..." :application nil :search-option nil :begin 860 :end 922 :contents-begin 915 :contents-end 919 :post-blank 1 :parent #6) #("Sent" 0 4 ...)) (italic (:begin 922 :end 939 :contents-begin 923 :contents-end 938 :post-blank 0 :parent #6) #("[[" 0 2 ...) (link ...)) #("sent or m:/gmail/sent or m:/univ/sent|..." 0 66 (:parent #6)) (link (:type "mu4e" :path "date:4w..now" :format bracket :raw-link "mu4e:date:4w..now" :application nil :search-option nil :begin 1005 :end 1039 :contents-begin 1026 :contents-end 1036 :post-blank 1 :parent #6) #("Last month" 0 10 ...)) (italic (:begin 1039 :end 1074 :contents-begin 1040 :contents-end 1072 :post-blank 1 :parent #6) (link ... ...)) #(".... [m]  " 0 10 (:parent #6)) (bold (:begin 1084 :end 1091 :contents-begin 1085 :contents-end 1089 :post-blank 1 :parent #6) #("Quit" 0 4 ...)) #("......... [q]\n" 0 14 (:parent #6))))))
  #f(compiled-function (--data) #<bytecode -0x5feeebb3b3d94c3>)((headline (:raw-value "Mu for Emacs (mu4e)             ..." :begin 2 :end 1106 :pre-blank 1 :contents-begin 110 :contents-end 1105 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 2 ...) (section (:begin 110 :end 1106 :contents-begin 110 :contents-end 1105 :post-blank 1 :post-affiliated 110 :parent #1) (paragraph (:begin 110 :end 1105 :contents-begin 110 :contents-end 1105 :post-blank 0 :post-affiliated 110 :parent #4) (link ... ...) (italic ... ...) #(".... [u]  " 0 10 ...) (link ... ...) (italic ... ...) #(".......... [t]  " 0 16 ...) (bold ... ...) #("...... [C]\n" 0 11 ...) (link ... ...) (italic ... ...) #(".... [i]  " 0 10 ...) (link ... ...) (italic ... ...) #("...... [y]  " 0 12 ...) (bold ... ...) #("....... [U]\n" 0 12 ...) (link ... ...) (italic ... ...) #(".... [d]  " 0 10 ...) (link ... ...) (italic ... ...) #("..... [w]  " 0 11 ...) (bold ... ...) #("[;]\n" 0 4 ...) (link ... ...) (italic ... ... ...) #("sent or m:/gmail/sent or m:/univ..." 0 66 ...) (link ... ...) (italic ... ...) #(".... [m]  " 0 10 ...) ...))))
  mapc(#f(compiled-function (--data) #<bytecode -0x5feeebb3b3d94c3>) ((headline ... ...) (headline ... ...) (headline ... ... ... ... ...) (headline ... ...) (headline ... ...)))
  #f(compiled-function (--data) #<bytecode -0x5feeebb3b3d94c3>)((org-data nil (headline ... ...) (headline ... ...) (headline ... ... ... ... ...) (headline ... ...) (headline ... ...)))
  org-element-map((org-data nil (headline ... ...) (headline ... ...) (headline ... ... ... ... ...) (headline ... ...) (headline ... ...)) link (closure (... t) (link) (if ... ...)))
  (let ((buffer (current-buffer))) (org-element-map (org-element-parse-buffer) 'link #'(lambda (link) (if (string= (org-element-property :type link) "mu4e") (progn (let* (... ... ... ... ... ...) (if ... ...)))))))
  mu4e-dashboard-update-all-async()
  (save-current-buffer (set-buffer mu4e-dashboard--buffer) (message (concat "[" (propertize "mu4e dashboard" 'face 'bold) "] " (format-time-string "Update (%H:%M)"))) (mu4e-dashboard-update-all-async))
  mu4e-dashboard-update()
  mu4e-dashboard-activate()
  (if mu4e-dashboard-mode (mu4e-dashboard-deactivate) (mu4e-dashboard-activate))
  (progn (if mu4e-dashboard-mode (mu4e-dashboard-deactivate) (mu4e-dashboard-activate)))
  (if (and (eq major-mode 'org-mode) (boundp mu4e-dashboard-mode)) (progn (if mu4e-dashboard-mode (mu4e-dashboard-deactivate) (mu4e-dashboard-activate))))
  mu4e-dashboard-toggle()
  #<subr funcall-interactively>(mu4e-dashboard-toggle)
  apply(#<subr funcall-interactively> mu4e-dashboard-toggle)
  funcall-interactively(mu4e-dashboard-toggle)
  #<subr call-interactively>(mu4e-dashboard-toggle record nil)
  apply(#<subr call-interactively> (mu4e-dashboard-toggle record nil))
  (unwind-protect (apply original-func args) (let ((top-frame explain-pause--current-command-record)) (if extra-frame (cond ((and (eq (progn ... ...) target-function) (eq (progn ... ...) command-frame)) (explain-pause--command-record-and-store top-frame) (if (progn (or ... ...) (aref top-frame 7)) (progn (explain-pause--command-record--save-and-stop-profiling top-frame))) (explain-pause-log--send-command-exit top-frame) (explain-pause--run-measure-hook top-frame) (explain-pause-log--send-command-exit command-frame) (explain-pause--run-measure-hook command-frame)) ((eq top-frame command-frame) (explain-pause--command-record-and-store top-frame) (explain-pause-log--send-command-exit top-frame) (explain-pause--run-measure-hook top-frame)) (t (explain-pause-report-measuring-bug "call-interactively has extra-frame" "top-frame" top-frame "target-function" target-function))) (if (not (eq top-frame command-frame)) (explain-pause-report-measuring-bug "call interactively frame does not match" "command-frame" command-frame "should be equal" top-frame) (explain-pause--command-record-and-store command-frame) (if (progn (or (and ... t) (signal ... ...)) (aref command-frame 7)) (progn (explain-pause--command-record--save-and-stop-profiling command-frame))) (explain-pause-log--send-command-exit command-frame) (explain-pause--run-measure-hook command-frame)))) (if (eq parent explain-pause-root-command-loop) nil (progn (or (and (memq (type-of parent) cl-struct-explain-pause-command-record-tags) t) (signal 'wrong-type-argument (list 'explain-pause-command-record parent))) (let* ((v parent)) (aset v 5 (current-time))))) (setq explain-pause--current-command-record parent))
  (let ((parent explain-pause--current-command-record) (target-function (car args)) (command-frame nil) (extra-frame nil)) (if (eq parent explain-pause-root-command-loop) nil (explain-pause--command-record-and-store parent)) (if (or (eq target-function #'self-insert-command) (eq target-function #'newline) (eq target-function #'next-line) (eq target-function #'previous-line) (eq target-function #'delete-forward-char)) nil (let ((i-spec (car (cdr (interactive-form target-function))))) (if (and (stringp i-spec) (explain-pause--interactive-form-needs-frame-p i-spec)) (progn (setq command-frame (explain-pause--command-record-from-parent parent parent 'call-interactively-interactive t)) (setq extra-frame t))))) (if extra-frame nil (setq command-frame (explain-pause--command-record-from-parent parent parent target-function))) (explain-pause-log--send-command-entry parent command-frame) (setq explain-pause--current-command-record command-frame) (progn (or (and (memq (type-of command-frame) cl-struct-explain-pause-command-record-tags) t) (signal 'wrong-type-argument (list 'explain-pause-command-record command-frame))) (let* ((v command-frame)) (aset v 5 (current-time)))) (if (and (not extra-frame) (explain-pause--command-record-profile-p command-frame)) (progn (explain-pause--command-record-start-profiling command-frame))) (unwind-protect (apply original-func args) (let ((top-frame explain-pause--current-command-record)) (if extra-frame (cond ((and (eq ... target-function) (eq ... command-frame)) (explain-pause--command-record-and-store top-frame) (if (progn ... ...) (progn ...)) (explain-pause-log--send-command-exit top-frame) (explain-pause--run-measure-hook top-frame) (explain-pause-log--send-command-exit command-frame) (explain-pause--run-measure-hook command-frame)) ((eq top-frame command-frame) (explain-pause--command-record-and-store top-frame) (explain-pause-log--send-command-exit top-frame) (explain-pause--run-measure-hook top-frame)) (t (explain-pause-report-measuring-bug "call-interactively has extra-frame" "top-frame" top-frame "target-function" target-function))) (if (not (eq top-frame command-frame)) (explain-pause-report-measuring-bug "call interactively frame does not match" "command-frame" command-frame "should be equal" top-frame) (explain-pause--command-record-and-store command-frame) (if (progn (or ... ...) (aref command-frame 7)) (progn (explain-pause--command-record--save-and-stop-profiling command-frame))) (explain-pause-log--send-command-exit command-frame) (explain-pause--run-measure-hook command-frame)))) (if (eq parent explain-pause-root-command-loop) nil (progn (or (and (memq (type-of parent) cl-struct-explain-pause-command-record-tags) t) (signal 'wrong-type-argument (list 'explain-pause-command-record parent))) (let* ((v parent)) (aset v 5 (current-time))))) (setq explain-pause--current-command-record parent)))
  explain-pause--wrap-call-interactively(#<subr call-interactively> mu4e-dashboard-toggle record nil)
  apply(explain-pause--wrap-call-interactively #<subr call-interactively> (mu4e-dashboard-toggle record nil))
  call-interactively(mu4e-dashboard-toggle record nil)
  command-execute(mu4e-dashboard-toggle record)
  counsel-M-x-action("mu4e-dashboard-toggle")
  ivy-call()
  ivy-read("M-x " [browserFriendly soap-bound-operation-soap-headers =uxj1<fd*ZUfi*cRB:b4g= CTCP-CLIENTINFO locals 0 Undo eww-handle-link text-rendering artist-current-column shr-td-cache-315-nil tramp-find-user erc-readonly-mode-off-hook xsd:complexContent vc-git-make-version-backups-p shr-td-cache-366-t =C8c@c>:/Ra7z<oPbBd12= tramp-do-copy-or-rename-file-out-of-band =:Q$crg!N&|65e-W1DYJT= nsm-permanent-host-settings flycheck-error-list-mode-line-map sgml-syntax-propertize shr-td-cache-166-nil makefile-browser-format-macro-line =Pg3i>V34~qg>|YVjrSG<= extra-frame calcFunc-sec edebug-clear-frequency-count wicon bibtex-SuppCollection conf-space-mode-map post-deadline xsdre-to-symbolic debbugs-soap-invoke-async soap-element-namespace-tag--cmacro one =SWvMjXYXK*$~h>tR>Q1_= nnheader-translate-file-chars & \' tramp-rename-files gnus-summary-catchup-from-here tramp-cache-data =a|LPWL!VI-8DNPF!b572= =GekJ$XvBHWd<O9xa$*rH= align-set-vhdl-rules rng-xsd-decimal< --cl-block-elfeed-score-feed-rule--create--cmacro-- mu4e-view-image-max-height explain-pause-top--table-set-header ...] :predicate #f(compiled-function (sym) #<bytecode 0xcf9090198605e4c>) :require-match t :history counsel-M-x-history :action counsel-M-x-action :keymap (keymap (67108908 . counsel--info-lookup-symbol) (67108910 . counsel-find-symbol)) :initial-input nil :caller counsel-M-x)
  counsel-M-x()
  #<subr funcall-interactively>(counsel-M-x)
  apply(#<subr funcall-interactively> counsel-M-x)
  funcall-interactively(counsel-M-x)
  #<subr call-interactively>(counsel-M-x nil nil)
  apply(#<subr call-interactively> (counsel-M-x nil nil))
  (unwind-protect (apply original-func args) (let ((top-frame explain-pause--current-command-record)) (if extra-frame (cond ((and (eq (progn ... ...) target-function) (eq (progn ... ...) command-frame)) (explain-pause--command-record-and-store top-frame) (if (progn (or ... ...) (aref top-frame 7)) (progn (explain-pause--command-record--save-and-stop-profiling top-frame))) (explain-pause-log--send-command-exit top-frame) (explain-pause--run-measure-hook top-frame) (explain-pause-log--send-command-exit command-frame) (explain-pause--run-measure-hook command-frame)) ((eq top-frame command-frame) (explain-pause--command-record-and-store top-frame) (explain-pause-log--send-command-exit top-frame) (explain-pause--run-measure-hook top-frame)) (t (explain-pause-report-measuring-bug "call-interactively has extra-frame" "top-frame" top-frame "target-function" target-function))) (if (not (eq top-frame command-frame)) (explain-pause-report-measuring-bug "call interactively frame does not match" "command-frame" command-frame "should be equal" top-frame) (explain-pause--command-record-and-store command-frame) (if (progn (or (and ... t) (signal ... ...)) (aref command-frame 7)) (progn (explain-pause--command-record--save-and-stop-profiling command-frame))) (explain-pause-log--send-command-exit command-frame) (explain-pause--run-measure-hook command-frame)))) (if (eq parent explain-pause-root-command-loop) nil (progn (or (and (memq (type-of parent) cl-struct-explain-pause-command-record-tags) t) (signal 'wrong-type-argument (list 'explain-pause-command-record parent))) (let* ((v parent)) (aset v 5 (current-time))))) (setq explain-pause--current-command-record parent))
  (let ((parent explain-pause--current-command-record) (target-function (car args)) (command-frame nil) (extra-frame nil)) (if (eq parent explain-pause-root-command-loop) nil (explain-pause--command-record-and-store parent)) (if (or (eq target-function #'self-insert-command) (eq target-function #'newline) (eq target-function #'next-line) (eq target-function #'previous-line) (eq target-function #'delete-forward-char)) nil (let ((i-spec (car (cdr (interactive-form target-function))))) (if (and (stringp i-spec) (explain-pause--interactive-form-needs-frame-p i-spec)) (progn (setq command-frame (explain-pause--command-record-from-parent parent parent 'call-interactively-interactive t)) (setq extra-frame t))))) (if extra-frame nil (setq command-frame (explain-pause--command-record-from-parent parent parent target-function))) (explain-pause-log--send-command-entry parent command-frame) (setq explain-pause--current-command-record command-frame) (progn (or (and (memq (type-of command-frame) cl-struct-explain-pause-command-record-tags) t) (signal 'wrong-type-argument (list 'explain-pause-command-record command-frame))) (let* ((v command-frame)) (aset v 5 (current-time)))) (if (and (not extra-frame) (explain-pause--command-record-profile-p command-frame)) (progn (explain-pause--command-record-start-profiling command-frame))) (unwind-protect (apply original-func args) (let ((top-frame explain-pause--current-command-record)) (if extra-frame (cond ((and (eq ... target-function) (eq ... command-frame)) (explain-pause--command-record-and-store top-frame) (if (progn ... ...) (progn ...)) (explain-pause-log--send-command-exit top-frame) (explain-pause--run-measure-hook top-frame) (explain-pause-log--send-command-exit command-frame) (explain-pause--run-measure-hook command-frame)) ((eq top-frame command-frame) (explain-pause--command-record-and-store top-frame) (explain-pause-log--send-command-exit top-frame) (explain-pause--run-measure-hook top-frame)) (t (explain-pause-report-measuring-bug "call-interactively has extra-frame" "top-frame" top-frame "target-function" target-function))) (if (not (eq top-frame command-frame)) (explain-pause-report-measuring-bug "call interactively frame does not match" "command-frame" command-frame "should be equal" top-frame) (explain-pause--command-record-and-store command-frame) (if (progn (or ... ...) (aref command-frame 7)) (progn (explain-pause--command-record--save-and-stop-profiling command-frame))) (explain-pause-log--send-command-exit command-frame) (explain-pause--run-measure-hook command-frame)))) (if (eq parent explain-pause-root-command-loop) nil (progn (or (and (memq (type-of parent) cl-struct-explain-pause-command-record-tags) t) (signal 'wrong-type-argument (list 'explain-pause-command-record parent))) (let* ((v parent)) (aset v 5 (current-time))))) (setq explain-pause--current-command-record parent)))
  explain-pause--wrap-call-interactively(#<subr call-interactively> counsel-M-x nil nil)
  apply(explain-pause--wrap-call-interactively #<subr call-interactively> (counsel-M-x nil nil))
  call-interactively(counsel-M-x nil nil)
  command-execute(counsel-M-x)

Add sampel for for side dashboard

The side dashboard (screenshot 2) looks very promising. I would like to replicate this and then base my own config off of that one.

Could you please upload your configuration that resulted in screenshot 2?

Cheers, and thanks for making this.

Lisp Error when opning link to a query with count

I started out by modifying your dashboard.org to my needs. I added a person in the People section but when clicking on the counted links, emacs encounters an error (wrong-type-argument number-or-marker-p "100")
Here is the debug log

Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p "100")
  >("100" 0)
  (and count (> count 0))
  (cond ((and (not fmt) (not count)) (mu4e-headers-search query)) ((and count (> count 0)) (let ((mu4e-headers-results-limit (string-to-number count))) (mu4e-headers-search query))) ((and fmt (> (length fmt) 0)) (mu4e-dashboard-update-link link)))
  (let* ((link (org-element-context)) (query (string-trim (nth 0 (split-string path "|")))) (fmt (nth 1 (split-string path "|"))) (count (nth 2 (split-string path "|")))) (cond ((and (not fmt) (not count)) (mu4e-headers-search query)) ((and count (> count 0)) (let ((mu4e-headers-results-limit (string-to-number count))) (mu4e-headers-search query))) ((and fmt (> (length fmt) 0)) (mu4e-dashboard-update-link link))))
  mu4e-dashboard-follow-mu4e-link("from:someone.i.know||100")
  org-link-open((link (:type "mu4e" :path "from:someone.i.know||100" :format bracket :raw-link "mu4e:from:someone.i.know||100" :application nil :search-option nil :begin 2175 :end 2212 :contents-begin 2206 :contents-end 2209 :post-blank 1 :parent (paragraph (:begin 2058 :end 2292 :contents-begin 2058 :contents-end 2291 :post-blank 1 :post-affiliated 2058 :parent nil)))) nil)
  org-open-at-point()
  org-open-at-mouse((mouse-2 (#<window 14 on dashboard.org> 2207 (679 . 125) 2421735 nil 2207 (61 . 5) nil (8 . 10) (11 . 23))))
  funcall-interactively(org-open-at-mouse (mouse-2 (#<window 14 on dashboard.org> 2207 (679 . 125) 2421735 nil 2207 (61 . 5) nil (8 . 10) (11 . 23))))
  call-interactively(org-open-at-mouse nil nil)
  command-execute(org-open-at-mouse)

The corresponding section looks like

[[mu4e:from:someone.i.know][Someone I know]] /[[mu4e:from:someone.i.know|(%3d)][(345)]]/ .................................. [[mu4e:from:someone.i.know||100][100]] - [[mu4e:from:someone.i.know||500][500]] - [[mu4e:from:someone.i.know||9999][all]]

suggestion: make the dashboard read/write (or embeddable)

hi Nicolas,

I have been a long time user of the mu4e-dashboard. Thank you for developing it.

However, I find two major issues with it:

  1. It is read only
  2. It is not "embeddable" into other files.

Ideally, I would like to use the dashboard from my daily file. That way my daily is my main
dashboard.

I thought about it and implemented a function that:

  1. Finds a predefined header (e.g. Flagged Emails).
  2. Removes its contents
  3. Scans the flagged emails (up to a maximum number)
    • for each email, create an entry in a table: date, subject, from
    • the subject is an org link to the email using its message id

This way I can run a function to update the headline.

I have also done something similar to NEXT actions.

In general, the idea would be that an action in the dashboard replaces a given header (or creates it if does not exist)
with the corresponding content.

Note that text properties allow sections of a buffer to be read-only. So it is possible to guarantee that some sections
in the mu4e dashboard remain always read-only.

If this is of interest to anybody, I can share the code.

--dmg

guarantee opening link in other window?

I'm trying to figure out if there's a way to be sure an mu link always opens in other-window (I'm using the side-dashboard). For me, by default links always seem to open in the dashboard window (perhaps there's something wrong with my org-link config, I don't know). By changing all instances of switch-to-buffer in window-excursion to switch-to-buffer-other-window, I can fix that for most cases. However, if mu4e has not yet started and there's no *mu4e-headers* buffer, the link will again open in the dashboard. Any suggestions on how I might fix that? It seems a bit tricky to open another window without an existing buffer, and the mu4e buffers don't exist until mu4e is called for the first time. Thanks!

open the [inbox,drafts...etc] in a splitted buffer on the right

actually this is a question and not an issue
I'm using the sidebar dashboard now , but when i want to see the inbox for example, it appears in a whole buffer by itself.
How can i make the result appears in a splitted buffer on the right like the image on the README?

Error if I read mail from mu4e-dashboard without first running mu4e

If I run mu4e-dashboard without first running mu4e, the dashboard page opens fine. But if I click to run one of the searches, I get an error like:

Debugger entered--Lisp error: (void-function nil)
  nil(500)
  mu4e--server-filter(#<process  *mu4e-server*> "\376b\377(:erase t)\n\37620aa7\377(:headers ((:path \"/Users/sta...")

All works fine as long as I've run mu4e first.

Usage issue

Hello, just wondering if some one can help. I have no idea how to use this package, I have so far

(package! mu4e-dashboard :recipe (:host github :repo "rougier/mu4e-dashboard"))

`** mu4e-dashboard
#+begin_src emacs-lisp
(use-package mu4e-dashboard
:ensure nil
:load-path "/Repositories/mu4e-dashboard"
:custom (mu4e-dashboard-file "
/Repositories/mu4e-dashboard/side-dashboard.org")
:bind
(:map mu4e-main-mode-map
("C-;" . mu4e-dashboard-show))
(:map mu4e-headers-mode-map
("C-;" . mu4e-dashboard-show)
("C-c C-;" . mu4e-dasboard-toggle-window))
(:map mu4e-dashboard-mode-map
("C-;" . (lambda () (interactive) (select-window (previous-window))))))

#+end_src
`

When I run the mu4e-dashboard-mode nothing happens, what am I supposed to evaluate or do exactly?

Melpa package

Would it be possible to package mu4e-dashboard as a melpa package?

Unexpected results when following a count link

I have the following links in my dashboard Org file

[[mu:from:[email protected] and flag:unread and date:4w..now][John Doe]] 
......... [[mu:from:[email protected] and flag:unread and date:4w..now|%2d][12]]
  • Clicking to the first link correctly shows the 12 unread emails in *mu4e-headers*, that I got from John Doe.
  • When enabling mu4e-dashboard-mode, the email count in the second link updates correctly as well, you can see there is 12 in there
  • But clicking on the second link opens *mu4e-headers* with unexpected results. It seems like the date:4w..now constraint isn't applied.

Is this an error on my side please, or is this a bug?

Typos and Vagueness

Two typos at top of README:

mu4e Dahsboard

mu4e dahsboard

In the Installation, you say "evaluate the buffer and you're ready to go." What buffer? Any MELPA package?

why not major mode?

Hi, thank you for this great package!
Is there any motivation behind not creating a major mode, instead of the current minor mode?
I've had to define a derived major mode to get the keybindings to work, because the current keybindings don't work with evil-mode

Consistant keybindings between Dashboard and Mu4e

Hello,

I would like to have consistant keybindings between dashboard and mu4e (for bookmarks at least). I am not able to did that with dashboard as it, so I did some changed you can see there : Airwan@ba75b23 . Would you like to give me your opinion if possible. Thanks a lot.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.