5133 Commits

Author SHA1 Message Date
Jiří Techet
77f6e98de8 Add scope completion for namespaces
Pop up scope completion dialog for namespaces too; e.g. for

boost::

show all symbols defined in the namespace. Determine whether the namespace
scope completion should be used based on whether user typed a scope
separator. If so, perform completion for namespaces before normal scope
completion - this seems to work better e.g. for Scintilla where

Scintilla::

would otherwise pop up the varible sci instead of showing everything
in the namespace (might be more questionable for languages where
the scope separator is identical to the dereference operator like
Java's "." but we have to make some choice anyway).

The performance seems to be reasonable - for the completion all tags
have to be walked but after testing with big C++ projects like
boost and Mozilla, the completion takes only something like 0.2s
which is acceptable as the delay happens only on typing the scope
completion separator and feels kind of expected.

Also tested with linux kernel sources which normally lack any scope
information by hacking TM a bit and injecting 10-character scope for
each tag - then the completion takes something over 0.5s.
2016-02-26 01:09:59 +01:00
Jiří Techet
b46e183cbc Move the popup 1px further so it isn't below mouse pointer
Otherwise the mouse pointer highlights a wrong value if the popup is
large enough to extend above the mouse pointer.
2016-02-26 00:05:22 +01:00
Colomban Wendling
c8dd52eb46 Position the popup at the very click position if any 2016-02-26 00:05:22 +01:00
Colomban Wendling
653990c011 Pass the actual event button to gtk_menu_popup()
In case it's actually useful.  Also properly free the GdkEvent returned
by gtk_get_current_event().
2016-02-26 00:05:22 +01:00
Jiří Techet
a168f69887 Make sure the mouse cursor is out of the popup
The x coordinate is now taken from the scintilla caret position. However,
when performing ctrl+click, we have to distinguish two cases:

1. the click happens in the second half of a letter - in this case the caret
is placed behind the letter and the popup appears behind it - no problem

2. the click happens in the first part of a letter - caret is placed before
the letter and the popup appears before the position where the click
happened - this means that the mouse cursor is above the popup which causes
that the mouse cursor highlights the item at the position of the cursor
instead of having the first item in the menu highlighted.

The patch calculates offset between caret and the mouse click event
position and uses this value to adjust the popup positioning so it's
outside the mouse cursor.
2016-02-26 00:05:22 +01:00
Colomban Wendling
848a123f00 Improve placement of the goto tag popup 2016-02-26 00:05:22 +01:00
Jiří Techet
1f9bfdf65f Set push_in parameter to false
This behaves a bit strangely when the list is long and when clicked at the
bottom of the screen (the top part of the popup is empty).
2016-02-26 00:05:22 +01:00
Jiří Techet
61582a42f9 Always select the first item for better keyboard manipulation
Even when the user Ctrl+clicks to perform goto tag definition, it should
be possible to select the item from the list using keyboard (and have
the first item automatically selected so ctrl+click plus enter afterwards
always gets you somewhere).
2016-02-26 00:05:22 +01:00
Colomban Wendling
943bfa52c5 Re-implement goto tag popup with a poped-up GtkMenu 2016-02-26 00:05:22 +01:00
Jiří Techet
4c0c76e6f4 If more tags are found during tag definition/declaration goto, let user select which one to use
If only a single tag is found, just perform the goto. If more tags are found,
show them in a popup. Try to help the user find the right file by
putting the "best" tag at the first position and emphasizing it.

Thanks to Colomban Wendling for various improvements of this patch.
2016-02-26 00:03:45 +01:00
Thomas Martitz
1f53552007 Undo removal of "can be NULL" remark
Also remove a unecessary empty line.
2016-02-25 14:50:25 +01:00
Thomas Martitz
3d51d8f6a6 GeanyFiletypeGroupID shall be gir-only 2016-02-25 14:49:18 +01:00
Thomas Martitz
17e4a604c5 plugin api: export editor_set_indent_width()
Plugins can now change the indentation width of an editor.

Closes #903.
2016-02-25 00:45:47 +01:00
Colomban Wendling
3973892e29 Move deprecated setptr() macro inside GEANY_DISABLE_DEPRECATED guards 2016-02-24 19:29:44 +01:00
Enrico Tröger
756d3ce5b0 Allow spawn debug output also with GEANY_DEBUG
And remove a trailing unnecessary newline in the debug message.
2016-02-22 00:57:12 +01:00
Colomban Wendling
b22fbe734c Mark deprecated API so GCC can warn about it
Also suggest replacement when appropriate.
2016-02-21 02:09:45 +01:00
Colomban Wendling
b4c3d6a737 Move deprecated declarations inside GEANY_DISABLE_DEPRECATED guards
Not all deprecated declarations were guarded this way, making it harder
to catch them.
2016-02-21 01:57:35 +01:00
Thomas Martitz
2280ca4303 project: fix build with old glib versions 2016-02-20 22:44:13 +01:00
Colomban Wendling
2f55540f75 Merge pull request #582 from techee/tags_are_symbols
Use the word "symbol" instead of "tag" in the UI and documentation
2016-02-17 22:54:55 +01:00
Jiří Techet
9b686871de Use the word "symbol" instead of "tag" in the UI and documentation
For users a tag is <this> so the naming can be confusing.

The only exception where we probably shouldn't use the word symbol is the
"tags file" (*.tags) containing global tags - this has already the "tags"
extension and is more related to ctags and using "symbols file" is a bit
strange in this case.

As a result, the only places where this patch leaves the word "tag" are:

* phrase "tags file(s)"
* phrase "tags parser(s)"
* documentation mentioning the "tags" directory
* documentation mentioning the *.tags extension

and of course where it means the HTML/XML markup <thing>. The rest of the
uses of the word "tag" is replaced with "symbol".

Documentation is updated accordingly.

Fixes #579.
2016-02-17 22:38:00 +01:00
Colomban Wendling
444a18b5e1 calltips: Allow for C++-style explicit specialization after the name
Closes #496.

Based on PR#496 by @DThought, thanks.
2016-02-17 18:49:32 +01:00
Colomban Wendling
989e0df412 calltips: Allow for more than one space between the brace and the word 2016-02-17 18:46:16 +01:00
Colomban Wendling
d0cd111883 Merge pull request #575 from techee/colourise
Colourise only the visible area when highlighting typenames
2016-02-17 17:37:21 +01:00
Colomban Wendling
372d7632e8 Merge branch 'tsahlin/more-cc-kb'
Closes #858.
2016-02-16 22:24:24 +01:00
Thomas Sahlin
74e3dd6d1c Added keybindings for custom commands 4-9 2016-02-16 22:21:34 +01:00
Thomas Martitz
607c95ed98 stash: drop @transfer annotation, not needed for boxed types 2016-02-16 15:50:01 +01:00
Thomas Martitz
f2ebd288b3 doc: gir annotations cleanup
- @skip -> @girskip
- @null -> @nullable
- @addtogir -> @gironly
- changed internal xml representation of @cb, @cbdata, @cbfree
- @girskip keybindings_set_item() too
2016-02-16 07:14:27 +01:00
Thomas Martitz
7279037dd6 project: change GeanyProject::file_patterns type to GStrv
GStrv is identical to gchar ** (as per typedef) but a bit more gir friendly.
This does not break the ABI or API.
2016-02-16 06:52:03 +01:00
Colomban Wendling
8dd7759048 spawn: Don't truncate a NULL GString 2016-02-13 18:23:10 +01:00
Colomban Wendling
a775da0714 Merge pull request #862 from techee/tm_workspace_find_cleanup3
Rewrite scope completion v3.

Closes #488 and #505.
2016-02-11 15:30:09 +01:00
Thomas Martitz
bfa0946420 doxygen: various doxygen-related fixes in preparation for gtkdoc generation 2016-02-07 17:50:23 +01:00
Colomban Wendling
496d51210c Merge pull request #839 from kugel-/gboxed-types
GBoxed types
2016-01-25 23:10:37 +01:00
Thomas Martitz
43737733ac plugin api: convert StashGroup to GBoxed internally
Because the stash_group_new() is an exported API, it has to be at least a boxed
type to be usable for gobject introspection. The boxed type uses reference
counting as opposed to memory duplication.

The obligatory stash_group_dup() is not exported (doesn't have to).
2016-01-19 17:08:59 +01:00
Jiří Techet
cd1a58f0a5 Use language-specific context separator instead of hard-coded "::"
This makes it possible to popup scope completion dialog for more languages.
2016-01-18 22:56:10 +01:00
Jiří Techet
981320c3b8 Skip [] when performing scope autocompletion
In addition to skipping function parameters, we can also skip indexes so
in something like

foo[2].

we get autocompletion for foo's type members.
2016-01-18 22:56:10 +01:00
Jiří Techet
ad77ee15da Add a "prefix" search for non-scope autocompletion
The main reason for separating m_workspace_find() into two parts is the
fact that when matching only the prefix, the result may contain too
many results and we need to go through all of them, return them and at the
end discard most of them.

For instance, when considering the linux kernel project with 2300000 tags
and when autocompletion is set to be invoked after typing a single character,
we get on average something like 100000 results (tag_num/alphabet_size).
But from these 100000 results, we get only the first 30 which we display
in the popup and discard the rest which means going through the list of
the 100000 tags and comparing them for no reason.

Thanks to using binary search for the start and the end of the sequence of
matching tags (added in a separate patch), we can get the start of the
sequence and the length of the sequence very quickly without going through
it.

For the prefix search we can limit the number of tags we are interested
in and go through at most this number of returned tags (to be precise,
times two, because we need to go both through the workspace array and
global tags array and remove the extras only after sorting the two).

It would be possible to combine both tm_workspace_find() and
tm_workspace_find_prefix() into a single function but the result is a bit
hard to read because some of the logic is used only in tm_workspace_find()
and some only in tm_workspace_find_prefix() so even though there is some
code duplication, I believe it's easier to understand this way.
2016-01-18 22:56:10 +01:00
Jiří Techet
7a3d6a4ee1 Filter scope autocompletion list based on user input
When scope autocompletion list shows, start filtering it when
when the user types some more characters. As long as the list
is non-empty, don't switch to normal autocompletion and show
only the scope autocompletion results.
2016-01-18 22:56:10 +01:00
Jiří Techet
932dc71fe2 Don't use struct/class/... member types when the edited text isn't a member
For instance, consider

class A {
    int a;
    int b;
}

class B {
    A c;
    void foo() {
        c.    //<---- (3)
    }
}

int main() {
    c.    //<---- (1)
    foo.c.    //<---- (2)
}

Consider cases (1) and (2) first - in the case (1) scope completion
shouldn't be performed because c isn't a global variable; however,
in case (2) it should be performed because c is a member.

To fix this, we can check whether the typed variable ('c' in this case)
is preceeded by another dot - if it is, use member tags for scope
completion; otherwise don't use them.

There's one exception from this rule - in the case (3) we are accessing
a member variable from a member function at the same scope so the
function should have access to the variable. For this we can use the
scope at the position of the cursor. It should be

B::foo

in this case, more generally ...::class_name::function_name. We need
to check if class_name exists at the given scope and if the member
variable we are trying to access is inside ...::class_name - if so,
scope completion can be performed using member tags (without explicit
invocation on a member).
2016-01-18 22:55:02 +01:00
Colomban Wendling
bfd5587f4f Merge pull request #852 from b4n/reflow-hang
Fix hang in reflow command (and small improvements around)
2016-01-18 03:40:56 +01:00
Colomban Wendling
a7ce20dc59 Merge pull request #826 from kugel-/doxygen-fixes2
Doxygen API fixes and cleanup.
2016-01-18 03:19:15 +01:00
Thomas Martitz
9f6f6cfb78 gir: keybindings: adhere to user_data naming convention
This helps g-ir-scanner recognizing the data parameter as context storage,
allowing object methods to be used as callback (via wrappers). It goes even
so far that g_object_unref is propery passed as destroy func to
keybindings_set_item_full() and plugin_set_key_group_full().
2016-01-17 14:13:45 +01:00
Colomban Wendling
6e0d4ac6ec Merge pull request #581 from techee/symbollist_sort
Make it possible to define default symbol_list_sort_mode
2016-01-13 17:43:03 +01:00
Thomas Martitz
740ecb00fb doxygen: fix doxygen warnings about filetypes_array references. 2016-01-12 07:15:54 +01:00
Jiří Techet
1ea072e125 Make it possible to define default symbol_list_sort_mode
Both sorting by name and appearance makes sense for most languages. Some
users may prefer sorting by appearance so make it configurable in
preferences (the possibility to override the settings for specific
filetypes is preserved).

Thanks to Colomban Wendling for lots of improvements of this patch.

Fixes #313.
2016-01-11 23:36:50 +01:00
Colomban Wendling
e7429d4cdb Merge branch 'gb-new'
Nothing to see here, is there :)
2016-01-11 02:31:01 +01:00
Jiří Techet
e0122592d9 Perform scope autocompletion based on function return types
We just need to skip the (...) and perform autocompletion as before.

Shift pos by 1 in the whole function so we don't have to look 2 characters
back (makes the function easier to read).

Functions contain pointers in their return values - remove them before
searching for the type.

Also restrict the searched variable/function/type tags a bit only to
types which make sense for the search.
2016-01-10 12:36:08 +01:00
Jiří Techet
4bc5f4a7e4 Popup scope autocompletion dialog in more cases
* for PHP and Rust scope separator ::
* when there's more than one whitespace between the identifier and operator
2016-01-10 12:36:08 +01:00
Jiří Techet
13755122f2 Move symbols_get_context_separator() implementation to TM
This way we can use it inside TM.
2016-01-10 12:31:47 +01:00
Jiří Techet
b6b93036f6 Get scope members only from corresponding tag arrays
At the moment it can happen that even though a member is found in the
currently edited file, the search at the end of the function finds
the type inside another file. This typically happens for anonymous
structs so e.g. for anon_struct_0{...} from the current file we get
members from anon_struct_0{...} from all open documents plus gloabl tags.

Search in an increasing "circle" - start with current file only (trying
all possible types of the variable), continue with workspace array and
finally, if not found, search in the global tags.
2016-01-10 12:31:02 +01:00
Colomban Wendling
28f7c169fc Merge pull request #652 from b4n/kb/file-properties
Allow to set a keybinding for File->Properties
2016-01-09 20:07:23 +01:00