While ANSI says that ED should only accept one optional argument, it'd be nice if SLIME's ED-IN-EMACS could deal with another, optional, position argument, making it more useful as a general editing tool, as opposed to being quite lisp specific. What are people's thoughts on something like this:
Index: ChangeLog =================================================================== RCS file: /project/slime/cvsroot/slime/ChangeLog,v retrieving revision 1.316 diff -u -r1.316 ChangeLog --- ChangeLog 29 Mar 2004 17:08:17 -0000 1.316 +++ ChangeLog 29 Mar 2004 22:02:19 -0000 @@ -1,3 +1,11 @@ +2004-03-29 Lawrence Mitchell wence@gmx.li + + * swank.lisp (ed-in-emacs): New optional argument, WHERE. + Describes a LINE:COLUMN location in the file we're visiting. + + * slime.el (slime-ed): Deal with new WHERE argument. In the case + of a filename, visit the correct line and column number. + 2004-03-29 Helmut Eller e9626484@stud3.tuwien.ac.at
* swank-source-path-parser.lisp (cmucl-style-get-macro-character):
Index: swank.lisp =================================================================== RCS file: /project/slime/cvsroot/slime/swank.lisp,v retrieving revision 1.155 diff -u -r1.155 swank.lisp --- swank.lisp 27 Mar 2004 21:14:52 -0000 1.155 +++ swank.lisp 29 Mar 2004 21:56:36 -0000 @@ -1133,12 +1133,16 @@ (let ((*package* *buffer-package*)) (format nil "~{~S~^~%~}" values))))))
-(defslimefun ed-in-emacs (&optional what) +(defslimefun ed-in-emacs (&optional what where) "Edit WHAT in Emacs. -WHAT can be a filename (pathname or string) or function name (symbol)." +WHAT can be a filename (pathname or string) or function name (symbol). + +If WHERE is non-nil, it should be a string of the form +"LINE[:COLUMN]" telling us where in the file we should jump to." (send-oob-to-emacs `(:ed ,(if (pathnamep what) (canonicalize-filename what) - what)))) + what) + ,where))) ;;;; Compilation Commands.
Index: slime.el =================================================================== RCS file: /project/slime/cvsroot/slime/slime.el,v retrieving revision 1.248 diff -u -r1.248 slime.el --- slime.el 29 Mar 2004 00:59:13 -0000 1.248 +++ slime.el 29 Mar 2004 21:59:26 -0000 @@ -1511,8 +1511,8 @@ (setf (slime-use-sigint-for-interrupt) t)) ((:%apply fn args) (apply (intern fn) args)) - ((:ed what) - (slime-ed what)) + ((:ed what where) + (slime-ed what where)) ((:debug-condition thread message) (apply 'ignore thread) ; stupid XEmacs warns about unused variable (message "%s" message))))) @@ -3637,7 +3637,7 @@ (defvar slime-ed-use-dedicated-frame t "*When non-nil, `slime-ed' will create and reuse a dedicated frame.")
-(defun slime-ed (what) +(defun slime-ed (what where) "Edit WHAT, either a filename (string) or function name (symbol), or nil. This for use in the implementation of COMMON-LISP:ED." ;; Without `save-excursion' very strange things happen if you call @@ -3648,7 +3648,19 @@ (setq slime-ed-frame (new-frame))) (select-frame slime-ed-frame)) (cond ((stringp what) - (find-file (slime-from-lisp-filename what))) + (find-file (slime-from-lisp-filename what)) + (when (string-match "\([0-9]+\):?\([0-9]+\)?" where) + ;; Go to the correct line. + (goto-line (string-to-number (match-string 1 where))) + ;; Check to see if we've specified a column, and if so, + ;; try and reach it, but don't go off the end of the + ;; current line. + (let ((col (match-string 2 where))) + (and col (setq col (string-to-number col))) + (while (and col + (< (point) (point-at-eol)) + (/= (decf col) -1)) + (forward-char 1))))) ((and what (symbolp what)) (slime-edit-definition (symbol-name what))) (t nil)))) ; nothing in particular