unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
From: "B. T. Raven" <nihil@nihilo.net>
To: help-gnu-emacs@gnu.org
Subject: Re: emacs as a service
Date: Sun, 08 Mar 2009 14:39:17 -0600	[thread overview]
Message-ID: <DuKdnWVMIs51sSnUnZ2dnUVZ_rvinZ2d@posted.cpinternet> (raw)
In-Reply-To: <25226f9f-0d90-4350-99b6-eb1becce3cb2@l37g2000vba.googlegroups.com>

rustom wrote:
> This is about tweaking emacs to run (somewhat like) a service.
> Environment is emacs22 on win-XP.
> 
> I describing my current configuration with questions here and there in
> the hope that some (better) solutions will come out.
> 
> Normally emacs runs with 1 or more windows (frames in emacsspeak)
> multiple emacs processes have no relation wilth each other.
> 
> So in sort the typical setup is:
> 0 or more emacses each having 1 or more frame.
> 
> By a server setup I mean the following (which may not be proper usage
> from the os service point of view)
> 0 or 1 emacs having 0 or more frames.
> 
> So first thing I did
> --------------
> ; from http://www.emacswiki.org/cgi-bin/wiki/RupertSwarbrick#toc1
>  (defun buffer-used-elsewhere-p (&optional buf)
>    "Returns true if more than one window is attached to BUF in all
>  frames. If buf is nil or not supplied, search
>  for (CURRENT-BUFFER)."
>    (unless buf (setq buf (current-buffer)))
>    (< 1 (length (get-buffer-window-list buf nil t))))
> 
>  (defun delete-frame-ex ()
>    "Delete frame as normal, unless we're on the last frame, in
>    which case, exit emacs as we would normally do"
>    (interactive)
>    (if (eq (selected-frame) (next-frame (selected-frame) 0))
>        ;; This is the last frame
>        (save-buffers-kill-emacs)
>     ;; There's more!
>      (unless (buffer-used-elsewhere-p) (kill-buffer nil))
>      (delete-frame)))
> 
> (global-set-key "\C-x\C-c" 'delete-frame-ex)
> -----------------
> 
> This basically makes C-x C-c kill frames rather than kill emacs except
> for the last one in which case it kills emacs.
> 
> Then recently got some solutions from Scott Turner that prompted me to
> try again:
> 
> I changed the line
>        (save-buffers-kill-emacs)
> above to
>        (make-frame-invisible (car (frame-list)) t)
> which makes the last frame behavior consistent with the others (and
> emacs unkillable unless one uses explicit M-x kill-emacs).  Basically
> emacs disappears rather than dying.
> 
> Q: Obviously the (car (frame-list)) thingy is clumsy. Any better way?
> Also I want to bind the X on the window top right to function delete-
> frame-ex
> rather than the default save-buffer-kill-emacs. How to do that?
> 
> To move to a more client-server oriented model.
> The default emacs program that runs is to be replaced by this vbs
> script
> ------------
> Set objShell = WScript.CreateObject("WScript.Shell")
> Set fso = CreateObject("Scripting.FileSystemObject")
> 
> strComputer = "."
> 
> Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root
> \cimv2")
> 
> Set colItems = objWMIService.ExecQuery("Select * From Win32_Process")
> Dim isRunning
> isRunning = False
> 
> For Each objItem in colItems
>   If InStr(objItem.CommandLine, "emacs.exe") Then
>     isRunning = True
>   End If
> Next
> 
> parent = fso.GetParentFolderName(WScript.ScriptFullName)
> If WScript.Arguments.Count = 1 Then
>   If isRunning Then
>     callString = parent & "/emacsclientw.exe -n """ & WScript.Arguments
> (0) & """"
>   Else
>     callString = parent & "/runemacs.exe """ & WScript.Arguments(0) &
> """"
>   End If
> Else
>   If isRunning Then
>     callString = parent & "/emacsclientw.exe -n -e ""(raise-frame)"""
>   else
>     callString = parent & "/runemacs.exe"
>   End If
> End if
> objShell.Run(callString)
> -------------
> Q: Whats the diff between emacs and runemacs?

I think that runemacs is just a wrapper used to suppress the appearance 
of the command window. It is after all only 217kB in size.

> Q: The for loop is ugly but my windows/vbs is out of depth here
> 
> This script basically does a 4=2x2 way check:
> Is emacs server running or not?
> Is the script called with an argument or not?
> And the default bindings for emacs-ish files (in my case .txt, .org)
> is bound to this script in the registry.
> 
> If someone can offer HKEY magic to automate this that'd be nice.

I'm not sure I understand your problem or how it differs from just 
putting emacsclientw in the Windows Registry. You don't need VB to do that:

(server-start)
goes in .emacs (Emacs version 22.1)

ALTERNATE_EDITOR=C:\emacs\bin\runemacs.exe
goes in environment

in HKCR hive
*/shell/open/command
default c:\emacs\bin\emacsclientw.exe -n "%1"

Applications/emacsclientw.exe/shell/open/command
default c:\emacs\bin\emacsclientw.exe -n "%1"

I think that these will propagate to the HKLM hive on startup but beware 
of manual registry surgery. At one point, when I clicked on files 
associated with Emacs in Windows Explorer, all that would happen was 
that the runemacs.exe binary would load into an emacs buffer, a 
consummation not devoutly to be wished for. Also, it's safest to make 
associations from WE with Tools>Folder Options>File Types rather than in 
the registry but you may need ./ (also in HKCR) set to something like 
ft000003, ft000002, or ft000001 for click-opening extensionless files 
(e.g. readme). I think these are automatically generated user file types 
but I can't find any documentation on them. Again beware; some system 
files don't have extensions , even parts of the registry itself.
See:
http://www.emacswiki.org/emacs/EmacsClient#toc6

> 
> Now one fragile aspect of this is that if 2 emacsservers run well the
> system is borked!  How is the (server-start) to be enclosed in a
> (if server-not-started-p ...) ?

Is that... run well or run, well.... ;-)
> 
> And one (entirely windowsy) related question:
> How to catch the system login, logout, shutdown etc events?
> Once I can get some script to give me some control for this I can use
> emacsclient to do appropriate actions.

I am totally out of my depth here. Don't MSwin processes with pending 
open files warn about needed actions in case of logout or shutdown?

> 
> Thanks (if you read so far!)


  parent reply	other threads:[~2009-03-08 20:39 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-08 13:52 emacs as a service rustom
2009-03-08 14:08 ` Marc Tfardy
2009-03-08 20:39 ` B. T. Raven [this message]
2009-03-09 11:42   ` rustom
2009-03-09 22:01     ` Chris McMahan
     [not found] <mailman.17859.1219992155.18990.help-gnu-emacs@gnu.org>
2008-08-29  6:52 ` Torsten Mueller
2008-08-29 15:06 ` Chet
2008-08-29 16:04 ` Ken Goldman
2008-08-29 16:24 ` Dan Espen
  -- strict thread matches above, loose matches on Subject: below --
2008-08-29  6:42 Rustom Mody
2008-08-29  9:46 ` Nikolaj Schumacher
2008-08-29 11:41   ` Rustom Mody
2008-08-29 13:41     ` Nikolaj Schumacher
2008-08-29 14:40       ` Eli Zaretskii
2008-08-29 16:40         ` Nikolaj Schumacher
2008-08-30 10:53       ` Rustom Mody
     [not found]       ` <mailman.17988.1220093630.18990.help-gnu-emacs@gnu.org>
2008-09-02 18:00         ` Ken Goldman
2008-09-02 18:34           ` Richard G Riley
2008-09-02 18:42             ` Pascal J. Bourguignon
     [not found]   ` <mailman.17876.1220010121.18990.help-gnu-emacs@gnu.org>
2008-08-29 13:05     ` Torsten Mueller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DuKdnWVMIs51sSnUnZ2dnUVZ_rvinZ2d@posted.cpinternet \
    --to=nihil@nihilo.net \
    --cc=help-gnu-emacs@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).