[ESS] Path completion
Deepayan Sarkar
deepayan.sarkar at gmail.com
Fri Jul 13 04:39:16 CEST 2007
On 7/11/07, James MacDonald <jmacdon at med.umich.edu> wrote:
> Hi,
>
> Using Emacs 22.1 and ESS-5.3.5 on Windows XP, file name completion
> doesn't work if there are spaces in the path. I see that this issue
> was raised back in 2005 by Vaidotas Zemlys with no response
> (https://stat.ethz.ch/pipermail/ess-help/2005-September/002882.html),
> and also discussed re Debian Sarge
> (https://stat.ethz.ch/pipermail/ess-help/2005-March/002498.html).
>
> So, here is what I am seeing:
>
> When editing an *.R file if there are no spaces in the path, Esc Tab
> will complete the filename. If there are spaces, I get path
> completion up to where I have typed and an error in the minibuffer
> saying e.g., 'No completions of Settings/J' when I was trying to
> complete the path C:/Documents and Settings/Jim. My druthers here
> would be for Tab to do the completion without having to hit Esc
> first (and we all know that M-Tab isn't gonna work on Windoze...).
But wouldn't you rather have Tab indent? C-c Tab generally causes object
completion in an ESS editor buffer (and file completion inside qoutes).
> In an *R* buffer with no spaces in the working directory path, a
> simple Tab will complete the file name. If there are spaces in the
> path to the working directory I get the same results as when editing
> an *.R file.
>
> Note that path completion works without problem using
> ESS/Xemacs. Also, the 'Complete ==> Complete File Name menu item
> will do the path completion in Emacs (in an inferior R buffer), but
> if I wanted to keep grabbing my mouse, I would be using Word ;-D.
>
> Any suggestions?
A non-ESS solution is to bypass ESS's completion and use rcompgen
instead. Since R 2.5.0 rcompgen supports file completion using R's
Sys.glob() (used on the Windows GUI but disabled on UNIX be default).
To use it, put the following in your .emacs (after loading ESS):
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; use rcompgen in ESS
(defun alt-ess-complete-object-name ()
(interactive)
(ess-make-buffer-current)
(let* ((comint-completion-addsuffix nil)
(beg-of-line (save-excursion (comint-bol) (point)))
(end-of-line (point-at-eol))
(line-buffer (buffer-substring beg-of-line end-of-line))
(token-string ;; setup, including computation of the token
(progn
(ess-command (format
"rcompgen:::.assignLinebuffer('%s')\n" line-buffer))
(ess-command (format "rcompgen:::.assignEnd(%d)\n" (-
(point) beg-of-line)))
(car (ess-get-words-from-vector
"rcompgen:::.guessTokenFromLine()\n"))))
(possible-completions ;; compute and retrieve possible completions
(progn
(ess-command "rcompgen:::.completeToken()\n")
(ess-get-words-from-vector "rcompgen:::.retrieveCompletions()\n"))))
(or (comint-dynamic-simple-complete token-string
possible-completions) 'none)))
(define-key inferior-ess-mode-map "\t" 'alt-ess-complete-object-name)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
and enable file completion in rcompgen, e.g. by putting
rcompgen::rc.settings(file = TRUE)
in your ~/.Rprofile. This takes over completion with TAB in a *R*
buffer and C-c TAB in a *.R editor buffer (M-TAB will still force Emacs'
completion).
This should also get rid of the path expansion (for both relative
paths and ones beginning with ~), which like Ronaldo I find very
irritating.
-Deepayan
More information about the ESS-help
mailing list