all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* How to profile restoring from .emacs.desktop
@ 2021-01-27 17:11 Steinar Bang
  2021-01-27 17:42 ` Stefan Monnier
  0 siblings, 1 reply; 13+ messages in thread
From: Steinar Bang @ 2021-01-27 17:11 UTC (permalink / raw)
  To: help-gnu-emacs

Platform: emacs 26.1 on debian 10.7 "buster", amd64

Using emacs.desktop on my development area works fine at first, but
startup fairly quickly becomes so slow that the only possibility is to
delete the .emacs.desktop and start fresh.

It would be interesting to find out where emacs spends its time when
restoring from an .emacs.desktop file.

Is it possible to profile the restore from .emacs.desktop in some way?

Thanks!


- Steinar



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to profile restoring from .emacs.desktop
  2021-01-27 17:11 How to profile restoring from .emacs.desktop Steinar Bang
@ 2021-01-27 17:42 ` Stefan Monnier
  2021-01-28 17:51   ` Steinar Bang
  0 siblings, 1 reply; 13+ messages in thread
From: Stefan Monnier @ 2021-01-27 17:42 UTC (permalink / raw)
  To: help-gnu-emacs

Hi Steinar,

> Is it possible to profile the restore from .emacs.desktop in some way?

You can add

    (profiler-start 'cpu)

in your init file somewhere before loading the `.emacs.desktop` and then
call `M-x profiler-report` when the startup is done (or call
`(profiler-report)` at the end of your init file, tho I've never tried
that and there's a chance/risk that the desktop loading actually
continues long after the end of init file so it may capture too short
a profile).


        Stefan




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to profile restoring from .emacs.desktop
  2021-01-27 17:42 ` Stefan Monnier
@ 2021-01-28 17:51   ` Steinar Bang
  2021-01-28 19:08     ` Stefan Monnier
  0 siblings, 1 reply; 13+ messages in thread
From: Steinar Bang @ 2021-01-28 17:51 UTC (permalink / raw)
  To: help-gnu-emacs

>>>>> Stefan Monnier <monnier@iro.umontreal.ca>:

> Hi Steinar,
>> Is it possible to profile the restore from .emacs.desktop in some way?

> You can add

>     (profiler-start 'cpu)

> in your init file somewhere before loading the `.emacs.desktop` and then
> call `M-x profiler-report` when the startup is done

Thanks, Stefan!

I did exactly that:
 1. Put (profiler-start 'cpu) at the end of ~/.emacs
 2. Did `M-x profiler-report` after the startup has completed

And it worked perfectly!

I succeeded in saving the profile to a file.  I have no idea how/if it
can be loaded from that file, but the saved profile is here:
 https://gist.github.com/steinarb/fbb854a40f058cf561cbc333f64bc967

But a deep analysis probably isn't necessary, opening the biggest nodes
in the profile, it's pretty obvious that the biggest culprit is
projectile-discover-projects-in-directory the function it calls, with
the biggest chunks, before it all breaks down into many small things,
are projectile-serialize and projectile-difference.

So it's projectile project discovery that spends most of the time.
I wonder if that information can be cached...?

Here's the profiler tree with the most interesting (to me) nodes opened:

- normal-top-level                                             116518  92%
 - command-line                                                116518  92%
  - command-line-1                                             116510  92%
   - eval                                                      116506  92%
    - progn                                                    116506  92%
     - desktop-read                                            116506  92%
      - load                                                   116355  92%
       - load-with-code-conversion                             116355  92%
        - eval-buffer                                          116346  92%
         - desktop-create-buffer                               116281  92%
          - projectile-mode                                    102201  81%
           - projectile-discover-projects-in-search-path              96086  76%
            - mapcar                                            96086  76%
             - projectile-discover-projects-in-directory              96086  76%
              - mapcar                                          95579  75%
               - #<compiled 0x10bffb5>                          95540  75%
                - projectile-add-known-project                  90190  71%
                 - projectile-merge-known-projects              85962  68%
                  - projectile-save-known-projects              45969  36%
                   - projectile-serialize                       43930  34%
                    + write-region                              11854   9%
                    + #<compiled 0x134d99d>                      1988   1%
                    + get-buffer-create                           106   0%
                  - projectile-difference                       18874  14%
                   - cl-remove-if                               18650  14%
                    - apply                                     18631  14%
                       cl-remove                                12671  10%
                  + projectile-unserialize                      15287  12%
                    delete-dups                                  3281   2%
                 + abbreviate-file-name                          1425   1%
                   delete-dups                                   1081   0%
                 + projectile-ignored-project-p                    37   0%
                + projectile-project-p                           4587   3%
                directory-files                                    13   0%
           + projectile--cleanup-known-projects                  5784   4%
           + projectile-load-known-projects                       210   0%
           + projectile-commander-bindings                         53   0%
           + advice-add                                            36   0%
           + called-interactively-p                                 3   0%
             add-hook                                               2   0%
          + desktop-restore-file-buffer                          7532   5%
          + dired-restore-desktop-buffer                         3346   2%
          + desktop-load-file                                    1498   1%
          + bury-buffer                                          1081   0%
          + rename-buffer                                         476   0%
          + auto-revert-mode                                       71   0%
          + flycheck-mode                                          12   0%
          + editorconfig-mode                                       9   0%
          + nxml-psgml-compatibility-mode                           4   0%
            buffer-list                                             4   0%
          + auto-fill-mode                                          4   0%
         + internal-macroexpand-for-load                           11   0%
        + do-after-load-evaluation                                  9   0%
      + desktop-restore-frameset                                  147   0%
      + byte-code                                                   4   0%
  + lisp-interaction-mode                                           4   0%
- ...                                                            8332   6%
   Automatic GC                                                  8299   6%
 + minibuffer-complete                                             25   0%
 + cl--generic-get-dispatcher                                       4   0%
 + rng-compute-start-tag-close-deriv                                4   0%
+ timer-event-handler                                            1021   0%
+ command-execute                                                 108   0%
+ redisplay_internal (C function)                                  67   0%
+ flycheck-handle-signal                                           12   0%
+ flycheck-hide-error-buffer                                        3   0%



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to profile restoring from .emacs.desktop
  2021-01-28 17:51   ` Steinar Bang
@ 2021-01-28 19:08     ` Stefan Monnier
  2021-01-28 22:31       ` Steinar Bang
  0 siblings, 1 reply; 13+ messages in thread
From: Stefan Monnier @ 2021-01-28 19:08 UTC (permalink / raw)
  To: help-gnu-emacs

> But a deep analysis probably isn't necessary, opening the biggest nodes
> in the profile, it's pretty obvious that the biggest culprit is
> projectile-discover-projects-in-directory the function it calls, with
> the biggest chunks, before it all breaks down into many small things,
> are projectile-serialize and projectile-difference.
>
> So it's projectile project discovery that spends most of the time.
> I wonder if that information can be cached...?

I don't use Projectile and never looked at its code, so I can't
answer that.  I don't know either how Projectile compares to Emacs's
builtin support for projects (tho I expect it's significantly more
featureful), but you may want to try that builtin support instead of
Projectile to see if it suffers from a similar problem, and/or if it
provides the subset of features you happen to use.


        Stefan




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to profile restoring from .emacs.desktop
  2021-01-28 19:08     ` Stefan Monnier
@ 2021-01-28 22:31       ` Steinar Bang
  2021-01-28 22:58         ` Stefan Monnier
  0 siblings, 1 reply; 13+ messages in thread
From: Steinar Bang @ 2021-01-28 22:31 UTC (permalink / raw)
  To: help-gnu-emacs

>>>>> Stefan Monnier <monnier@iro.umontreal.ca>:

>> So it's projectile project discovery that spends most of the time.
>> I wonder if that information can be cached...?

> I don't use Projectile and never looked at its code, so I can't answer
> that.

I googled and found this: https://stackoverflow.com/a/50997907

I changed the script I use to restore an emacs tunnelled over an SSH X
forwarding from:
 #!/bin/sh
 #
 # Brukes til å sparke igang eclipse og emacs når jeg tar en ssh til lorenzo
 #
 export REPOUSER=maven
 cd ~/workspaces
 emacs --eval "(progn (desktop-read)(desktop-save-mode 1))" >/dev/null 2>&1 &
to
 #!/bin/sh
 #
 # Brukes til å sparke igang eclipse og emacs når jeg tar en ssh til lorenzo
 #
 export REPOUSER=maven
 cd ~/workspaces
 emacs --eval "(progn (setq projectile-enable-caching 't)(desktop-read)(desktop-save-mode 1))" >/dev/null 2>&1 &

I then started emacs once and stopped it, and started emacs again with
profiling on.

The caching didn't seem to have much effect.  See the opened profiling
below.

C-h v projectile-enable-caching says:
 projectile-enable-caching is a variable defined in ‘projectile.el’.
 Its value is t
 Original value was nil

(ie. the variable was successfully set)

> I don't know either how Projectile compares to Emacs's builtin support
> for projects (tho I expect it's significantly more featureful), but
> you may want to try that builtin support instead of Projectile to see
> if it suffers from a similar problem, and/or if it provides the subset
> of features you happen to use.

Sounds interesting.

I've googled this as well and the one hit I found was emacs 28:
 https://www.gnu.org/software/emacs/manual/html_node/emacs/Projects.html

Is this emacs 28 only?

(I'm still on emacs 26 and 27)

Here's the profile from starting up with a projectile cache in place:
- normal-top-level                                             116753  92%
 - command-line                                                116753  92%
  - command-line-1                                             116749  92%
   - eval                                                      116749  92%
    - progn                                                    116749  92%
     - desktop-read                                            116745  92%
      - load                                                   116609  92%
       - load-with-code-conversion                             116609  92%
        - eval-buffer                                          116602  92%
         - desktop-create-buffer                               116501  92%
          - projectile-mode                                    102763  81%
           - projectile-discover-projects-in-search-path              96535  76%
            - mapcar                                            96535  76%
             - projectile-discover-projects-in-directory              96535  76%
              - mapcar                                          96039  76%
               - #<compiled 0xf66071>                           96009  76%
                - projectile-add-known-project                  90801  72%
                 - projectile-merge-known-projects              86378  68%
                  - projectile-save-known-projects              46828  37%
                   - projectile-serialize                       44868  35%
                    - write-region                              12417   9%
                     - select-safe-coding-system                11873   9%
                      - find-auto-coding                         9805   7%
                         auto-coding-alist-lookup                3012   2%
                         sgml-html-meta-auto-coding-function               1011   0%
                         auto-coding-regexp-alist-lookup                540   0%
                         sgml-xml-auto-coding-function                392   0%
                      + mapcar                                     58   0%
                        find-coding-systems-region                 43   0%
                        coding-system-get                          26   0%
                        coding-system-type                         22   0%
                    + #<compiled 0x124135d>                      2120   1%
                    + get-buffer-create                            68   0%
                  - projectile-difference                       17815  14%
                   - cl-remove-if                               17598  14%
                    - apply                                     17580  13%
                       cl-remove                                11888   9%
                  - projectile-unserialize                      15191  12%
                   + insert-file-contents                        5195   4%
                   + #<compiled 0x119c0b9>                       3287   2%
                   + generate-new-buffer                          838   0%
                    delete-dups                                  3816   3%
                 + abbreviate-file-name                          1526   1%
                   delete-dups                                   1263   1%
                 + projectile-ignored-project-p                    20   0%
                + projectile-project-p                           4475   3%
                directory-files                                    11   0%
           + projectile--cleanup-known-projects                  5847   4%
           + projectile-load-known-projects                       236   0%
           + projectile-commander-bindings                         64   0%
           + advice-add                                            56   0%
             called-interactively-p                                 1   0%
          + desktop-restore-file-buffer                          7767   6%
          + dired-restore-desktop-buffer                         3833   3%
          + bury-buffer                                          1074   0%
          + rename-buffer                                         529   0%
          + desktop-load-file                                     338   0%
          + auto-revert-mode                                       52   0%
          + flycheck-mode                                          33   0%
            editorconfig-mode                                       8   0%
            buffer-list                                             4   0%
          + nxml-psgml-compatibility-mode                           3   0%
          + smerge-mode                                             3   0%
         + internal-macroexpand-for-load                           23   0%
        + do-after-load-evaluation                                  7   0%
      + desktop-restore-frameset                                  136   0%
    #<compiled 0x1dda91>                                            4   0%
+ ...                                                            8194   6%
+ timer-event-handler                                             563   0%
+ command-execute                                                  99   0%
+ redisplay_internal (C function)                                  34   0%
+ flycheck-handle-signal                                            8   0%



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to profile restoring from .emacs.desktop
  2021-01-28 22:31       ` Steinar Bang
@ 2021-01-28 22:58         ` Stefan Monnier
  2021-01-28 23:33           ` Dmitry Gutov
  2021-01-29 22:05           ` How to profile restoring from .emacs.desktop Steinar Bang
  0 siblings, 2 replies; 13+ messages in thread
From: Stefan Monnier @ 2021-01-28 22:58 UTC (permalink / raw)
  To: help-gnu-emacs

> The caching didn't seem to have much effect.  See the opened profiling
> below.
>
> C-h v projectile-enable-caching says:
>  projectile-enable-caching is a variable defined in ‘projectile.el’.
>  Its value is t
>  Original value was nil
>
> (ie. the variable was successfully set)

You might want to file a bug report with the maintainer of Projectile, then.
Clearly, your profile indicates that it's doing "too much work".

>> I don't know either how Projectile compares to Emacs's builtin support
>> for projects (tho I expect it's significantly more featureful), but
>> you may want to try that builtin support instead of Projectile to see
>> if it suffers from a similar problem, and/or if it provides the subset
>> of features you happen to use.
>
> Sounds interesting.
>
> I've googled this as well and the one hit I found was emacs 28:
> https://www.gnu.org/software/emacs/manual/html_node/emacs/Projects.html
>
> Is this emacs 28 only?

It was introduced in Emacs-25, with extremely limited functionality.
Its functionality has grown a bit since, but it's still very minimal.
It's more thought as something on top of which other tools (like xref)
can provide features.

> (I'm still on emacs 26 and 27)

I think there was nothing new for it in Emacs-26, but Emacs-27 did spice
it up a bit (check the NEWS file for more info).


        Stefan




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to profile restoring from .emacs.desktop
  2021-01-28 22:58         ` Stefan Monnier
@ 2021-01-28 23:33           ` Dmitry Gutov
  2021-06-19  9:02             ` project-mode vs projectile (Was: How to profile restoring from .emacs.desktop) Steinar Bang
  2021-01-29 22:05           ` How to profile restoring from .emacs.desktop Steinar Bang
  1 sibling, 1 reply; 13+ messages in thread
From: Dmitry Gutov @ 2021-01-28 23:33 UTC (permalink / raw)
  To: Stefan Monnier, help-gnu-emacs

On 29.01.2021 00:58, Stefan Monnier wrote:
> It was introduced in Emacs-25, with extremely limited functionality.
> Its functionality has grown a bit since, but it's still very minimal.
> It's more thought as something on top of which other tools (like xref)
> can provide features.
> 
>> (I'm still on emacs 26 and 27)
> I think there was nothing new for it in Emacs-26, but Emacs-27 did spice
> it up a bit (check the NEWS file for more info).

And it's grown again a bit in Emacs 28, with a global keymap and a set 
of project-scoped commands in it, among other things.

Most importantly, you can install the latest version of project.el 
inside Emacs 26 or 27 from GNU ELPA.



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: How to profile restoring from .emacs.desktop
  2021-01-28 22:58         ` Stefan Monnier
  2021-01-28 23:33           ` Dmitry Gutov
@ 2021-01-29 22:05           ` Steinar Bang
  1 sibling, 0 replies; 13+ messages in thread
From: Steinar Bang @ 2021-01-29 22:05 UTC (permalink / raw)
  To: help-gnu-emacs

>>>>> Stefan Monnier <monnier@iro.umontreal.ca>:

> You might want to file a bug report with the maintainer of Projectile, then.
> Clearly, your profile indicates that it's doing "too much work".

Turns out this was a user error.

I had this setting in ~/.emacs:
 (setq projectile-project-search-path '("~/workspaces/" "~/git/"))

This causes projectile to scan all of the subdirectories of those
directories for project on startup.

And there are a *lot* of project directories to scan under those!

When I removed this setting (defaults to nil), desktop restored in a
much shorter time.

Here's the results of profiler-report from desktop restore, opened on
the interesting nodes: 

- normal-top-level                                              20214  91%
 - command-line                                                 20214  91%
  - command-line-1                                              20206  91%
   - eval                                                       20206  91%
    - progn                                                     20206  91%
     - desktop-read                                             20206  91%
      - load                                                    20040  90%
       - load-with-code-conversion                              20040  90%
        - eval-buffer                                           20026  90%
         - desktop-create-buffer                                19978  90%
          - desktop-restore-file-buffer                          8029  36%
           - find-file-noselect                                  7865  35%
            - find-file-noselect-1                               4813  21%
             - after-find-file                                   4621  20%
              + run-hooks                                        2564  11%
              + normal-mode                                      2020   9%
              + auto-save-mode                                     20   0%
             + file-truename                                      134   0%
             + insert-file-contents                                17   0%
               abbreviate-file-name                                 4   0%
            + create-file-buffer                                  433   1%
            + find-buffer-visiting                                292   1%
            + file-truename                                       210   0%
              abbreviate-file-name                                 42   0%
           + switch-to-buffer                                     147   0%
          + projectile-mode                                      5696  25%
          + dired-restore-desktop-buffer                         3839  17%
          + bury-buffer                                          1411   6%
          + rename-buffer                                         466   2%
          + desktop-load-file                                     359   1%
          + auto-revert-mode                                       62   0%
          + flycheck-mode                                          12   0%
            visual-line-mode                                        6   0%
            editorconfig-mode                                       5   0%
            buffer-list                                             2   0%
         + internal-macroexpand-for-load                           12   0%
        + do-after-load-evaluation                                 12   0%
      + desktop-restore-frameset                                  162   0%
      + byte-code                                                   4   0%
  + lisp-interaction-mode                                           4   0%
+ ...                                                            1360   6%
+ timer-event-handler                                             486   2%
+ command-execute                                                  98   0%
+ redisplay_internal (C function)                                  34   0%
+ flycheck-handle-signal                                            4   0%



^ permalink raw reply	[flat|nested] 13+ messages in thread

* project-mode vs projectile (Was: How to profile restoring from .emacs.desktop)
  2021-01-28 23:33           ` Dmitry Gutov
@ 2021-06-19  9:02             ` Steinar Bang
  2021-06-27  0:20               ` Dmitry Gutov
  0 siblings, 1 reply; 13+ messages in thread
From: Steinar Bang @ 2021-06-19  9:02 UTC (permalink / raw)
  To: help-gnu-emacs

>>>>> Dmitry Gutov <dgutov@yandex.ru>:

> On 29.01.2021 00:58, Stefan Monnier wrote:
(on project-mode)

>> It was introduced in Emacs-25, with extremely limited functionality.
>> Its functionality has grown a bit since, but it's still very minimal.
>> It's more thought as something on top of which other tools (like xref)
>> can provide features.
>> 
>>> (I'm still on emacs 26 and 27)
>> I think there was nothing new for it in Emacs-26, but Emacs-27 did spice
>> it up a bit (check the NEWS file for more info).

> And it's grown again a bit in Emacs 28, with a global keymap and a set
> of project-scoped commands in it, among other things.

> Most importantly, you can install the latest version of project.el
> inside Emacs 26 or 27 from GNU ELPA.

Maybe it is time for me to try project-mode out again, then?

Is there an overview on what kind of commands are available in the emacs
28 project-mode?

By this time I have about 6 months of actively using projectile (once I
got the startup issues cleared away and using the cache instead), and
I've quite grown to like it.

I have replaced navigating with switch-to-buffer with the
projectile-find-file file command, and switch between projects with
projectile-switch-open-project command and find a directory with the
projectile-find-dir command (the find file and find dir commands stay
within a project).

So that has mostly replaced my need for .emacs.desktop.
(The only reason I'm still using .emacs.desktop, is to restore the open
windows.  Is it possible to have .emacs.desktop restore windows but not
files?)

Other useful commands:
 - projectile-grep which rgreps inside a project useful
 - projectile-compile-project (very useful for maven projects, where the
   mvn command must be run at the top directory of the project far from
   the file being edited)
 - projectile-find-tag (very useful, once I was able to make CTAGS
   recognize ES6 javascript)

What I'm missing are commands that do the same thing as the project
level commands for project modules, in particular for maven multi-module
projects.

The most important command to get a module command for is the compile
command (because building a single module takes a lot less time than
building the entire reactor build), but module specific search and
navigate commands would also be useful.

Does project-mode have a concept of modules? (the maven concept of
modules is what's in my mind)

Thanks!


- Steinar



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: project-mode vs projectile (Was: How to profile restoring from .emacs.desktop)
  2021-06-19  9:02             ` project-mode vs projectile (Was: How to profile restoring from .emacs.desktop) Steinar Bang
@ 2021-06-27  0:20               ` Dmitry Gutov
  2021-09-05 11:35                 ` project-mode vs projectile Steinar Bang
  0 siblings, 1 reply; 13+ messages in thread
From: Dmitry Gutov @ 2021-06-27  0:20 UTC (permalink / raw)
  To: Steinar Bang, help-gnu-emacs

Hi!

Sorry for the late reply.

On 19.06.2021 12:02, Steinar Bang wrote:

>> And it's grown again a bit in Emacs 28, with a global keymap and a set
>> of project-scoped commands in it, among other things.
> 
>> Most importantly, you can install the latest version of project.el
>> inside Emacs 26 or 27 from GNU ELPA.
> 
> Maybe it is time for me to try project-mode out again, then?

First of all, it's not a mode. A recent enough version of project.el 
just installs a global keymap and lets you use its bindings.

One advantage is it doesn't run any code (e.g. root-finding code) until 
you actually use one of the related commands.

> Is there an overview on what kind of commands are available in the emacs
> 28 project-mode?

'C-x p C-h' should give you a reasonably complete list.

> By this time I have about 6 months of actively using projectile (once I
> got the startup issues cleared away and using the cache instead), and
> I've quite grown to like it.

I've used it for years, it's a handy package. project.el started out as 
a kind of backdoor to be able to use projectile indirectly in core Emacs 
commands. That still hasn't panned out exactly, but I'm hopeful on that 
front too.

> I have replaced navigating with switch-to-buffer with the
> projectile-find-file file command, and switch between projects with
> projectile-switch-open-project command and find a directory with the
> projectile-find-dir command (the find file and find dir commands stay
> within a project).

There is still no 'project-find-dir' command, but we should add one. 
There is a related bug report somewhere in debbugs.

> Other useful commands:
>   - projectile-grep which rgreps inside a project useful
>   - projectile-compile-project (very useful for maven projects, where the
>     mvn command must be run at the top directory of the project far from
>     the file being edited)
>   - projectile-find-tag (very useful, once I was able to make CTAGS
>     recognize ES6 javascript)

There are counterparts to the first two, but what does the last one do? 
It's it basically the same as xref-find-definitions?

> What I'm missing are commands that do the same thing as the project
> level commands for project modules, in particular for maven multi-module
> projects.
> 
> The most important command to get a module command for is the compile
> command (because building a single module takes a lot less time than
> building the entire reactor build), but module specific search and
> navigate commands would also be useful.
> 
> Does project-mode have a concept of modules? (the maven concept of
> modules is what's in my mind)

No concept of modules as such (though there is a defcustom to decide 
whether to treat "git submodules" as separate projects, but those are 
different kind of modules).

If you want some dedicated support, we'll need to clarify the 
requirements. For instance, would you be happy if mvn modules were 
treated as separate projects? I think that leaves only the "module 
compile command", and that seems somewhat maven-specific. You could 
create a new command which would look up what kind of project the 
current file is in, and invoke some corresponding action.

Or if you want project-compile to provide different behaviors, what 
would it do? Perhaps you'd want to customize compilation-read-command 
instead?



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: project-mode vs projectile
  2021-06-27  0:20               ` Dmitry Gutov
@ 2021-09-05 11:35                 ` Steinar Bang
  2021-09-05 14:56                   ` Nikolay Kudryavtsev
  2021-10-07  2:39                   ` Dmitry Gutov
  0 siblings, 2 replies; 13+ messages in thread
From: Steinar Bang @ 2021-09-05 11:35 UTC (permalink / raw)
  To: help-gnu-emacs

>>>>> Dmitry Gutov <dgutov@yandex.ru>:

> First of all, it's not a mode. A recent enough version of project.el
> just installs a global keymap and lets you use its bindings.

Hm... ok. I've seen some bindings mentioned in a google hit, but when I
tried using them on emacs 27 (I don't have a reference to the google hit
handy).

Is this for emacsen newer than 27.1?

> One advantage is it doesn't run any code (e.g. root-finding code)
> until you actually use one of the related commands.

An advantage in performance?

I don't know what projectile does here, but I suspect that, with the
correct configuration (which is *not*, as I found, "scan everything on
startup"...), projectile doesn't do much either, until the commands are
used.

>> Is there an overview on what kind of commands are available in the emacs
>> 28 project-mode?

> 'C-x p C-h' should give you a reasonably complete list.

I get "C-x p is undefined" on emacs 27.1, so I guess I need something
newer than that?

> I've used it for years, it's a handy package. project.el started out
> as a kind of backdoor to be able to use projectile indirectly in core
> Emacs commands. That still hasn't panned out exactly, but I'm hopeful
> on that front too.

Hm... are you saying project.el and projectile are releated somehow?

Up until reading the above I had been thinking they were two
implementations of similar functionality, with project.el being the
native emacs version?

[snip!]
>> projectile-find-dir command (the find file and find dir commands stay
>> within a project).

> There is still no 'project-find-dir' command, but we should add
> one. There is a related bug report somewhere in debbugs.

>> Other useful commands:
>> - projectile-grep which rgreps inside a project useful
>> - projectile-compile-project (very useful for maven projects, where the
>> mvn command must be run at the top directory of the project far from
>> the file being edited)
>> - projectile-find-tag (very useful, once I was able to make CTAGS
>> recognize ES6 javascript)

> There are counterparts to the first two, but what does the last one
> do? It's it basically the same as xref-find-definitions?

I've never used xref-find-definitions, but from the description it looks
to be the same.

[snip1]
>> Does project-mode have a concept of modules? (the maven concept of
>> modules is what's in my mind)

> No concept of modules as such

Ok.

> (though there is a defcustom to decide whether to treat "git
> submodules" as separate projects, but those are different kind of
> modules).

Yes.  Maven modules have the same form as the entire maven project they
are part of.  And they can be run separately by cd'ing into the module
diretory and running the mvn build command (if their dependencies are
fulfilled). 

> If you want some dedicated support, we'll need to clarify the
> requirements. For instance, would you be happy if mvn modules were
> treated as separate projects?

Ideally I would like the project level commands to remain as they are.

But I would like to have a similar set of commands that operate on the
specified module only (search, replace, build, at least).

And maybe a simple way to navigate to a specified module.

> I think that leaves only the "module compile command", and that seems
> somewhat maven-specific. You could create a new command which would
> look up what kind of project the current file is in, and invoke some
> corresponding action.

What I currently do, is have a text file in each project, not commited
to git, and containing canned commands for building each project.

And then I just go to that file, copy them, and then feed them to "M-x
compile" to build a specific project.

But this is cumbersome, and error prone (I have may times built the
wrong module and not understood why my changes weren't showing up) and
cd followed by a command, doesn't work on windows emacs.

Here's an example of such a text file:
 cd ~/workspaces/sampleapp/sampleapp.web.frontend/; mvn -B install -DskipTests -Dmaven.javadoc.skip=true -Dmaven.source.skip=true
 cd ~/workspaces/sampleapp/sampleapp.db.liquibase.test/; mvn -B install -DskipTests -Dmaven.javadoc.skip=true -Dmaven.source.skip=true
 cd ~/workspaces/sampleapp/sampleapp.backend/; mvn -B install -DskipTests -Dmaven.javadoc.skip=true -Dmaven.source.skip=true
 cd ~/workspaces/sampleapp/sampleapp.web.api/; mvn -B install -DskipTests -Dmaven.javadoc.skip=true -Dmaven.source.skip=true

> Or if you want project-compile to provide different behaviors, what
> would it do? Perhaps you'd want to customize compilation-read-command
> instead?

No, I think what I would like to see, is a concept of "current-module"
(e.g. based on the currently visisted file or directory) and then a
module-compile command

Thanks for responding! :-)


- Steinar



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: project-mode vs projectile
  2021-09-05 11:35                 ` project-mode vs projectile Steinar Bang
@ 2021-09-05 14:56                   ` Nikolay Kudryavtsev
  2021-10-07  2:39                   ` Dmitry Gutov
  1 sibling, 0 replies; 13+ messages in thread
From: Nikolay Kudryavtsev @ 2021-09-05 14:56 UTC (permalink / raw)
  To: Steinar Bang, help-gnu-emacs

project.el currently supports only two backends, one is VC which is not 
very useful if you want any compilation functionality, but the other one 
is EDE, which supports subprojects and having multiple targets per 
project. So in theory you'd need to replace your text files with make 
files and it would work.



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: project-mode vs projectile
  2021-09-05 11:35                 ` project-mode vs projectile Steinar Bang
  2021-09-05 14:56                   ` Nikolay Kudryavtsev
@ 2021-10-07  2:39                   ` Dmitry Gutov
  1 sibling, 0 replies; 13+ messages in thread
From: Dmitry Gutov @ 2021-10-07  2:39 UTC (permalink / raw)
  To: Steinar Bang, help-gnu-emacs

On 05.09.2021 14:35, Steinar Bang wrote:
>>>>>> Dmitry Gutov <dgutov@yandex.ru>:
> 
>> First of all, it's not a mode. A recent enough version of project.el
>> just installs a global keymap and lets you use its bindings.
> 
> Hm... ok. I've seen some bindings mentioned in a google hit, but when I
> tried using them on emacs 27 (I don't have a reference to the google hit
> handy).
> 
> Is this for emacsen newer than 27.1?

Like I said, it's grown a little in Emacs 28. You can install that 
version from GNU ELPA in Emacs 27 as well.

>> One advantage is it doesn't run any code (e.g. root-finding code)
>> until you actually use one of the related commands.
> 
> An advantage in performance?
> 
> I don't know what projectile does here, but I suspect that, with the
> correct configuration (which is *not*, as I found, "scan everything on
> startup"...), projectile doesn't do much either, until the commands are
> used.

It doesn't do "much", but it does stuff, for example,

   (add-hook 'find-file-hook 'projectile-find-file-hook-function)

which isn't too bad by itself but contributes to the "death by a 1000 
cuts" in configurations where many packages are installed. Or when you 
just need to visit many files quickly.

>> I've used it for years, it's a handy package. project.el started out
>> as a kind of backdoor to be able to use projectile indirectly in core
>> Emacs commands. That still hasn't panned out exactly, but I'm hopeful
>> on that front too.
> 
> Hm... are you saying project.el and projectile are releated somehow?

They will be more "related" when Bozhidar gets around to merging the 
"bridging" code which allows Projectile to act as a project.el backend.

Any year now.

>> If you want some dedicated support, we'll need to clarify the
>> requirements. For instance, would you be happy if mvn modules were
>> treated as separate projects?
> 
> Ideally I would like the project level commands to remain as they are.
> 
> But I would like to have a similar set of commands that operate on the
> specified module only (search, replace, build, at least).
> 
> And maybe a simple way to navigate to a specified module.

All right, thanks.

I've outlined my brief thoughts on the subject of module-specific 
functionality in the second part of the email here: 
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=41572#146

>> I think that leaves only the "module compile command", and that seems
>> somewhat maven-specific. You could create a new command which would
>> look up what kind of project the current file is in, and invoke some
>> corresponding action.
> 
> What I currently do, is have a text file in each project, not commited
> to git, and containing canned commands for building each project.
> 
> And then I just go to that file, copy them, and then feed them to "M-x
> compile" to build a specific project.
> 
> But this is cumbersome, and error prone (I have may times built the
> wrong module and not understood why my changes weren't showing up) and
> cd followed by a command, doesn't work on windows emacs.
> 
> Here's an example of such a text file:
>   cd ~/workspaces/sampleapp/sampleapp.web.frontend/; mvn -B install -DskipTests -Dmaven.javadoc.skip=true -Dmaven.source.skip=true
>   cd ~/workspaces/sampleapp/sampleapp.db.liquibase.test/; mvn -B install -DskipTests -Dmaven.javadoc.skip=true -Dmaven.source.skip=true
>   cd ~/workspaces/sampleapp/sampleapp.backend/; mvn -B install -DskipTests -Dmaven.javadoc.skip=true -Dmaven.source.skip=true
>   cd ~/workspaces/sampleapp/sampleapp.web.api/; mvn -B install -DskipTests -Dmaven.javadoc.skip=true -Dmaven.source.skip=true

Sounds like it can be automated, with or without project.el integration. 
Though perhaps you'd have to transition to a more structured file format 
like yml/json/lisp. Which might be more of a pain to write.

Cheers,
Dmitry.



^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2021-10-07  2:39 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-01-27 17:11 How to profile restoring from .emacs.desktop Steinar Bang
2021-01-27 17:42 ` Stefan Monnier
2021-01-28 17:51   ` Steinar Bang
2021-01-28 19:08     ` Stefan Monnier
2021-01-28 22:31       ` Steinar Bang
2021-01-28 22:58         ` Stefan Monnier
2021-01-28 23:33           ` Dmitry Gutov
2021-06-19  9:02             ` project-mode vs projectile (Was: How to profile restoring from .emacs.desktop) Steinar Bang
2021-06-27  0:20               ` Dmitry Gutov
2021-09-05 11:35                 ` project-mode vs projectile Steinar Bang
2021-09-05 14:56                   ` Nikolay Kudryavtsev
2021-10-07  2:39                   ` Dmitry Gutov
2021-01-29 22:05           ` How to profile restoring from .emacs.desktop Steinar Bang

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.