Mercurial > emacs
view lib-src/emacsclient.c @ 4872:628cbf7e7005
(comint-after-partial-file-name-command):
Renamed from comint-after-partial-pathname-command.
(comint-match-partial-file-name, comint-after-partial-file-name):
Renamed from comint-match-partial-pathname, etc.
(comint-last-output-start): New variable to record
where most recent process output started from.
(comint-mode): Initialise it.
(comint-output-filter): Set it.
(comint-previous-matching-input-string): Moved to
comint-previous-matching-input-position.
(comint-previous-matching-input-string): Use it.
(comint-search-arg, comint-search-start,
comint-previous-input-string): New subroutines.
(comint-previous-input, comint-next-input,
comint-previous-matching-input, comint-next-matching-input,
comint-previous-matching-input-from-input,
comint-next-matching-input-from-input): Use them.
(comint-mode-map): Added signal menu-bar. Moved
comint-backward/forward-matching-input to output menu-bar, since
they move within the buffer rather than do input.
(comint-send-input, comint-after-pmark-p,
comint-kill-input, comint-proc-query): Removed serialisation of
obtaining the process mark's marker-position.
Commented out comint-load-hooks.
(comint-dynamic-simple-complete): New subroutine.
(comint-dynamic-complete-filename-command): New variable.
(comint-after-partial-pathname-command): New variable.
(comint-after-partial-pathname): New subroutine.
(comint-dynamic-complete): Use them.
(comint-mode): Make them local.
Renamed comint-dynamic-complete-command to
comint-dynamic-complete-command-command for consistency.
Renamed comint-file-name-addsuffix/autolist/recexact to
comint-completion-addsuffix/autolist/recexact for consistency.
(comint-replace-by-expanded-history): Check if input
ring size is not big enough for relative reference.
(comint-read-input-ring, comint-input-ring-file-name):
From shell.el.
(shell-write-input-ring): New subroutine.
(comint-file-name-prefix): New variable.
(comint-directory): New inline subroutine.
(comint-dynamic-complete-filename, comint-dynamic-complete-variable,
comint-dynamic-list-filename-completions): Use it.
(comint-dynamic-complete-filename,
comint-dynamic-complete-variable,
comint-dynamic-list-filename-completions): Make sure local
completion-ignore-case is nil.
(comint-next-prompt, comint-previous-prompt): Use
paragraph-start and paragraph motion commands rather than
re-search-forward and re-search-backward commands.
(comint-dynamic-list-input-ring,
comint-previous-matching-input-string): Use ring-empty-p rather
than zerop and ring-length.
(comint-input-ignoredups): New variable.
(comint-send-input, shell-read-input-ring): Use it.
(comint-mode): Make comint-input-ignoredups local. Doc fix.
(comint-scroll-to-bottom-on-input): New variable.
(comint-scroll-to-bottom-on-output): New variable.
(comint-scroll-show-maximum-output): New variable.
(comint-output-filter-hook): New variable, defaults to
comint-postoutput-scroll-to-bottom.
(comint-output-filter): Renamed from comint-filter
for consistency. Now calls comint-output-filter-hook.
(comint-preinput-scroll-to-bottom): New subroutine.
(comint-postoutput-scroll-to-bottom): New subroutine.
(comint-show-maximum-output): New command.
(comint-copy-old-input): New command.
(comint-send-input): Run comint-output-filter-hook if
necessary as a kludge to prevent messy redisplays.
(comint-mode-map): Added comint-show-maximum-output to
C-c C-e and menu-bar output, and comint-copy-old-input to C-c C-i
and menu-bar input.
(comint-mode): Make local variables
comint-scroll-to-bottom-on-input, before-change-function,
comint-scroll-to-bottom-on-output, comint-scroll-show-maximum-output,
and comint-output-filter-hook.
(comint-version): Deleted--no need for separate version.
(comint-input-ring-index): Make this a permanent local.
(comint-mode): Don't alter comint-input-ring-index or comint-input-ring
if already set meaningfully.
(comint-mode-map): Added keys M-R/S for
comint-previous/next-matching-input-from-input and to completion
menu-bar. Added comint-forward/backward-matching-input and
comint-previous/next-matching-input to completion menu-bar.
(comint-mode): Doc fix for functionality.
(comint-exec-1): Uses setenv.
(comint-update-env): Removed.
(comint-input-ring-size): Incremented to 32, as with
command history.
(comint-dynamic-list-input-ring): Check for zero
length ring. Use ring length, not ring size, when generating
list. Use buffer " *Input History*".
(comint-previous-matching-input-string): Check for zero-length ring.
Check last item in case at end of cycle and it's a match.
(comint-searching-input-ring): New subroutine.
(comint-regexp-arg): New subroutine.
(comint-previous-matching-input-from-input): New command.
(comint-next-matching-input-from-input): New command.
(comint-replace-by-expanded-history): Fix for matching
inside quotes. Fix to allow argument subrange specifiers. Fix to
identify and reject absolute input number references.
(comint-within-quotes): New subroutine.
(comint-how-many-region): New subroutine.
(comint-args): New subroutine.
(comint-delim-arg): New subroutine.
(comint-arguments): New subroutine.
(comint-delimiter-argument-list): New variable.
(comint-send-input): Inserts input arguments into ring
separated by single spaces.
(comint-filter): Checks the buffer's process to make
sure it's still there. Otherwise, set-buffer will fail.
(comint-backward-matching-input): New command.
(comint-forward-matching-input): New command.
(comint-next-prompt, comint-previous-prompt):
Error if reach beg/end of buffer.
(comint-dynamic-complete): Fix for absolute input
number references.
(comint-dynamic-complete-filename): Changed listings
function to comint-dynamic-list-filename-completions. Uses
file-directory-p rather than string-match to test for directories.
(comint-dynamic-list-completions): Changed to list the
list of completions supplied as the function argument. Use buffer
" *Completions*".
(comint-match-partial-pathname): New subroutine.
(comint-dynamic-complete-variable): New command.
(comint-dynamic-list-filename-completions): New function.
(comint-previous-input):
Don't use replace-match; just insert before deleting.
(comint-magic-space): Use self-insert command.
(comint-history-file-name): New variable.
(comint-mode): Initialize comint-input-ring before
running comint-mode-hook.
(comint-input-autoexpand): New variable.
(comint-dynamic-complete-command): New variable.
(comint-get-current-command): New variable.
(comint-read-input-ring): New function.
(comint-send-input): Handle history expansion.
(comint-input-sentinel): Doc fix.
(comint-mode-map): Added key binding for C-c C-h.
Added menu bars for completion, input and output.
(comint-dynamic-list-input-ring): New function.
(comint-previous-input-string): New subroutine.
(comint-previous-input): Use it.
(comint-previous-matching-input-string): New subroutine.
(comint-previous-matching-input): Use it.
(comint-replace-by-expanded-history): New command.
(comint-magic-space): New command.
(comint-replace-by-expanded-filename): Now replaces
expanded match for a filename, and then calls filename completion
comint-dynamic-complete-filename to do file name completion.
(comint-kill-output): Don't kill prompt.
(comint-show-output): Don't move point if it's
visible where it is, and if point is moved, put it after prompt.
(comint-dynamic-complete): Totally new definition.
(comint-dynamic-complete-filename): New name for old
function comint-dynamic-complete, completes files and lists
candidates, souped up for configurability.
(comint-dynamic-complete-variable): New command.
(comint-file-name-autolist): New variable.
(comint-file-name-addsuffix): New variable,
(comint-file-name-recexact): New variable.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Fri, 22 Oct 1993 02:57:36 +0000 |
parents | 1fc792473491 |
children | 64a936b21f74 |
line wrap: on
line source
/* Client process that communicates with GNU Emacs acting as server. Copyright (C) 1986, 1987 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #define NO_SHORTNAMES #include <../src/config.h> #undef read #undef write #undef open #undef close #undef signal #if !defined(HAVE_SOCKETS) && !defined(HAVE_SYSVIPC) #include <stdio.h> main (argc, argv) int argc; char **argv; { fprintf (stderr, "%s: Sorry, the Emacs server is supported only\n", argv[0]); fprintf (stderr, "on systems with Berkeley sockets or System V IPC.\n"); exit (1); } #else /* HAVE_SOCKETS or HAVE_SYSVIPC */ #if ! defined (HAVE_SYSVIPC) /* BSD code is very different from SYSV IPC code */ #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <sys/stat.h> #include <stdio.h> #include <errno.h> extern int sys_nerr; extern char *sys_errlist[]; extern int errno; main (argc, argv) int argc; char **argv; { char system_name[32]; int s, i; FILE *out; struct sockaddr_un server; char *homedir, *cwd, *str; char string[BUFSIZ]; char *getenv (), *getwd (); int geteuid (); if (argc < 2) { fprintf (stderr, "Usage: %s [+linenumber] filename\n", argv[0]); exit (1); } /* * Open up an AF_UNIX socket in this person's home directory */ if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) { fprintf (stderr, "%s: ", argv[0]); perror ("socket"); exit (1); } server.sun_family = AF_UNIX; #ifndef SERVER_HOME_DIR { struct stat statbfr; gethostname (system_name, sizeof (system_name)); sprintf (server.sun_path, "/tmp/esrv%d-%s", geteuid (), system_name); if (stat (server.sun_path, &statbfr) == -1) { if (errno == ENOENT) fprintf (stderr, "Can't find socket; have you started the server?\n"); else perror ("stat"); exit (1); } if (statbfr.st_uid != geteuid()) { fprintf (stderr, "Illegal socket owner\n"); exit (1); } } #else if ((homedir = getenv ("HOME")) == NULL) { fprintf (stderr, "%s: No home directory\n", argv[0]); exit (1); } strcpy (server.sun_path, homedir); strcat (server.sun_path, "/.emacs_server"); #endif if (connect (s, (struct sockaddr *) &server, strlen (server.sun_path) + 2) < 0) { fprintf (stderr, "%s: ", argv[0]); perror ("connect"); exit (1); } if ((out = fdopen (s, "r+")) == NULL) { fprintf (stderr, "%s: ", argv[0]); perror ("fdopen"); exit (1); } cwd = getwd (string); if (cwd == 0) { /* getwd puts message in STRING if it fails. */ fprintf (stderr, "%s: %s (%s)\n", argv[0], string, (errno < sys_nerr) ? sys_errlist[errno] : "unknown error"); exit (1); } for (i = 1; i < argc; i++) { if (*argv[i] == '+') { char *p = argv[i] + 1; while (*p >= '0' && *p <= '9') p++; if (*p != 0) fprintf (out, "%s/", cwd); } else if (*argv[i] != '/') fprintf (out, "%s/", cwd); fprintf (out, "%s ", argv[i]); } fprintf (out, "\n"); fflush (out); printf ("Waiting for Emacs..."); fflush (stdout); rewind (out); /* re-read the output */ str = fgets (string, BUFSIZ, out); /* Now, wait for an answer and print any messages. */ while (str = fgets (string, BUFSIZ, out)) printf ("%s", str); exit (0); } #else /* This is the SYSV IPC section */ #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdio.h> main (argc, argv) int argc; char **argv; { int s; key_t key; struct msgbuf * msgp = (struct msgbuf *) malloc (sizeof *msgp + BUFSIZ); struct msqid_ds * msg_st; char *homedir, buf[BUFSIZ]; char gwdirb[BUFSIZ]; char *cwd; char *temp; char *getwd (), *getcwd (), *getenv (); if (argc < 2) { fprintf (stderr, "Usage: %s [+linenumber] filename\n", argv[0]); exit (1); } /* * Create a message queue using ~/.emacs_server as the path for ftok */ if ((homedir = getenv ("HOME")) == NULL) { fprintf (stderr, "%s: No home directory\n", argv[0]); exit (1); } strcpy (buf, homedir); strcat (buf, "/.emacs_server"); creat (buf, 0600); key = ftok (buf, 1); /* unlikely to be anyone else using it */ s = msgget (key, 0600 | IPC_CREAT); if (s == -1) { fprintf (stderr, "%s: ", argv[0]); perror ("msgget"); exit (1); } /* Determine working dir, so we can prefix it to all the arguments. */ #ifdef BSD temp = getwd (gwdirb); #else temp = getcwd (gwdirb, sizeof gwdirb); #endif cwd = gwdirb; if (temp != 0) { /* On some systems, cwd can look like `@machine/...'; ignore everything before the first slash in such a case. */ while (*cwd && *cwd != '/') cwd++; strcat (cwd, "/"); } else { fprintf (stderr, cwd); exit (1); } msgp->mtext[0] = 0; argc--; argv++; while (argc) { if (*argv[0] == '+') { char *p = argv[0] + 1; while (*p >= '0' && *p <= '9') p++; if (*p != 0) strcat (msgp->mtext, cwd); } else if (*argv[0] != '/') strcat (msgp->mtext, cwd); strcat (msgp->mtext, argv[0]); strcat (msgp->mtext, " "); argv++; argc--; } strcat (msgp->mtext, "\n"); msgp->mtype = 1; if (msgsnd (s, msgp, strlen (msgp->mtext)+1, 0) < 0) { fprintf (stderr, "%s: ", argv[0]); perror ("msgsnd"); exit (1); } /* * Now, wait for an answer */ printf ("Waiting for Emacs..."); fflush (stdout); msgrcv (s, msgp, BUFSIZ, getpid (), 0); /* wait for anything back */ strcpy (buf, msgp->mtext); printf ("\n%s\n", buf); exit (0); } #endif /* HAVE_SYSVIPC */ #endif /* HAVE_SOCKETS or HAVE_SYSVIPC */