mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-15 10:30:25 -08:00
Set `default-directory' in *scratch* to the current directory of emacsclient.
* lib-src/emacsclient.c (get_current_dir_name): New function, copied here from sysdep.c. (main): Use it to send over the current directory. * lisp/server.el (server-process-filter): Accept `-dir' command. Set `default-directory' of the *scratch* buffer on connect, if applicable. git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-539
This commit is contained in:
parent
59b3194ca9
commit
2828d5f9d4
3 changed files with 117 additions and 5 deletions
|
|
@ -1487,5 +1487,12 @@ DIARY OF CHANGES
|
||||||
|
|
||||||
(Done in patch-537.)
|
(Done in patch-537.)
|
||||||
|
|
||||||
|
-- The `default-directory' variable should somehow be set to the
|
||||||
|
cwd of the emacsclient process when the user runs emacsclient
|
||||||
|
without file arguments. Perhaps it is OK to just override the
|
||||||
|
directory of the *scratch* buffer.
|
||||||
|
|
||||||
|
(Done in patch-539.)
|
||||||
|
|
||||||
;;; arch-tag: 8da1619e-2e79-41a8-9ac9-a0485daad17d
|
;;; arch-tag: 8da1619e-2e79-41a8-9ac9-a0485daad17d
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -248,6 +248,83 @@ xstrdup (const char *s)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* From sysdep.c */
|
||||||
|
#if !defined (HAVE_GET_CURRENT_DIR_NAME) || defined (BROKEN_GET_CURRENT_DIR_NAME)
|
||||||
|
|
||||||
|
/* Return the current working directory. Returns NULL on errors.
|
||||||
|
Any other returned value must be freed with free. This is used
|
||||||
|
only when get_current_dir_name is not defined on the system. */
|
||||||
|
char*
|
||||||
|
get_current_dir_name ()
|
||||||
|
{
|
||||||
|
char *buf;
|
||||||
|
char *pwd;
|
||||||
|
struct stat dotstat, pwdstat;
|
||||||
|
/* If PWD is accurate, use it instead of calling getwd. PWD is
|
||||||
|
sometimes a nicer name, and using it may avoid a fatal error if a
|
||||||
|
parent directory is searchable but not readable. */
|
||||||
|
if ((pwd = getenv ("PWD")) != 0
|
||||||
|
&& (IS_DIRECTORY_SEP (*pwd) || (*pwd && IS_DEVICE_SEP (pwd[1])))
|
||||||
|
&& stat (pwd, &pwdstat) == 0
|
||||||
|
&& stat (".", &dotstat) == 0
|
||||||
|
&& dotstat.st_ino == pwdstat.st_ino
|
||||||
|
&& dotstat.st_dev == pwdstat.st_dev
|
||||||
|
#ifdef MAXPATHLEN
|
||||||
|
&& strlen (pwd) < MAXPATHLEN
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
{
|
||||||
|
buf = (char *) malloc (strlen (pwd) + 1);
|
||||||
|
if (!buf)
|
||||||
|
return NULL;
|
||||||
|
strcpy (buf, pwd);
|
||||||
|
}
|
||||||
|
#ifdef HAVE_GETCWD
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t buf_size = 1024;
|
||||||
|
buf = (char *) malloc (buf_size);
|
||||||
|
if (!buf)
|
||||||
|
return NULL;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (getcwd (buf, buf_size) == buf)
|
||||||
|
break;
|
||||||
|
if (errno != ERANGE)
|
||||||
|
{
|
||||||
|
int tmp_errno = errno;
|
||||||
|
free (buf);
|
||||||
|
errno = tmp_errno;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
buf_size *= 2;
|
||||||
|
buf = (char *) realloc (buf, buf_size);
|
||||||
|
if (!buf)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We need MAXPATHLEN here. */
|
||||||
|
buf = (char *) malloc (MAXPATHLEN + 1);
|
||||||
|
if (!buf)
|
||||||
|
return NULL;
|
||||||
|
if (getwd (buf) == NULL)
|
||||||
|
{
|
||||||
|
int tmp_errno = errno;
|
||||||
|
free (buf);
|
||||||
|
errno = tmp_errno;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* In STR, insert a & before each &, each space, each newline, and
|
/* In STR, insert a & before each &, each space, each newline, and
|
||||||
any initial -. Change spaces to underscores, too, so that the
|
any initial -. Change spaces to underscores, too, so that the
|
||||||
return value never contains a space.
|
return value never contains a space.
|
||||||
|
|
@ -709,6 +786,20 @@ To start the server in Emacs, type \"M-x server-start\".\n",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Send over our current directory. */
|
||||||
|
if (!current_frame)
|
||||||
|
{
|
||||||
|
char *dir = get_current_dir_name ();
|
||||||
|
if (dir)
|
||||||
|
{
|
||||||
|
fprintf (out, "-dir ");
|
||||||
|
quote_argument (dir, out);
|
||||||
|
fprintf (out, "/");
|
||||||
|
fprintf (out, " ");
|
||||||
|
free (dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
if (nowait)
|
if (nowait)
|
||||||
fprintf (out, "-nowait ");
|
fprintf (out, "-nowait ");
|
||||||
|
|
|
||||||
|
|
@ -493,6 +493,9 @@ The following commands are accepted by the server:
|
||||||
`-env NAME=VALUE'
|
`-env NAME=VALUE'
|
||||||
An environment variable on the client side.
|
An environment variable on the client side.
|
||||||
|
|
||||||
|
`-dir DIRNAME'
|
||||||
|
The current working directory of the client process.
|
||||||
|
|
||||||
`-current-frame'
|
`-current-frame'
|
||||||
Forbid the creation of new frames.
|
Forbid the creation of new frames.
|
||||||
|
|
||||||
|
|
@ -520,16 +523,16 @@ The following commands are accepted by the server:
|
||||||
`-tty DEVICENAME TYPE'
|
`-tty DEVICENAME TYPE'
|
||||||
Open a new tty frame at the client.
|
Open a new tty frame at the client.
|
||||||
|
|
||||||
`-resume'
|
|
||||||
Resume this tty frame. The client sends this string when it
|
|
||||||
gets the SIGCONT signal and it is the foreground process on its
|
|
||||||
controlling tty.
|
|
||||||
|
|
||||||
`-suspend'
|
`-suspend'
|
||||||
Suspend this tty frame. The client sends this string in
|
Suspend this tty frame. The client sends this string in
|
||||||
response to SIGTSTP and SIGTTOU. The server must cease all I/O
|
response to SIGTSTP and SIGTTOU. The server must cease all I/O
|
||||||
on this tty until it gets a -resume command.
|
on this tty until it gets a -resume command.
|
||||||
|
|
||||||
|
`-resume'
|
||||||
|
Resume this tty frame. The client sends this string when it
|
||||||
|
gets the SIGCONT signal and it is the foreground process on its
|
||||||
|
controlling tty.
|
||||||
|
|
||||||
`-ignore COMMENT'
|
`-ignore COMMENT'
|
||||||
Do nothing, but put the comment in the server
|
Do nothing, but put the comment in the server
|
||||||
log. Useful for debugging.
|
log. Useful for debugging.
|
||||||
|
|
@ -581,6 +584,7 @@ The following commands are accepted by the client:
|
||||||
display ; Open the frame on this display.
|
display ; Open the frame on this display.
|
||||||
dontkill ; t if the client should not be killed.
|
dontkill ; t if the client should not be killed.
|
||||||
env
|
env
|
||||||
|
dir
|
||||||
(files nil)
|
(files nil)
|
||||||
(lineno 1)
|
(lineno 1)
|
||||||
(columnno 0))
|
(columnno 0))
|
||||||
|
|
@ -650,6 +654,7 @@ The following commands are accepted by the client:
|
||||||
|
|
||||||
;; Display *scratch* by default.
|
;; Display *scratch* by default.
|
||||||
(switch-to-buffer (get-buffer-create "*scratch*") 'norecord)
|
(switch-to-buffer (get-buffer-create "*scratch*") 'norecord)
|
||||||
|
(if dir (setq default-directory dir))
|
||||||
|
|
||||||
(setq dontkill t))
|
(setq dontkill t))
|
||||||
;; This emacs does not support X.
|
;; This emacs does not support X.
|
||||||
|
|
@ -706,6 +711,7 @@ The following commands are accepted by the client:
|
||||||
|
|
||||||
;; Display *scratch* by default.
|
;; Display *scratch* by default.
|
||||||
(switch-to-buffer (get-buffer-create "*scratch*") 'norecord)
|
(switch-to-buffer (get-buffer-create "*scratch*") 'norecord)
|
||||||
|
(if dir (setq default-directory dir))
|
||||||
|
|
||||||
;; Reply with our pid.
|
;; Reply with our pid.
|
||||||
(server-send-string proc (concat "-emacs-pid " (number-to-string (emacs-pid)) "\n"))
|
(server-send-string proc (concat "-emacs-pid " (number-to-string (emacs-pid)) "\n"))
|
||||||
|
|
@ -760,6 +766,14 @@ The following commands are accepted by the client:
|
||||||
(setq request (substring request (match-end 0)))
|
(setq request (substring request (match-end 0)))
|
||||||
(setq env (cons var env))))
|
(setq env (cons var env))))
|
||||||
|
|
||||||
|
;; -dir DIRNAME: The cwd of the emacsclient process.
|
||||||
|
((and (equal "-dir" arg) (string-match "\\([^ ]+\\) " request))
|
||||||
|
(setq dir (server-unquote-arg (match-string 1 request)))
|
||||||
|
(setq request (substring request (match-end 0)))
|
||||||
|
(if coding-system
|
||||||
|
(setq dir (decode-coding-string dir coding-system)))
|
||||||
|
(setq dir (command-line-normalize-file-name dir)))
|
||||||
|
|
||||||
;; Unknown command.
|
;; Unknown command.
|
||||||
(t (error "Unknown command: %s" arg)))))
|
(t (error "Unknown command: %s" arg)))))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue