diff --git a/src/buffer.c b/src/buffer.c index 352aca8ddfd..f79b1e06119 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -327,6 +327,11 @@ bset_name (struct buffer *b, Lisp_Object val) b->name_ = val; } static void +bset_lastname (struct buffer *b, Lisp_Object val) +{ + b->lastname_ = val; +} +static void bset_overwrite_mode (struct buffer *b, Lisp_Object val) { b->overwrite_mode_ = val; @@ -1276,6 +1281,19 @@ DEFUN ("buffer-name", Fbuffer_name, Sbuffer_name, 0, 1, 0, return BVAR (decode_buffer (buffer), name); } +DEFUN ("buffer-last-name", Fbuffer_last_name, Sbuffer_last_name, 0, 1, 0, + doc: /* Return last name of BUFFER, as a string. +BUFFER defaults to the current buffer. + +The return value is nil if BUFFER is live and has never been renamed. +If BUFFER is live and has been renamed at least once, it is the name it +had before the last rename changed it. For a dead buffer it is the name +the buffer had before it was killed. */) + (Lisp_Object buffer) +{ + return BVAR (decode_buffer (buffer), lastname); +} + DEFUN ("buffer-file-name", Fbuffer_file_name, Sbuffer_file_name, 0, 1, 0, doc: /* Return name of file BUFFER is visiting, or nil if none. No argument or nil as argument means use the current buffer. */) @@ -1647,6 +1665,7 @@ DEFUN ("rename-buffer", Frename_buffer, Srename_buffer, 1, 2, { register Lisp_Object tem, buf; Lisp_Object requestedname = newname; + Lisp_Object oldname = BVAR (current_buffer, name); CHECK_STRING (newname); @@ -1661,14 +1680,14 @@ DEFUN ("rename-buffer", Frename_buffer, Srename_buffer, 1, 2, with the original name. It makes UNIQUE equivalent to (rename-buffer (generate-new-buffer-name NEWNAME)). */ if (NILP (unique) && XBUFFER (tem) == current_buffer) - return BVAR (current_buffer, name); + return oldname; if (!NILP (unique)) - newname = Fgenerate_new_buffer_name (newname, - BVAR (current_buffer, name)); + newname = Fgenerate_new_buffer_name (newname, oldname); else error ("Buffer name `%s' is in use", SDATA (newname)); } + bset_lastname (current_buffer, oldname); bset_name (current_buffer, newname); /* Catch redisplay's attention. Unless we do this, the mode lines for @@ -2081,6 +2100,7 @@ DEFUN ("kill-buffer", Fkill_buffer, Skill_buffer, 0, 1, "bKill buffer: ", This gets rid of them for certain. */ reset_buffer_local_variables (b, 1); + bset_lastname (b, b->name_); bset_name (b, Qnil); block_input (); @@ -4647,6 +4667,7 @@ init_buffer_once (void) /* 0 means not a lisp var, -1 means always local, else mask. */ memset (&buffer_local_flags, 0, sizeof buffer_local_flags); + bset_lastname (&buffer_local_flags, make_fixnum (-1)); bset_filename (&buffer_local_flags, make_fixnum (-1)); bset_directory (&buffer_local_flags, make_fixnum (-1)); bset_backed_up (&buffer_local_flags, make_fixnum (-1)); @@ -6030,6 +6051,7 @@ Functions (implicitly) running this hook are `get-buffer-create', defsubr (&Smake_indirect_buffer); defsubr (&Sgenerate_new_buffer_name); defsubr (&Sbuffer_name); + defsubr (&Sbuffer_last_name); defsubr (&Sbuffer_file_name); defsubr (&Sbuffer_base_buffer); defsubr (&Sbuffer_local_value); diff --git a/src/buffer.h b/src/buffer.h index 80edfdcbc22..7e009397f4d 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -309,6 +309,12 @@ #define BVAR(buf, field) ((buf)->field ## _) /* The name of this buffer. */ Lisp_Object name_; + /* The last name of this buffer. Initially nil, for a renamed live + buffer the name the buffer had before the last Frename_buffer + changed it, for a dead buffer the last name the buffer had before + it was killed. */ + Lisp_Object lastname_; + /* The name of the file visited in this buffer, or nil. */ Lisp_Object filename_;