>> > Thanks for the reply, actually these 2 commands are just examples from
>> > what I really would like to do. In more detail, I have a function:
>> >
>> > function! ReFold()
>> >     syn off | syn on
>> >     set foldmethod=expr
>> >     set foldexpr=0
>> >     syn region myFold start='{' end='}' transparent fold
>> >     syntax sync fromstart
>> >     set foldmethod=syntax
>> >     echo
>> > endfunction
>> >
>> > And whenever I call this function in a window it also effects the
>> > other windows. So my real question (sorry if I should have explained
>> > it better in the first email) is how to make the function ReFold act
>> > locally.
>
> The solution that I have in mind is this.
> Let's say your language is abc (perl, c, cpp, etc). Let's denote is abc
> for sake of this example.
>
> 1. Create file ~/.vim/after/synatx/abc-x.vim
> 2. Put this nito file abc-x.vim:
>
>    if exists("b:current_syntax") | finish | endif
>    runtime syntax/abc.vim
>    set foldmethod=expr
>    set foldexpr=0
>    syn region myFold start='{' end='}' transparent fold
>    syntax sync fromstart
>    set foldmethod=syntax
>
> 3. In the window where you want to turn own ReFold, you do
>    :set filetype=abc-x
> To reset folsing & back:
>    :set filetype=abc
>
> I expect this shall do it.
>
> Note that this solution will trigger your custom additions
> in all windows where filetype if abc-x, but leave intact windows
> with different filetypes.
>
> Explanation:
> The thing in your ReFold that scrambles syntax of other
> windows is 'syn off|syn on'. You need to avoid 'syn off|syn on' on
> one hand, and still preserve your local syntax-related commands.
> My solution above tries to to do exactly this.
>
> Yakov
>

In filetype-plugins or syntax scripts like this one, you should use
everywhere
":setlocal" rather than ":set" (:setlocal fdm=..., setlocal fde=..., etc.).
This will avoid clobbering the global defaults of the same options for
future
windows.

Similarly, from the command-line, use ":setlocal ft=abc" and "setlocal
ft=abc-x". You can abbreviate ":setlocal" to ":setl" or anything in-between.
The global default for 'filetype' should always be empty (check it with
":verbose setglobal ft?"), so when you do ":new foobar" (creating an empty
file whose name doesn't imply a filetype) it shouldn't get one, and when you
do ":new foobar.c" "new foobar.cpp" ":new foobar.htm" etc., it should get
the
proper default filetype (in these examples respectively c, cpp and html),
not
whatever you last set with ":set ft=...". (In the case of the file with the
ambiguous name, you can either ":setlocal" the 'filetype' manually, or else
use ":e" with no arguments to re-read it and reassess the filetype once
you've
entered the #!/bin/bash shebang line or whatever.)


Thanks a lot, this was exactly what I was looking for. Now my whole
function is really local, thanks again.

Reply via email to