How to open a file in Edwin from the command line
The Edwin text editor that comes with MIT Scheme has no direct way for the user to provide the name of the file to open via a command line argument. This stands in stark contrast with other text editors, such as Emacs, where such a convenience is the norm (e.g. emacs myfile.txt
). In this article, I will show two methods of specifying a filename on the command line when starting Edwin.
Method 1: environment variable
This method uses an environment variable EDWIN_OPEN_FILE
that specifies the name of the file to open. First, add the following to your Edwin configuration file (~/.edwin
on UNIX-like systems):
(let ((filename (get-environment-variable "EDWIN_OPEN_FILE"))) (when (and filename (not (string=? filename ""))) (set-environment-variable! "EDWIN_OPEN_FILE" #f) ; Optional: unset environment variable. (find-file filename)))
Then, to open a file directly from the command line, specify that environment variable when starting Edwin from the command line:
EDWIN_OPEN_FILE='/path/to/my/file' mit-scheme --eval "(edwin 'console)"
Method 2: command line arguments
This method looks at the command line arguments passed to MIT Scheme. However, this method only works in MIT Scheme 9.2 or later, because it depends on MIT Scheme's --args
command line option, which was added in MIT Scheme 9.2. For MIT Scheme 9.2 only, add this to your Edwin configuration file:
(let (args (command-line)) (when (and (not (null? args)) (not (string=? (car args) ""))) (find-file (car args))))
For MIT Scheme 10.1.1 or later, add this to your Edwin configuration file instead:
(let ((args (command-line-arguments))) (when (and (not (null? args)) (not (string=? (car args) ""))) (find-file (car args))))
Why the difference between MIT Scheme 9.2 and the later versions? It's because the command-line
procedure was renamed to command-line-arguments
from MIT Scheme 10.1.1 onwards to avoid a conflict with R7RS-small's command-line
procedure.
Then, to directly open a file from the command line:
mit-scheme --eval "(edwin 'console)" --args "/path/to/my/file"
For convenience, you could probably wrap that in a shell script named "edwin":
#!/bin/sh mit-scheme --eval "(edwin 'console)" --args "$1"