Monday, June 15, 2015

Re: extglob unset when filtering/writing text lines to bash

On Monday, June 15, 2015 at 9:11:12 PM UTC-4, Gary Johnson wrote:
> I had the same problem a while back, but in my case I could verify
> that my ~/.bashrc was _not_ being sourced when Vim executed bash.
>
>On 2015-06-15, Paul wrote:
>> To track down the cause, I created the dummy text line
>>
>> shopt -p extglob
>>
>> and used diagnostic echo commands to ensure that the above 2
>> invocations of bash actually execute ~/.bashrc and ~/.alias.bash
>> (they do). For both bash invocations, extglob is unset.
>
> Your observation that extglob is not set contradicts your claim that
> ~/.bashrc is being sourced.

Indeed, that's part of the puzzle.

> As you say later, it should not be.
> How did you determine that ~/.bashrc is being sourced?

In each of.bashrc and .alias.bash, I put echo statements saying that
the files is being run. In all my tests so far, they have run, though
as I said, I'm not sure why. They're not suppose to as far as I
understand (which is not a very high bar!).

> Having determined in my case that ~/.bashrc was not being sourced
> when Vim invoked bash (except as :sh), and not really wanting it to
> be sourced in that case because of the overhead, I found two
> solutions.
>
> One is to put the following in my ~/.vimrc:
>
> set shellcmdflag=-O\ extglob\ -c

Based on your post, I tried each of the following:

set shellcmdflag=-i\ -c
set shellcmdflag=-O\ extglob\ -c

For each setting, I rested the cursor on the following text line:

shopt -p extglob

and tried each of the following:

!!bash
:. w !bash

For each test, both ~/.bashrc and ~/.alias.bash ran, but extglob was
unset.

> The other, which I currently use, is to create a file,
> ~/.vim/bash_env.sh, which contains the following:
>
> shopt -s extglob # Enable !(pattern-list).
>
> and then put this in my ~/.vimrc:
>
> if !exists("$BASH_ENV") || $BASH_ENV == ""
> if filereadable($HOME . "/.vim/bash_env.sh")
> let $BASH_ENV = "$HOME/.vim/bash_env.sh"
> endif
> endif
>
> The second seems more robust to me in part because I use the same
> ~/.vimrc on a variety of machines and OSes and the first solution
> doesn't work on Vims older that 7.3.269.

I looked up BASH_ENV, and I see what you're doing. However, my vimrc
(which is confirmed to run) explicitly does shopt -s extglob. In
fact, I added an immediately subsequent shopt -p extglob, which
confirms that extglob was successfully enabled. That's great when
~/.bashrc is running, but once that's done, it seems that it doesn't
persist to the point where the code banged out from vim is run. Very,
very weird.

It's late, but I've got your example code above to try when I get a
few extra moments. It's obvious that the shopt setting of extglob
gets dropped sometime between completion of ~/.bashrc and execution of
the code that is banged out from vim. BASH_ENV may solve the problem
because it is persistent, and may get picked up by whatever bash
process actually ends up running the banged out code.

Thanks.

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments: