#3780: Ctrl-Y causes mutt to suspend on OSX
-----------------------------+----------------------
  Reporter:  balderdash      |      Owner:  mutt-dev
      Type:  defect          |     Status:  closed
  Priority:  trivial         |  Milestone:
 Component:  user interface  |    Version:
Resolution:  invalid         |   Keywords:
-----------------------------+----------------------

Comment (by dgc):

 Balderdash, as tempting as it is to go point for point with you, I don't
 think that serves any purpose. Your paraphrasing of the argument is a
 straw man, not what we're actually telling you. So far nobody but you has
 disagreed with our stance. This is very simply an OS issue. Other
 applications (but not most, by far) choose to sidestep the OS behavior.
 Mutt does not, and we feel there are good reasons for that. I think we've
 been pretty clear that this actually is harmful, not just a trivial bug
 that we refuse to fix. I've already spent more time researching and
 arguing than it would take to patch, commit, release, and announce an
 update.

 I was curious about those applications that you hold as models though. I
 wanted to be confident that there's no reasonable way of doing what you
 asked — confident that I was not overlooking some smarter approach than
 what I knew about already. After all those vim guys are pretty smart. So I
 took a harder look at what vim does to reclaim !^Y. It turns out it's not
 really aiming for !^Y, that's just a side effect. What vim actually does
 is to disable ''all'' terminal-generated signals by the C (termios)
 equivalent of "stty -isig". Vim blocks !^C, !^Z, all of them, so that on
 keyboard read it actually receives those control characters (\003, \031,
 \032) instead of job control signals. Then vim explicitly maps !^C and !^Z
 in its keyboard bindings to interrupt and suspend, respectively, and when
 those keys are struck it sends itself an interrupt or suspend signal.

 Well, what if I've remapped INTR and SUSP in my terminal? (It doesn't
 matter why I might do that; the point is UNIX allows it and an application
 shouldn't subvert that.) What about vim? ''Vim totally subverts that.''
 Try this experiment: `stty susp ^P` to set !^P to suspend in your
 terminal. It works. Run any normal program; !^P will suspend it. That's
 how UNIX is supposed to work. You can rebind terminal signal generation.

 Now run vim. Press !^P — nothing happens. Press !^Z — it suspends. Vim's
 approach means that it doesn't follow what the user or system has
 configured. I argue that's completely broken and vim has absolutely done
 the wrong thing.

 Your argument is that nobody wants !^Y anyway, so I imagine you would also
 argue that nobody does (or, at least, should) rebind INTR and SUSP. But
 this is not mutt's decision to make. The OS provides these configurable
 capabilities for a reason. Because it provides them, there can be people
 who use them. If someone uses them, and they run mutt and find that it
 prevents what their OS allows, ''that is a mutt bug.'' As Brendan said,
 that's a layering violation.

 Emacs? Same result as vim. Broken. Pine? I don't know, I use mutt.
 Netstat? I can't imagine why netstat is doing ''anything'' with raw
 keyboard bindings anyway, so I don't really care. Less? Less does what it
 should, if it's going to disable !^Y. Less is okayish. Sudo? Sudo is not
 the same class of program. It's like ssh, it allocates a pty and owns that
 terminal. You get the new terminal's behavior, not the old one's. Not
 analogous at all to mutt. (But try "sudo cat", i.e. run sudo without
 allocating a pty. Now !^Y suspends.) So you have one case of something
 else that does what you're proposing.

 Google around for people asking why !^Y suspends their software. The
 answer is always "stty dsusp undef" or something like it. In every case I
 found, the OP is glad for an answer and happily accepts the solution.
 You're the only person I've ever heard unhappy with using what the OS
 gives you to control your operating environment, and asking for the
 application to circumvent it for you to save you one line in a shell
 config file. That is, as you say, not remotely compelling.

 Mutt should not be making these decisions. Neither should vim, emacs, or
 netstat.

 If you want a wrapper, here's one. But you don't. You don't want DSUSP at
 all, so just put the stty in your .profile and call it a day.

 {{{
 #!/bin/sh
 # Disable DSUSP processing while running mutt

 # Capture old termio params
 old=$(stty -g)

 # Disable DSUSP
 stty dsusp undef

 # Set a trap to restore termios
 trap "rc=$?; stty $old; exit $rc" 0 1 2 3 15

 # Run mutt
 mutt "$@"
 }}}

-- 
Ticket URL: <http://dev.mutt.org/trac/ticket/3780#comment:20>
Mutt <http://www.mutt.org/>
The Mutt mail user agent

Reply via email to