Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

C++ Support #33

Open
jeetsukumaran opened this issue May 21, 2014 · 7 comments
Open

C++ Support #33

jeetsukumaran opened this issue May 21, 2014 · 7 comments

Comments

@jeetsukumaran
Copy link

Is it possible to have this? Thanks,

@AndrewRadev
Copy link
Owner

Could you describe what kind of support you'd like? I don't really write C++, so I can't tell what would be useful.

For instance, take a look at the recent pull request that adds C support, #36. Are some of these things useful to you?

If clauses

if (val1 && val2 || val3);

if (val1
        && val2
        || val3);

Function calls

myfunction(arg1, arg2, arg3, arg4);

myfunction(arg1,
        arg2,
        arg3,
        arg4);

@jeetsukumaran
Copy link
Author

Hi Andrew,

That would do it in 90% of the cases, I imagine. In fact, I think it would work with a number of other languages as well, such as Java etc. [Related to this: It would be nice to be able to activate SplitJoin for a particular filetype on another filetype (e.g., use "C/C++"-mode SplitJoin in a Java file) for cases like this: maybe I should submit this as a separate issue?]

The only C++-specific thing I could add, if I were to be greedy, is for initializer lists in constructors:

Initializer Lists

From:

SomeType(SomeType&& other) : namespace1::TemplateType<double>(std::move(other)) , attr1(std::move(other.desc_path_lens_)) , attr2(other.num_leaves_) {
}

To:

SomeType(SomeType&& other)
        : namespace1::TemplateType<double>(std::move(other))
        , attr1(std::move(other.desc_path_lens_))
        , attr2(other.num_leaves_) {

}

But, as I said, that is me being greedy. The pull request you reference really would be quite serviceable for most folks for most of the cases.

@AndrewRadev
Copy link
Owner

Technically, you can re-use splitters and joiners. If you take a look at the ftplugin directory, https://github.com/AndrewRadev/splitjoin.vim/tree/master/ftplugin, you'll notice that for each filetype there's a separate folder with a single file, splitjoin.vim. The contents of these files are quite simple, for instance, this is the C one:

if !exists('b:splitjoin_split_callbacks')
  let b:splitjoin_split_callbacks = [
        \ 'sj#c#SplitIfClause',
        \ 'sj#c#SplitFuncall',
        \ ]
endif

if !exists('b:splitjoin_join_callbacks')
  let b:splitjoin_join_callbacks = [
        \ 'sj#c#JoinFuncall',
        \ 'sj#c#JoinIfClause',
        \ ]
endif

The two variables just hold a list of functions to attempt for splitting and joining. They can be overridden by users if some callbacks should be excluded or for the sake of adding custom callbacks.

So, if you'd like to get the same things to work for java, you could just create an ftplugin/java.vim file in your own vimfiles and put the b:splitjoin_split_callbacks and b:splitjoin_join_callbacks initialization with a list of all the functions you'd like to use. Or even just runtime! ftplugin/splitjoin/c.vim, if you just want the whole filetype.

Of course, this does require a little bit Vimscript knowledge. Still, I can't think of a good way to share the definitions and keep the simplicity of the ftplugin setup at the same time.

As for the initializer lists, I'll see what I can do.

@jeetsukumaran
Copy link
Author

Hi Andrew, was not aware of this. This does make custom application of logic very flexible. Thank you!

@ViRu-ThE-ViRuS
Copy link

its been ~8 years since last message here, wanted to know if anyone is working on it?

@AndrewRadev
Copy link
Owner

@ViRu-ThE-ViRuS Do you mean the initializer list? I haven't worked on it, I'm afraid. I don't write C++ myself. I think I gave it a shot at the time, but ran into problems parsing the content. I could try it again, see how far I can take it -- is this the feature you're looking for? Maybe you could share a few more examples so I can have an idea of edge cases I might run into?

@ViRu-ThE-ViRuS
Copy link

ViRu-ThE-ViRuS commented Apr 4, 2022

Hey @AndrewRadev! this is the feature im looking for, but its okay if it doesn't exist yet. I just feel the lack of a plugin which can easily collapse single line if/else blocks, and also split them to make adding additional lines to each block easier.
Other than in this case, I don't really feel the need for C/C++ support.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants