Hi, on most systems vim forks when gui mode is entered. On OS X this is not implemented. As a workaround, gvim is usually launched in the background ('gvim &') from a separated script, so it can survive if its spawning shell is closed. This has the undesirable side effect that you can't pipe stdin to the shell script (at least I couldn't get it to work):
$ cat test.sh #!/bin/bash /Applications/_Nico/Vim.app/Contents/MacOS/Vim -g $* & $ ls | ./test.sh After that, vim claims that it's reading from stdin, but nothing shows up in vim. If I remove the '&' in the script, piping works fine, but even after `^Z; bg` vim dies if I close the spawning shell. Furthermore, in whatever way you tweak the script it's not possible to make vim's '-f' ("don't fork") flag work, which you need for example if you set gvim as the EDITOR for version control programs. To summarize: 1. If started with '-g', vim should become independent of its spawning shell and still support reading from stdin 2. If started with '-f' and '-g', vim should _not_ do fork (but still support reading from stdin) Oh, and if started without '-g' and the doing `:gui`, things should still kind of work. As far as I see it, the only way to do all this is to add forking support to vim's code. This is a bit difficult, as OS X doesn't really support fork() in the way other unices do (see CAVEATS here: http://developer.apple.com/documentation/Darwin/Reference/ManPages/man2/fork.2.html "All APIs, including global data symbols, in any framework or library should be assumed to be unsafe after a fork() unless explicitly documented to be safe or async-signal safe. If you need to use these frameworks in the child process, you must exec. In this situation it is reasonable to exec yourself." ), so I didn't add complete support. Here's what the attached patch does: If vim is started via '-g', it forks and exec()s a new (!) vim instance in the child process. But if the gui is started via `:gui`, no forking is done. I did some basic testing and it seems to work, but I'm not very proficient in this kind of code, so I'm thankful for comments. This should work for all vim guis on OS X, but I tested it only with MacVim. If there's a simpler way to achieve the same thing, I'd be happy to hear about it ;-) Bye, Nico ps: Bjorn: If I do `ls | .../Vim -` followed by `:gui` in vim, and finally cmd-q, I get a single 2007-11-23 16:33:14.603 MacVim[25537:10b] *** -[NSMachPort handlePortMessage:]: dropping incoming DO message because the connection or ports are invalid message. I get this message only if I start in text mode, let it read from stdin, and then switch over to gui mode (and close the window). Any ideas why this is? pps: This deprecates the '&' at the end of most of the gvim and mvim scripts on OS X out there. --~--~---------~--~----~------------~-------~--~----~ You received this message from the "vim_dev" maillist. For more information, visit http://www.vim.org/maillist.php -~----------~----~----~----~------~----~------~--~---
mac_fork.patch
Description: Binary data