* How to use project.el
@ 2020-11-20 14:52 excalamus--- via Users list for the GNU Emacs text editor
2020-11-20 19:34 ` Jean Louis
2020-11-20 23:34 ` Dmitry Gutov
0 siblings, 2 replies; 10+ messages in thread
From: excalamus--- via Users list for the GNU Emacs text editor @ 2020-11-20 14:52 UTC (permalink / raw)
To: Help Gnu Emacs
With 27.1 out, I see talk of project.el, how great it is, and how it's been around for years. What I don't see is anything about how to use it. There's one sparse page in the manual, C-h i m emacs m Projects. I've run project-find-file and project-search. I fail to see how they're fundamentally different than find-file or grep.
I happen to have ESS installed which appears to use project.el. It defines some new methods. I'll need to brush up on CL objects and generic methods, though, before I can decipher how those interact with project.el. In the meantime, does anyone have a basic setup and usage example?
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: How to use project.el
2020-11-20 14:52 How to use project.el excalamus--- via Users list for the GNU Emacs text editor
@ 2020-11-20 19:34 ` Jean Louis
2020-11-20 23:34 ` Dmitry Gutov
1 sibling, 0 replies; 10+ messages in thread
From: Jean Louis @ 2020-11-20 19:34 UTC (permalink / raw)
To: excalamus; +Cc: Help Gnu Emacs
* excalamus--- via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> [2020-11-20 17:53]:
> With 27.1 out, I see talk of project.el, how great it is, and how
> it's been around for years. What I don't see is anything about how
> to use it. There's one sparse page in the manual, C-h i m emacs m
> Projects. I've run project-find-file and project-search. I fail to
> see how they're fundamentally different than find-file or grep.
Even me I was reading about it before some days. The difference is
is this below.
File: emacs.info, Node: Projects, Next: Change Log, Prev: Version Control, Up: Maintaining
28.2 Working with Projects
==========================
A “project” is a collection of files used for producing one or more
programs. Files that belong to a project are typically stored in a
hierarchy of directories; the top-level directory of the hierarchy is
known as the “project root”.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: How to use project.el
2020-11-20 14:52 How to use project.el excalamus--- via Users list for the GNU Emacs text editor
2020-11-20 19:34 ` Jean Louis
@ 2020-11-20 23:34 ` Dmitry Gutov
2020-11-21 1:03 ` excalamus--- via Users list for the GNU Emacs text editor
1 sibling, 1 reply; 10+ messages in thread
From: Dmitry Gutov @ 2020-11-20 23:34 UTC (permalink / raw)
To: excalamus, Help Gnu Emacs
On 20.11.2020 16:52, excalamus--- via Users list for the GNU Emacs text
editor wrote:
> With 27.1 out, I see talk of project.el, how great it is, and how it's been around for years. What I don't see is anything about how to use it. There's one sparse page in the manual, C-h i m emacs m Projects. I've run project-find-file and project-search. I fail to see how they're fundamentally different than find-file or grep.
>
> I happen to have ESS installed which appears to use project.el. It defines some new methods. I'll need to brush up on CL objects and generic methods, though, before I can decipher how those interact with project.el. In the meantime, does anyone have a basic setup and usage example?
It's basically zero setup. If you don't have a Git repo for your
project, the setup is 'git init'. The repo is the project, and the
project files are all the non-ignored files in its root directory
(registered or not). At least, that's with the built-in 'vc' backend.
To get the most benefit from the package, you should install the latest
version from GNU ELPA ('M-x list-packages', then install 'project'). The
latest version is 0.5.2.
To see the full list of commands defined in that package, type 'C-x p C-h'.
You can also read the full description of the package with 'C-h P
project RET'.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: How to use project.el
2020-11-20 23:34 ` Dmitry Gutov
@ 2020-11-21 1:03 ` excalamus--- via Users list for the GNU Emacs text editor
2020-11-22 2:55 ` Dmitry Gutov
0 siblings, 1 reply; 10+ messages in thread
From: excalamus--- via Users list for the GNU Emacs text editor @ 2020-11-21 1:03 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Help Gnu Emacs
> To get the most benefit from the package, you should install the latest version from GNU ELPA ('M-x list-packages', then install 'project'). The latest version is 0.5.2.
>
> To see the full list of commands defined in that package, type 'C-x p C-h'.
>
> You can also read the full description of the package with 'C-h P project RET'.
>
Thank you, I was unfamiliar with 'C-h P'.
I have updated to 0.5.2 and it's more like what I would have expected. Actually, several functions mirror my own project management code. My use-case is, of course, specific to me, but I see overlap. I wonder if any of my code, or its ideas, may be useful? Who is project.el's point person?
I develop Python and prefer to interact through shell directly by sending commands to the comint buffer. At this point the main command is 'xc/sh-send-command'. This sends something like 'python main.py' or 'pyinstaller main.spec' to the appropriate shell and steps. I create a shell, either by name or on the fly, similar to 'project-shell' with 'xc/create-shell'. Everything else is just a helper.
It's all hacky stuff I've made in the moment over time. This weekend, I hoped to create project profiles, a plist or something, with :root, :venv, :entry-point-file, etc., so that I can switch between shells and associated command sets easily, maybe also formalize it (hence my looking into project.el first).
Thoughts?
(defun xc/set-global-default-directory (new-default-directory)
"Set xc/global-default-directory to NEW-DEFAULT-DIRECTORY."
(interactive "DSet global default directory: ")
(setq xc/global-default-directory new-default-directory))
(defvar xc/python nil
"Python interpreter to be used in shell calls.")
(defvar xc/shell "*shell*"
"Shell process buffer to be used in shell calls.")
(defun xc/set-python (exe)
"Set python executable."
(interactive
(list (read-file-name "Python executable: " "C:/Users/excalamus/Anaconda3/envs/" nil t)))
(setq xc/python (concat exe " "))
(message "Set `xc/python' to: %s" xc/python))
(defun xc/set-shell (pbuff)
"Set `xc/shell' to process associated with PBUFF buffer."
(interactive
(list (read-buffer "Process buffer: " nil t '(lambda (x) (processp (get-buffer-process (car x)))))))
(setq xc/shell pbuff)
(message "Set `xc/shell' to: %s" xc/shell))
(defun xc/create-shell (name)
"Create shell with a given NAME.
NAME should have earmuffs (e.g. *NAME*) if it is to follow Emacs
naming conventions. Earmuffs indicate that the buffer is special
use and not associated with a file.
Returns newly created shell process.
Adapted from URL `https://stackoverflow.com/a/36450889/5065796'"
(interactive
(let ((name (read-string "shell name: " nil)))
(list name)))
(let ((name (or name xc/shell)))
(get-buffer-process (shell name))))
(defun xc/sh-send-command (command &optional pbuff)
"Send COMMAND to shell process with buffer PBUFF.
PBUFF is the buffer name string of a process. If the process
associated with PBUFF does not exist, it is created. PBUFF is
then opened in the other window and control is returned to the
calling buffer.
See URL `https://stackoverflow.com/a/7053298/5065796'"
(let* ((pbuff (or pbuff xc/shell))
(proc (or (get-buffer-process pbuff)
;; create new process
(let ((currbuff (current-buffer))
(new-proc (xc/create-shell pbuff))) ; creates a buried pbuff
(switch-to-buffer-other-window pbuff)
(switch-to-buffer currbuff)
new-proc)))
(command-and-go (concat command "\n")))
(with-current-buffer pbuff
(goto-char (process-mark proc))
(insert command-and-go)
(move-marker (process-mark proc) (point)))
(process-send-string proc command-and-go)))
(defun xc/set-global-shell-command (new-command)
"Set `xc/global-shell-command' to NEW-COMMAND."
(interactive "sShell command: ")
(setq xc/global-shell-command new-command))
;; todo make interactive, read envs dir for available envs, send to shell, etc.
(defun xc/conda-activate ()
"Activate conda venv."
(interactive)
(insert "C:\\Users\\excalamus\\Anaconda3\\condabin\\conda.bat activate "))
(defun xc/set-global-shell-command-to-current-file ()
"Set the global shell command to use the current file.
This is useful if, for instance, a project was started using one
file, but later in development another file needs to be called
frequently. It is like a permanent version of
`xc/buffer-file-to-shell'."
(interactive)
(setq xc/global-shell-command (concat xc/python (buffer-file-name)))
(message "Set `xc/global-shell-command' to \"%s\"" xc/global-shell-command))
(defun xc/buffer-file-to-shell ()
"Send current buffer file to shell as python call."
(interactive)
(let ((script (buffer-file-name)))
(if script
(xc/sh-send-command (concat xc/python script))
(error "Command not sent. Buffer not visiting file"))))
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: How to use project.el
2020-11-21 1:03 ` excalamus--- via Users list for the GNU Emacs text editor
@ 2020-11-22 2:55 ` Dmitry Gutov
2020-11-23 16:22 ` excalamus--- via Users list for the GNU Emacs text editor
0 siblings, 1 reply; 10+ messages in thread
From: Dmitry Gutov @ 2020-11-22 2:55 UTC (permalink / raw)
To: excalamus; +Cc: Help Gnu Emacs
On 21.11.2020 03:03, excalamus@tutanota.com wrote:
>
>
>> To get the most benefit from the package, you should install the latest version from GNU ELPA ('M-x list-packages', then install 'project'). The latest version is 0.5.2.
>>
>> To see the full list of commands defined in that package, type 'C-x p C-h'.
>>
>> You can also read the full description of the package with 'C-h P project RET'.
>>
> Thank you, I was unfamiliar with 'C-h P'.
>
> I have updated to 0.5.2 and it's more like what I would have expected. Actually, several functions mirror my own project management code. My use-case is, of course, specific to me, but I see overlap. I wonder if any of my code, or its ideas, may be useful? Who is project.el's point person?
That would be me.
> I develop Python and prefer to interact through shell directly by sending commands to the comint buffer. At this point the main command is 'xc/sh-send-command'. This sends something like 'python main.py' or 'pyinstaller main.spec' to the appropriate shell and steps. I create a shell, either by name or on the fly, similar to 'project-shell' with 'xc/create-shell'. Everything else is just a helper.
>
> It's all hacky stuff I've made in the moment over time. This weekend, I hoped to create project profiles, a plist or something, with :root, :venv, :entry-point-file, etc., so that I can switch between shells and associated command sets easily, maybe also formalize it (hence my looking into project.el first).
>
> Thoughts?
In general, I like things to happen automatically for the user. For
instance, if you are working on a Python project, shouldn't there be
some file in the project root directory which will indicate which
virtualenv to use?
Then your workflow could be something like call (project-root
(project-current)), then read that file, then set the venv for the
current buffer to the appropriate value.
And :root, is that project root? The idea in project.el is that you can
write a function which will determine it, again, programmatically,
based, say, on the current directory (usually by traversal up the tree
and looking for some directory markers).
Of course, you can whip up a project backend which will plug into
project-find-functions, but allow you, as the user, to set up everything
manually, with manual switching between "profiles", etc. I'm just not
sure why you would prefer that.
As for switching, there is the project-switch-project command.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: How to use project.el
2020-11-22 2:55 ` Dmitry Gutov
@ 2020-11-23 16:22 ` excalamus--- via Users list for the GNU Emacs text editor
2020-11-23 22:19 ` Dmitry Gutov
0 siblings, 1 reply; 10+ messages in thread
From: excalamus--- via Users list for the GNU Emacs text editor @ 2020-11-23 16:22 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Help Gnu Emacs
21 nov. 2020 à 21:55 de dgutov@yandex.ru:
> For instance, if you are working on a Python project, shouldn't there be some file in the project root directory which will indicate which virtualenv to use?
>
Maybe? I've never heard of such a file being used with the venv module or conda environments.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: How to use project.el
2020-11-23 16:22 ` excalamus--- via Users list for the GNU Emacs text editor
@ 2020-11-23 22:19 ` Dmitry Gutov
2020-11-24 3:54 ` excalamus--- via Users list for the GNU Emacs text editor
0 siblings, 1 reply; 10+ messages in thread
From: Dmitry Gutov @ 2020-11-23 22:19 UTC (permalink / raw)
To: excalamus; +Cc: Help Gnu Emacs
On 23.11.2020 18:22, excalamus--- via Users list for the GNU Emacs text
editor wrote:
>
> 21 nov. 2020 à 21:55 de dgutov@yandex.ru:
>
>> For instance, if you are working on a Python project, shouldn't there be some file in the project root directory which will indicate which virtualenv to use?
>>
> Maybe? I've never heard of such a file being used with the venv module or conda environments.
OK, I'm not well-versed in Python ecosystem, but there is pyenv:
https://github.com/pyenv/pyenv
which apparently supports reading the python version from a file called
.python-version, and an Emacs package that provides some sort of
integration with it:
https://github.com/pythonic-emacs/pyenv-mode
But even if those packages don't work to your liking, or together with
"conda" (whatever that is), I think the general idea could be
implemented in Emacs Lisp: you call (project-root (project-current)) and
see if there is a file with a predetermined name inside that root. That
file could point to a specific virtualenv which you would then switch to.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: How to use project.el
2020-11-23 22:19 ` Dmitry Gutov
@ 2020-11-24 3:54 ` excalamus--- via Users list for the GNU Emacs text editor
2020-11-25 1:54 ` Dmitry Gutov
0 siblings, 1 reply; 10+ messages in thread
From: excalamus--- via Users list for the GNU Emacs text editor @ 2020-11-24 3:54 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Help Gnu Emacs
23 nov. 2020 à 17:19 de dgutov@yandex.ru:
> On 23.11.2020 18:22, excalamus--- via Users list for the GNU Emacs text editor wrote:
>
>>
>> 21 nov. 2020 à 21:55 de dgutov@yandex.ru:
>>
>>> For instance, if you are working on a Python project, shouldn't there be some file in the project root directory which will indicate which virtualenv to use?
>>>
>> Maybe? I've never heard of such a file being used with the venv module or conda environments.
>>
>
> OK, I'm not well-versed in Python ecosystem
>
I sadly am (it's my day job). "Should" is a dangerous assumption for Python. As far as I'm aware there's no unit of project nor standard way to indicate which environment to use or what packages are in that environment. Some people put a bajillion packages into a giant catch all environment to "reduce duplication", others have a 1:1 project to virtual environment relationship.
In practice, a project and virtual environment are separate, although each are determined by a directory (maybe the virtual environment is a subdirectory of the project directory; maybe virtual environments are all co-located in a separate envs/ directory). The user has to remember which virtual environment to activate and where that environment is located.
The virtual environment is activated by running some script which sets environment variables for the current shell instance.
> I think the general idea could be implemented in Emacs Lisp: you call (project-root (project-current)) and see if there is a file with a predetermined name inside that root. That file could point to a specific virtualenv which you would then switch to.
>
I could create my own project indicator file, I suppose. I'm not sure how that would help. But I'm getting (myself) lost. I may be stuck in my own pattern of solving things. What problem are we trying to solve here?
My project workflow is:
1. Create a shell2. Activate a virtual environment
3. Assign some commonly used commands based on the project (e.g. run this entry point, build according to this spec, etc.)
The trouble is managing several of these simultaneously (e.g. "Hey can you quickly fix this thing in this other project?") while maintaining the state of each.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: How to use project.el
2020-11-24 3:54 ` excalamus--- via Users list for the GNU Emacs text editor
@ 2020-11-25 1:54 ` Dmitry Gutov
2020-11-25 2:55 ` excalamus--- via Users list for the GNU Emacs text editor
0 siblings, 1 reply; 10+ messages in thread
From: Dmitry Gutov @ 2020-11-25 1:54 UTC (permalink / raw)
To: excalamus; +Cc: Help Gnu Emacs
On 24.11.2020 05:54, excalamus--- via Users list for the GNU Emacs text
editor wrote:
>
> 23 nov. 2020 à 17:19 de dgutov@yandex.ru:
>
>> On 23.11.2020 18:22, excalamus--- via Users list for the GNU Emacs text editor wrote:
>>
>>>
>>> 21 nov. 2020 à 21:55 de dgutov@yandex.ru:
>>>
>>>> For instance, if you are working on a Python project, shouldn't there be some file in the project root directory which will indicate which virtualenv to use?
>>>>
>>> Maybe? I've never heard of such a file being used with the venv module or conda environments.
>>>
>>
>> OK, I'm not well-versed in Python ecosystem
>>
> I sadly am (it's my day job). "Should" is a dangerous assumption for Python. As far as I'm aware there's no unit of project nor standard way to indicate which environment to use or what packages are in that environment. Some people put a bajillion packages into a giant catch all environment to "reduce duplication", others have a 1:1 project to virtual environment relationship.
> In practice, a project and virtual environment are separate, although each are determined by a directory (maybe the virtual environment is a subdirectory of the project directory; maybe virtual environments are all co-located in a separate envs/ directory). The user has to remember which virtual environment to activate and where that environment is located.
pyenv seems to be one such standard. Though of course it might not be
adopted by the projects you use (especially if they are collaborative,
and you don't make that decision).
> The virtual environment is activated by running some script which sets environment variables for the current shell instance.
>> I think the general idea could be implemented in Emacs Lisp: you call (project-root (project-current)) and see if there is a file with a predetermined name inside that root. That file could point to a specific virtualenv which you would then switch to.
>>
> I could create my own project indicator file, I suppose. I'm not sure how that would help. But I'm getting (myself) lost. I may be stuck in my own pattern of solving things. What problem are we trying to solve here?
>
> My project workflow is:
> 1. Create a shell2. Activate a virtual environment
> 3. Assign some commonly used commands based on the project (e.g. run this entry point, build according to this spec, etc.)
> The trouble is managing several of these simultaneously (e.g. "Hey can you quickly fix this thing in this other project?") while maintaining the state of each.
You asked how to maintain a number of "profiles" corresponding to
projects, each containing a venv, entry point, and so on.
My response is that in my preferred paradigm most or all of that
information is inferred from the files that reside in the project's root
directory. So to get some of that info you first find the project root,
and then read that info from disk. You can subsequently cache it, of course.
But if there is no existing standard for most of those things in your
projects, you might as well write some registry in Lisp, in your init
script, that would map, say, project roots to such profiles.
The benefit of having those auto-determined is that you could always
have them up-to-date and correspond to the current file you have opened
in Emacs (the current buffer). And when you switch to another project,
with project-switch-project or even the plain find-file, your
profile-finding logic would use the correct profile automatically,
without you having to recall which profile corresponds to which project.
But that's how I prefer to approach this kind of problem. You might
choose to do it differently.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: How to use project.el
2020-11-25 1:54 ` Dmitry Gutov
@ 2020-11-25 2:55 ` excalamus--- via Users list for the GNU Emacs text editor
0 siblings, 0 replies; 10+ messages in thread
From: excalamus--- via Users list for the GNU Emacs text editor @ 2020-11-25 2:55 UTC (permalink / raw)
To: Dmitry Gutov; +Cc: Help Gnu Emacs
24 nov. 2020 à 20:54 de dgutov@yandex.ru:
> But that's how I prefer to approach this kind of problem. You might choose to do it differently.
>
That makes sense. Thank you so much for taking the time to talk with me.
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2020-11-25 2:55 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-11-20 14:52 How to use project.el excalamus--- via Users list for the GNU Emacs text editor
2020-11-20 19:34 ` Jean Louis
2020-11-20 23:34 ` Dmitry Gutov
2020-11-21 1:03 ` excalamus--- via Users list for the GNU Emacs text editor
2020-11-22 2:55 ` Dmitry Gutov
2020-11-23 16:22 ` excalamus--- via Users list for the GNU Emacs text editor
2020-11-23 22:19 ` Dmitry Gutov
2020-11-24 3:54 ` excalamus--- via Users list for the GNU Emacs text editor
2020-11-25 1:54 ` Dmitry Gutov
2020-11-25 2:55 ` excalamus--- via Users list for the GNU Emacs text editor
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).