Understanding automatic vimrc sourcing

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Understanding automatic vimrc sourcing

Oleksii Vilchanskyi
Hello,

* What I want:

Be able to do :w after editing $MYVIRC and have vim source the new
version of config. Basically, just execute `source %` automatically.

* What I have tried (all examples are launched with `vim -u testvimrc`):

So, this works without any error, as supposed:
> set nocompatible
> filetype plugin indent on
> syntax on
>
> augroup vimrc
> autocmd!
> autocmd BufWritePost testvimrc source testvimrc | echom "Reloaded"
> augroup END

However, if I try wrapping it in a function, E127 occurs:

> set nocompatible
> filetype plugin indent on
> syntax on
>
> augroup vimrc
> autocmd!
> autocmd BufWritePost testvimrc call s:ReloadRC("testvimrc")
> augroup END
>
> function! s:ReloadRC(rc)
> exec 'source ' . a:rc | echom "Reloaded " . a:rc
> endfunction
Whenever I do :w, I see:
> E127: Cannot redefine function <SNR>1_ReloadRC: It is in use

But at the same time it doesn't abort and I see:
> Reloaded testvimrc
, so it looks like the new vimrc gets sourced regardless?..

* My questions:
1) Why doesn't this work if wrapped into a function, but does, if
written out directly?
2) Why, if an error occurs, I still see "Reloaded testvimrc"?
3) Does it have anything to do with reentrancy?
4) Is it possible to make it work through calling a function (since I
would want to do the same for gvimrc (as well as vimrc), and don't want
to have repetitive code, instead using a reusable function code)?

Thank you in advance.
--
Regards,
Oleksii Vilchanskyi
PGP:0x8D3A0E046BDE941F2A53867CE3FD952D48C0B338

--
--
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 [hidden email].
For more options, visit https://groups.google.com/d/optout.

signature.asc (849 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Understanding automatic vimrc sourcing

Tony Mechelynck
On Tue, Aug 21, 2018 at 12:22 PM, Oleksii Vilchanskyi
<[hidden email]> wrote:

> Hello,
>
> * What I want:
>
> Be able to do :w after editing $MYVIRC and have vim source the new
> version of config. Basically, just execute `source %` automatically.
>
> * What I have tried (all examples are launched with `vim -u testvimrc`):
>
> So, this works without any error, as supposed:
>> set nocompatible
>> filetype plugin indent on
>> syntax on
>>
>> augroup vimrc
>>       autocmd!
>>       autocmd BufWritePost testvimrc source testvimrc | echom "Reloaded"
>> augroup END
>
> However, if I try wrapping it in a function, E127 occurs:
>> set nocompatible
>> filetype plugin indent on
>> syntax on
>>
>> augroup vimrc
>>       autocmd!
>>       autocmd BufWritePost testvimrc call s:ReloadRC("testvimrc")
>> augroup END
>>
>> function! s:ReloadRC(rc)
>>       exec 'source ' . a:rc | echom "Reloaded " . a:rc
>> endfunction
>
> Whenever I do :w, I see:
>> E127: Cannot redefine function <SNR>1_ReloadRC: It is in use
>
> But at the same time it doesn't abort and I see:
>> Reloaded testvimrc
> , so it looks like the new vimrc gets sourced regardless?..
>
> * My questions:
> 1) Why doesn't this work if wrapped into a function, but does, if
> written out directly?
> 2) Why, if an error occurs, I still see "Reloaded testvimrc"?
> 3) Does it have anything to do with reentrancy?
> 4) Is it possible to make it work through calling a function (since I
> would want to do the same for gvimrc (as well as vimrc), and don't want
> to have repetitive code, instead using a reusable function code)?
>
> Thank you in advance.
> --
> Regards,
> Oleksii Vilchanskyi
> PGP:0x8D3A0E046BDE941F2A53867CE3FD952D48C0B338

See :help E127

To replace a function with an existing name, you need an exclamation
mark after :function. This can be dangerous. IIUC, what happened to
you is that (without an exclamation) Vim gave the error message, did
not replace the function, and later executed the _old_ version of that
function. If you happened not to change that part of your vimrc, it
can be just what you want; but beware of shooting yourself in the
foot.

The approved way to reload your vimrc after changing it is to shutdown
Vim then restart it. Any other method is full of corner cases which
can be hard to debug.

Best regards,
Tony.

--
--
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 [hidden email].
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Understanding automatic vimrc sourcing

Christian Brabandt
In reply to this post by Oleksii Vilchanskyi

On Di, 21 Aug 2018, Oleksii Vilchanskyi wrote:

> However, if I try wrapping it in a function, E127 occurs:
> > set nocompatible
> > filetype plugin indent on
> > syntax on
> >
> > augroup vimrc
> > autocmd!
> > autocmd BufWritePost testvimrc call s:ReloadRC("testvimrc")
> > augroup END
> >
> > function! s:ReloadRC(rc)
> > exec 'source ' . a:rc | echom "Reloaded " . a:rc
> > endfunction
>
> Whenever I do :w, I see:
> > E127: Cannot redefine function <SNR>1_ReloadRC: It is in use

Yes, what happens when you execute the function is, you reload your
.vimrc which will redefine your function, while the function is
executed. This is not allowed and causes the error message. Either do
not use a function, or define your function inside e.g.
~/.vim/plugins/reload.vim or similar.

Best,
Christian
--
Jeder Mensch ist einzigartig.
                -- Benedetto Croce

--
--
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 [hidden email].
For more options, visit https://groups.google.com/d/optout.