WEBVTT
00:00.000 --> 00:04.000
Hello, I'm Alexey Bochkarev, and I'm talking about
00:04.000 --> 00:07.000
unentangling projects and repositories,
00:07.000 --> 00:10.000
or maybe entangling them, depending on how you look at that.
00:12.000 --> 00:15.000
So that's going to be a short workflow note.
00:15.000 --> 00:19.000
I work as a researcher,
00:19.000 --> 00:23.000
so there are three main components to my work, I guess.
00:23.000 --> 00:27.000
First, I think, so I try to come up with new ideas,
00:27.000 --> 00:31.000
and that usually results in some collection of notes I have.
00:31.000 --> 00:35.000
Second, I try things out, so it usually means that I write code.
00:35.000 --> 00:39.000
And third, I communicate, so I prepare papers,
00:39.000 --> 00:43.000
presentations, memos, and so on and so forth.
00:43.000 --> 00:47.000
And so the workflow problem I had is
00:47.000 --> 00:51.000
sometimes all this does not really fit
00:51.000 --> 00:55.000
into a concept of a single repository per project,
00:55.000 --> 00:59.000
so I might want to have, for example,
00:59.000 --> 01:03.000
a source code in one repository, and then I would like to have a paper
01:03.000 --> 01:07.000
in another one, and then I want to have a collection of notes somewhere
01:07.000 --> 01:11.000
unrelated to those two. And yeah,
01:11.000 --> 01:15.000
Emacs is pretty good at supporting your workflows, and I figured I should
01:15.000 --> 01:19.000
share what I use and what works for me.
01:19.000 --> 01:23.000
So,
01:23.000 --> 01:27.000
from the technical perspective, things are
01:27.000 --> 01:31.000
pretty easy, so I use a collection of pretty standard components
01:31.000 --> 01:35.000
of Emacs, so it's a projectile org-mode with its capture templates and other
01:35.000 --> 01:39.000
things. Then I sustain a collection of notes in something
01:39.000 --> 01:43.000
that is called org-roam, which is, well, essentially, it's a glorified
01:43.000 --> 01:47.000
collection of org-mode files. Then I use directory
01:47.000 --> 01:51.000
local variables, maybe a ctext to jump through the source code,
01:51.000 --> 01:55.000
and very, very little Elisp glue to make this
01:55.000 --> 01:59.000
all work, but that's not really rocket science.
01:59.000 --> 02:03.000
So that's the workflow I would like to talk about today.
02:03.000 --> 02:07.000
So, what I mean by all that,
02:07.000 --> 02:11.000
it's pretty straightforward to make
02:11.000 --> 02:15.000
it easy to jump around a single repository in Emacs.
02:15.000 --> 02:19.000
Now, I have Doom Emacs, but that's not really specific to Doom.
02:19.000 --> 02:23.000
That'll work in any Emacs configuration.
02:23.000 --> 02:27.000
Well, kbindings might be
02:27.000 --> 02:31.000
different, but that's not the point, I guess, for the workflow. So, if I hit space
02:31.000 --> 02:35.000
two times, I have all the list of files within my project.
02:35.000 --> 02:39.000
So, if I create a couple of custom shortcuts,
02:39.000 --> 02:43.000
so if I press a magic button,
02:43.000 --> 02:47.000
hyperlp, don't worry about hyperkey, so I want it to have a
02:47.000 --> 02:51.000
modifier key all to myself, so that would, no program
02:51.000 --> 02:55.000
on my computer would use that except Emacs, and Emacs would
02:55.000 --> 02:59.000
use that only when I tell it to, so I have a hyperkey instead of caps lock, that's pretty easy
02:59.000 --> 03:03.000
to do in GNU Linux system. So,
03:03.000 --> 03:07.000
when I press this magic keys, I have a menu that's a normal
03:07.000 --> 03:11.000
kbinding, yeah, essentially in Emacs, and
03:11.000 --> 03:15.000
if I hit, for example, R, I end up in a readme file within
03:15.000 --> 03:19.000
this specific repository I was sitting in, right, so if I want to document something
03:19.000 --> 03:23.000
real quick, I go to the readme file. Then I could have, I could
03:23.000 --> 03:27.000
go to a changelog file, right, so I have a list of changes
03:27.000 --> 03:31.000
and the way it works, usually, for example, if I'm working on some code,
03:31.000 --> 03:35.000
I created a couple of dummy files in there, so
03:35.000 --> 03:39.000
I'm working on some code, and then I implemented something, and I can
03:39.000 --> 03:43.000
just use the org mode capture
03:43.000 --> 03:47.000
mechanisms to keep track of what
03:47.000 --> 03:51.000
I want to discuss with colleagues next time, for example, I could just hit
03:51.000 --> 03:55.000
capture repo specific changelog entry
03:55.000 --> 03:59.000
and I implemented a feature
03:59.000 --> 04:03.000
and I can continue working
04:03.000 --> 04:07.000
without this context switching, and then if I want to go to the changelog,
04:07.000 --> 04:11.000
well, it is there, and next time I talk
04:11.000 --> 04:15.000
to the colleagues about the source code, I can open the changelog and go through entries one by one
04:15.000 --> 04:19.000
and discuss what I have implemented last time.
04:19.000 --> 04:23.000
I could go to project specific
04:23.000 --> 04:27.000
to, sorry, to repo specific to-do list, and I have
04:27.000 --> 04:31.000
a list of to-dos that would live within a repository, and
04:31.000 --> 04:35.000
for example, I could have a high-level structure here,
04:35.000 --> 04:39.000
work distribution between team members and other things that sort of face
04:39.000 --> 04:43.000
the world, so to speak, and of course,
04:43.000 --> 04:47.000
there are very many ways to jump through the source code conveniently,
04:47.000 --> 04:51.000
I ended up not using language servers, I used a special program called
04:51.000 --> 04:55.000
ctags, and so the way it works is just I call
04:55.000 --> 04:59.000
projectile regenerate tags, and it creates the special
04:59.000 --> 05:03.000
tags file within the repository,
05:03.000 --> 05:07.000
and then I can, again, run
05:07.000 --> 05:11.000
I usually just hit a single keystroke,
05:11.000 --> 05:15.000
and here is all the symbols that are there in my
05:15.000 --> 05:19.000
source code, regardless of the language, right, so I can jump to the main function
05:19.000 --> 05:23.000
and that'll be a C++ file, or I could go to the super function, which I
05:23.000 --> 05:27.000
had in my Python file, and this comes in pretty convenient if I have
05:27.000 --> 05:31.000
a mixture of languages, so sometimes I can have some algorithm-specific code
05:31.000 --> 05:35.000
in Julia, and then I can have some Python glue within the same
05:35.000 --> 05:39.000
source code repository, and it makes it really convenient to jump
05:39.000 --> 05:43.000
between all of those, right,
05:43.000 --> 05:47.000
but I have a few problems here,
05:47.000 --> 05:51.000
just to give you a little bit of context, for example, here is the
05:51.000 --> 05:55.000
a real project that corresponds to a real paper,
05:55.000 --> 05:59.000
I have a single note about that project,
05:59.000 --> 06:03.000
where I keep all the things related to that project here, but that's a private
06:03.000 --> 06:07.000
note, so for example, again, I hit a special key that
06:07.000 --> 06:11.000
invokes my org-roam function that gives me a menu of my
06:11.000 --> 06:15.000
notes, and so here is the paper,
06:15.000 --> 06:19.000
essentially, and I can have a paper timeline, and I can
06:19.000 --> 06:23.000
have a list of all the dates, what happened to the paper, with links
06:23.000 --> 06:27.000
to my email, right, so for example, if I hit this link,
06:27.000 --> 06:31.000
that'll open a specific email, and that doesn't work outside of my
06:31.000 --> 06:35.000
computer, it doesn't make any sense to keep it in the outer world-facing
06:35.000 --> 06:39.000
repository, for example, so that's something to myself, right, sometimes I want
06:39.000 --> 06:43.000
to have, like, this list of
06:43.000 --> 06:47.000
working notes, right, that contain, like, for example,
06:47.000 --> 06:51.000
I might produce this kind of things for internal discussion, right,
06:51.000 --> 06:55.000
it has some marks, it has some margin notes, and things like that,
06:55.000 --> 06:59.000
maybe, again, health-based ideas that may or may not end up
06:59.000 --> 07:03.000
in a repository, in a final paper, or in a source code,
07:03.000 --> 07:07.000
but still I want to have it somewhere, and
07:07.000 --> 07:11.000
well, long story short, I need a project folder
07:11.000 --> 07:15.000
that would be unrelated to the source code, or
07:15.000 --> 07:19.000
to the source code repository, or to the paper itself,
07:19.000 --> 07:23.000
or a final report, right, and one way,
07:23.000 --> 07:27.000
as usual, there are multiple ways to achieve that, I suppose, and one way to do that
07:27.000 --> 07:31.000
is, so, I create
07:31.000 --> 07:35.000
a special folder within my org-roam
07:35.000 --> 07:39.000
storage, so it's a special folder outside of any
07:39.000 --> 07:43.000
repositories that got backed up to my hard drive, with
07:43.000 --> 07:47.000
certain redundancy, but I don't really need, like, version control, full-blown
07:47.000 --> 07:51.000
version control for that, I'm okay with just having a couple of backups, right, so
07:51.000 --> 07:55.000
this is the folder you see here, so pkb stands for personal knowledge
07:55.000 --> 07:59.000
base, and I have a folder, project notes in there, right, so
07:59.000 --> 08:03.000
and, how does it work, so I have a
08:03.000 --> 08:07.000
folder per project in there, essentially, and here I can
08:07.000 --> 08:11.000
have all the stuff that is, that kind of belongs to me, and I
08:11.000 --> 08:15.000
do not publish it anywhere, and then
08:15.000 --> 08:19.000
for example, a source code
08:19.000 --> 08:23.000
repository knows about that folder, and a paper repository
08:23.000 --> 08:27.000
knows about that folder, and anything else that might live in separate
08:27.000 --> 08:31.000
places all over my system can know about that folder, and how do I achieve that,
08:31.000 --> 08:35.000
well, essentially, this is one of the use cases for the directory
08:35.000 --> 08:39.000
local variables, right, so, for example,
08:39.000 --> 08:43.000
how does it work from the user perspective, so if I hit a special
08:43.000 --> 08:47.000
key, oh, sorry, if I hit a special key
08:47.000 --> 08:51.000
that would be open project
08:51.000 --> 08:55.000
and then, for example,
08:55.000 --> 08:59.000
org mode file, right, so this is my personal notes about the emacs conf, not
08:59.000 --> 09:03.000
specifically about this very talk, but I can have, you know,
09:03.000 --> 09:07.000
half-baked ideas here, again, presentation tools, and things like that,
09:07.000 --> 09:11.000
and how does that happen if we try to
09:11.000 --> 09:15.000
look at the code, the elisp magic here, what
09:15.000 --> 09:19.000
is happening is, it's just a couple lines of code, in fact, so
09:19.000 --> 09:23.000
let me just press control, help
09:23.000 --> 09:27.000
key, and so the key I was
09:27.000 --> 09:31.000
pressing is open project org mode file, and so
09:31.000 --> 09:35.000
what we see here, there is a single, so it's just a call to a find
09:35.000 --> 09:39.000
file function, so I open that file, and there is a special function that
09:39.000 --> 09:43.000
figures out what is the, like, umbrella
09:43.000 --> 09:47.000
project notes file, and that's, again, that's very easy, so
09:47.000 --> 09:51.000
essentially, if a variable describing this
09:51.000 --> 09:55.000
the name for that project is defined, then
09:55.000 --> 09:59.000
I use that as my project folder name, if not, I take the project name from the
09:59.000 --> 10:03.000
project towel, and well, that's pretty much it,
10:03.000 --> 10:07.000
and how do I define this
10:07.000 --> 10:11.000
variable is, essentially, there is this
10:11.000 --> 10:15.000
magical file in a folder called dear locals elisp,
10:15.000 --> 10:19.000
and I just put it there, and then, whenever I
10:19.000 --> 10:23.000
go into that folder, or any of its children folders, I get this
10:23.000 --> 10:27.000
variable defined, and that's pretty much it, that's how
10:27.000 --> 10:31.000
it works for me.
10:31.000 --> 10:35.000
I guess one thing that I wanted to emphasize
10:35.000 --> 10:39.000
specifically about that is, of course, it's
10:39.000 --> 10:43.000
time tracking, right, so what I find especially important when I work in
10:43.000 --> 10:47.000
something, and I want to clock time, I usually do not want
10:47.000 --> 10:51.000
this information to be in a source code repository or in a paper repository
10:51.000 --> 10:55.000
because other people I work with will not be particularly happy about that
10:55.000 --> 10:59.000
especially if most of them do not use Emacs, and they will see
10:59.000 --> 11:03.000
this long list of org clocked data, and that doesn't look
11:03.000 --> 11:07.000
nice in a plain text format, so what I usually
11:07.000 --> 11:11.000
do if I want to clock in some time, and then later analyze what I've
11:11.000 --> 11:15.000
been spending time on, so I go to my org mode file
11:15.000 --> 11:19.000
and I go to my current project
11:19.000 --> 11:23.000
to-dos, and I clock in there, and that's
11:23.000 --> 11:27.000
how it works, so again
11:27.000 --> 11:31.000
what comes in handy if I hit ctrl-o, I just go
11:31.000 --> 11:35.000
back to the file I jumped from, so that's also
11:35.000 --> 11:39.000
pretty handy, so again, no rocket science in there
11:39.000 --> 11:43.000
so I create a directory local variable that helps me
11:43.000 --> 11:47.000
to figure out what umbrella project does
11:47.000 --> 11:51.000
this particular folder belongs to, and this way
11:51.000 --> 11:55.000
I make Emacs aware of, for example, facts like so this
11:55.000 --> 11:59.000
source code belongs to that project, and this repository with the paper
11:59.000 --> 12:03.000
also belongs to that project, and I can have capture templates
12:03.000 --> 12:07.000
that would save my notes into my private notes
12:07.000 --> 12:11.000
file, and my to-dos go to my private note files
12:11.000 --> 12:15.000
and so on and so forth, so I find it pretty simple, but
12:15.000 --> 12:19.000
that really helps to reduce this context
12:19.000 --> 12:23.000
switching, and I don't believe it allows me to save time
12:23.000 --> 12:27.000
but that probably helps me to stay focused, and this
12:27.000 --> 12:31.000
is what is really important, I believe, so thank you
12:31.000 --> 12:35.000
very much, and if you have any comments or suggestions to that, please do jump
12:35.000 --> 12:39.000
into the discussion, yeah, after the talk, thank you.