docs/master

changeset 58:814c33b96d89

Restructured the content in ch03.
author markus schnalke <meillo@marmaro.de>
date Fri, 01 Jun 2012 12:33:49 +0200
parents 8776101db595
children cd50590902d3
files ch03.roff
diffstat 1 files changed, 367 insertions(+), 319 deletions(-) [+]
line diff
     1.1 --- a/ch03.roff	Sun May 20 22:10:22 2012 +0200
     1.2 +++ b/ch03.roff	Fri Jun 01 12:33:49 2012 +0200
     1.3 @@ -1,10 +1,159 @@
     1.4 -.H0 "Work Report
     1.5 +.H0 "Discussion
     1.6  .P
     1.7 -foo
     1.8 +This main chapter discusses the practical work done in the mmh project.
     1.9 +It is structured along the goals to achieve. The concrete work done
    1.10 +is described in the examples of how the general goals were achieved.
    1.11 +
    1.12 +
    1.13 +
    1.14 +
    1.15 +.H1 "Stream-lining
    1.16 +
    1.17 +
    1.18 +.H2 "Removal of non-MUA Tools
    1.19  .P
    1.20 -bar
    1.21 +MH had been considered an all-in-one system for mail handling.
    1.22 +The community around nmh has a similar understanding.
    1.23 +In fundamental difference, I believe that mmh should be a MUA but
    1.24 +nothing more. I believe that all-in-one mail systems are not the way
    1.25 +to go. There are excellent specialized MTAs, like Postfix;
    1.26 +there are specialized MDAs, like Procmail; there are specialized
    1.27 +MRAs, like Fetchmail. I believe it's best to use them instead of
    1.28 +providing the same function ourselves. Doing something well requires to
    1.29 +focus on this particular aspect or a small set of aspects. The more
    1.30 +it is possible to focus, the better the result in this particular
    1.31 +area will be. The limiting resource in Free Software community development
    1.32 +usually is human power. If the low development power is even parted
    1.33 +into multiple development areas, it will hardly be possible to 
    1.34 +compete with the specialists in the various fields. This is even
    1.35 +increased, given the small community \(en developers and users \(en
    1.36 +that MH-based mail systems have. In consequence, I believe that the
    1.37 +available resources should be concentrated at the point where MH is
    1.38 +most unique. This is clearly the MUA part.
    1.39 +.P
    1.40 +Several of nmh's tools were removed from mmh because they didn't
    1.41 +match the main focus of adding to the MUA's task.
    1.42 +.P
    1.43 +.Pn conflict
    1.44 +was removed because it is a mail system maintenance tool.
    1.45 +Besides, it also checks the
    1.46 +.Fn /etc/passwd
    1.47 +and
    1.48 +.Fn /etc/group
    1.49 +files.
    1.50 +The tool might be useful, but it should not be shipped with mmh.
    1.51 +.P
    1.52 +.Pn rcvtty
    1.53 +was removed because its usecase of writing to the user's terminal
    1.54 +on receiving of mail is hardly wanted today. If users like to be
    1.55 +informed of new mail, then using the shell's
    1.56 +.Ev MAILPATH
    1.57 +variable or different (graphical) notifications are likely more
    1.58 +appealing. Writing directly to other terminals is hardly ever wanted
    1.59 +today. If though one wants to have it this way, the standard tool
    1.60 +.Pn write
    1.61 +can be used in a way similar to:
    1.62 +.DS
    1.63 +scan -file - | write `id -un`
    1.64 +.DE
    1.65 +.P
    1.66 +When the new attachment system was introduced,
    1.67 +.Pn viamail
    1.68 +was removed because then
    1.69 +.Pn forw
    1.70 +could cover the task itself.
    1.71 +The wrapper program
    1.72 +.Pn sendfiles
    1.73 +was rewritten as a shell script to use
    1.74 +.Pn forw .
    1.75 +.P
    1.76 +.Pn msgchk
    1.77 +was removed as it became hardly useful when POP support was removed.
    1.78 +It is questionable if
    1.79 +.Pn msgchk
    1.80 +provides more information than:
    1.81 +.DS
    1.82 +ls -l /var/mail/meillo
    1.83 +.DE
    1.84 +It does separate between old and new mail, but that's not very
    1.85 +useful and can be found out with
    1.86 +.Pn stat (1)
    1.87 +too. A very small shell script could care for the form of output.
    1.88 +As mmh's inc only incorporates mail from the user's local maildrop
    1.89 +and thus no long data transfers are involved,
    1.90 +there's no need to check for new mail before incorporating it.
    1.91 +.P
    1.92 +.Pn msh
    1.93 +was removed because the tool was in conflict with the original
    1.94 +philosophy of MH. It provided an interactive shell to access the
    1.95 +features of MH. One major feature of MH is being a tool chest.
    1.96 +.Pn msh
    1.97 +wouldn't be just another shell, tailored to the needs of mail
    1.98 +handling, but one large program to have the MH tools built in.
    1.99 +It's main use was for accessing Bulletin Boards, which have seized to
   1.100 +be popular. Removing
   1.101 +.Pn msh ,
   1.102 +together with the truly obsolete programs
   1.103 +.Pn vmh
   1.104 +and
   1.105 +.Pn wmh ,
   1.106 +saved more than 7\|000 lines of C code \(en a major achievement.
   1.107  
   1.108 -.H1 "Removal of Code Relicts
   1.109 +.U2 "Removal of the MTS
   1.110 +.P
   1.111 +
   1.112 +
   1.113 +.H2 "mhshow show Merge
   1.114 +.P
   1.115 +Since the very beginning, already in the first concept paper,
   1.116 +.Pn show
   1.117 +had been MH's mail display program.
   1.118 +.Pn show
   1.119 +found out which pathnames the relevant messages had and invoked
   1.120 +.Pn mhl
   1.121 +then to let it render the content.
   1.122 +With the advent of MIME, this approach wasn't sufficient anymore.
   1.123 +MIME messages can consist of multiple parts, some of which aren't
   1.124 +directly displayable, and text content can be encoded in
   1.125 +foreign charsets.
   1.126 +.Pn show 's
   1.127 +simple approach and
   1.128 +.Pn mhl 's
   1.129 +limited display facilities couldn't cope with the task any longer.
   1.130 +Instead of extending these tools, new ones were written from scratch
   1.131 +and then added to the MH tool chest. Doing so is encouraged by the
   1.132 +tool chest approach. The new tools could be added without interfering
   1.133 +with the existing ones. This is great. It allowed MH to be the
   1.134 +first MUA to implement MIME.
   1.135 +.P
   1.136 +The new MIME features were added in form of the single program
   1.137 +.Pn mhn .
   1.138 +The command
   1.139 +.DS
   1.140 +mhn \-show 42
   1.141 +.DE
   1.142 +would show the MIME message numbered 42.
   1.143 +With the 1.0 release of nmh in February 1999, Richard Coleman finished
   1.144 +the split of
   1.145 +.Pn mhn
   1.146 +into a set of specialized programs, which together covered the
   1.147 +aspects of MIME. One of these resulting tools was
   1.148 +.Pn mhshow .
   1.149 +
   1.150 +
   1.151 +.H2 "Removal of Configure Options
   1.152 +.P
   1.153 +
   1.154 +.H2 "Removal of switches
   1.155 +.P
   1.156 +
   1.157 +
   1.158 +
   1.159 +
   1.160 +.H1 "Moderizing
   1.161 +
   1.162 +
   1.163 +.H2 "Removal of Code Relicts
   1.164  .P
   1.165  The code base of mmh originates from the late Seventies,
   1.166  had been extensively
   1.167 @@ -215,263 +364,36 @@
   1.168  common today.
   1.169  
   1.170  
   1.171 -.H1 "Removal of Tools
   1.172 +.H2 "Attachments
   1.173  .P
   1.174 -MH had been considered an all-in-one system for mail handling.
   1.175 -The community around nmh has a similar understanding.
   1.176 -In fundamental difference, I believe that mmh should be a MUA but
   1.177 -nothing more. I believe that all-in-one mail systems are not the way
   1.178 -to go. There are excellent specialized MTAs, like Postfix;
   1.179 -there are specialized MDAs, like Procmail; there are specialized
   1.180 -MRAs, like Fetchmail. I believe it's best to use them instead of
   1.181 -providing the same function ourselves. Doing something well requires to
   1.182 -focus on this particular aspect or a small set of aspects. The more
   1.183 -it is possible to focus, the better the result in this particular
   1.184 -area will be. The limiting resource in Free Software community development
   1.185 -usually is human power. If the low development power is even parted
   1.186 -into multiple development areas, it will hardly be possible to 
   1.187 -compete with the specialists in the various fields. This is even
   1.188 -increased, given the small community \(en developers and users \(en
   1.189 -that MH-based mail systems have. In consequence, I believe that the
   1.190 -available resources should be concentrated at the point where MH is
   1.191 -most unique. This is clearly the MUA part.
   1.192 +MIME
   1.193 +
   1.194 +
   1.195 +.H2 "Digital Cryptography
   1.196  .P
   1.197 -Several of nmh's tools were removed from mmh because they didn't
   1.198 -match the main focus of adding to the MUA's task.
   1.199 +Signing and encryption.
   1.200 +
   1.201 +
   1.202 +.H2 "Good Defaults
   1.203  .P
   1.204 -.Pn conflict
   1.205 -was removed because it is a mail system maintenance tool.
   1.206 -Besides, it also checks the
   1.207 -.Fn /etc/passwd
   1.208 -and
   1.209 -.Fn /etc/group
   1.210 -files.
   1.211 -The tool might be useful, but it should not be shipped with mmh.
   1.212 +foo
   1.213 +
   1.214 +
   1.215 +
   1.216 +
   1.217 +.H1 "Code style
   1.218  .P
   1.219 -.Pn rcvtty
   1.220 -was removed because its usecase of writing to the user's terminal
   1.221 -on receiving of mail is hardly wanted today. If users like to be
   1.222 -informed of new mail, then using the shell's
   1.223 -.Ev MAILPATH
   1.224 -variable or different (graphical) notifications are likely more
   1.225 -appealing. Writing directly to other terminals is hardly ever wanted
   1.226 -today. If though one wants to have it this way, the standard tool
   1.227 -.Pn write
   1.228 -can be used in a way similar to:
   1.229 -.DS
   1.230 -scan -file - | write `id -un`
   1.231 -.DE
   1.232 +foo
   1.233 +
   1.234 +
   1.235 +.H2 "Standard Code
   1.236  .P
   1.237 -When the new attachment system was introduced,
   1.238 -.Pn viamail
   1.239 -was removed because then
   1.240 -.Pn forw
   1.241 -could cover the task itself.
   1.242 -The wrapper program
   1.243 -.Pn sendfiles
   1.244 -was rewritten as a shell script to use
   1.245 -.Pn forw .
   1.246 -.P
   1.247 -.Pn msgchk
   1.248 -was removed as it became hardly useful when POP support was removed.
   1.249 -It is questionable if
   1.250 -.Pn msgchk
   1.251 -provides more information than:
   1.252 -.DS
   1.253 -ls -l /var/mail/meillo
   1.254 -.DE
   1.255 -It does separate between old and new mail, but that's not very
   1.256 -useful and can be found out with
   1.257 -.Pn stat (1)
   1.258 -too. A very small shell script could care for the form of output.
   1.259 -As mmh's inc only incorporates mail from the user's local maildrop
   1.260 -and thus no long data transfers are involved,
   1.261 -there's no need to check for new mail before incorporating it.
   1.262 -.P
   1.263 -.Pn msh
   1.264 -was removed because the tool was in conflict with the original
   1.265 -philosophy of MH. It provided an interactive shell to access the
   1.266 -features of MH. One major feature of MH is being a tool chest.
   1.267 -.Pn msh
   1.268 -wouldn't be just another shell, tailored to the needs of mail
   1.269 -handling, but one large program to have the MH tools built in.
   1.270 -It's main use was for accessing Bulletin Boards, which have seized to
   1.271 -be popular. Removing
   1.272 -.Pn msh ,
   1.273 -together with the truly obsolete programs
   1.274 -.Pn vmh
   1.275 -and
   1.276 -.Pn wmh ,
   1.277 -saved more than 7\|000 lines of C code \(en a major achievement.
   1.278 +POSIX
   1.279  
   1.280  
   1.281 -.H1 "Draft and Trash Folders
   1.282 -.U2 "Draft Folder
   1.283 -.P
   1.284 -Historically, MH provided exactly one draft message, named
   1.285 -.Fn draft
   1.286 -and
   1.287 -being located in the MH directory. When starting to compose another message
   1.288 -before the former one was sent, the user had been questioned whether to use,
   1.289 -refile or replace the old draft. Working on multiple drafts at the same time
   1.290 -was impossible. One could only work on them in alteration by refiling the
   1.291 -previous one to some directory and fetching some other one for reediting. 
   1.292 -This manual draft management needed to be done each time the user wanted
   1.293 -to switch between editing one draft to editing another.
   1.294 -.P
   1.295 -To allow true parallel editing of drafts, in a straight forward way, the
   1.296 -draft folder facility exists. It had been introduced already in July 1984
   1.297 -by Marshall T. Rose. The facility was deactivated by default.
   1.298 -Even in nmh, the draft folder facility remained deactivated by default.
   1.299 -At least, Richard Coleman added the man page
   1.300 -.Mp mh-draft(5)
   1.301 -to document
   1.302 -the feature well.
   1.303 -.P
   1.304 -The only advantage of not using the draft folder facility is the static
   1.305 -name of the draft file. This could be an issue for MH frontends like mh-e.
   1.306 -But as they likely want to provide working on multiple drafts in parallel,
   1.307 -the issue is only concerning compatibility. The aim of nmh to stay compatible
   1.308 -prevented the default activation of the draft folder facility.
   1.309 -.P
   1.310 -On the other hand, a draft folder is the much more natural concept than
   1.311 -a draft message. MH's mail storage consists of folders and messages,
   1.312 -the messages named with ascending numbers. A draft message breaks with this
   1.313 -concept by introducing a message in a file named
   1.314 -.Fn draft .
   1.315 -This draft
   1.316 -message is special. It can not be simply listed with the available tools,
   1.317 -but instead requires special switches. I.e. corner-cases were
   1.318 -introduced. A draft folder, in contrast, does not introduce such
   1.319 -corner-cases. The available tools can operate on the messages within that
   1.320 -folder like on any messages within any mail folders. The only difference
   1.321 -is the fact that the default folder for
   1.322 -.Pn send
   1.323 -is the draft folder,
   1.324 -instead of the current folder, like for all other tools.
   1.325 -.P
   1.326 -The trivial part of the change was activating the draft folder facility
   1.327 -by default and setting a default name for this folder. Obviously, I chose
   1.328 -the name
   1.329 -.Fn +drafts .
   1.330 -This made the
   1.331 -.Sw \-draftfolder
   1.332 -and
   1.333 -.Sw \-draftmessage
   1.334 -switches useless, and I could remove them.
   1.335 -The more difficult but also the part that showed the real improvement,
   1.336 -was updating the tools to the new concept.
   1.337 -.Sw \-draft
   1.338 -switches could
   1.339 -be dropped, as operating on a draft message became indistinguishable to
   1.340 -operating on any other message for the tools.
   1.341 -.Pn comp
   1.342 -still has its
   1.343 -.Sw \-use
   1.344 -switch for switching between its two modes: (1) Compose a new
   1.345 -draft, possibly by taking some existing message as a form. (2) Modify
   1.346 -an existing draft. In either case, the behavior of
   1.347 -.Pn comp is
   1.348 -deterministic. There is no more need to query the user. I consider this
   1.349 -a major improvement. By making
   1.350 -.Pn send
   1.351 -simply operate on the current
   1.352 -message in the draft folder by default, with message and folder both
   1.353 -overridable by specifying them on the command line, it is now possible
   1.354 -to send a draft anywhere within the storage by simply specifying its folder
   1.355 -and name.
   1.356 -.P
   1.357 -All theses changes converted special cases to regular cases, thus
   1.358 -simplifying the tools and increasing the flexibility.
   1.359 +.H2 "Separation
   1.360  
   1.361 -.U2 "Trash Folder
   1.362 -.P
   1.363 -Similar to the situation for drafts is the situation for removed messages.
   1.364 -Historically, a message was deleted by renaming. A specific
   1.365 -\fIbackup prefix\fP, often comma (\c
   1.366 -.Fn , )
   1.367 -or hash (\c
   1.368 -.Fn # ),
   1.369 -being prepended to the file name. Thus, MH wouldn't recognize the file
   1.370 -as a message anymore, as only files whose name consists of digits only
   1.371 -are treated as messages. The removed messages remained as files in the
   1.372 -same directory and needed some maintenance job to truly delete them after
   1.373 -some grace time. Usually, by running a command similar to
   1.374 -.DS
   1.375 -find /home/user/Mail \-ctime +7 \-name ',*' | xargs rm
   1.376 -.DE
   1.377 -in a cron job. Within the grace time interval
   1.378 -the original message could be restored by stripping the
   1.379 -the backup prefix from the file name. If however, the last message of
   1.380 -a folder is been removed \(en say message
   1.381 -.Fn 6
   1.382 -becomes file
   1.383 -.Fn ,6
   1.384 -\(en and a new message enters the same folder, thus the same
   1.385 -numbered being given again \(en in our case
   1.386 -.Fn 6
   1.387 -\(en, if that one
   1.388 -is removed too, then the backup of the former message gets overwritten.
   1.389 -Thus, the ability to restore removed messages does not only depend on
   1.390 -the ``sweeping cron job'' but also on the removing of further messages.
   1.391 -This is undesirable, because the real mechanism is hidden from the user
   1.392 -and the consequences of further removals are not always obvious.
   1.393 -Further more, the backup files are scattered within the whole mail
   1.394 -storage, instead of being collected at one place.
   1.395 -.P
   1.396 -To improve the situation, the profile entry
   1.397 -.Pe rmmproc
   1.398 -(previously named
   1.399 -.Pe Delete-Prog )
   1.400 -was introduced, very early.
   1.401 -It could be set to any command, which would care for the mail removal
   1.402 -instead of taking the default action, described above.
   1.403 -Refiling the to-be-removed files to some garbage folder was a common
   1.404 -example. Nmh's man page
   1.405 -.Mp rmm(1)
   1.406 -proposes
   1.407 -.Cl "refile +d
   1.408 -to move messages to the garbage folder and
   1.409 -.Cl "rm `mhpath +d all`
   1.410 -the empty the garbage folder.
   1.411 -Managing the message removal this way is a sane approach. It keeps
   1.412 -the removed messages in one place, makes it easy to remove the backup
   1.413 -files, and, most important, enables the user to use the tools of MH
   1.414 -itself to operate on the removed messages. One can
   1.415 -.Pn scan
   1.416 -them,
   1.417 -.Pn show
   1.418 -them, and restore them with
   1.419 -.Pn refile .
   1.420 -There's no more
   1.421 -need to use
   1.422 -.Pn mhpath
   1.423 -to switch over from MH tools to Unix tools \(en MH can do it all itself.
   1.424 -.P
   1.425 -This approach matches perfect with the concepts of MH, thus making
   1.426 -it powerful. Hence, I made it the default. And even more, I also
   1.427 -removed the old backup prefix approach, as it is clearly less powerful.
   1.428 -Keeping unused alternative in the code is a bad choice as they likely
   1.429 -gather bugs, by not being constantly tested. Also, the increased code
   1.430 -size and more conditions crease the maintenance costs. By strictly
   1.431 -converting to the trash folder approach, I simplified the code base.
   1.432 -.Pn rmm
   1.433 -calls
   1.434 -.Pn refile
   1.435 -internally to move the to-be-removed
   1.436 -message to the trash folder (\c
   1.437 -.Fn +trash
   1.438 -by default). Messages
   1.439 -there can be operated on like on any other message in the storage.
   1.440 -The sweep clean, one can use
   1.441 -.Cl "rmm \-unlink +trash a" ,
   1.442 -where the
   1.443 -.Sw \-unlink
   1.444 -switch causes the files to be truly unliked instead
   1.445 -of moved to the trash folder.
   1.446 -
   1.447 -
   1.448 -.H1 "MH Directory Split
   1.449 +.U2 "MH Directory Split
   1.450  .P
   1.451  In MH and nmh, a personal setup had consisted of two parts:
   1.452  The MH profile, named
   1.453 @@ -563,77 +485,203 @@
   1.454  split between mail storage and personal configuration files.
   1.455  
   1.456  
   1.457 -.H1 "Path Notations
   1.458 +.H2 "Modularization
   1.459  .P
   1.460 -foo
   1.461 -
   1.462 -.H1 "Attachments
   1.463 +whatnowproc
   1.464  .P
   1.465 -foo
   1.466 -
   1.467 -.H1 "mhshow to show Transition
   1.468 -.P
   1.469 -Since the very beginning, already in the first concept paper,
   1.470 -.Pn show
   1.471 -had been MH's mail display program.
   1.472 -.Pn show
   1.473 -found out which pathnames the relevant messages had and invoked
   1.474 -.Pn mhl
   1.475 -then to let it render the content.
   1.476 -With the advent of MIME, this approach wasn't sufficient anymore.
   1.477 -MIME messages can consist of multiple parts, some of which aren't
   1.478 -directly displayable, and text content can be encoded in
   1.479 -foreign charsets.
   1.480 -.Pn show 's
   1.481 -simple approach and
   1.482 -.Pn mhl 's
   1.483 -limited display facilities couldn't cope with the task any longer.
   1.484 -Instead of extending these tools, new ones were written from scratch
   1.485 -and then added to the MH tool chest. Doing so is encouraged by the
   1.486 -tool chest approach. The new tools could be added without interfering
   1.487 -with the existing ones. This is great. It allowed MH to be the
   1.488 -first MUA to implement MIME.
   1.489 -.P
   1.490 -The new MIME features were added in form of the single program
   1.491 -.Pn mhn .
   1.492 -The command
   1.493 -.DS
   1.494 -mhn \-show 42
   1.495 -.DE
   1.496 -would show the MIME message numbered 42.
   1.497 -With the 1.0 release of nmh in February 1999, Richard Coleman finished
   1.498 -the split of
   1.499 -.Pn mhn
   1.500 -into a set of specialized programs, which together covered the
   1.501 -aspects of MIME. One of these resulting tools was
   1.502 -.Pn mhshow .
   1.503 -
   1.504 -
   1.505 -.H1 "Blind Carbon Copies
   1.506 -.P
   1.507 -foo
   1.508 -
   1.509 -.H1 "Good Defaults
   1.510 -.P
   1.511 -foo
   1.512 -
   1.513 -.H1 "Modularization
   1.514 -.P
   1.515 -foo
   1.516 -
   1.517 -.H1 "Code style
   1.518 -.P
   1.519 -foo
   1.520 -
   1.521 -
   1.522 -
   1.523 -(e.g. the
   1.524 -user-visible access to whole messages and MIME parts are inherently
   1.525 -different).
   1.526 -
   1.527  The \fIMH library\fP
   1.528  .Fn libmh.a
   1.529  collects a bunch of standard functions that many of the MH tools need,
   1.530  like reading the profile or context files.
   1.531  This doesn't hurt the separation.
   1.532  
   1.533 +
   1.534 +.H2 "Style
   1.535 +.P
   1.536 +Code layout, goto, ...
   1.537 +
   1.538 +
   1.539 +
   1.540 +
   1.541 +.H1 "Concept Exploitation/Homogeniety
   1.542 +
   1.543 +
   1.544 +.H2 "Draft Folder
   1.545 +.P
   1.546 +Historically, MH provided exactly one draft message, named
   1.547 +.Fn draft
   1.548 +and
   1.549 +being located in the MH directory. When starting to compose another message
   1.550 +before the former one was sent, the user had been questioned whether to use,
   1.551 +refile or replace the old draft. Working on multiple drafts at the same time
   1.552 +was impossible. One could only work on them in alteration by refiling the
   1.553 +previous one to some directory and fetching some other one for reediting. 
   1.554 +This manual draft management needed to be done each time the user wanted
   1.555 +to switch between editing one draft to editing another.
   1.556 +.P
   1.557 +To allow true parallel editing of drafts, in a straight forward way, the
   1.558 +draft folder facility exists. It had been introduced already in July 1984
   1.559 +by Marshall T. Rose. The facility was deactivated by default.
   1.560 +Even in nmh, the draft folder facility remained deactivated by default.
   1.561 +At least, Richard Coleman added the man page
   1.562 +.Mp mh-draft(5)
   1.563 +to document
   1.564 +the feature well.
   1.565 +.P
   1.566 +The only advantage of not using the draft folder facility is the static
   1.567 +name of the draft file. This could be an issue for MH frontends like mh-e.
   1.568 +But as they likely want to provide working on multiple drafts in parallel,
   1.569 +the issue is only concerning compatibility. The aim of nmh to stay compatible
   1.570 +prevented the default activation of the draft folder facility.
   1.571 +.P
   1.572 +On the other hand, a draft folder is the much more natural concept than
   1.573 +a draft message. MH's mail storage consists of folders and messages,
   1.574 +the messages named with ascending numbers. A draft message breaks with this
   1.575 +concept by introducing a message in a file named
   1.576 +.Fn draft .
   1.577 +This draft
   1.578 +message is special. It can not be simply listed with the available tools,
   1.579 +but instead requires special switches. I.e. corner-cases were
   1.580 +introduced. A draft folder, in contrast, does not introduce such
   1.581 +corner-cases. The available tools can operate on the messages within that
   1.582 +folder like on any messages within any mail folders. The only difference
   1.583 +is the fact that the default folder for
   1.584 +.Pn send
   1.585 +is the draft folder,
   1.586 +instead of the current folder, like for all other tools.
   1.587 +.P
   1.588 +The trivial part of the change was activating the draft folder facility
   1.589 +by default and setting a default name for this folder. Obviously, I chose
   1.590 +the name
   1.591 +.Fn +drafts .
   1.592 +This made the
   1.593 +.Sw \-draftfolder
   1.594 +and
   1.595 +.Sw \-draftmessage
   1.596 +switches useless, and I could remove them.
   1.597 +The more difficult but also the part that showed the real improvement,
   1.598 +was updating the tools to the new concept.
   1.599 +.Sw \-draft
   1.600 +switches could
   1.601 +be dropped, as operating on a draft message became indistinguishable to
   1.602 +operating on any other message for the tools.
   1.603 +.Pn comp
   1.604 +still has its
   1.605 +.Sw \-use
   1.606 +switch for switching between its two modes: (1) Compose a new
   1.607 +draft, possibly by taking some existing message as a form. (2) Modify
   1.608 +an existing draft. In either case, the behavior of
   1.609 +.Pn comp is
   1.610 +deterministic. There is no more need to query the user. I consider this
   1.611 +a major improvement. By making
   1.612 +.Pn send
   1.613 +simply operate on the current
   1.614 +message in the draft folder by default, with message and folder both
   1.615 +overridable by specifying them on the command line, it is now possible
   1.616 +to send a draft anywhere within the storage by simply specifying its folder
   1.617 +and name.
   1.618 +.P
   1.619 +All theses changes converted special cases to regular cases, thus
   1.620 +simplifying the tools and increasing the flexibility.
   1.621 +
   1.622 +
   1.623 +.H2 "Trash Folder
   1.624 +.P
   1.625 +Similar to the situation for drafts is the situation for removed messages.
   1.626 +Historically, a message was deleted by renaming. A specific
   1.627 +\fIbackup prefix\fP, often comma (\c
   1.628 +.Fn , )
   1.629 +or hash (\c
   1.630 +.Fn # ),
   1.631 +being prepended to the file name. Thus, MH wouldn't recognize the file
   1.632 +as a message anymore, as only files whose name consists of digits only
   1.633 +are treated as messages. The removed messages remained as files in the
   1.634 +same directory and needed some maintenance job to truly delete them after
   1.635 +some grace time. Usually, by running a command similar to
   1.636 +.DS
   1.637 +find /home/user/Mail \-ctime +7 \-name ',*' | xargs rm
   1.638 +.DE
   1.639 +in a cron job. Within the grace time interval
   1.640 +the original message could be restored by stripping the
   1.641 +the backup prefix from the file name. If however, the last message of
   1.642 +a folder is been removed \(en say message
   1.643 +.Fn 6
   1.644 +becomes file
   1.645 +.Fn ,6
   1.646 +\(en and a new message enters the same folder, thus the same
   1.647 +numbered being given again \(en in our case
   1.648 +.Fn 6
   1.649 +\(en, if that one
   1.650 +is removed too, then the backup of the former message gets overwritten.
   1.651 +Thus, the ability to restore removed messages does not only depend on
   1.652 +the ``sweeping cron job'' but also on the removing of further messages.
   1.653 +This is undesirable, because the real mechanism is hidden from the user
   1.654 +and the consequences of further removals are not always obvious.
   1.655 +Further more, the backup files are scattered within the whole mail
   1.656 +storage, instead of being collected at one place.
   1.657 +.P
   1.658 +To improve the situation, the profile entry
   1.659 +.Pe rmmproc
   1.660 +(previously named
   1.661 +.Pe Delete-Prog )
   1.662 +was introduced, very early.
   1.663 +It could be set to any command, which would care for the mail removal
   1.664 +instead of taking the default action, described above.
   1.665 +Refiling the to-be-removed files to some garbage folder was a common
   1.666 +example. Nmh's man page
   1.667 +.Mp rmm(1)
   1.668 +proposes
   1.669 +.Cl "refile +d
   1.670 +to move messages to the garbage folder and
   1.671 +.Cl "rm `mhpath +d all`
   1.672 +the empty the garbage folder.
   1.673 +Managing the message removal this way is a sane approach. It keeps
   1.674 +the removed messages in one place, makes it easy to remove the backup
   1.675 +files, and, most important, enables the user to use the tools of MH
   1.676 +itself to operate on the removed messages. One can
   1.677 +.Pn scan
   1.678 +them,
   1.679 +.Pn show
   1.680 +them, and restore them with
   1.681 +.Pn refile .
   1.682 +There's no more
   1.683 +need to use
   1.684 +.Pn mhpath
   1.685 +to switch over from MH tools to Unix tools \(en MH can do it all itself.
   1.686 +.P
   1.687 +This approach matches perfect with the concepts of MH, thus making
   1.688 +it powerful. Hence, I made it the default. And even more, I also
   1.689 +removed the old backup prefix approach, as it is clearly less powerful.
   1.690 +Keeping unused alternative in the code is a bad choice as they likely
   1.691 +gather bugs, by not being constantly tested. Also, the increased code
   1.692 +size and more conditions crease the maintenance costs. By strictly
   1.693 +converting to the trash folder approach, I simplified the code base.
   1.694 +.Pn rmm
   1.695 +calls
   1.696 +.Pn refile
   1.697 +internally to move the to-be-removed
   1.698 +message to the trash folder (\c
   1.699 +.Fn +trash
   1.700 +by default). Messages
   1.701 +there can be operated on like on any other message in the storage.
   1.702 +The sweep clean, one can use
   1.703 +.Cl "rmm \-unlink +trash a" ,
   1.704 +where the
   1.705 +.Sw \-unlink
   1.706 +switch causes the files to be truly unliked instead
   1.707 +of moved to the trash folder.
   1.708 +
   1.709 +
   1.710 +.H2 "Path Notations
   1.711 +.P
   1.712 +foo
   1.713 +
   1.714 +
   1.715 +.H2 "MIME Integration
   1.716 +.P
   1.717 +user-visible access to whole messages and MIME parts are inherently
   1.718 +different
   1.719 +
   1.720 +
   1.721 +.H2 "Of One Cast
   1.722 +.P