* Navigating an enormous code base
@ 2022-04-26 2:31 John Yates
2022-04-26 6:06 ` Daniel Fleischer
` (3 more replies)
0 siblings, 4 replies; 24+ messages in thread
From: John Yates @ 2022-04-26 2:31 UTC (permalink / raw)
To: Help Gnu Emacs mailing list
At my day job I work on a 35 year old product with literally
a few hundred million lines of codes. It is essentially a
mono-repo.
There are thousands of directory trees with Makefiles. To be
consistent with Emacs concepts, let's call these 'projects'.
Luckily projects are rarely nested, and not in the areas I work
on. There is no discipline requiring file names be unique across
projects, nor even within projects. Furthermore, within any
project there can be multiple unittest/ and/or pkgtest/
directories. Each such directory must contain a
suite_registration.cpp.
Most often I work within a single project and want to navigate to
files in the same project. Less frequently I need to find a file
in a sibling project. Unfortunately, there are ~400 siblings,
though I very rarely visit more than 10.
With recent attempts to work within Emacs' built-in tools, I
wonder how I find files in this code base. Or if Emacs lacks
adequate built-in tooling, what package(s) might help?
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-26 2:31 Navigating an enormous code base John Yates
@ 2022-04-26 6:06 ` Daniel Fleischer
2022-04-26 11:03 ` Eli Zaretskii
` (2 subsequent siblings)
3 siblings, 0 replies; 24+ messages in thread
From: Daniel Fleischer @ 2022-04-26 6:06 UTC (permalink / raw)
To: John Yates; +Cc: Help Gnu Emacs mailing list
John Yates [2022-04-25 Mon 22:31] wrote:
> With recent attempts to work within Emacs' built-in tools, I
> wonder how I find files in this code base. Or if Emacs lacks
> adequate built-in tooling, what package(s) might help?
There's projectile, which is very good:
https://github.com/bbatsov/projectile
--
Daniel Fleischer
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-26 2:31 Navigating an enormous code base John Yates
2022-04-26 6:06 ` Daniel Fleischer
@ 2022-04-26 11:03 ` Eli Zaretskii
2022-04-26 12:53 ` John Yates
2022-04-26 12:49 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-04-27 7:59 ` Marcus Harnisch
3 siblings, 1 reply; 24+ messages in thread
From: Eli Zaretskii @ 2022-04-26 11:03 UTC (permalink / raw)
To: help-gnu-emacs
> From: John Yates <john@yates-sheets.org>
> Date: Mon, 25 Apr 2022 22:31:44 -0400
>
> At my day job I work on a 35 year old product with literally
> a few hundred million lines of codes. It is essentially a
> mono-repo.
>
> There are thousands of directory trees with Makefiles. To be
> consistent with Emacs concepts, let's call these 'projects'.
> Luckily projects are rarely nested, and not in the areas I work
> on. There is no discipline requiring file names be unique across
> projects, nor even within projects. Furthermore, within any
> project there can be multiple unittest/ and/or pkgtest/
> directories. Each such directory must contain a
> suite_registration.cpp.
>
> Most often I work within a single project and want to navigate to
> files in the same project. Less frequently I need to find a file
> in a sibling project. Unfortunately, there are ~400 siblings,
> though I very rarely visit more than 10.
>
> With recent attempts to work within Emacs' built-in tools, I
> wonder how I find files in this code base. Or if Emacs lacks
> adequate built-in tooling, what package(s) might help?
In what language(s) is this written?
Can you tell more about what you mean by "how I find files"? Like
show an example or two of use cases where you need to 'find files"?
And what built-in tools did you try to solve those problems?
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-26 2:31 Navigating an enormous code base John Yates
2022-04-26 6:06 ` Daniel Fleischer
2022-04-26 11:03 ` Eli Zaretskii
@ 2022-04-26 12:49 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-12-14 3:47 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-04-27 7:59 ` Marcus Harnisch
3 siblings, 1 reply; 24+ messages in thread
From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2022-04-26 12:49 UTC (permalink / raw)
To: help-gnu-emacs
> Most often I work within a single project and want to navigate to
> files in the same project.
I think we have tools for that, such as `project-find-file` (and I'm
pretty sure there are several alternatives in third party packages).
> Less frequently I need to find a file in a sibling project.
> Unfortunately, there are ~400 siblings, though I very rarely visit
> more than 10.
I don't know of a tool for that, but I'd be interested. I never have
400 siblings (more like less than 10), but I jump between siblings very
often.
There could be several notions of "sibling":
- jump from /foo/bar/main/src/hello.c to /foo/bar/stable/src/hello.c.
- jump from /foo/bar/main/src/hello.c to /foo/bar/main/test/src/hello-tests.el.
- jump from /foo/bar/main/src/hello.c to /foo/bar/main/src/hello.h.
Not sure if we'd want to treat them together or separately (we already
have code to switch between .h and .c).
Stefan
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-26 11:03 ` Eli Zaretskii
@ 2022-04-26 12:53 ` John Yates
2022-04-26 14:06 ` Emanuel Berg via Users list for the GNU Emacs text editor
0 siblings, 1 reply; 24+ messages in thread
From: John Yates @ 2022-04-26 12:53 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: Help Gnu Emacs mailing list
On Tue, Apr 26, 2022 at 7:03 AM Eli Zaretskii <eliz@gnu.org> wrote:
>
> In what language(s) is this written?
Primarily C++. But there are Makefiles, bash scripts, ad hoc text
files, xml, json, etc.
> Can you tell more about what you mean by "how I find files"? Like
> show an example or two of use cases where you need to 'find files"?
Within the current project I want to open a specific
suite_registraction.cpp in one of multiple unittest/
or pkgtest/ directories.
In some project, could be the current project, could be a sibling
project, I want to open a specific file.
My goal is not so much navigating by symbols (I have lsp for
that). Rather it is more of a UI question. I want to use a modern
completion interface to open files by name. Supporting completion
requires that the space of possible file names be indexed and
supplied to the completion function.
As mentioned in my first post, an issue is how should the
completion UI present files with duplicate names.
Another issue is what should be the scope of file name (paths)
fed to the completion UI. Here I can imagine the following
possibilities:
* The current project
* An explicitly specified sibling project
* Within the current workspace, all projects in which I have made
changes (perhap via after-save-hook)
* One of various pre-specified canned sets of projects
I could imagine splitting this UI into:
* Find in current project
* Find within a menu of wider contexts
> And what built-in tools did you try to solve those problems?
I have not tried any built-in tools yet. I do have a private
wsf.el (WorkSpace Files) package that indexes as much of a
workspace as I am ever likely visit:
https://github.com/jsyjr/wsf/blob/main/wsf.el
It is single threaded and rather slow (10 minutes to index a
workspace on a local SSD). Currently I use ivy to browse the
index and open files. Loading and caching the index in memory
takes 5 or 10 seconds. (There can only be one workspace active
at any time.) Once loaded, ivy interactivity is not great.
I am now using the whole vertico / marginalia / corfu / etc stuff
and want to ditch using ivy with my wsf. Ideally I would like to
ditch wsf as well. Hence this posting.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-26 12:53 ` John Yates
@ 2022-04-26 14:06 ` Emanuel Berg via Users list for the GNU Emacs text editor
0 siblings, 0 replies; 24+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2022-04-26 14:06 UTC (permalink / raw)
To: help-gnu-emacs
John Yates wrote:
>> In what language(s) is this written?
>
> Primarily C++. But there are Makefiles, bash scripts, ad hoc
> text files, xml, json, etc.
Yeah, the exact traditional fail case for Emacs and Eli can
tell you all about it...
--
underground experts united
https://dataswamp.org/~incal
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-26 2:31 Navigating an enormous code base John Yates
` (2 preceding siblings ...)
2022-04-26 12:49 ` Stefan Monnier via Users list for the GNU Emacs text editor
@ 2022-04-27 7:59 ` Marcus Harnisch
2022-04-27 8:36 ` mrf
3 siblings, 1 reply; 24+ messages in thread
From: Marcus Harnisch @ 2022-04-27 7:59 UTC (permalink / raw)
To: help-gnu-emacs
GNU Global with the ggtags package (https://github.com/leoliu/ggtags)
help me wrangle my Project with roughly 10k source files. Global has an
option for specifying “nearness” sorting order, taking the starting
point of teh query into account. Completion/narrowing interfaces would
still present all candidates, but the nearer ones come out first.
I am quite happily using ggtags with Helm in this setup.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-27 7:59 ` Marcus Harnisch
@ 2022-04-27 8:36 ` mrf
2022-04-27 16:35 ` Emanuel Berg via Users list for the GNU Emacs text editor
0 siblings, 1 reply; 24+ messages in thread
From: mrf @ 2022-04-27 8:36 UTC (permalink / raw)
To: Marcus Harnisch; +Cc: help-gnu-emacs
Marcus Harnisch writes:
> GNU Global with the ggtags package (https://github.com/leoliu/ggtags)
> help me wrangle my Project with roughly 10k source files. Global has an
> option for specifying “nearness” sorting order, taking the starting
> point of teh query into account. Completion/narrowing interfaces would
> still present all candidates, but the nearer ones come out first.
>
> I am quite happily using ggtags with Helm in this setup.
I prefer GNU global but also there is other options that have emacs
integration like CTags and CScope:
http://ctags.sourceforge.net/
http://cscope.sourceforge.net/
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-27 8:36 ` mrf
@ 2022-04-27 16:35 ` Emanuel Berg via Users list for the GNU Emacs text editor
2022-04-27 22:59 ` John Yates
0 siblings, 1 reply; 24+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2022-04-27 16:35 UTC (permalink / raw)
To: help-gnu-emacs
mrf wrote:
>> GNU Global with the ggtags package
>> (https://github.com/leoliu/ggtags) help me wrangle my
>> Project with roughly 10k source files. Global has an option
>> for specifying “nearness” sorting order, taking the
>> starting point of teh query into account.
>> Completion/narrowing interfaces would still present all
>> candidates, but the nearer ones come out first.
>>
>> I am quite happily using ggtags with Helm in this setup.
>
> I prefer GNU global but also there is other options that
> have emacs integration like CTags and CScope
What problem(s) in particular are we encountering when the code
base gets enormous?
--
underground experts united
https://dataswamp.org/~incal
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-27 16:35 ` Emanuel Berg via Users list for the GNU Emacs text editor
@ 2022-04-27 22:59 ` John Yates
2022-04-28 0:46 ` Emanuel Berg
2022-04-28 6:42 ` Marcus Harnisch
0 siblings, 2 replies; 24+ messages in thread
From: John Yates @ 2022-04-27 22:59 UTC (permalink / raw)
To: Emanuel Berg, Help Gnu Emacs mailing list
Start with feeding a completion interface:
* Do you index on demand? If no, then when? And how do you
keep the index upto date?
* Indexing the entire workspace will result in an intractably
large index. So how do you partition it?
* Is the user restricted to querying a single partition of the
index? If yes, then that feels painfully restrictive. If no,
how does that user indicate which partition indices to combine?
How is combining accomplished?
* How are duplicate filenames handled?
Need I say more?
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-27 22:59 ` John Yates
@ 2022-04-28 0:46 ` Emanuel Berg
2022-04-28 6:42 ` Marcus Harnisch
1 sibling, 0 replies; 24+ messages in thread
From: Emanuel Berg @ 2022-04-28 0:46 UTC (permalink / raw)
To: help-gnu-emacs
John Yates wrote:
> Do you index on demand? If no, then when? And how do you
> keep the index upto date?
>
> Indexing the entire workspace [...]
What kind of index are we talking?
> How are duplicate filenames handled?
Non-duplicate paths?
--
underground experts united
https://dataswamp.org/~incal
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-27 22:59 ` John Yates
2022-04-28 0:46 ` Emanuel Berg
@ 2022-04-28 6:42 ` Marcus Harnisch
2022-04-28 7:39 ` Leo Liu
` (2 more replies)
1 sibling, 3 replies; 24+ messages in thread
From: Marcus Harnisch @ 2022-04-28 6:42 UTC (permalink / raw)
To: help-gnu-emacs
On 28/04/2022 00.59, John Yates wrote:
> Start with feeding a completion interface:
>
> * Do you index on demand? If no, then when? And how do you
> keep the index upto date?
As far as my work pattern with Global/ggtags is concerned, I create a
full index rarely. Usually only when the repository can be expected to
have changed significantly (pull, merge with upstream, etc).
Global can do single-file updates, which I think ggtags executes in
‘after-save-hook’ or something, so your own changes will be tracked.
Creating the database with the sqlite3 backend is supposed to perform
much better with these partial updates.
Since I spend most of my time in my little niche this is sufficient for
my purposes and even if there have been small updates outside, the
location I will be taken to is close enough most of the time (and a
little reminder for creating a full index).
> * Indexing the entire workspace will result in an intractably
> large index. So how do you partition it?
I don't bother and don't partition the project (comprising of 10k files,
and 50+ nested subprojects)
The total size of the DBs is about 60MB (files: 2, tags: 20, references:
38).
> * Is the user restricted to querying a single partition of the
> index? If yes, then that feels painfully restrictive. If no,
> how does that user indicate which partition indices to combine?
> How is combining accomplished?
See above.
> * How are duplicate filenames handled?
By storing path names.
Why don't you give it a whirl and see whether this suits you?
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-28 6:42 ` Marcus Harnisch
@ 2022-04-28 7:39 ` Leo Liu
2022-04-28 8:38 ` Marcus Harnisch
2022-04-28 14:30 ` John Yates
2022-04-28 14:50 ` John Yates
2 siblings, 1 reply; 24+ messages in thread
From: Leo Liu @ 2022-04-28 7:39 UTC (permalink / raw)
To: help-gnu-emacs
On 2022-04-28 08:42 +0200, Marcus Harnisch wrote:
> As far as my work pattern with Global/ggtags is concerned, I create a
> full index rarely. Usually only when the repository can be expected to
> have changed significantly (pull, merge with upstream, etc).
>
> Global can do single-file updates, which I think ggtags executes in
> ‘after-save-hook’ or something, so your own changes will be tracked.
> Creating the database with the sqlite3 backend is supposed to perform
> much better with these partial updates.
This is true. There is a customisable threshold ggtags-oversize-limit. I
used to test ggtags regularly on the Linux kernel source and it was very
fast IOW I was not disappointed.
If source files are changed outside emacs for example by git pull,
ggtags will notice and reindex. For example if M-. jumps to a location
that is off I often M-, and then M-. again to trigger reindex
immediately.
HTH,
Leo
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-28 7:39 ` Leo Liu
@ 2022-04-28 8:38 ` Marcus Harnisch
2022-04-28 10:45 ` Leo Liu
2022-04-28 14:34 ` John Yates
0 siblings, 2 replies; 24+ messages in thread
From: Marcus Harnisch @ 2022-04-28 8:38 UTC (permalink / raw)
To: help-gnu-emacs
On 28/04/2022 09.39, Leo Liu wrote:
> If source files are changed outside emacs for example by git pull,
> ggtags will notice and reindex. For example if M-. jumps to a location
> that is off I often M-, and then M-. again to trigger reindex
> immediately.
Thanks, I didn't even know that. However in my setup I use an explicit
file list (created by a gtags-hook script) rather than having gtags go
through all files, else a lot more files would be scanned (unnecessarily).
Ggtags won't be able to tell if files have been renamed or added, I am
afraid. (it might notice deletions, though)
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-28 8:38 ` Marcus Harnisch
@ 2022-04-28 10:45 ` Leo Liu
2022-04-28 14:34 ` John Yates
1 sibling, 0 replies; 24+ messages in thread
From: Leo Liu @ 2022-04-28 10:45 UTC (permalink / raw)
To: help-gnu-emacs
On 2022-04-28 10:38 +0200, Marcus Harnisch wrote:
> Thanks, I didn't even know that. However in my setup I use an explicit
> file list (created by a gtags-hook script) rather than having gtags go
> through all files, else a lot more files would be scanned (unnecessarily).
Yes this works too.
> Ggtags won't be able to tell if files have been renamed or added, I am
> afraid. (it might notice deletions, though)
ggtags notices outside changes by comparing mtimes of GTAGS and source
files that it visits. So yes if something is deleted only 'global -u'
can sync correctly.
Leo
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-28 6:42 ` Marcus Harnisch
2022-04-28 7:39 ` Leo Liu
@ 2022-04-28 14:30 ` John Yates
2022-04-28 14:40 ` Marcus Harnisch
2022-04-28 14:50 ` John Yates
2 siblings, 1 reply; 24+ messages in thread
From: John Yates @ 2022-04-28 14:30 UTC (permalink / raw)
To: Marcus Harnisch; +Cc: Help Gnu Emacs mailing list
On Thu, Apr 28, 2022 at 3:14 AM Marcus Harnisch <mh-gmane@online.de> wrote:
>
> I don't bother and don't partition the project (comprising of 10k files,
> and 50+ nested subprojects)
That's puny. In my code base a typical 'project' (a tree rooted
at a Makefile) has ~2k files. I work on foundational elements
so my workspaces include those components that can be
affected by my changes. A workspace is ~220GB. There are
400+ direct siblings of handful of projects where my efforts are
focused.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-28 8:38 ` Marcus Harnisch
2022-04-28 10:45 ` Leo Liu
@ 2022-04-28 14:34 ` John Yates
2022-04-28 14:45 ` Marcus Harnisch
1 sibling, 1 reply; 24+ messages in thread
From: John Yates @ 2022-04-28 14:34 UTC (permalink / raw)
To: Marcus Harnisch; +Cc: Help Gnu Emacs mailing list
On Thu, Apr 28, 2022 at 4:38 AM Marcus Harnisch <mh-gmane@online.de> wrote:
>
> Ggtags won't be able to tell if files have been renamed or added, I am
> afraid. (it might notice deletions, though)
That is crucial. A very large part of my work is untangling
decades of cruft (including migration from C to C++).
I do a tremendous amount of refactoring: moving and
renaming files. I need a scheme that can handle such
churn gracefully.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-28 14:30 ` John Yates
@ 2022-04-28 14:40 ` Marcus Harnisch
0 siblings, 0 replies; 24+ messages in thread
From: Marcus Harnisch @ 2022-04-28 14:40 UTC (permalink / raw)
To: help-gnu-emacs
On 28/04/2022 16.30, John Yates wrote:
> On Thu, Apr 28, 2022 at 3:14 AM Marcus Harnisch <mh-gmane@online.de> wrote:
>>
>> I don't bother and don't partition the project (comprising of 10k files,
>> and 50+ nested subprojects)
>
> That's puny. In my code base a typical 'project' (a tree rooted
> at a Makefile) has ~2k files. I work on foundational elements
> so my workspaces include those components that can be
> affected by my changes. A workspace is ~220GB. There are
> 400+ direct siblings of handful of projects where my efforts are
> focused.
<shrug> All I can tell from this is that creating the full index will
probably take a bit longer. Why don't you give it a try and then decide?
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-28 14:34 ` John Yates
@ 2022-04-28 14:45 ` Marcus Harnisch
0 siblings, 0 replies; 24+ messages in thread
From: Marcus Harnisch @ 2022-04-28 14:45 UTC (permalink / raw)
To: help-gnu-emacs
On 28/04/2022 16.34, John Yates wrote:
> On Thu, Apr 28, 2022 at 4:38 AM Marcus Harnisch <mh-gmane@online.de> wrote:
>>
>> Ggtags won't be able to tell if files have been renamed or added, I am
>> afraid. (it might notice deletions, though)
>
> That is crucial. A very large part of my work is untangling
> decades of cruft (including migration from C to C++).
> I do a tremendous amount of refactoring: moving and
> renaming files. I need a scheme that can handle such
> churn gracefully.
Actually, as Leo has pointed out, the gtags program should be able to
notice *unless* you are using a fixed list of files like me.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-28 6:42 ` Marcus Harnisch
2022-04-28 7:39 ` Leo Liu
2022-04-28 14:30 ` John Yates
@ 2022-04-28 14:50 ` John Yates
2022-04-28 16:10 ` Óscar Fuentes
2022-04-28 16:15 ` Marcus Harnisch
2 siblings, 2 replies; 24+ messages in thread
From: John Yates @ 2022-04-28 14:50 UTC (permalink / raw)
To: Marcus Harnisch; +Cc: Help Gnu Emacs mailing list
On Thu, Apr 28, 2022 at 3:14 AM Marcus Harnisch <mh-gmane@online.de> wrote:
>
> I don't bother and don't partition the project (comprising of 10k files,
> and 50+ nested subprojects)
In another reply I describe the size of my code base.
> > * Is the user restricted to querying a single partition of the
> > index? If yes, then that feels painfully restrictive. If no,
> > how does that user indicate which partition indices to combine?
> > How is combining accomplished?
>
> See above.
I take that as "My project is not large enough
to prompt me to consider partitioning, therefore
why should you?". The flawed assumption is
that your code base is comparable to mine.
> > * How are duplicate filenames handled?
>
> By storing path names.
Yes. I have written indexing software. I do
index the entire workspace. I do store paths
and identify duplicate filenames in the index.
That does not make the tool pleasant:
* indexing takes minutes
* file moves and renames require reindexing
* loading the index into emacs takes ~15s
* firing up the ivy completion take ~3s
* UI presentation of duplicates is ugly
* UI is _very_ sluggish
> Why don't you give it a whirl and see whether this suits you?
Because it misses the point. I am not looking
to navigate by tags, but rather by filename.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-28 14:50 ` John Yates
@ 2022-04-28 16:10 ` Óscar Fuentes
2022-04-28 16:15 ` Marcus Harnisch
1 sibling, 0 replies; 24+ messages in thread
From: Óscar Fuentes @ 2022-04-28 16:10 UTC (permalink / raw)
To: help-gnu-emacs
John Yates <john@yates-sheets.org> writes:
>> Why don't you give it a whirl and see whether this suits you?
>
> Because it misses the point. I am not looking
> to navigate by tags, but rather by filename.
In your original message you mention millions of lines of code but not
how many files.
Here, finding a file on the LLVM repo (> 100k files) works well enough
(for me) with ido+flx. flx is quite cpu-intensive and the UI feels a bit
sluggish, specially the first time the command is invoked, but combining
ido with some other filtering method (flex, for instance) should improve
that facet while at the same time providing a reasonably effective
method of finding the file of interest.
The list of candidate paths is generated by `git ls' (which takes about
two seconds here, but you could use a finer method that concentrates on
your areas of interest.) Then finding something like
llvm/include/llvm/Support/X86TargetParser.h
`isxtph' or `x8tph' provides that file as the first candidate.
An effective usage requires knowledge about the directory structure,
understanding the filtering algorithm and some practice.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-28 14:50 ` John Yates
2022-04-28 16:10 ` Óscar Fuentes
@ 2022-04-28 16:15 ` Marcus Harnisch
1 sibling, 0 replies; 24+ messages in thread
From: Marcus Harnisch @ 2022-04-28 16:15 UTC (permalink / raw)
To: help-gnu-emacs
On 28/04/2022 16.50, John Yates wrote:
> On Thu, Apr 28, 2022 at 3:14 AM Marcus Harnisch <mh-gmane@online.de> wrote:
>
> I take that as "My project is not large enough
> to prompt me to consider partitioning, therefore
> why should you?". The flawed assumption is
> that your code base is comparable to mine.
No assumption being made. All I can offer is sharing my experience from
projects I work on. Nobody can save you the work of trying for yourself
whether any suggested tool satisfies your needs in your environment.
> Because it misses the point. I am not looking
> to navigate by tags, but rather by filename.
Arguably, the main purpose of Global is navigation by tags and
references. However, one of the database tables stores the path names of
all indexed files.
Turns out that my primary use pattern actually involves navigation by
file name (‘ggtags-find-file’). In *my* project the combination of
ggtags/Helm shows no noticeable delay.
Leo will be able to tell how this works behind the scenes, interacts
with Emacs completion frameworks and how it might scale to larger
projects such as yours.
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-04-26 12:49 ` Stefan Monnier via Users list for the GNU Emacs text editor
@ 2022-12-14 3:47 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-12-14 17:55 ` Emanuel Berg
0 siblings, 1 reply; 24+ messages in thread
From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2022-12-14 3:47 UTC (permalink / raw)
To: help-gnu-emacs
> There could be several notions of "sibling":
> - jump from /foo/bar/main/src/hello.c to /foo/bar/stable/src/hello.c.
> - jump from /foo/bar/main/src/hello.c to /foo/bar/main/test/src/hello-tests.el.
> - jump from /foo/bar/main/src/hello.c to /foo/bar/main/src/hello.h.
The function below can do all three given the appropriate hint:
- "stable" for the first.
- "-tests" for the second.
- ".h" for the third.
It can also find "/foo/bar/stable/src/hello.h" when given the hint
"stable/.h".
Stefan
(defun my-other-files (hint file)
(cl-assert (file-name-absolute-p file))
(named-let loop ((fullname file)
(hint hint)
(rest nil))
(if (file-name-directory hint)
(let* ((hintbase (directory-file-name (file-name-directory hint)))
(hintend (file-name-nondirectory hint)))
(apply #'append
(mapcar (lambda (x)
(let ((default-directory
(file-name-as-directory (car x)))
(tail (cdr x)))
(mapcar
(lambda (x)
(cons (file-name-concat default-directory
(car x))
(cdr x)))
(loop tail hintend rest))))
(loop fullname hintbase rest))))
(let ((dir (file-name-directory fullname))
(file (file-name-nondirectory fullname))
(names '())
(re (regexp-quote hint)))
(when dir
(dolist (candidate (directory-files dir nil re))
(when (string-match re candidate)
(let ((prefix (substring candidate 0 (match-beginning 0)))
(suffix (substring candidate (match-end 0))))
(when (and (>= (length file)
(+ (length prefix) (length suffix)))
(string-prefix-p prefix file)
(string-suffix-p suffix file))
(push candidate names)))))
(nconc
(mapcar (lambda (name) (cons (file-name-concat dir name) rest)) names)
(when (> (length dir)
(length (setq dir (directory-file-name dir))))
(loop dir hint (if rest (file-name-concat file rest) file)))))))))
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: Navigating an enormous code base
2022-12-14 3:47 ` Stefan Monnier via Users list for the GNU Emacs text editor
@ 2022-12-14 17:55 ` Emanuel Berg
0 siblings, 0 replies; 24+ messages in thread
From: Emanuel Berg @ 2022-12-14 17:55 UTC (permalink / raw)
To: help-gnu-emacs
Stefan Monnier via Users list for the GNU Emacs text editor wrote:
>> There could be several notions of "sibling":
>> - jump from /foo/bar/main/src/hello.c to /foo/bar/stable/src/hello.c.
>> - jump from /foo/bar/main/src/hello.c to
>> /foo/bar/main/test/src/hello-tests.el.
>> - jump from /foo/bar/main/src/hello.c to /foo/bar/main/src/hello.h.
>
> The function below can do all three given the appropriate hint:
> - "stable" for the first.
> - "-tests" for the second.
> - ".h" for the third.
>
> It can also find "/foo/bar/stable/src/hello.h" when given the hint
> "stable/.h".
So this is the `find-file-dwim' at last?
Good ...
I would do it with several functions that all search for the
file according to their method or algorithm, then they produce
a score and the one with the highest score wins or is
tried first.
After that the file is displayed or a message "is this this
file?" and if it is, obviously it gets displayed but also that
algorithm gets a bonus since it got it right.
That way the "algorithm of algorithms" will be self-learning
and it will also be interesting to the developers, "hey, this
algorithm _never_ gets it right, what's wrong with it?"
However one should also store the exact situation (state,
hint, and correct file) in a database, so if that exact
situation appears again we already know what to do and the
desired file will just be found (a reference to it) in the
database, with no need for any algorithm to execute ...
So the order would be
1. database
2. run algorithm of algorithm
3. algorithms produce score
4. algorithm of algorithm add bonus
5. suggestion presented to user
6. algorithm of algorithm adjusts bonus
7. correct answer inserted into database
But it's up to the developer to do it anyway they like
of course ...
--
underground experts united
https://dataswamp.org/~incal
^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2022-12-14 17:55 UTC | newest]
Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-04-26 2:31 Navigating an enormous code base John Yates
2022-04-26 6:06 ` Daniel Fleischer
2022-04-26 11:03 ` Eli Zaretskii
2022-04-26 12:53 ` John Yates
2022-04-26 14:06 ` Emanuel Berg via Users list for the GNU Emacs text editor
2022-04-26 12:49 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-12-14 3:47 ` Stefan Monnier via Users list for the GNU Emacs text editor
2022-12-14 17:55 ` Emanuel Berg
2022-04-27 7:59 ` Marcus Harnisch
2022-04-27 8:36 ` mrf
2022-04-27 16:35 ` Emanuel Berg via Users list for the GNU Emacs text editor
2022-04-27 22:59 ` John Yates
2022-04-28 0:46 ` Emanuel Berg
2022-04-28 6:42 ` Marcus Harnisch
2022-04-28 7:39 ` Leo Liu
2022-04-28 8:38 ` Marcus Harnisch
2022-04-28 10:45 ` Leo Liu
2022-04-28 14:34 ` John Yates
2022-04-28 14:45 ` Marcus Harnisch
2022-04-28 14:30 ` John Yates
2022-04-28 14:40 ` Marcus Harnisch
2022-04-28 14:50 ` John Yates
2022-04-28 16:10 ` Óscar Fuentes
2022-04-28 16:15 ` Marcus Harnisch
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.