From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "B. T. Raven" Newsgroups: gmane.emacs.help Subject: Re: emacs as a service Date: Sun, 08 Mar 2009 14:39:17 -0600 Message-ID: References: <25226f9f-0d90-4350-99b6-eb1becce3cb2@l37g2000vba.googlegroups.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1236636445 21746 80.91.229.12 (9 Mar 2009 22:07:25 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 9 Mar 2009 22:07:25 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Mon Mar 09 23:08:42 2009 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1Lgne1-0001vP-2n for geh-help-gnu-emacs@m.gmane.org; Mon, 09 Mar 2009 23:08:23 +0100 Original-Received: from localhost ([127.0.0.1]:40318 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Lgnce-0007eq-Dk for geh-help-gnu-emacs@m.gmane.org; Mon, 09 Mar 2009 18:06:56 -0400 Original-Path: news.stanford.edu!newsfeed.stanford.edu!postnews.google.com!news1.google.com!Xl.tags.giganews.com!border1.nntp.dca.giganews.com!nntp.giganews.com!local01.nntp.dca.giganews.com!nntp.posted.cpinternet!news.posted.cpinternet.POSTED!not-for-mail Original-NNTP-Posting-Date: Sun, 08 Mar 2009 15:39:04 -0500 User-Agent: Thunderbird 2.0.0.19 (Windows/20081209) Original-Newsgroups: gnu.emacs.help In-Reply-To: <25226f9f-0d90-4350-99b6-eb1becce3cb2@l37g2000vba.googlegroups.com> Original-Lines: 162 X-Usenet-Provider: http://www.giganews.com Original-NNTP-Posting-Host: 64.61.221.202 Original-X-Trace: sv3-CXX+NGnsgMnk//B0nOfhqFg7N8Qs3hSUEP6CUmsekJ3kIiuC6DPeom4dYYaC/pidrZvqxCLmcnsuIFN!/gMLPrB/XVYBjJCUJCfpEbwDIxLu0RIjUYmozmHg1wgzQ1qypW87BRYc3Xue5h+vhdSZUvFD+A2C!4KK5M/Kd6KTPzhjgq6k= Original-X-Complaints-To: abuse@cpinternet.com X-DMCA-Complaints-To: abuse@cpinternet.com X-Abuse-and-DMCA-Info: Please be sure to forward a copy of ALL headers X-Abuse-and-DMCA-Info: Otherwise we will be unable to process your complaint properly X-Postfilter: 1.3.39 Original-Xref: news.stanford.edu gnu.emacs.help:167476 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:62781 Archived-At: 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!)