[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Why is TAB-completion in shell not working for some commands?

From: Jonathan Oddie
Subject: Re: Why is TAB-completion in shell not working for some commands?
Date: Wed, 9 Nov 2011 17:46:46 +0000

That took less time than I thought it might. See if this helps you:

(let ((path (shell-command-to-string "echo $PATH")))
  (setenv "PATH" path)
  (setq exec-path
         (split-string-and-unquote path ":")

(In case you're not used to evaluating bits of Lisp code in Emacs:
paste that into your *scratch* buffer, put point somewhere in the
middle and type C-M-x or M-x eval-defun)

You would have to kill any existing shell-mode buffers and start over
for this to do anything, I think.

Does that fix it?


On 9 Nov 2011, at 17:28, Marius Hofert wrote:

>> This rang a bell for me. When launching anything from the Finder the
>> PATH is not set correctly (since the Finder is not itself run from
>> your shell). I am a bit fuzzy now on the details of how `exec-path',
>> the PATH variable and tab-completion in shell-mode interact, but I
>> would suggest putting something in your .emacs or init.el file that
>> (1) sets the emacs variable `exec-path' to the sequence of directories
>> you expect to find in PATH, and (2) sets the environment variable PATH
>> based on that. Here's what I have, just as an example:
>> ;; Exec-path and env variable
>> (setq exec-path
>>     (append '("/opt/local/bin" "/opt/local/sbin" "/opt/local/libexec/gnubin/"
>>              "/usr/local/mysql/bin/" "/usr/local/share/rhino" "~/bin")
>>            exec-path
>>            '("/Applications/"
>>              "/Applications/Racket v5.1.3/bin/")))
>> (setenv "PATH" (mapconcat 'identity exec-path ":"))
> I just tried out something:
> 1) If I start emacs from the terminal, TAB-completion works (as reported 
> earlier). Now the emacs I start from the terminal is actally (output of 
> "which emacs"):
> /Applications/
> and not the /Applications/ (the GUI version one clicks on in the 
> dock). So when I started emacs from the terminal, I used Options -> Keep in 
> Dock to keep that in the dock instead of /Applications/ Starting 
> the former, I again did not have TAB-completion, so it only works when 
> (really) starting emacs from the terminal (which is funny cause I thought I 
> can get rid of the Mac's terminal since I have a shell in emacs...)
> Don't know if that makes sense to the experts, I just wanted to report on 
> this.
> 2)  Jonathan, your hint led me to a search which brought up this: 
> So that seems to be related to the fact that emacs started from the dock does 
> not get the same initialization as emacs started from the terminal (the 
> latter having environment variables set up correctly). The only thing I'm 
> wondering about is, if I set up the path to a2ps in .emacs and it finally 
> works, what about all other not TAB-completed commands? What is a *general* 
> solution to this problem (not depending on adding specific paths)? The bottom 
> line is: I want to have exactly the same behavior for the emacs started from 
> the dock as from the one started from the terminal.
> 3) There's a hint on the bottom of the above linked page. I executed C-h v 
> exec-path and obtained:
> exec-path is a variable defined in `C source code'.
> Its value is
> ("/usr/bin" "/bin" "/usr/sbin" "/sbin" "/usr/local/bin" "/usr/X11/bin" 
> "/usr/texbin" "/Applications/")
> Original value was 
> ("/usr/bin" "/bin" "/usr/sbin" "/sbin" "/usr/local/bin" "/usr/X11/bin" 
> "/Users/david/src/emacs-dev/ftp-versions/emacs-24.0.91/lib-src" 
> "/Users/david/src/emacs-dev/ftp-versions/emacs-24.0.91/nextstep/")
>  This variable is potentially risky when used as a file local variable.
> Documentation:
> *List of directories to search programs to run in subprocesses.
> Each element is a string (directory name) or nil (try default directory).
> You can customize this variable.
> => Clearly, the /opt-directories are missing. I haven't tried but one might 
> just add all directories from PATH to exec-path, but whenever I change PATH, 
> I have to remember to do the same for exec-path. Is there a nicer way?
> Cheers,
> Marius

reply via email to

[Prev in Thread] Current Thread [Next in Thread]