00:06 good morning everyone 00:07 welcome to another episode of sound talk 00:10 show 00:11 today is 2021 00:14 april 18th and today we are going to do 00:17 emacs this cody live coding 00:21 and today we are going to uh explore 00:25 the fuzzy matching in emac bisp 00:29 you know first imagine is like uh it's 00:31 very useful you'll see what it means 00:33 so it's going to be mostly about emac 00:36 emacs list coding and i'm going to 00:39 expand as we go 00:42 exploring first imagine you know there 00:45 are different kinds 00:46 i'm gonna explain okay so let's begin 00:48 and by the way today 00:50 i'm using my newly bought microphone 00:52 okay 00:53 this is uh you know so so now i got the 00:57 dedicated micro 00:59 so now i got so newly bought microphone 01:02 i got a dedicated mic 01:03 dedicated microphone so is my voice good 01:08 okay so uh okay let me show you the 01:10 microphone actually let's 01:12 take a minute uh just go to um 01:15 let me show you the microphone okay xali 01:18 keyboard 01:22 so you go to actually you go to 01:25 my keyboard blog search for saudi 01:27 keyboard blog and you can see 01:29 miscellaneous and i've done some 01:32 research on microphones 01:34 so you can see uh you know shopping 01:37 choices 01:38 and i end up buying this one uh pretty 01:41 cheap 01:41 35 or something and uh looks like it's 01:44 working 01:45 fantastic fife 01:49 uh dedicated microphone is much better 01:51 than uh headset 01:52 you know my headset has hum issue like 01:55 um 01:55 [Music] 01:57 screaming like fantastic good morning 01:59 but you haven't 02:00 you are not sleeping yet and good 02:01 morning is this one crazy okay 02:03 uh actually so we're gonna focus on emac 02:05 this today just imagine 02:08 so let me begin okay meanwhile let me 02:11 turn this 02:12 uh so you can watch my keyboard instead 02:17 you know since emacs coding you uh 02:21 it's it would be fun to just watch 02:24 at my keyboard my i type okay so 02:28 let's see okay 02:34 sec 02:38 okay so so yeah imagine coding so let's 02:41 begin okay 02:43 so i'm going i'm going to start okay so 02:45 on the 02:46 on the left window the pink window is 02:49 all the 02:50 command codes you can see whenever i 02:52 press a key 02:53 in emacs every keystroke 02:56 automatically becomes a command call so 02:58 if i move cursor by words you can see 03:01 it's actually calling forward word 03:02 and and you can also see the key i'm 03:05 pressing to do that 03:07 i'm using software keys and i'm using a 03:10 variable keyword 03:12 okay so now let's begin so first so you 03:15 can 03:15 if you are on youtube you can see the 03:17 topic this okay i have the topic this 03:19 prepared here 03:20 so let me show you what we are doing 03:22 okay so we are going to 03:25 uh write uh let me let me demonstrate 03:28 okay 03:29 so uh let's see emac this 03:32 so start an empty buffer and define a 03:35 function 03:36 uh and let's explain what does this 03:39 function do 03:40 okay um the function will be 03:45 select let's name it uh select 03:51 choices okay select choices and 03:55 uh 03:58 select from a list of choices 04:03 predefined choices 04:05 using and then 04:09 then insert them into buffer okay 04:12 that's what this function does and let's 04:14 put 04:15 today's date 04:19 okay that's what this does so let's 04:22 begin 04:22 so first of all what kind of choices do 04:26 we want 04:26 okay now when you write academic paper 04:29 there's 04:29 lots of repetitive kind of sentence 04:32 structures okay let me show you an 04:34 example 04:35 uh 04:40 okay let's let's just uh show you a 04:42 simple example okay 04:45 so here is a list of uh you know 04:48 sentences 04:49 uh if you are uh in academia and you are 04:52 writing a lot of you know 04:54 theses or report or publications 04:58 you there is a particular style of 05:02 writing 05:02 which is impersonal that is the style of 05:05 academic writing 05:07 and if you search online you search 05:09 online for academic phrases you'll find 05:11 tons of those kind of database 05:14 so here's an example you know this field 05:16 closely follows the paradigm of 05:18 something something 05:19 why do we consider to be a good way to 05:22 something something 05:23 this has been widely adopted adopted in 05:26 the field of something something 05:28 this is more widely used at the time of 05:30 something something so 05:31 those are type of the academic style of 05:33 writing 05:35 so when you in you know if you are a 05:37 professor you may 05:40 you may find what we are doing today 05:42 useful uh 05:43 okay so let me show you so so these are 05:44 the choices first of all 05:46 i want to make each line uh you know i 05:49 want to quote each line 05:52 make make them into a uh 05:56 emac list list okay so let me show you 05:59 what 05:59 i do okay i press three keys so actually 06:02 let's undo uh let me show you okay 06:06 copy paste do that that 06:09 that that okay that command you can see 06:13 is called software lines okay 06:16 and now we have now we just say 06:20 list actually 06:25 okay copy that just paste here so we 06:28 have a list here 06:31 uh let's let's call them 06:34 phrases okay 06:38 uh let's put a variable here 06:43 so the variable is phrases and the value 06:46 will be 06:49 predefined these are phrases predefined 06:51 okay 06:52 so 06:57 so these are the choices we want um 07:02 want uh let user choose once user choose 07:06 one 07:06 it will be inserted to the buffer okay 07:10 so how do you write that uh let me show 07:13 you okay 07:13 let's say let's do some quickly 07:17 let's say let's do something quickly 07:20 messages 07:21 okay and we are going to say phrases 07:24 we're gonna print 07:25 phrases uh car phrases car just means 07:29 the first item okay 07:30 so that is the function that is that's 07:33 it so now we 07:37 evaluate the function then call it 07:40 meta x select choices by the way when 07:44 you do meta x you can see 07:46 in my mini buffer 07:50 sorry so you can see 07:53 in my mini buffer i'm using i do i'm 07:55 using the 07:56 you know one of the meta x what what is 07:59 it called 07:59 smash smacks right but anyway um 08:03 so you can see there is a uh it lets you 08:06 pick some choices for example if i type 08:08 saw 08:09 then it shows all the commands uh 08:11 starting with xr 08:14 so that's what you know this is similar 08:16 that's what we are doing today we are 08:18 trying to implement 08:20 something similar okay so let's call 08:22 meta x let's put the cursor at the 08:24 bottom 08:25 middle x then type select choices okay 08:29 enter 08:34 symbols values variable is void phrases 08:37 okay this error why is the arrow 08:42 oh oh oh oh yeah we we um 08:47 yeah because we you see this part needs 08:49 to be inside the 08:51 let okay so put it here yeah 08:56 uh yeah what so why is it all these oh 08:59 yeah so 09:00 actually so you know this nested 09:03 parentheses 09:04 this this is the indication of the 09:06 problem of nested parenthesis 09:08 syntax you know some some 09:11 minor issues i mean i mean the 09:14 disadvantage of nested parentheses 09:16 syntax 09:18 so sometimes you got confused which one 09:20 is uh inside which 09:22 yeah okay now now this is good okay 09:25 evaluate the buffer 09:26 put a cursor at the bottom call it 09:29 select choices 09:30 enter 09:33 you can see now you can see at the 09:35 bottom you see 09:37 it act you know it actually printed the 09:39 first uh 09:40 line that you know this field closely 09:42 follows something 09:44 okay if you have comments and questions 09:46 just post it okay 09:48 uh z trunk crazy 09:51 wanna see my pv face uh do you suggest 09:55 you i use stone emacs coming from 09:57 veeam okay i'm not gonna talk about that 10:00 because 10:00 uh different you know basically the 10:02 answer is different people have 10:03 different choices 10:04 you know it depends on the person so 10:06 anyway let me continue with this okay 10:09 so now we are going to write a you know 10:12 modify the code so that it lets the user 10:15 pick one of the choices uh actually i 10:18 need to go 10:19 faster because yeah we have a lot to do 10:22 okay so uh let me show you what to do 10:25 okay i do 10:27 read uh this is how you uh 10:34 okay i forgot what's the name okay so 10:37 what you do is 10:37 you go to casa emac list 10:41 okay so you go to xr emac list website 10:45 practical emac list then 10:48 you go down there is a section 10:51 about uh basics functions 10:55 but text editing buffer stream functions 10:57 both for rewrite file writing command 11:01 get purpose string work with lines get 11:03 user input okay click on that 11:07 prompt for file name prompt for 11:09 directory prompt for 11:10 string this is what we want okay read 11:13 string okay 11:15 that's the command we want okay so back 11:17 to here 11:18 so so actually in emacs you can say read 11:22 string but actually there's a better 11:24 version that is i do read string 11:26 so 11:31 uh what uh okay so i do 11:34 read i do read directory name i do read 11:38 buffer i do read file name i do read 11:40 buffer 11:42 uh what the 11:51 um wait there should be 11:54 i do read string 11:58 okay there is no such function 12:01 [Music] 12:08 oh actually i have an example of i do 12:10 right here so 12:14 oh i do completing read yeah okay so 12:17 here is the function we want copy it 12:20 back to 12:21 e-max buffer i do completing 12:25 read that's right 12:28 so here let's see the documentation 12:32 describe function so here is the full 12:35 syntax 12:36 copy and paste it here okay 12:39 and let's see now we don't need the 12:42 message part okay 12:43 delete that uh delete that i mean 12:46 comment it down i do 12:48 okay complete read okay let's uh 12:53 do this okay 12:56 prompt prompt will be 13:01 make a choice okay then the choices will 13:04 be 13:05 phrases okay then optional optional we 13:08 don't care about optional okay 13:11 so that's it 13:14 okay then then you need to set the 13:19 uh let's do a variable 13:24 user choice 13:29 okay user choice is a variable here 13:33 and now we're gonna set 13:37 user choice and that's gonna be this 13:40 line okay user choice that pretty fine 13:43 okay so now insert 13:47 user choice okay that's it 13:51 let's run it run our code move the 13:53 cursor to the bottom 13:55 call it select choices enter so now 13:59 watch okay so you see emacs now prompt 14:02 us with a bunch of choices now i'm going 14:04 to start to type 14:06 as i type it will start to narrow down 14:08 the choices 14:09 and this is the heart of fuzzy 14:14 matching first imagine because it first 14:16 imagine is a very useful 14:18 feature it lets you uh it saves a lot of 14:21 typing 14:22 because of all the choices for example 14:24 emacs commands 14:25 you you do not remember how exactly the 14:30 full name of the command but you do 14:31 remember some words or 14:33 you know part of the words in the 14:35 command name so you can just type that 14:38 you know and you'll be 14:41 able to show that as a selection and you 14:43 can pick it so 14:44 right now we have the similar situation 14:46 so let's say we want the third 14:49 um you know we want the the line that 14:52 says widely 14:53 adopted okay so i type watch what i type 14:55 okay 14:57 i d you see let me try it again 15:00 magnify okay let's let's do this 15:04 w okay as soon as you type w 15:08 then those sentences doesn't contain it 15:10 will be eliminated 15:12 so you see w okay i 15:16 d okay then let's say 15:20 let's type g okay now g is a word here 15:23 let's type g 15:25 okay now that that's the only selection 15:27 now enter that's what we want you so you 15:29 can see 15:30 it inserted uh that uh 15:33 phrase okay so we have completed 15:37 essentially this is the first part of 15:39 today's 15:40 uh uh you know the uh tutorial 15:43 these uh this is how you uh 15:46 use first imagine you know how how you 15:49 write a command 15:50 to have um first imagine feature to let 15:55 users select 15:56 a predefined list of things okay this 15:59 list of things can be anything it can be 16:01 sentences 16:02 it can be a list of command names and it 16:04 can be 16:06 you know uh whatever you know whatever 16:08 you it's a part of user interface 16:11 now uh okay questions now 16:15 you know now for our application 16:18 it you know we are going to have 16:21 actually potentially 16:23 a thousand uh phrases 16:27 so and each phrase may be 16:30 you know maybe a long sentence so that 16:33 means 16:33 our command the way we implement it 16:37 needs to be fast you know you cannot you 16:39 know if you have to 16:41 every time user calls the command it 16:43 waits for 16:44 you know one second or two seconds to do 16:46 it then that's no good okay 16:48 we need it to be fast thousands of 16:50 choices 16:51 okay so that's that's how you that's how 16:54 you write it 16:54 you know you can in fact copy this code 16:57 paste your emacs you need any file and 16:59 it'll work for you already okay now 17:03 let me show you um 17:06 you know like if you just search for 17:08 okay let me show you okay 17:10 academic phrases 17:13 okay you see there's a lot of people 17:16 searching for it because in academia 17:19 professors you know academia they 17:21 they want you know they they write a lot 17:24 of papers and it's very tedious to type 17:27 all these 17:28 uh let's see so you know i 17:32 seen this before so let's go to some of 17:35 the choices okay 17:38 i mean let me show you some of the 17:40 examples so here 17:42 is a page that lists academic phrases 17:46 sentences and vocabulary so you can see 17:50 you can see how many of them there are 17:53 you know you know they are grouped 17:56 by category okay 18:00 so lots of and this is just one of the 18:02 page there are like 18:04 a hundred more so 18:07 that's a point that's that's what i'm 18:09 saying you you potentially have hundred 18:11 choices okay 18:12 and by the way this this this uh 18:15 multiple choice 18:16 um user interface is uh truly extremely 18:20 useful i 18:21 also use it for a brief because i have 18:23 hundreds of briefs 18:24 but some of them i don't use very often 18:27 so i forgot 18:28 what exactly is a brief so i can you 18:31 know so 18:32 so i have a command that lets me select 18:35 on the fly which you believe i want 18:38 so very useful okay now the next thing 18:41 so 18:42 so this is what we are doing today now 18:44 the 18:45 the thing we want to talk about is about 18:48 fuzzy matching 18:49 because if you have thousands of choices 18:52 there are many type of first imaging now 18:54 in our case for example um 18:58 uh let's try to insert this line again 19:01 okay this has been widely adapted 19:04 in the field of so let's try it again 19:08 okay so 19:09 i'm gonna show you so select choices 19:12 let's magnify 19:13 okay so watch what i type okay so 19:16 we i'm going to type uh the first 19:19 character of 19:20 each word okay this has been 19:23 widely a adopted in 19:26 the you see so if you type the first 19:30 character of each word 19:32 that will work okay 19:36 but if you type the last character of 19:38 each word 19:39 it will also work let's try it again 19:43 uh let's say so it's gonna be s 19:46 s n y 19:50 d n you see that also works 19:54 so so the first imagine used here 19:58 let me try it again okay so let's see 20:01 let's search let's try the word has okay 20:05 you see there are two sentences i mean 20:07 two of the choices that contains the 20:09 word has 20:09 okay let's try it again call it 20:14 select choices yes and uh 20:18 h-a-s okay so we got 20:21 our two sentences now let's add one more 20:24 sentence 20:25 let's try add one more sentence 20:29 etch something uh let's say heart 20:38 the heart follows the brain of okay 20:43 let's make a cv sentence this heart 20:45 follows the brain up okay 20:47 now notice in this sentence there's no 20:50 such word has 20:52 has is not in this sentence okay 20:55 now we evaluate the buffer call command 20:58 again 20:59 now i'm going to type has h-a-s 21:05 okay uh it's not showing up 21:13 uh let's let's uh it's unexpected 21:17 let's try again h a s 21:23 okay i 21:26 this is not expected because what i'm 21:29 trying to 21:30 say is that 21:37 first imagine because i was trying to 21:40 get it to show 21:41 this line why because this line contains 21:45 h and a 21:48 and s okay let's try it again 21:54 this time let's type 22:04 h a t okay so if you type h 22:08 a t it works because it matches part of 22:11 the 22:12 word heart 22:18 so now let's try t h a 22:21 okay let's see what happens t h a try it 22:24 again 22:24 t try it again 22:28 select choices t 22:31 h a yeah so that's my point 22:36 uh th a will show up you know the 22:39 sentence because 22:41 t is in the first word 22:45 then h uh let's try again ths 22:50 you know so right now we are trying to 22:52 basically what we are doing is that we 22:54 are trying to find out 22:55 exactly what kind of first imaging i 22:57 mean how exactly 22:59 uh our text input 23:03 you know exactly what's the criteria how 23:06 how exactly it use 23:07 it uses our input to match the 23:10 selections 23:12 so let's say h 23:16 e let's say 23:20 h e o okay that works because 23:24 h-e-o is the second character of each 23:26 word 23:28 uh 23:32 okay but why is h-a-s does not work 23:36 h a s let's try again okay 23:42 h a 23:45 okay okay i 23:48 think i kind of see it 23:53 h a excludes the first choice 23:56 because uh 24:01 the character you type 24:07 i i don't understand why is it why why 24:09 does not 24:10 it includes the first choice 24:14 try it again 24:23 s 24:26 o l okay that works 24:36 h a 24:39 s okay that works okay so if you have 24:44 h h a 24:47 s that works but 24:51 h a s does not work 24:55 so what about t s 24:59 t right t 25:03 s t that should also turn up the first 25:06 sentence 25:08 t s t it does 25:12 so why is it h a s 25:15 does not work h a s well because 25:18 h between h and a there's an e 25:22 is that how so if we try 25:26 t i h 25:29 would that work t i h it should not 25:34 t i h it does 25:38 so why is it h why is it has does not 25:41 turn up the first 25:42 um i don't understand 25:46 uh i don't understand but i think we're 25:48 gonna move on okay 25:50 so now let's see the comments okay big 25:53 comments uh 26:03 okay you guys are chatting random 26:07 okay so now if you have questions for me 26:10 put my name to it okay 26:13 so now okay so now 26:16 i do not understand exactly how the 26:23 how the i do completing read is uh 26:26 the criteria it uses you know so we can 26:29 we can look 26:30 into we can look at that to see how it 26:33 is 26:33 uh uh to to find the answer okay so 26:38 describe function uh then we can see the 26:41 documentation 26:46 and we can we can go 26:49 to the source code okay 26:52 go to the source code 26:56 and we can see how it is implemented 27:10 so here it is i do read internal 27:14 this is the heart of the fuzzy matching 27:16 part 27:18 so let's go to i do read internal 27:23 okay actually there is some 27:26 uh i do read internally let's look into 27:32 it 27:35 okay search next make the prompt for i 27:39 do read internal 27:43 oh okay so they actually have 27:46 a programmers a documentation for 27:50 programmers 27:51 explaining how it works 27:55 here is a very briefly here is very 27:58 briefly how i do find file works 28:12 and here is the implementation okay 28:17 now okay so now this is actually the 28:20 heart 28:20 of i do mod so you see oh my god it's 28:26 okay it's few hundred lines let's see 28:28 how many uh 28:33 what is this yeah 28:41 345 lines 28:44 i do read internal this is the heart of 28:47 i do mod 28:49 345 lines so but exactly how it's 28:53 how it does the match so 28:57 let's search for rejects 29:00 oh it doesn't even use regular 29:02 expression amazing 29:06 i mean so this is my the first time i'm 29:08 i'm looking into 29:10 the i do internal 29:14 so it does not even use regular 29:17 expression 29:18 because i thought it's creating a 29:20 regular expression on the fly 29:24 so okay let's quickly find out exactly 29:27 how it is done so 29:28 i mean i'm interested i want to know 29:32 uh let me just look okay 29:42 so if require match is the neo 29:46 uh an existing file must be selected 29:49 okay so 29:50 uh require match 30:02 let's say let's search for scan okay 30:05 these matching lines scan 30:10 yeah i cannot i cannot see okay at least 30:12 matching line scan 30:34 do 30:36 wow so actually i'm surprised it's 30:40 um implementing its 30:43 own completion basically 30:50 yeah that's let's save it 30:53 uh i'm gonna study this offline 30:58 okay so that's so good guys 31:07 how many people are watching 31:12 five uh 31:16 so let's see 31:21 so okay so that's about i do 31:24 now let's look at helm okay so let's get 31:27 some let's 31:28 get start to do something interesting 31:31 so now we explain let's close 31:35 let's go back to our talk show page 31:40 now we have explained what we are doing 31:43 we 31:44 we wrote a function using i do 31:49 we explained the possible choices can be 31:52 a few thousands 31:54 and we we demonstrated what first 31:57 imagine 31:58 is now the point here is that there are 32:01 different type of fussy matching 32:03 that's the main topic of today so you 32:07 as we have seen the first imagine in i 32:10 do mod 32:11 essentially when you type something it 32:15 take them as uh you know it takes them 32:18 as a sequence 32:19 of characters and if that sequence 32:22 occurs in one of the choices 32:26 then you'll show it does not consider 32:29 you know space or 32:33 yeah so it's basically character based 32:36 sequence 32:36 match essentially 32:41 but so what is the problem but 32:44 but there are different type of first 32:46 imagine for example 32:48 in i do mod the word order i mean the 32:51 character sequence 32:53 order we user types is very critical 32:56 because if you type for example 33:02 you know you type the same character but 33:04 but reverse it won't work 33:07 for example for example the first line 33:10 the this heart follows the brain of okay 33:13 but if you type follows then followed by 33:17 heart 33:18 in it won't work okay let me show so 33:21 order is 33:21 important so i do 33:24 fuzzy matching let's let's do a demo 33:28 first 33:29 call it select choices so i'm going to 33:32 type 33:33 follows heart okay f o l 33:36 o s h e a r t 33:40 no match because there is no 33:44 sentence in the choices that contains 33:47 this exact order ordered sequence of 33:51 characters 33:53 so i do first imagine is 33:56 a character based 34:00 uh fuzzy matching and 34:03 all the matters okay 34:07 now let's explore other types 34:10 of fuzzy matching 34:14 in particular let's 34:17 look at helms mx 34:23 i know it does fuzzy 34:27 matching but word based 34:30 and oda does not matter 34:35 for example if you have a emac sometimes 34:39 a emacs command you forgot you know some 34:41 words in it but you forgot what's the 34:43 order for example 34:45 these matching lines or or 34:48 or uh match lines 34:51 list you know something like that you 34:53 don't remember the order 34:55 so so you know sometimes you want to 34:58 first imagine that ignores 35:00 order but consider each word 35:04 so for example in our case uh in our 35:07 case 35:07 you know sometimes you just want every 35:11 you know you you want to show a list of 35:14 phrases that contains 35:16 the word observed for example because 35:18 you do remember that that is the 35:20 sentence you want 35:21 so you you start to type observed 35:25 and if you use i do 35:28 then it may it may show many other 35:31 sentences that 35:32 actually do not contain the word 35:34 observed 35:36 because it's character based you know 35:39 the whole sentence contains the 35:40 characters o b 35:41 s e r v e d but there is no single word 35:44 that contains you know 35:46 match observed so such sentence we also 35:49 turn up 35:50 you don't want that you want a word 35:52 based fuzzy matching so let's let's 35:54 let's look into uh let's install helm 35:56 okay let's look so let's go to 35:59 uh let's go to my emacs let's see if i 36:03 have 36:04 helm installed okay melpa 36:08 search for helm so actually i have helm 36:10 installed 36:12 okay so 36:15 okay so let me show you what we are 36:16 doing so um 36:24 let's look at helm's implementation 36:28 of mx okay that's what we are doing 36:34 uh so first of all turn on helmet okay 36:37 so let's see helm 36:42 oh actually we don't we don't need to 36:43 turn on helmet we we can just directly 36:46 call helm 36:47 mx okay try it 36:50 yes yes yes okay so there we have it so 36:54 now we type 36:59 select 37:05 choices select 37:08 oh you see you see so 37:12 i helms meta x is you know it's first 37:15 imagine is very different from i do 37:17 for example the command we have written 37:20 let me show you okay first of all exit 37:23 so the command we've written is called 37:25 select choices 37:27 and we can call it by 37:30 okay for example we we try helmet x 37:34 and we type choices okay 37:38 and space select you see 37:42 it shows up because it ignores order 37:46 uh and also the space 37:49 character serves as a separator 37:54 but in i do's first imagine space 37:56 character is basically ignored 37:58 okay i believe so so 38:01 so helms first imagine um 38:05 is word-based and the 38:08 space serves as a separator and the word 38:12 order does not matter 38:13 okay so this is what we want so i'm 38:16 going to start to look into 38:19 uh i'm going to look into 38:24 how this is implemented okay helm mx 38:30 okay 38:32 so we write it down this is the command 38:35 okay let's describe function on it 38:38 uh now helmet helm mx is a automated 38:42 interactive compile this function in 38:45 there in helm commands helm commands 38:48 okay let's see 38:53 okay let's just go to the source code 38:57 open there we have it 39:00 magnify 39:04 okay so let's see how this works 39:11 um pre-configured helm for emax command 39:15 this is helm replacement of regular meta 39:18 x 39:19 uh unlike regular meta x 39:23 emax vanilla execute extended command 39:26 the prefix arcs if needed can be passed 39:30 after starting 39:31 helmets so okay uh when a prefix 39:35 argument is passed before starting 39:37 helmet x the first cu well in 39:40 helm mx session will 39:43 disable it 39:52 interesting a bit confusing 39:56 if you don't know what you know if you 39:59 uh i'm not 40:00 um you know the previous prefix arc 40:03 if you understand that i mean well i'm 40:05 not going to explain 40:07 because we got other things to do so you 40:10 can get help on each command by 40:12 persistent action okay so anyway 40:16 let's see how it is implemented 40:22 uh 40:25 okay so uh wait what 40:38 okay so first of all interactive okay 40:50 so 40:56 okay so the arc here the arc 40:59 here that's basically that's the prefix 41:02 arc 41:03 okay that's the argument for this 41:05 command 41:07 basically this part means 41:10 when user calls this function 41:12 interactively 41:14 how how does the function's argument 41:16 this 41:17 one gets a value and 41:20 that is defined i mean that's specified 41:23 by this 41:24 this code interactive so we can kind of 41:26 ignore that 41:30 uh because it yeah it's it's about and 41:33 you know 41:34 current prefix arc if you don't know 41:36 what that is just search for it i have 41:38 an article on that 41:39 but we don't we don't need to uh care 41:42 about that for now 41:43 so here is the main body of help okay 41:47 so if defining keyboard marker 41:51 or executing keyboard marco 41:54 then okay then do nothing basically just 41:57 call 41:58 this means just call the standard emax 42:02 meta x right yeah because when you're 42:05 defining a keyboard macro 42:07 the fancy interface usually interferes 42:10 with your recording 42:14 so if you are actually defining a 42:16 keyboard if you are in the middle of 42:18 doing that 42:18 you you know just do the just call the 42:20 regular meta x 42:22 otherwise here is the heart of help meta 42:25 x 42:26 so it says help me x read extended 42:30 command 42:30 hub array so let's so up array basically 42:34 is a basically is a vector it's a list 42:38 it's actually a vector it's a and you 42:41 know it's a list of all 42:43 emacs uh commands you know 42:46 so this is this this thing up array is 42:49 actually 42:50 contains uh contains a 42:53 few thousand items okay 42:57 more than one thousand for sure because 42:59 i've done i've you know i've seen it 43:01 before 43:02 so anyway so this this is the heart of 43:05 the 43:06 helmet x read okay let's search for that 43:11 okay and it is defined here let's see 43:14 how big 43:15 is this okay not too big now 43:18 narrow two region narrow to the function 43:21 so it's uh 43:22 60 lines let's see how it's implemented 43:25 okay here 43:27 i see the word flex flex matching is 43:30 another 43:31 um first imagine 43:35 uh method okay let's read the 43:38 documentation 43:41 read or exec okay so here's the command 43:43 name collection 43:45 predicate history okay read or execute 43:48 action on command name in collection or 43:51 history 43:52 okay uh when when this command is used 43:56 okay when something style is used 43:58 several actions those helm type commands 44:00 are used 44:01 and executed from here otherwise this 44:04 function returns the command as a symbol 44:08 okay helm completion is not provided 44:11 when executing or defining keyboard 44:13 markers 44:14 okay uh arc collection should be 44:18 an up array but can be any object 44:20 suitable for try completion okay 44:24 okay yeah so how is it done 44:28 how is the fuzzy matching done that's 44:30 the 44:31 thing we are interested 44:34 am i doing good 44:39 does feel good okay you guys are 44:41 chatting random 44:48 uh 44:54 do we do we actually have emacs people 44:57 here 44:57 [Laughter] 44:59 current viewers five six okay 45:03 anyway so let's back to helm let's see 45:07 how it implements the flex matching so 45:10 let's just search for flex 45:12 okay okay that only occurs one time 45:17 uh 45:25 how long have i been talking 45:29 46 minutes yeah 45:34 okay let's see how this works 45:51 it seems somewhat complex 45:55 because you know 45:58 actually we are not i don't think we are 46:02 looking at the heart of the 46:04 first imagine it's not here it's 46:07 probably some other function that 46:10 actually does that 46:12 how do i know because when you call helm 46:14 meta x 46:15 you know it actually it has a different 46:19 user interface 46:20 from the gnu emacs you see 46:24 it does not pop up a list of 46:27 options in the mini buffer instead 46:31 the mini buffer remains you know like 46:34 the mini buffer but 46:35 the list of choices is in in a separate 46:38 buffer 46:41 so and also the 46:44 list of choices has fancy 46:48 quantification in e-max terminology you 46:51 know fancy 46:52 color and font 46:55 so as you type for example as i type 46:58 uh let's say copy 47:01 you know then then it started to you 47:04 know it changes 47:05 the the 47:08 the choice is buffer and very elaborate 47:12 you can see syntax coloring 47:15 you know you can see command history 47:17 section he actually has several sections 47:19 kind of history section 47:21 emacs command section 47:24 okay yeah okay two sections so far 47:27 uh and all the words copy is highlighted 47:31 let's say cop 47:34 yeah so what if i type two 47:39 okay then you have command history 47:41 section emacs command 47:43 section 47:47 okay 47:51 okay what if i type gg okay 47:54 gg yeah so 47:58 one thing i noticed you know one thing 48:00 you notice here 48:01 is that the helm's first imaging system 48:05 you know whatever whatever you type the 48:08 characters you type 48:09 must be within a word and continuously 48:15 so that means when you type gg then 48:19 this sequence i mean then you know one 48:22 of the choices must contain 48:24 exactly gg uh with nothing in between 48:28 otherwise it doesn't you know count it 48:30 doesn't match 48:32 so that's why i say helms 48:35 fuzzy matching is kind of like it's like 48:39 substring of a word based 48:41 system and the order 48:45 a word does not matter 48:48 okay so so anyway helm has this you know 48:52 special interface 48:53 now we are trying to find out exactly 48:56 where is the code 48:57 that does the first imagine so it's a 49:00 bit complex because 49:07 because since it has to create generate 49:10 this 49:10 uh fancy interface 49:14 uh so there must be a part that does the 49:17 interface 49:18 and another part of the code that does 49:21 the 49:21 the uh uh first imaging okay 49:25 okay let's see the code let's start to 49:27 read the code this is 49:30 you know this is where i'm gonna be 49:32 quiet 49:33 because i need to read the code okay 49:35 helmet line display 49:37 okay mini buffer completion confirmed 49:40 predicate so these are a bunch of local 49:44 variables metadata metadata what is it 49:48 associate associate list 49:51 flex uh 49:55 completion style if so if it's not true 50:00 then then metadata equals to that 50:05 now what is metadata display sort 50:08 function 50:10 okay so basically okay candidate 50:14 sort candidate okay lots of 50:18 things so metadata 50:21 and what is the next source 50:26 okay so then you have emacs command 50:28 history 50:30 now these sources okay sources this is a 50:33 combination of 50:34 all the possible choices probably 50:38 okay and the lisp code here is a bit 50:42 advanced because you can see they are 50:44 using the spectic 50:47 backtick basically means 50:52 evaluate only part of a list 50:56 not every element in a list okay 50:59 so anyway sources is uh creating 51:02 a you know probably creating a list of 51:05 all the 51:06 input sources selections so now 51:09 you have prompt uh 51:14 prompt how meta x prefix argument 51:17 okay then and and something something 51:19 something something okay problem doesn't 51:21 it's not too important yeah basically 51:23 it's a 51:24 string to prompt user okay mini x 51:28 now helmets timer so they also have a 51:31 timer 51:35 uh fixbug add hell move selection after 51:40 hook 51:40 okay i don't know what that is i'm not 51:43 sure what the timer does 51:46 then add hook help move selection after 51:49 hook helm 51:52 move selection after 51:56 hook then you add the function hell meta 51:59 x 52:00 move selection after hook okay i'm not 52:02 sure 52:04 exactly what that means then add hook 52:08 helm before action hook okay something 52:10 something 52:11 then okay okay now it's now here is 52:14 probably 52:15 the main part of the 52:18 code okay let's see 52:21 when and sources and reverse history 52:25 when okay when that is true says sources 52:28 reverse sources okay that doesn't matter 52:30 it just reverse the order of the for 52:33 example command history 52:35 so that the more recent becomes on top 52:37 something like that 52:39 then okay so here is the heart oh my god 52:42 so 52:42 the heart the heart of this command is 52:44 very short 52:46 so so now i understand you know i can 52:48 see that 52:49 basically the entire the 52:53 entire thousands thousands of lines of 52:56 helm 52:57 is essentially based on this this single 52:59 command 53:01 helm read extended command yeah because 53:04 that's what helm does you know helm is a 53:08 emacs package that basically allows you 53:11 to call one single command 53:14 and that can be a file name can be 53:17 a search string can be a meta x you know 53:21 something like that helm you know one 53:23 single command 53:25 and you can just type and just match 53:27 you'll you'll you know 53:29 narrow down among file 53:32 file names or you know open file history 53:36 or command name 53:37 or command name history things like that 53:40 so you don't have to think about 53:42 oh am i going to opening a file or am i 53:44 going to call 53:45 uh emacs command or you know you just 53:49 start to type you just call one single 53:51 command and start to type 53:52 so i that's essentially the paradigm of 53:56 the helm package workflow something like 53:59 that okay more or less 54:02 so now i realized so the this command we 54:04 are looking 54:05 i think okay so far so i think it's 54:08 actually 54:08 kind of the the heart of help 54:12 and okay so then this command is 54:15 actually calling 54:16 here is very you know advanced emac this 54:19 code so here's the heart of this command 54:23 the code 54:24 unwind protect essentially what that 54:27 does 54:28 is uh something like um in case this 54:31 error 54:31 what to do you know it's it's rather 54:36 it's one of the uh deep 54:39 emac beast code usually you know 54:43 you don't you don't call this you know 54:46 okay so unwind protect so 54:50 program sitcom prefix ark neo 54:54 then call helm okay okay okay here is 54:57 the 54:59 yeah here's the part here's the heart of 55:01 the helm 55:02 so it's simply you see it's simply 55:04 called a helm command so helm command is 55:07 the 55:08 the master of the entire helm package is 55:11 this function helm 55:14 so it says sources okay and then prompt 55:17 okay then buffer 55:19 uh okay then history okay yeah so let's 55:22 so now okay now we understand we we want 55:24 to look into the source code of this 55:27 function help okay so so 55:31 expand narrow to region and that's 55:34 uh let's describe function on helm okay 55:39 so there it is the um 55:44 the documentation for the helm function 55:46 so helm 55:47 is an automated helmet is an auto 55:51 auto loaded compilies function helm in 55:53 helm el 55:55 helm key sources input 56:00 uh okay everything is optional 56:04 so actually we can actually 56:07 compile this function so it's not a 56:09 command you cannot actually call it 56:11 directly so let's try to call it 56:13 h e l h e h-e-e-l-m 56:16 yeah there's no search function by 56:18 itself this is a command 56:20 this is this is the engine of the helm 56:23 package uh so essentially 56:27 it you know it's probably the case that 56:30 every command you call in helm 56:32 will eventually call this command 56:36 okay so yeah so it says the main 56:38 function to execute 56:40 helm sources okay okay 56:43 so yeah so this is so we need to look 56:46 into this 56:46 uh function this is this is 56:49 the function we are looking for 56:53 uh so let's okay so let's 56:57 let's jump to the source code directly 57:00 okay 57:00 enter 57:03 so now let's see how many lines are 57:05 there uh 57:07 wow okay so let's see narrow to defend 57:10 okay 160 lines not many 57:14 and most of it is actually common lots 57:17 of comments so it's actually 57:19 50 lines of code so that means 57:23 the first imagine implementation 57:26 is actually in another command even 57:29 deeper 57:31 oh my god 57:35 we we've been talking so so so comments 57:39 hexa long time no see anime ziad 57:43 okay i forgot sorry 57:48 uh so you know anime join discord 57:52 you know so we can you know chat 57:55 okay so so how long have i been talking 57:58 today we've been going on 57:59 for uh one hour now 58:03 and right now we are looking at the 58:05 source code in of helm 58:07 to find out how it implements its 58:11 first imagine completion 58:16 and now we are looking at this function 58:20 this function is simply named helm 58:23 and that we believe the first image the 58:26 fuzzy matching 58:27 engine 58:30 is in one of the function this function 58:33 course 58:34 so we haven't found it yet so we need to 58:36 read 58:37 up on what this function okay let's read 58:40 up okay 58:41 let a bunch of local variables 58:45 uh fn fn is a function i think 58:50 helmness keyword p 58:54 okay let is a define a function 58:58 i mean a local variable fn 59:01 and fn what is fn condition 59:05 if helm alive true or something 59:09 then the function should be helm nest 59:14 oh okay got it now okay we 59:18 are closer 59:22 okay so now we are pretty now we are 59:24 closer to 59:25 finding the implementation of this 59:28 fuzzy matching using helm now yeah 59:32 so first of all it defines a local 59:33 variable fn 59:35 which is going to be a function you see 59:37 so the 59:38 possible choices of the function is 59:40 helmnest 59:43 or or again just helmet itself 59:46 or again or the helm internal so it 59:49 looks like 59:49 helm internal is the function we want 59:53 so we are diving another layer deeper 59:55 into help 59:57 okay so that is fn okay so that is fn 60:00 now it's magnified okay 60:04 now let's see what the code does so 60:07 if helm is alive something something 60:13 then then helm is a live internal 60:17 variable 60:18 uh okay something something uh 60:21 helm is alive if 60:25 if helm is alive 60:31 okay okay on buffer okay 60:34 yeah that we don't care okay so so if 60:37 helm is not alive 60:39 then oh okay so helm alive means 60:43 you are already calling helm for example 60:47 you know i'm calling helm so you see 60:50 right now i'm in a state of helm alive 60:52 that's what it means 60:55 yeah so this that's that's essentially 60:58 what this 60:58 part uh means so if helm is you know you 61:01 are already in helm 61:03 then error trying to run home within a 61:05 running home session yeah that's uh 61:10 so if so if helm is not alive then what 61:12 we do 61:13 so we do here so if keyword 61:16 car p list now i don't know what a 61:19 proper 61:20 p list is a property list okay keyword 61:23 so if it's a keyword possibilities 61:26 and and move not regular helm argument 61:29 is okay what whatever whatever 61:33 so if key if it's a keyword 61:36 then you do that otherwise you just do 61:41 that okay so 61:42 so here so fn 61:45 equals to helm internal yeah so here 61:48 helm internal so we advanced we made 61:51 progress 61:52 helm internal is now the function we 61:54 want to look for 61:56 helm internal should contain 61:59 the implementation of how 62:02 helm implements the first imagine okay 62:06 so let's describe function helm internal 62:08 okay 62:10 let's look at the inline dock okay helm 62:13 internal something something something 62:15 okay again similar 62:17 uh syntax arguments internal hem 62:20 function called by helm okay 62:22 uh yeah yeah yeah yeah so let's jump to 62:26 source code we 62:28 we we oops uh we 62:31 you know let's jump to source code 62:34 there it is helm internal 62:38 now narrow to defend let's see 62:41 how many lines is it 62:44 okay again 100 lines not too many so 62:47 it's 62:48 you know so apparently the helm's coding 62:51 style is very 62:54 um you know it uh modulized 62:57 you know it it it tries to you know for 63:00 each function you just have 100 lines 63:04 instead of you know a huge number of 63:06 lines 63:07 okay helm internal 63:10 okay the internal hem function called by 63:13 helm right 63:14 so so let's look at the code structure 63:17 what does it do 63:18 um now again our goal is to find 63:24 how helm implements first imagine okay 63:27 so let's see i don't know what you know 63:30 i'm just looking 63:34 advices uh helm nesting okay whatever 63:38 let's just scan let's scan 63:41 and see if there are some words about 63:46 pattern or regular expression or first 63:49 imagine 63:53 okay unwind protect 63:56 okay oh my god this is 64:18 okay you know there's a lot to look into 64:21 um 64:23 helm read from mini buffer prompt 64:26 input 64:30 okay so 64:36 so helm read from mini buffer so this is 64:39 where helm uh 64:43 you know when you type this function 64:46 lets you 64:47 type something that's how helm gets 64:50 input 64:53 uh so we are several layers down 64:58 and we still haven't seen it yet 65:02 so helm read from mini buffer so 65:13 uh helm log 65:18 advice remove bound advice removed 65:21 so actually so helm is actually fairly 65:24 complicated 65:34 package 65:37 helm allow mouse okay so i 65:41 so now looks like how read for mini 65:44 buffer 65:45 is the function we want to look 65:49 into yeah let's go up let's see what 65:53 else 65:57 okay yeah i'm that i'm guessing this is 66:00 the function we want to 66:01 look into so okay let's describe 66:04 function on that 66:05 let's see what it says helm read mini 66:08 buffer is a compile list function okay 66:12 uh read pattern with prompt prompt and 66:15 initial input 66:18 yeah okay but 66:23 but it doesn't return 66:26 anything you see does it return to 66:31 something 66:32 i don't think it returns anything 66:36 so anyway let's let's go to the source 66:39 code okay 66:40 go to the source code here is the code 66:46 oh okay so let's see how many lines are 66:48 there 66:49 okay 66:52 narrow to defend again 100 lines 66:57 each function is just 100 lines no more 67:01 okay we are diving uh three levels down 67:05 by now okay helm read from mini buffer 67:09 yeah again similar arguments 67:13 so we are trying to find the 67:16 how it implements first imagine 67:22 okay now finally helm read from 67:24 minibuffer right 67:25 prompt input okay uh 67:29 with helm buffer oh my god with helm 67:32 buffer 67:34 you know it defines it defines 67:38 its own with helm buffer 67:41 okay then okay i'm actually getting 67:45 tired 67:48 so any comments 67:51 no comments uh what's a font that's a 67:54 standard font that's a console 67:56 a console that's a windows standard font 68:00 okay for mono space for code 68:04 uh with helm buffer okay so that's 68:08 basically the whole thing 68:10 then if statement helps resume 68:14 p get current source okay 68:18 make more current line updates 68:20 pre-select okay so 68:26 so let's you know again we are looking 68:29 at helm's 68:33 uh formatting style you know helms 68:35 source code for imaging style now this 68:38 is 68:38 this deviates from the gnu e-max style 68:42 because for example i can show you in 68:45 gnu e-max style 68:50 okay for example if you look at um 68:53 you know you look at this block now i'm 68:55 gonna 68:56 i'm going to restyle it you'll see this 68:58 you see this 68:59 sequence of space will be good so let me 69:02 try okay 69:05 do it oh actually 69:10 wait 69:13 huh anyway never never mind 69:18 never mind back to uh back to the led 69:26 source process p okay helm log 69:34 timer neo helm log 69:38 then when source helm resume 69:42 help display mod line 69:45 okay so pattern now we're starting to 69:47 see 69:48 pattern here helm pattern reset helm 69:50 pattern in update 69:55 oh my god this is uh helm pattern helm 69:59 input helm pattern 70:41 okay so 70:45 there is a timer now i'm not sure what 70:48 the 70:49 what is timer doing here exactly 70:53 because i've seen timer mentioned 70:56 several times 70:59 okay i don't know you know i need to go 71:01 offline and uh 71:05 study this because right now i'm 71:07 probably getting pretty boring 71:09 for you guys uh yeah 71:14 uh am i still like alive yes i'm still 71:17 talking 71:18 um let's 71:22 let's um hold on a second let's 71:27 put my face 71:32 [Music] 71:38 uh 71:40 so yeah i think we're gonna stop 71:44 now it's taking a long time make sure we 71:47 stop 71:48 uh 71:52 we are trying to find how first imaging 71:54 is done in hell 71:56 and we dived into several levels of 71:58 nested you know 71:59 functions calling functions tracing 72:02 tracking the functions 72:04 um and still i'm not seeing it 72:08 uh because you know really because 72:10 that's the heart of the helm engine 72:13 uh i suppose 72:16 so we i still haven't seen the 72:19 you know the actual code for the fuzzy 72:21 matching but we are getting close 72:24 minibuffer we set up so read from mini 72:28 buffer so it's actually 72:29 calling 72:33 but you know it's actually calling this 72:36 emac this gnu emacs this command to read 72:40 from mini buffer 72:44 so what about input you know there's an 72:48 argument of 72:49 input here that's the user input so can 72:53 we 72:53 find it 73:02 you know so this argument is actually 73:04 not used anywhere 73:05 huh in the code 73:11 okay so the comment says enter now mini 73:14 buffer and wait for input 73:15 okay so here wait 73:20 what 73:27 so actually there's some comments here 73:29 maybe they are helpful 73:30 result reset helm pattern and update 73:32 display if no result found 73:35 with precedent value of the helm pattern 73:38 okay 73:39 okay helm pattern is probably what we 73:42 want to look into 73:49 okay so helm input and what about the 73:53 input 73:57 and okay over here it says enter now 74:01 mini buffer and wait for 74:02 input so 74:07 tab okay so 74:22 you know and so so from what i see now 74:26 helm is pretty you know helm's source 74:29 code 74:30 is fairly advanced 74:33 you know it's not just um a rapper 74:37 of emac beast or something you know it's 74:40 you know especially when you see this 74:42 kind of thing unwind 74:44 protect usually you don't call that when 74:47 you call that that means your code is 74:49 doing complex things 74:50 you want a way to you know if there's 74:52 some error 74:54 that's what a unwind protect does 74:57 normally you wouldn't call it you you 74:59 wouldn't call this 75:01 so a wine protect is in emacs version 75:04 19. 75:08 introduced or before yeah i think it's 75:10 way before yeah 75:11 you know uh because unwind protect you 75:14 know i might protect 75:15 you know here's a bit uh here's 75:18 a bit um on wine protect is actually 75:22 you know for my study of 75:27 exceptions you know in programming 75:29 there's let me let me just 75:30 let them talk for now a little bit you 75:32 know in programming there's a concept of 75:34 exceptions 75:36 you know and uh the meaning of 75:38 exceptions 75:39 is very different in different languages 75:42 so you can go to wikipedia there's a 75:44 article on that 75:45 exceptions you know for example java you 75:48 know especially in oop languages 75:50 it's very common to see exceptions 75:53 meaning 75:54 basically it's a object oriented 75:58 method of errors you know of tracking 76:02 errors 76:04 you know error error handling you know 76:06 error handling is a very diff uh 76:08 complex uh issue uh different 76:11 there are so many different approaches 76:13 but anyway 76:15 in all languages you know today's 76:17 understanding of exceptions is basically 76:20 from op languages basically java 76:23 you can say java's model or it's also in 76:26 javascript and 76:27 also python you know exceptions 76:30 which is essentially 76:34 basically built in go tools you know 76:37 it's like mysterious go-to that's 76:40 so if you search for saudi exceptions or 76:43 history of exceptions saudi history 76:45 of exceptions you can find it let me 76:47 show you okay 76:48 let me jump 76:55 okay so here's the article why i hate 76:58 exceptions 77:00 and i have a quote from the golan 77:03 why does go not have exceptions 77:06 and you know i did some research on the 77:08 history of the exceptions so exceptions 77:11 is actually you know different languages 77:14 they are completely different you know 77:16 even your language has exceptions my 77:18 language has exceptions but they are 77:20 like different things 77:22 completely so it turns out from 77:25 from my study you know the first 77:27 exceptions 77:28 came from lisp okay this language and 77:31 uh and and the that exception is 77:35 entirely different from from java 77:38 or from java or python or javascript 77:42 you know it's you know throw and catch 77:44 is 77:45 uh it's it's also called the local exit 77:48 so anyway i do i vaguely recall an 77:52 unwind protec unwind protect 77:55 it's one of the earliest error han 77:59 error handling um approach okay 78:02 so you know in a sense this 78:06 it is indeed actually this is the 78:09 father of the error handling 78:13 concept exceptions okay but however this 78:17 you know the unwind protect and throw 78:19 and catch has nothing 78:21 absolutely nothing to do with java or 78:23 python or 78:24 javascript you know there are exceptions 78:28 so anyway that's a um that's a 78:31 digression about 78:32 unwind protect okay that's the error 78:34 handling thing 78:36 so back to the helm i don't know 78:39 uh so i haven't found what we're looking 78:42 for 78:42 we are looking for how helm the 78:46 engine of first imagine using helm so we 78:50 it's fairly complex okay helm is uh 78:54 it's a non-trivial actually non-trivial 78:56 package 78:58 okay so we haven't found it but however 79:03 we have some we we what we achieved is 79:06 some sense of 79:08 how helm is implemented you know the 79:11 helm structure so we can see 79:15 for example we have a helm read from 79:18 mini buffer 79:20 and the function that calls it is helm 79:23 internal and the function that calls 79:26 that is 79:28 helm okay and the function that calls 79:30 that is 79:32 help meta x 79:35 yeah helm mx right so we we have a list 79:38 of hierarchy of functions 79:40 uh okay let's write them down okay and 79:43 and 79:44 that's probably that's it for today uh 79:50 so so if i let's see if i can remember 79:56 how meta x cause helm 80:02 cause 80:05 helm read for mini buffer i think 80:08 let's see 80:16 yeah okay so it's 80:23 helm internal okay 80:32 so we have this is what we have okay 80:37 yeah so so 80:41 so this is a sequence um 80:46 call stack okay helm mx calls helm 80:49 helm cos helm internal and helm internal 80:53 calls helm read for mini buffer 80:57 and and they're small but we are going 81:00 to stop 81:03 so so what we can do 81:06 is you know we want to implement our 81:08 function you know original function we 81:10 can actually make a different version 81:13 by just calling helm internal i think 81:15 that will work 81:17 okay let's try uh 81:20 let's try helm internal it's a function 81:22 we can call i think so 81:24 okay so if we call helm internal let's 81:27 call helm 81:28 read for mini buffer okay let's see 81:32 so here's the code helm read from mini 81:34 buffer 81:35 yeah we can let's try to call it okay 81:41 so we modify our code now 81:44 so here instead of using uh 81:49 you see instead of using i do complete 81:51 read 81:52 we use help okay let's see we use helm 81:55 complete read 82:00 okay let's see 82:05 helm read for mini buffer let's see what 82:08 happens okay i'm not sure you work 82:10 let's see let's see the uh 82:14 prompt input okay so let's try that okay 82:19 so select choices okay so evaluate the 82:23 uh 82:24 function okay then 82:27 move to the bottom code select choices 82:31 enter wrong number of arguments 82:35 okay yeah okay it needs seven arguments 82:39 and and we only give it two 82:43 okay so let's instead of hem read for 82:46 mini 82:46 buffer let's try 82:50 let's try helm internal okay let's see 83:01 okay evaluate the code call it 83:05 select choices okay 83:08 initial input should be a string or neo 83:11 okay so now let's try again 83:14 now let's just try helm 83:18 evaluate the function call 83:21 select choices initial input should be 83:25 your string or neo okay 83:29 yeah so we cannot call it we need to 83:32 okay that that's that's it for today we 83:35 close down 83:36 in minutes okay thank you okay bought in 83:39 z trunk crazy 83:57 good night uh guys uh bye guys