Vim and SBCL #
hacking, June 5th 2009
Disclaimer: I don' use vim. However, there was a question on sbcl-devel about how to make ED use the console vim, and I thought someone not on sbcl-devel readers might get a kick out of this:
(require :sb-introspect)
(define-alien-routine system int (command c-string))
(defun namestring-for-vim (thing)
(when thing
(typecase thing
(pathname
(native-namestring (translate-logical-pathname thing) :as-file t))
(string
thing)
(t
(let* ((source
(sb-introspect:find-definition-source (fdefinition thing)))
(pathname
(sb-introspect:definition-source-pathname source))
(offset
(or (sb-introspect:definition-source-character-offset source)
0)))
(unless pathname
(error "Don't know where the definition of ~S is, sorry." thing))
(format nil "-c \"goto ~A\" ~A"
offset
(namestring-for-vim pathname)))))))
(defun ed-in-vim (thing)
(system (format nil "vim~@[ ~A~]" (namestring-for-vim thing))))
(push 'ed-in-vim *ed-functions*)
Given this, (ED 'CONS) does the right thing, assuming SBCL sources are in place.