diff options
Diffstat (limited to '')
-rw-r--r-- | 2022/info/treesitter-after.md | 485 | ||||
-rw-r--r-- | 2022/info/treesitter-before.md | 6 |
2 files changed, 245 insertions, 246 deletions
diff --git a/2022/info/treesitter-after.md b/2022/info/treesitter-after.md index ddbc3e9a..d7268f8c 100644 --- a/2022/info/treesitter-after.md +++ b/2022/info/treesitter-after.md @@ -4,249 +4,248 @@ <a name="treesitter-mainVideo-transcript"></a> # Transcript -[[!template new="1" text="Hey everyone, my name is Abin Simon" start="00:00:00.000" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and this talk is about "Tree-sitter:" start="00:00:03.240" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Beyond Syntax Highlighting."" start="00:00:05.080" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="For those who are not aware of what Tree-sitter is," start="00:00:08.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="let me give you a quick intro." start="00:00:10.720" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Tree-sitter, at its core, is a parser generator tool" start="00:00:11.720" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and an incremental parsing library." start="00:00:17.120" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="What it essentially means is that it gives you" start="00:00:19.440" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="an always up-to-date" start="00:00:22.000" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="AST [abstract syntax tree] of your code." start="00:00:23.155" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="In the current Emacs frame, what you see to the right" start="00:00:24.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template new="1" text="is the AST tree produced by Tree-sitter" start="00:00:27.960" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="of the code that is on the left." start="00:00:30.840" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="For example, if you go to this "if" statement," start="00:00:33.560" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="you can see it goes here." start="00:00:37.000" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="It is also really good at handling errors." start="00:00:38.840" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="For example, if I were to delete this [if statement]," start="00:00:41.440" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="it still parses out a tree as much as it can," start="00:00:44.400" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="but with an error node." start="00:00:47.960" video="mainVideo-treesitter" id="subtitle"]] -[[!template new="1" text="Now let's see how we can query the tree" start="00:00:50.280" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="to get the information that we need." start="00:00:51.760" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Let's first try to get all the identifiers in the buffer." start="00:00:54.440" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="It highlights all the identifiers in the buffer," start="00:01:01.480" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="but let's say we want to get something" start="00:01:04.000" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="a little more precise." start="00:01:05.440" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Let's say we wanted to get this "i" here." start="00:01:07.280" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="This, in our case, would be this identifier" start="00:01:10.400" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="inside this assignment expression" start="00:01:13.280" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="inside this "for" statement." start="00:01:15.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="We can write it out like this." start="00:01:27.320" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I hope this gives you a basic idea" start="00:01:29.920" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="of how Tree-sitter works and how you can query" start="00:01:31.880" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="to get the information that you need." start="00:01:34.480" video="mainVideo-treesitter" id="subtitle"]] -[[!template new="1" text="First of all, let's see how Tree-sitter can help us" start="00:01:37.040" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="with syntax highlighting." start="00:01:39.520" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="This is the default syntax highlighting by Emacs for SQL." start="00:01:41.880" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Now let's see how Tree-sitter helps." start="00:01:46.480" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="This is the syntax highlighting in Emacs" start="00:01:52.000" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="which Tree-sitter enabled." start="00:01:54.240" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="You'll see that we're able to target" start="00:01:56.760" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="a lot more things and highlight them." start="00:01:58.240" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="That said, you don't always have to" start="00:02:01.240" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="highlight everything." start="00:02:03.139" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I personally prefer a much simpler theme." start="00:02:04.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template new="1" text="Now let's see how Tree-sitter helps you simplify" start="00:02:15.640" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="adding custom syntax highlighting to your code." start="00:02:17.880" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="This is a Python file which has" start="00:02:20.920" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="a class and a few member functions." start="00:02:22.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Anyone who has used Python will know that" start="00:02:25.640" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="the "self" keyword, while it is passed in as an argument," start="00:02:27.680" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="it has more meaning than that." start="00:02:32.040" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Let's see if you can use Tree-sitter" start="00:02:34.240" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="to highlight just the "self" keyword." start="00:02:35.480" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="If you look at the Tree-sitter tree," start="00:02:38.720" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="you can see that this is the first identifier" start="00:02:40.400" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="in the list of parameters for a function definition." start="00:02:43.120" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="This is how you would query for the first identifier" start="00:02:45.520" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="inside parameters inside a function definition." start="00:02:55.480" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Now, if you see here, it also matches "cls"," start="00:02:59.320" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="but let's restrict it to match just "self"." start="00:03:02.520" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Now we have a Tree-sitter query that identifies" start="00:03:11.360" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="the first argument to the function definition" start="00:03:14.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and is also called "self"." start="00:03:16.960" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="We can use this to apply custom highlighting onto this." start="00:03:19.640" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="This is pretty much all the code" start="00:03:22.520" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="that you'll need to do this." start="00:03:25.000" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="The first block here is essentially to say to" start="00:03:26.520" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Tree-sitter to highlight anything with python.self" start="00:03:29.240" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="with the face of custom-set." start="00:03:32.160" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Now the second block here essentially is" start="00:03:35.720" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="how we match for that." start="00:03:37.520" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Now if you go back into a Python buffer" start="00:03:39.800" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and re-enable python-mode, we'll see that "self"" start="00:03:41.800" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="is highlighted differently." start="00:03:44.680" video="mainVideo-treesitter" id="subtitle"]] -[[!template new="1" text="How about creating text objects?" start="00:03:47.120" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Tree-sitter can help there too." start="00:03:48.880" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="For those who don't know, text objects" start="00:03:50.440" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="is an idea that comes from Vim," start="00:03:53.080" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and you can do things like select word," start="00:03:54.440" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="delete word, things like that." start="00:03:57.760" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="There are other text objects like line and paragraph." start="00:04:00.520" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="For each text object, you can have operations" start="00:04:06.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="that are defined on them." start="00:04:09.000" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="For example, delete, copy, select, comment," start="00:04:09.760" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="all of these are operations that you can do." start="00:04:13.600" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Let's try and use Tree-sitter to add more text objects." start="00:04:16.400" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="This is a plugin that I wrote" start="00:04:19.400" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="which lets you add more text objects into Emacs." start="00:04:20.560" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="It helps you code aware text objects" start="00:04:25.000" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="like functions, conditionals, loops, and such." start="00:04:27.880" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Let's see an example scenario of how" start="00:04:31.880" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="something like this could come in handy." start="00:04:34.360" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="For example, I can select inside this condition" start="00:04:35.920" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="or inside this function and do things like that." start="00:04:39.280" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Let's say I want to take this conditional," start="00:04:42.960" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="move to the next function, and create it here." start="00:04:44.520" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="What I would do is something like" start="00:04:47.160" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="delete the conditional, move to the next function," start="00:04:49.640" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="create a conditional there, and paste." start="00:04:52.320" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Let's try another example." start="00:04:56.240" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Let's say I want to take this and move it to the end." start="00:04:57.160" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="If I had to do it without text objects," start="00:05:01.360" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I'd probably have to go back to the previous comma," start="00:05:02.960" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="delete till next comma, find the closing bracket," start="00:05:06.800" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and paste before." start="00:05:10.440" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="That works, but let's see" start="00:05:11.880" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="how Tree-sitter can simplify it." start="00:05:14.040" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="With Tree-sitter, I can say delete the argument," start="00:05:16.520" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="go to the end of the next argument, and then paste." start="00:05:19.240" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Tree-sitter essentially helps Emacs" start="00:05:22.880" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="understand the code better semantically." start="00:05:25.280" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Here is yet another use case." start="00:05:27.240" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I work at a remote company," start="00:05:29.600" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and I often find myself being in a call" start="00:05:31.480" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="with my teammates, explaining the code to them." start="00:05:33.440" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="And one thing that really comes in handy" start="00:05:35.400" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="is the narrowing accessibility of Emacs." start="00:05:38.000" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Specifically, the fancy-narrow package." start="00:05:39.760" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I use it to narrow just the function," start="00:05:43.040" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="or I could narrow to the conditional." start="00:05:44.840" video="mainVideo-treesitter" id="subtitle"]] -[[!template new="1" text="Next to the end, the list would be code folding." start="00:05:48.760" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="This is a package which uses Tree-sitter" start="00:05:51.520" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="to improve the code folding functionalities of Emacs." start="00:05:54.480" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Code folding has always been this thing" start="00:05:57.560" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="that I've had a love-hate relationship with." start="00:06:00.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="It usually works most of the time," start="00:06:02.280" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="but then fails if the indentation is wrong" start="00:06:04.280" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="or we do something weird with the arguments." start="00:06:06.960" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="But now with Tree-sitter in the mix," start="00:06:09.160" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="it's a lot more precise." start="00:06:11.680" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I can fold comments, I can fold functions," start="00:06:12.720" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I can fold conditionals. You get the idea." start="00:06:17.040" video="mainVideo-treesitter" id="subtitle"]] -[[!template new="1" text="I work with Kubernetes, which means I end up" start="00:06:20.480" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="having to write and read a lot of YAML files." start="00:06:23.840" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="And navigating big YAML files is a mess." start="00:06:28.080" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="The two main problems are figuring out where I am," start="00:06:31.840" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and two, navigating to where I want to be." start="00:06:35.760" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Let's see how Tree-sitter can help us with both of this." start="00:06:38.760" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="This is an example YAML file." start="00:06:41.760" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="To be precise, this is the values file" start="00:06:43.840" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="of the Redis helm chart." start="00:06:47.080" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I'm somewhere in the file on tag under image," start="00:06:48.640" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="but I don't know what this tag is for." start="00:06:52.240" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="But with the help of Tree-sitter," start="00:06:54.880" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I've been able to add this information" start="00:06:57.240" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="into my header line." start="00:06:59.160" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="If you see in the header line," start="00:07:00.440" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="you'll see that I'm under sentinel.image." start="00:07:02.960" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Now let's see how this helps with navigation." start="00:07:05.880" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Let's say I want to enable persistence on master node." start="00:07:08.800" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="So with the help of Tree-sitter," start="00:07:12.680" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I was able to enumerate every field" start="00:07:18.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="that is available in this YAML file," start="00:07:20.400" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and I can pass that information onto imenu," start="00:07:22.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="which I can then use to go to exactly where I want to." start="00:07:24.520" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Also, since we're not dealing with" start="00:07:28.040" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="any language specific constructs," start="00:07:30.000" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="this is very easy to extend to" start="00:07:32.600" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="other similar languages" start="00:07:34.040" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="or config files in this case." start="00:07:35.760" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="So for example, this is a JSON file," start="00:07:37.440" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and I can navigate to location or project." start="00:07:39.520" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="And just like in YAML, it shows me where I'm at." start="00:07:44.800" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I'm in projects.name," start="00:07:48.320" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="or I'm inside projects.highlights." start="00:07:49.920" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Or how about Nix?" start="00:07:52.880" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="This is my home.nix file." start="00:07:55.600" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Again, I can search for services," start="00:07:57.480" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and this lists me all the services that I've enabled." start="00:08:01.040" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="How about just services.description?" start="00:08:04.640" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="So this is all the services" start="00:08:06.720" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="that I've enabled and have descriptions." start="00:08:08.160" video="mainVideo-treesitter" id="subtitle"]] -[[!template new="1" text="Now that we have seen this for config files," start="00:08:10.480" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="let's see how similar things apply for code." start="00:08:12.720" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Just like in config files," start="00:08:15.040" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I can see which function I'm under," start="00:08:16.760" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and if I go to the next function, it changes." start="00:08:18.680" video="mainVideo-treesitter" id="subtitle"]] -[[!template new="1" text="Okay, here is something really awesome." start="00:08:21.560" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="This is probably one of my favorites," start="00:08:23.960" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and one of the things that actually made me understand" start="00:08:26.600" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="how powerful Tree-sitter is, and got me into it." start="00:08:30.400" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I work with a lot of Go code," start="00:08:34.080" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and anyone who has worked with Go will tell you" start="00:08:35.680" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="how repetitive it is handling errors." start="00:08:38.840" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="For those who don't write Go," start="00:08:41.040" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="let me give you a rough idea of what I'm talking about." start="00:08:42.800" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="If you want to bubble up the error," start="00:08:45.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="the way you would do it is just to return the error" start="00:08:47.000" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="to the function that called it." start="00:08:49.920" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Over here, you can either return nil or an empty value," start="00:08:51.400" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and at the end, you return error." start="00:08:55.720" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Let's try and use Tree-sitter to do this." start="00:08:57.640" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Using the help of Tree-sitter, let's make Emacs" start="00:09:00.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="go back, figure out what the return arguments are," start="00:09:03.120" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="figure out what their default values are," start="00:09:06.422" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and automatically fill in the return statement." start="00:09:08.240" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="It would look something like this." start="00:09:11.480" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="In my case, it filled in the complete form," start="00:09:13.040" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="it figured out what the return arguments are," start="00:09:16.120" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="what their types are," start="00:09:18.320" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and what their default values are," start="00:09:19.320" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and filled out the entire return." start="00:09:20.960" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="And since this is a template," start="00:09:22.800" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I can go to the next function, do the same thing," start="00:09:24.760" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="next function, do the same thing," start="00:09:27.720" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="next function, do the same thing." start="00:09:29.560" video="mainVideo-treesitter" id="subtitle"]] -[[!template new="1" text="Here is a really fascinating use case of Tree-sitter," start="00:09:31.520" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="structural editing." start="00:09:34.360" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="You might be aware of plugins like paredit," start="00:09:36.320" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="which seems to "know" your code." start="00:09:38.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="This sort of takes it onto another level." start="00:09:40.280" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="It is in its early stages, but what this lets you do" start="00:09:42.520" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="is completely treat your code as an AST," start="00:09:46.040" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and edit as if it's a tree instead of characters." start="00:09:48.920" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="I am not going to go much in depth into it," start="00:09:52.000" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="but if you're interested, there is a talk" start="00:09:54.640" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="from last year's EmacsConf around it." start="00:09:57.000" video="mainVideo-treesitter" id="subtitle"]] -[[!template new="1" text="I'm just going to end this with one last tiny thing" start="00:09:59.080" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="that I found in the tree-sitter-extras package." start="00:10:02.320" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="It's this tiny macro called tree-sitter-save-excursion." start="00:10:04.920" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="It works pretty much like save-excursion, but better." start="00:10:07.600" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="It uses the Tree-sitter syntax tree" start="00:10:11.240" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="instead of just the code" start="00:10:13.400" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="to figure out where to restore the position." start="00:10:14.800" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="My main use case for this was with code formatters." start="00:10:16.720" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="Since the code moves around a lot" start="00:10:20.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="when it gets formatted," start="00:10:22.080" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="save-excursion was completely useless," start="00:10:23.160" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="but this came in handy." start="00:10:25.000" video="mainVideo-treesitter" id="subtitle"]] -[[!template new="1" text="I'll just leave you off with" start="00:10:26.240" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="what the future of Tree-sitter looks like for Emacs." start="00:10:28.120" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="So far, every Tree-sitter related feature" start="00:10:31.120" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="that I've talked about is powered by this library." start="00:10:33.760" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="But there is talk about Tree-sitter coming into the core." start="00:10:36.040" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="It will most probably be landing in Emacs 29," start="00:10:42.320" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="and if you want to check out the work on Tree-sitter" start="00:10:45.840" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="in core Emacs, you can check out" start="00:10:48.720" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="the features/tree-sitter branch." start="00:10:51.200" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="You'll probably see more and more features and packages" start="00:10:52.920" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="relying upon Tree-sitter, and even major modes" start="00:10:56.640" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="being powered by Tree-sitter." start="00:10:59.640" video="mainVideo-treesitter" id="subtitle"]] -[[!template text="And that's a wrap from me. Thank you." start="00:11:01.560" video="mainVideo-treesitter" id="subtitle"]] - +[[!template new="1" text="""Hey everyone, my name is Abin Simon""" start="00:00:00.000" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and this talk is about "Tree-sitter:""" start="00:00:03.240" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Beyond Syntax Highlighting."""" start="00:00:05.080" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""For those who are not aware of what Tree-sitter is,""" start="00:00:08.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""let me give you a quick intro.""" start="00:00:10.720" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Tree-sitter, at its core, is a parser generator tool""" start="00:00:11.720" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and an incremental parsing library.""" start="00:00:17.120" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""What it essentially means is that it gives you""" start="00:00:19.440" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""an always up-to-date""" start="00:00:22.000" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""AST [abstract syntax tree] of your code.""" start="00:00:23.155" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""In the current Emacs frame, what you see to the right""" start="00:00:24.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template new="1" text="""is the AST tree produced by Tree-sitter""" start="00:00:27.960" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""of the code that is on the left.""" start="00:00:30.840" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""For example, if you go to this "if" statement,""" start="00:00:33.560" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""you can see it goes here.""" start="00:00:37.000" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""It is also really good at handling errors.""" start="00:00:38.840" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""For example, if I were to delete this [if statement],""" start="00:00:41.440" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""it still parses out a tree as much as it can,""" start="00:00:44.400" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""but with an error node.""" start="00:00:47.960" video="mainVideo-treesitter" id="subtitle"]] +[[!template new="1" text="""Now let's see how we can query the tree""" start="00:00:50.280" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""to get the information that we need.""" start="00:00:51.760" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Let's first try to get all the identifiers in the buffer.""" start="00:00:54.440" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""It highlights all the identifiers in the buffer,""" start="00:01:01.480" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""but let's say we want to get something""" start="00:01:04.000" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""a little more precise.""" start="00:01:05.440" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Let's say we wanted to get this "i" here.""" start="00:01:07.280" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""This, in our case, would be this identifier""" start="00:01:10.400" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""inside this assignment expression""" start="00:01:13.280" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""inside this "for" statement.""" start="00:01:15.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""We can write it out like this.""" start="00:01:27.320" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I hope this gives you a basic idea""" start="00:01:29.920" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""of how Tree-sitter works and how you can query""" start="00:01:31.880" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""to get the information that you need.""" start="00:01:34.480" video="mainVideo-treesitter" id="subtitle"]] +[[!template new="1" text="""First of all, let's see how Tree-sitter can help us""" start="00:01:37.040" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""with syntax highlighting.""" start="00:01:39.520" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""This is the default syntax highlighting by Emacs for SQL.""" start="00:01:41.880" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Now let's see how Tree-sitter helps.""" start="00:01:46.480" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""This is the syntax highlighting in Emacs""" start="00:01:52.000" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""which Tree-sitter enabled.""" start="00:01:54.240" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""You'll see that we're able to target""" start="00:01:56.760" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""a lot more things and highlight them.""" start="00:01:58.240" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""That said, you don't always have to""" start="00:02:01.240" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""highlight everything.""" start="00:02:03.139" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I personally prefer a much simpler theme.""" start="00:02:04.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template new="1" text="""Now let's see how Tree-sitter helps you simplify""" start="00:02:15.640" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""adding custom syntax highlighting to your code.""" start="00:02:17.880" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""This is a Python file which has""" start="00:02:20.920" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""a class and a few member functions.""" start="00:02:22.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Anyone who has used Python will know that""" start="00:02:25.640" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""the "self" keyword, while it is passed in as an argument,""" start="00:02:27.680" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""it has more meaning than that.""" start="00:02:32.040" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Let's see if you can use Tree-sitter""" start="00:02:34.240" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""to highlight just the "self" keyword.""" start="00:02:35.480" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""If you look at the Tree-sitter tree,""" start="00:02:38.720" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""you can see that this is the first identifier""" start="00:02:40.400" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""in the list of parameters for a function definition.""" start="00:02:43.120" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""This is how you would query for the first identifier""" start="00:02:45.520" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""inside parameters inside a function definition.""" start="00:02:55.480" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Now, if you see here, it also matches "cls",""" start="00:02:59.320" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""but let's restrict it to match just "self".""" start="00:03:02.520" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Now we have a Tree-sitter query that identifies""" start="00:03:11.360" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""the first argument to the function definition""" start="00:03:14.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and is also called "self".""" start="00:03:16.960" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""We can use this to apply custom highlighting onto this.""" start="00:03:19.640" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""This is pretty much all the code""" start="00:03:22.520" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""that you'll need to do this.""" start="00:03:25.000" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""The first block here is essentially to say to""" start="00:03:26.520" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Tree-sitter to highlight anything with python.self""" start="00:03:29.240" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""with the face of custom-set.""" start="00:03:32.160" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Now the second block here essentially is""" start="00:03:35.720" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""how we match for that.""" start="00:03:37.520" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Now if you go back into a Python buffer""" start="00:03:39.800" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and re-enable python-mode, we'll see that "self"""" start="00:03:41.800" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""is highlighted differently.""" start="00:03:44.680" video="mainVideo-treesitter" id="subtitle"]] +[[!template new="1" text="""How about creating text objects?""" start="00:03:47.120" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Tree-sitter can help there too.""" start="00:03:48.880" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""For those who don't know, text objects""" start="00:03:50.440" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""is an idea that comes from Vim,""" start="00:03:53.080" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and you can do things like select word,""" start="00:03:54.440" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""delete word, things like that.""" start="00:03:57.760" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""There are other text objects like line and paragraph.""" start="00:04:00.520" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""For each text object, you can have operations""" start="00:04:06.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""that are defined on them.""" start="00:04:09.000" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""For example, delete, copy, select, comment,""" start="00:04:09.760" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""all of these are operations that you can do.""" start="00:04:13.600" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Let's try and use Tree-sitter to add more text objects.""" start="00:04:16.400" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""This is a plugin that I wrote""" start="00:04:19.400" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""which lets you add more text objects into Emacs.""" start="00:04:20.560" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""It helps you code aware text objects""" start="00:04:25.000" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""like functions, conditionals, loops, and such.""" start="00:04:27.880" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Let's see an example scenario of how""" start="00:04:31.880" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""something like this could come in handy.""" start="00:04:34.360" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""For example, I can select inside this condition""" start="00:04:35.920" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""or inside this function and do things like that.""" start="00:04:39.280" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Let's say I want to take this conditional,""" start="00:04:42.960" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""move to the next function, and create it here.""" start="00:04:44.520" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""What I would do is something like""" start="00:04:47.160" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""delete the conditional, move to the next function,""" start="00:04:49.640" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""create a conditional there, and paste.""" start="00:04:52.320" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Let's try another example.""" start="00:04:56.240" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Let's say I want to take this and move it to the end.""" start="00:04:57.160" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""If I had to do it without text objects,""" start="00:05:01.360" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I'd probably have to go back to the previous comma,""" start="00:05:02.960" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""delete till next comma, find the closing bracket,""" start="00:05:06.800" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and paste before.""" start="00:05:10.440" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""That works, but let's see""" start="00:05:11.880" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""how Tree-sitter can simplify it.""" start="00:05:14.040" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""With Tree-sitter, I can say delete the argument,""" start="00:05:16.520" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""go to the end of the next argument, and then paste.""" start="00:05:19.240" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Tree-sitter essentially helps Emacs""" start="00:05:22.880" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""understand the code better semantically.""" start="00:05:25.280" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Here is yet another use case.""" start="00:05:27.240" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I work at a remote company,""" start="00:05:29.600" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and I often find myself being in a call""" start="00:05:31.480" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""with my teammates, explaining the code to them.""" start="00:05:33.440" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""And one thing that really comes in handy""" start="00:05:35.400" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""is the narrowing accessibility of Emacs.""" start="00:05:38.000" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Specifically, the fancy-narrow package.""" start="00:05:39.760" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I use it to narrow just the function,""" start="00:05:43.040" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""or I could narrow to the conditional.""" start="00:05:44.840" video="mainVideo-treesitter" id="subtitle"]] +[[!template new="1" text="""Next to the end, the list would be code folding.""" start="00:05:48.760" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""This is a package which uses Tree-sitter""" start="00:05:51.520" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""to improve the code folding functionalities of Emacs.""" start="00:05:54.480" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Code folding has always been this thing""" start="00:05:57.560" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""that I've had a love-hate relationship with.""" start="00:06:00.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""It usually works most of the time,""" start="00:06:02.280" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""but then fails if the indentation is wrong""" start="00:06:04.280" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""or we do something weird with the arguments.""" start="00:06:06.960" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""But now with Tree-sitter in the mix,""" start="00:06:09.160" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""it's a lot more precise.""" start="00:06:11.680" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I can fold comments, I can fold functions,""" start="00:06:12.720" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I can fold conditionals. You get the idea.""" start="00:06:17.040" video="mainVideo-treesitter" id="subtitle"]] +[[!template new="1" text="""I work with Kubernetes, which means I end up""" start="00:06:20.480" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""having to write and read a lot of YAML files.""" start="00:06:23.840" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""And navigating big YAML files is a mess.""" start="00:06:28.080" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""The two main problems are figuring out where I am,""" start="00:06:31.840" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and two, navigating to where I want to be.""" start="00:06:35.760" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Let's see how Tree-sitter can help us with both of this.""" start="00:06:38.760" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""This is an example YAML file.""" start="00:06:41.760" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""To be precise, this is the values file""" start="00:06:43.840" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""of the Redis helm chart.""" start="00:06:47.080" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I'm somewhere in the file on tag under image,""" start="00:06:48.640" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""but I don't know what this tag is for.""" start="00:06:52.240" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""But with the help of Tree-sitter,""" start="00:06:54.880" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I've been able to add this information""" start="00:06:57.240" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""into my header line.""" start="00:06:59.160" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""If you see in the header line,""" start="00:07:00.440" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""you'll see that I'm under sentinel.image.""" start="00:07:02.960" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Now let's see how this helps with navigation.""" start="00:07:05.880" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Let's say I want to enable persistence on master node.""" start="00:07:08.800" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""So with the help of Tree-sitter,""" start="00:07:12.680" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I was able to enumerate every field""" start="00:07:18.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""that is available in this YAML file,""" start="00:07:20.400" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and I can pass that information onto imenu,""" start="00:07:22.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""which I can then use to go to exactly where I want to.""" start="00:07:24.520" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Also, since we're not dealing with""" start="00:07:28.040" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""any language specific constructs,""" start="00:07:30.000" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""this is very easy to extend to""" start="00:07:32.600" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""other similar languages""" start="00:07:34.040" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""or config files in this case.""" start="00:07:35.760" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""So for example, this is a JSON file,""" start="00:07:37.440" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and I can navigate to location or project.""" start="00:07:39.520" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""And just like in YAML, it shows me where I'm at.""" start="00:07:44.800" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I'm in projects.name,""" start="00:07:48.320" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""or I'm inside projects.highlights.""" start="00:07:49.920" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Or how about Nix?""" start="00:07:52.880" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""This is my home.nix file.""" start="00:07:55.600" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Again, I can search for services,""" start="00:07:57.480" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and this lists me all the services that I've enabled.""" start="00:08:01.040" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""How about just services.description?""" start="00:08:04.640" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""So this is all the services""" start="00:08:06.720" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""that I've enabled and have descriptions.""" start="00:08:08.160" video="mainVideo-treesitter" id="subtitle"]] +[[!template new="1" text="""Now that we have seen this for config files,""" start="00:08:10.480" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""let's see how similar things apply for code.""" start="00:08:12.720" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Just like in config files,""" start="00:08:15.040" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I can see which function I'm under,""" start="00:08:16.760" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and if I go to the next function, it changes.""" start="00:08:18.680" video="mainVideo-treesitter" id="subtitle"]] +[[!template new="1" text="""Okay, here is something really awesome.""" start="00:08:21.560" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""This is probably one of my favorites,""" start="00:08:23.960" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and one of the things that actually made me understand""" start="00:08:26.600" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""how powerful Tree-sitter is, and got me into it.""" start="00:08:30.400" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I work with a lot of Go code,""" start="00:08:34.080" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and anyone who has worked with Go will tell you""" start="00:08:35.680" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""how repetitive it is handling errors.""" start="00:08:38.840" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""For those who don't write Go,""" start="00:08:41.040" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""let me give you a rough idea of what I'm talking about.""" start="00:08:42.800" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""If you want to bubble up the error,""" start="00:08:45.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""the way you would do it is just to return the error""" start="00:08:47.000" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""to the function that called it.""" start="00:08:49.920" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Over here, you can either return nil or an empty value,""" start="00:08:51.400" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and at the end, you return error.""" start="00:08:55.720" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Let's try and use Tree-sitter to do this.""" start="00:08:57.640" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Using the help of Tree-sitter, let's make Emacs""" start="00:09:00.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""go back, figure out what the return arguments are,""" start="00:09:03.120" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""figure out what their default values are,""" start="00:09:06.422" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and automatically fill in the return statement.""" start="00:09:08.240" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""It would look something like this.""" start="00:09:11.480" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""In my case, it filled in the complete form,""" start="00:09:13.040" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""it figured out what the return arguments are,""" start="00:09:16.120" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""what their types are,""" start="00:09:18.320" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and what their default values are,""" start="00:09:19.320" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and filled out the entire return.""" start="00:09:20.960" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""And since this is a template,""" start="00:09:22.800" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I can go to the next function, do the same thing,""" start="00:09:24.760" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""next function, do the same thing,""" start="00:09:27.720" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""next function, do the same thing.""" start="00:09:29.560" video="mainVideo-treesitter" id="subtitle"]] +[[!template new="1" text="""Here is a really fascinating use case of Tree-sitter,""" start="00:09:31.520" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""structural editing.""" start="00:09:34.360" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""You might be aware of plugins like paredit,""" start="00:09:36.320" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""which seems to "know" your code.""" start="00:09:38.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""This sort of takes it onto another level.""" start="00:09:40.280" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""It is in its early stages, but what this lets you do""" start="00:09:42.520" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""is completely treat your code as an AST,""" start="00:09:46.040" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and edit as if it's a tree instead of characters.""" start="00:09:48.920" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""I am not going to go much in depth into it,""" start="00:09:52.000" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""but if you're interested, there is a talk""" start="00:09:54.640" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""from last year's EmacsConf around it.""" start="00:09:57.000" video="mainVideo-treesitter" id="subtitle"]] +[[!template new="1" text="""I'm just going to end this with one last tiny thing""" start="00:09:59.080" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""that I found in the tree-sitter-extras package.""" start="00:10:02.320" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""It's this tiny macro called tree-sitter-save-excursion.""" start="00:10:04.920" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""It works pretty much like save-excursion, but better.""" start="00:10:07.600" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""It uses the Tree-sitter syntax tree""" start="00:10:11.240" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""instead of just the code""" start="00:10:13.400" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""to figure out where to restore the position.""" start="00:10:14.800" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""My main use case for this was with code formatters.""" start="00:10:16.720" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""Since the code moves around a lot""" start="00:10:20.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""when it gets formatted,""" start="00:10:22.080" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""save-excursion was completely useless,""" start="00:10:23.160" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""but this came in handy.""" start="00:10:25.000" video="mainVideo-treesitter" id="subtitle"]] +[[!template new="1" text="""I'll just leave you off with""" start="00:10:26.240" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""what the future of Tree-sitter looks like for Emacs.""" start="00:10:28.120" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""So far, every Tree-sitter related feature""" start="00:10:31.120" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""that I've talked about is powered by this library.""" start="00:10:33.760" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""But there is talk about Tree-sitter coming into the core.""" start="00:10:36.040" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""It will most probably be landing in Emacs 29,""" start="00:10:42.320" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""and if you want to check out the work on Tree-sitter""" start="00:10:45.840" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""in core Emacs, you can check out""" start="00:10:48.720" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""the features/tree-sitter branch.""" start="00:10:51.200" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""You'll probably see more and more features and packages""" start="00:10:52.920" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""relying upon Tree-sitter, and even major modes""" start="00:10:56.640" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""being powered by Tree-sitter.""" start="00:10:59.640" video="mainVideo-treesitter" id="subtitle"]] +[[!template text="""And that's a wrap from me. Thank you.""" start="00:11:01.560" video="mainVideo-treesitter" id="subtitle"]] Questions or comments? Please e-mail [mail@meain.io](mailto:mail@meain.io?subject=Comment%20for%20EmacsConf%202022%20treesitter%3A%20Tree-sitter%20beyond%20syntax%20highlighting) diff --git a/2022/info/treesitter-before.md b/2022/info/treesitter-before.md index bfda5534..d9c7ea3b 100644 --- a/2022/info/treesitter-before.md +++ b/2022/info/treesitter-before.md @@ -3,15 +3,15 @@ In this talk, Abin Simon shares many ways in which Tree-sitter can help improve The following image shows where the talk is in the schedule for Sat 2022-12-03. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="treesitter"> -<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect stroke-width="3" x="94" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(578,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 3:50- 3:55 Short hyperlinks to Python docs</title> <rect x="643" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(648,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg> +<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2022/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:05 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2022/talks/journalism" title="Emacs journalism (or everything's a nail if you hit it with Emacs)" data-slug="journalism"> <title> 9:05- 9:25 Emacs journalism (or everything's a nail if you hit it with Emacs)</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> journalism</text></g></a> <a href="/2022/talks/school" title="Back to school with Emacs" data-slug="school"> <title> 9:45- 9:55 Back to school with Emacs</title> <rect x="70" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(83,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> school</text></g></a> <a href="/2022/talks/handwritten" title="How to incorporate handwritten notes into Emacs Orgmode" data-slug="handwritten"> <title> 10:05-10:15 How to incorporate handwritten notes into Emacs Orgmode</title> <rect x="101" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> handwritten</text></g></a> <a href="/2022/talks/science" title="Writing and organizing literature notes for scientific writing" data-slug="science"> <title> 10:45-11:05 Writing and organizing literature notes for scientific writing</title> <rect x="164" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(193,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> science</text></g></a> <a href="/2022/talks/buddy" title="The Emacs Buddy initiative" data-slug="buddy"> <title> 11:25-11:35 The Emacs Buddy initiative</title> <rect x="227" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(240,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buddy</text></g></a> <a href="/2022/talks/meetups" title="Attending and organizing Emacs meetups" data-slug="meetups"> <title> 1:00- 1:20 Attending and organizing Emacs meetups</title> <rect x="376" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(405,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> meetups</text></g></a> <a href="/2022/talks/buttons" title="Linking personal info with Hyperbole implicit buttons" data-slug="buttons"> <title> 1:40- 1:55 Linking personal info with Hyperbole implicit buttons</title> <rect x="439" y="15" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> buttons</text></g></a> <a href="/2022/talks/realestate" title="Real estate and Org table formulas" data-slug="realestate"> <title> 2:15- 2:40 Real estate and Org table formulas</title> <rect x="494" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(531,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> realestate</text></g></a> <a href="/2022/talks/maint" title="Maintaining the Maintainers: Attribution as an Economic Model for Open Source" data-slug="maint"> <title> 2:50- 3:10 Maintaining the Maintainers: Attribution as an Economic Model for Open Source</title> <rect x="549" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(578,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maint</text></g></a> <a href="/2022/talks/health" title="Health data journaling and visualization with Org Mode and gnuplot" data-slug="health"> <title> 3:00- 3:25 Health data journaling and visualization with Org Mode and gnuplot</title> <rect x="564" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(601,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> health</text></g></a> <a href="/2022/talks/jupyter" title="Edit live Jupyter notebook cells with Emacs" data-slug="jupyter"> <title> 3:45- 4:05 Edit live Jupyter notebook cells with Emacs</title> <rect x="635" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(664,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> jupyter</text></g></a> <a href="/2022/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 4:50- 4:55 Saturday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(742,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2022/talks/treesitter" title="Tree-sitter beyond syntax highlighting" data-slug="treesitter"> <title> 10:00-10:15 Tree-sitter beyond syntax highlighting</title> <rect stroke-width="3" x="94" y="75" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(115,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> treesitter</text></g></a> <a href="/2022/talks/lspbridge" title="lsp-bridge: a smooth-as-butter asynchronous LSP client" data-slug="lspbridge"> <title> 10:25-10:45 lsp-bridge: a smooth-as-butter asynchronous LSP client</title> <rect x="133" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> lspbridge</text></g></a> <a href="/2022/talks/asmblox" title="asm-blox: a game based on WebAssembly that no one asked for" data-slug="asmblox"> <title> 10:55-11:15 asm-blox: a game based on WebAssembly that no one asked for</title> <rect x="180" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(209,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> asmblox</text></g></a> <a href="/2022/talks/wayland" title="Emacs should become a Wayland compositor" data-slug="wayland"> <title> 11:25-11:35 Emacs should become a Wayland compositor</title> <rect x="227" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> wayland</text></g></a> <a href="/2022/talks/sqlite" title="Using SQLite as a data source: a framework and an example" data-slug="sqlite"> <title> 1:00- 1:25 Using SQLite as a data source: a framework and an example</title> <rect x="376" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sqlite</text></g></a> <a href="/2022/talks/mail" title="Revisiting the anatomy of Emacs mail user agents" data-slug="mail"> <title> 1:50- 2:30 Revisiting the anatomy of Emacs mail user agents</title> <rect x="454" y="75" opacity="0.5" width="62" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(514,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mail</text></g></a> <a href="/2022/talks/eev" title="Bidirectional links with eev" data-slug="eev"> <title> 3:35- 3:40 Bidirectional links with eev</title> <rect x="619" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(624,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eev</text></g></a> <a href="/2022/talks/haskell" title="Haskell code exploration with Emacs" data-slug="haskell"> <title> 4:05- 4:35 Haskell code exploration with Emacs</title> <rect x="666" y="75" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(711,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> haskell</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg> </div> [[!toc ]] Format: 12-min talk followed by IRC Q&A (<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-gen,emacsconf-dev">#emacsconf-dev</a>) Etherpad: <https://pad.emacsconf.org/2022-treesitter> Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev) -Status: Q&A starting (not yet open for joining) -<div>Times in different timezones:</div><div class="times" start="2022-12-03T15:00:00Z" end="2022-12-03T15:15:00Z"><div class="conf-time">Saturday, Dec 3 2022, ~10:00 AM - 10:15 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 3 2022, ~9:00 AM - 9:15 AM CST (US/Central)<br />Saturday, Dec 3 2022, ~8:00 AM - 8:15 AM MST (US/Mountain)<br />Saturday, Dec 3 2022, ~7:00 AM - 7:15 AM PST (US/Pacific)<br />Saturday, Dec 3 2022, ~3:00 PM - 3:15 PM UTC <br />Saturday, Dec 3 2022, ~4:00 PM - 4:15 PM CET (Europe/Paris)<br />Saturday, Dec 3 2022, ~5:00 PM - 5:15 PM EET (Europe/Athens)<br />Saturday, Dec 3 2022, ~8:30 PM - 8:45 PM IST (Asia/Kolkata)<br />Saturday, Dec 3 2022, ~11:00 PM - 11:15 PM +08 (Asia/Singapore)<br />Sunday, Dec 4 2022, ~12:00 AM - 12:15 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/dev/">Find out how to watch and participate</a></div> +Status: Q&A finished, IRC and pad will be archived on this page + [[!template id="vid" vidid="treesitter-mainVideo" src="https://media.emacsconf.org/2022/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main.webm" poster="https://media.emacsconf.org/2022/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main.vtt" default />""" size="37M" duration="11:04" other_resources="""[Download --main.webm (37MB)](https://media.emacsconf.org/2022/emacsconf-2022-treesitter--treesitter-beyond-syntax-highlighting--abin-simon--main.webm) |