Function: comint-source-default
comint-source-default is a byte-compiled function defined in
comint.el.gz.
Signature
(comint-source-default PREVIOUS-DIR/FILE SOURCE-MODES)
Documentation
Compute the defaults for load-file and compile-file commands.
PREVIOUS-DIR/FILE is a pair (DIRECTORY . FILENAME) from the last source-file processing command, or nil if there hasn't been one yet. SOURCE-MODES is a list used to determine what buffers contain source files: if the major mode of the buffer is in SOURCE-MODES, it's source. Typically, (lisp-mode) or (scheme-mode).
If the command is given while the cursor is inside a string, *and* the string is an existing filename, *and* the filename is not a directory, then the string is taken as default. This allows you to just position your cursor over a string that's a filename and have it taken as default.
If the command is given in a file buffer whose major mode is in SOURCE-MODES, then the filename is the default file, and the file's directory is the default directory.
If the buffer isn't a source file buffer (e.g., it's the process buffer), then the default directory & file are what was used in the last source-file processing command (i.e., PREVIOUS-DIR/FILE). If this is the first time the command has been run (PREVIOUS-DIR/FILE is nil), the default directory is the cwd, with no default file. ("no default file" = nil)
SOURCE-MODES is typically going to be something like (tea-mode) for T programs, (lisp-mode) for Lisp programs, (soar-mode lisp-mode) for Soar programs, etc.
The function returns a pair: (default-directory . default-file).
Source Code
;; Defined in /usr/src/emacs/lisp/comint.el.gz
;;; Support for source-file processing commands.
;;============================================================================
;; Many command-interpreters (e.g., Lisp, Scheme, Soar) have
;; commands that process files of source text (e.g. loading or compiling
;; files). So the corresponding process-in-a-buffer modes have commands
;; for doing this (e.g., lisp-load-file). The functions below are useful
;; for defining these commands.
;;
;; Alas, these guys don't do exactly the right thing for Lisp, Scheme
;; and Soar, in that they don't know anything about file extensions.
;; So the compile/load interface gets the wrong default occasionally.
;; The load-file/compile-file default mechanism could be smarter -- it
;; doesn't know about the relationship between filename extensions and
;; whether the file is source or executable. If you compile foo.lisp
;; with compile-file, then the next load-file should use foo.bin for
;; the default, not foo.lisp. This is tricky to do right, particularly
;; because the extension for executable files varies so much (.o, .bin,
;; .lbin, .mo, .vo, .ao, ...).
;; COMINT-SOURCE-DEFAULT -- determines defaults for source-file processing
;; commands.
;;
;; COMINT-CHECK-SOURCE -- if FNAME is in a modified buffer, asks you if you
;; want to save the buffer before issuing any process requests to the command
;; interpreter.
;;
;; COMINT-GET-SOURCE -- used by the source-file processing commands to prompt
;; for the file to process.
(defun comint-source-default (previous-dir/file source-modes)
"Compute the defaults for `load-file' and `compile-file' commands.
PREVIOUS-DIR/FILE is a pair (DIRECTORY . FILENAME) from the last
source-file processing command, or nil if there hasn't been one yet.
SOURCE-MODES is a list used to determine what buffers contain source
files: if the major mode of the buffer is in SOURCE-MODES, it's source.
Typically, (lisp-mode) or (scheme-mode).
If the command is given while the cursor is inside a string, *and*
the string is an existing filename, *and* the filename is not a directory,
then the string is taken as default. This allows you to just position
your cursor over a string that's a filename and have it taken as default.
If the command is given in a file buffer whose major mode is in
SOURCE-MODES, then the filename is the default file, and the
file's directory is the default directory.
If the buffer isn't a source file buffer (e.g., it's the process buffer),
then the default directory & file are what was used in the last source-file
processing command (i.e., PREVIOUS-DIR/FILE). If this is the first time
the command has been run (PREVIOUS-DIR/FILE is nil), the default directory
is the cwd, with no default file. (\"no default file\" = nil)
SOURCE-MODES is typically going to be something like (tea-mode)
for T programs, (lisp-mode) for Lisp programs, (soar-mode lisp-mode)
for Soar programs, etc.
The function returns a pair: (default-directory . default-file)."
(cond ((and buffer-file-name (memq major-mode source-modes))
(cons (file-name-directory buffer-file-name)
(file-name-nondirectory buffer-file-name)))
(previous-dir/file)
(t
(cons default-directory nil))))