Implement opening tutorial after account wizard
This commit is contained in:
parent
937b33c850
commit
58bc15b472
4 changed files with 170 additions and 2 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -5,3 +5,4 @@ log
|
||||||
raw.log
|
raw.log
|
||||||
*.1
|
*.1
|
||||||
*.5
|
*.5
|
||||||
|
*.7
|
||||||
|
|
6
Makefile
6
Makefile
|
@ -7,11 +7,15 @@ aerc:
|
||||||
%.5: doc/%.5.scd
|
%.5: doc/%.5.scd
|
||||||
scdoc < $< > $@
|
scdoc < $< > $@
|
||||||
|
|
||||||
|
%.7: doc/%.7.scd
|
||||||
|
scdoc < $< > $@
|
||||||
|
|
||||||
DOCS := \
|
DOCS := \
|
||||||
aerc.1 \
|
aerc.1 \
|
||||||
aerc-config.5 \
|
aerc-config.5 \
|
||||||
aerc-imap.5 \
|
aerc-imap.5 \
|
||||||
aerc-smtp.5
|
aerc-smtp.5 \
|
||||||
|
aerc-tutorial.7
|
||||||
|
|
||||||
all: aerc $(DOCS)
|
all: aerc $(DOCS)
|
||||||
|
|
||||||
|
|
143
doc/aerc-tutorial.7.scd
Normal file
143
doc/aerc-tutorial.7.scd
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
aerc-tutorial(7)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
aerc - the world's best email client
|
||||||
|
|
||||||
|
# INTRODUCTION
|
||||||
|
|
||||||
|
Welcome to aerc! This tutorial will guide you through your first steps in using
|
||||||
|
the client. This tutorial is a man page - you can read it again later with
|
||||||
|
*:help tutorial* from aerc, or *man aerc-tutorial* from your terminal.
|
||||||
|
|
||||||
|
First, let's introduce some basic keybindings. For convention, we'll use *<C-p>*
|
||||||
|
to represent Ctrl+p, which matches the convention used for writing keybindings
|
||||||
|
for aerc.
|
||||||
|
|
||||||
|
*C-n*
|
||||||
|
Cycles to the next tab
|
||||||
|
|
||||||
|
*C-p*
|
||||||
|
Cycles to the previous tab
|
||||||
|
|
||||||
|
Try using these now to switch between your message list and the tutorial. In
|
||||||
|
your message list, we use vim-style keys to get around.
|
||||||
|
|
||||||
|
*k*, *j*
|
||||||
|
Scrolls up and down between messages
|
||||||
|
|
||||||
|
*<C-u>*, *<C-d>*
|
||||||
|
Scrolls half a page up or down
|
||||||
|
|
||||||
|
*g*, *G*
|
||||||
|
Selects the first or last message, respectively
|
||||||
|
|
||||||
|
*K*, *J*
|
||||||
|
Switches between folders in the sidebar
|
||||||
|
|
||||||
|
*<Enter>*
|
||||||
|
Opens the selected message
|
||||||
|
|
||||||
|
# THE MESSAGE VIEWER
|
||||||
|
|
||||||
|
Press *<Enter>* to open a message. By default, the message viewer will display
|
||||||
|
your message using *less*(1). This should also have familiar, vim-like
|
||||||
|
keybindings for scrolling around in your message.
|
||||||
|
|
||||||
|
Multipart messages (messages with attachments, or messages with several
|
||||||
|
alternative formats) show a part selector on the bottom of the message viewer.
|
||||||
|
|
||||||
|
*<C-k>*, *<C-j>*
|
||||||
|
Cycle between parts of a multipart message
|
||||||
|
|
||||||
|
*q*
|
||||||
|
Close the message viewer
|
||||||
|
|
||||||
|
# COMPOSING MESSAGES
|
||||||
|
|
||||||
|
Return to the message list by pressing *q* to dismiss the message viewer. Once
|
||||||
|
there, let's compose a message.
|
||||||
|
|
||||||
|
*C*
|
||||||
|
Compose a new message
|
||||||
|
|
||||||
|
*rr*
|
||||||
|
Reply to a message
|
||||||
|
|
||||||
|
*rq*
|
||||||
|
Reply to a message, and pre-fill the editor with a quoted version of the
|
||||||
|
message being replied to
|
||||||
|
|
||||||
|
*Rr*
|
||||||
|
Reply-all to a message
|
||||||
|
|
||||||
|
*Rq*
|
||||||
|
Reply-all to a message, and pre-fill the editor with a quoted version of the
|
||||||
|
message being replied to
|
||||||
|
|
||||||
|
For now, let's use *C* to compose a new message. The message composer will
|
||||||
|
appear. You should see To, From, and Subject lines, as well as your *$EDITOR*.
|
||||||
|
You can use *<Tab>* or *<C-j>* and *<C-k>* to cycle between these fields (tab
|
||||||
|
won't cycle between fields once you enter the editor, but *<C-j>* and *<C-k>*
|
||||||
|
will).
|
||||||
|
|
||||||
|
Let's send an email to yourself. Note that the To and From headers only accept
|
||||||
|
RFC 5322 addresses, e.g. *John Doe <john@example.org>*, or simply
|
||||||
|
*<john@example.org>*. Go ahead and fill out an email (to yourself, perhaps?),
|
||||||
|
then close the editor.
|
||||||
|
|
||||||
|
The message review screen is shown next. You have a chance now to revise the
|
||||||
|
email before it's sent. Press *y* to send the email if it looks good.
|
||||||
|
|
||||||
|
# USING THE TERMINAL
|
||||||
|
|
||||||
|
aerc comes with an embedded terminal, which you've already used to view and edit
|
||||||
|
emails. We can also use this for other purposes, such as referencing a git
|
||||||
|
repository while reviewing a patch. From the message list, we can use the
|
||||||
|
following keybindings to open a terminal:
|
||||||
|
|
||||||
|
*<C-t>*
|
||||||
|
Opens a new terminal tab, running your shell
|
||||||
|
|
||||||
|
*$*, *!*
|
||||||
|
Prompts for a command to run, then opens a new terminal tab running that
|
||||||
|
command
|
||||||
|
|
||||||
|
*|*
|
||||||
|
Prompts for a command to run, then pipes the selected email into that
|
||||||
|
command and displays the result on a new terminal tab
|
||||||
|
|
||||||
|
Try pressing *$* and entering "top". You can also use the *:cd* command to
|
||||||
|
change aerc's working directory, and the directory in which new terminals run.
|
||||||
|
Use *:pwd* to see it again if you're not sure where you are.
|
||||||
|
|
||||||
|
# ADDITIONAL NOTES
|
||||||
|
|
||||||
|
## COMMANDS
|
||||||
|
|
||||||
|
Every keybinding is ultimately bound to an aerc command. You can also summon the
|
||||||
|
command line by pressing ':', then entering one of these commands. See *aerc*(1)
|
||||||
|
or *:help* for a full list of commands.
|
||||||
|
|
||||||
|
## MESSAGE FILTERS
|
||||||
|
|
||||||
|
When displaying messages in the message viewer, aerc will pipe them through a
|
||||||
|
_message filter_ first. This allows you to decode messages in non-plaintext
|
||||||
|
formats, add syntax highlighting, etc. aerc ships with a few default filters:
|
||||||
|
|
||||||
|
- Emails which begin with "[PATCH" will be piped into a filter for rendering
|
||||||
|
git-format-patch and hg export emails.
|
||||||
|
- text/html is rendered with w3m in a network sandbox
|
||||||
|
- text/\* is rendered with a simple filter for coloring quoted text
|
||||||
|
|
||||||
|
## CUSTOMIZING AERC
|
||||||
|
|
||||||
|
Aerc is highly customizable. Review *aerc-config*(5) (or use *:help config*) to
|
||||||
|
learn more about how to add custom keybindings, install new message filters,
|
||||||
|
change its appearance and behavior, and so on.
|
||||||
|
|
||||||
|
# AUTHORS
|
||||||
|
|
||||||
|
Maintained by Drew DeVault <sir@cmpwn.com>, who is assisted by other open
|
||||||
|
source contributors. For more information about aerc development, see
|
||||||
|
https://git.sr.ht/~sircmpwn/aerc.
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
"os/exec"
|
||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -451,6 +452,7 @@ func (wizard *AccountWizard) finish(tutorial bool) {
|
||||||
sec, _ = file.NewSection(wizard.accountName.String())
|
sec, _ = file.NewSection(wizard.accountName.String())
|
||||||
sec.NewKey("source", wizard.imapUrl.String())
|
sec.NewKey("source", wizard.imapUrl.String())
|
||||||
sec.NewKey("outgoing", wizard.smtpUrl.String())
|
sec.NewKey("outgoing", wizard.smtpUrl.String())
|
||||||
|
sec.NewKey("default", "INBOX")
|
||||||
if wizard.smtpMode == SMTP_STARTTLS {
|
if wizard.smtpMode == SMTP_STARTTLS {
|
||||||
sec.NewKey("smtp-starttls", "yes")
|
sec.NewKey("smtp-starttls", "yes")
|
||||||
}
|
}
|
||||||
|
@ -472,6 +474,7 @@ func (wizard *AccountWizard) finish(tutorial bool) {
|
||||||
|
|
||||||
account := config.AccountConfig{
|
account := config.AccountConfig{
|
||||||
Name: sec.Name(),
|
Name: sec.Name(),
|
||||||
|
Default: "INBOX",
|
||||||
From: sec.Key("from").String(),
|
From: sec.Key("from").String(),
|
||||||
Source: sec.Key("source").String(),
|
Source: sec.Key("source").String(),
|
||||||
Outgoing: sec.Key("outgoing").String(),
|
Outgoing: sec.Key("outgoing").String(),
|
||||||
|
@ -492,7 +495,24 @@ func (wizard *AccountWizard) finish(tutorial bool) {
|
||||||
wizard.aerc.NewTab(view, account.Name)
|
wizard.aerc.NewTab(view, account.Name)
|
||||||
|
|
||||||
if tutorial {
|
if tutorial {
|
||||||
// TODO: Open tutorial
|
name := "aerc-tutorial"
|
||||||
|
if _, err := os.Stat("./aerc-tutorial.7"); !os.IsNotExist(err) {
|
||||||
|
// For development
|
||||||
|
name = "./aerc-tutorial.7"
|
||||||
|
}
|
||||||
|
term, err := NewTerminal(exec.Command("man", name))
|
||||||
|
if err != nil {
|
||||||
|
wizard.errorFor(nil, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
wizard.aerc.NewTab(term, "Tutorial")
|
||||||
|
term.OnClose = func(err error) {
|
||||||
|
wizard.aerc.RemoveTab(term)
|
||||||
|
if err != nil {
|
||||||
|
wizard.aerc.PushStatus(" "+err.Error(), 10*time.Second).
|
||||||
|
Color(tcell.ColorDefault, tcell.ColorRed)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wizard.aerc.RemoveTab(wizard)
|
wizard.aerc.RemoveTab(wizard)
|
||||||
|
|
Loading…
Reference in a new issue