Okay, cool. So, welcome to the third lecture of the missing semester of your si a second today we're going to be talking about text editors this is a topic that I really like I think it's one of the most valuable topics that we're teaching in this class because as programmers you spend so much of your time editing text editing programs that if you invest time into making yourself more efficient at doing this you'll save a ton of time probably hundreds of hours over the course of your undergrad or over the course of your career so text editors are a little bit different than other programs you might use to edit say things like English prose because programming is different than writing English prose when you're programming you spend a lot of time reading what you've written you spend a lot of time navigating around a buffer and you spend a lot of time making little edits to code all over the place rather than just writing in a long stream like you do when you're writing an essay or something and so it makes sense that there different programs for these different purposes right so yeah things like Microsoft Word for writing essays and things like vim and Emacs and vs code and sublime for writing code so the way you learn a text editor and become really good at it is you start with a tutorial and so that's basically going to be the function of today's lecture plus the exercises we've given you and then after the tutorial you need to stick with the editor for all your editing tasks and when you're learning a sophisticated tool so today we're going to teach you vim which is one powerful editor that a lot of programmers use when you're learning such a sophisticated tool it may be the case that initially switching to this tool slows you down a little bit when you're programming but stick with it because I'd say that in about 20 hours of programming using a new editor you'll be back to the same speed at which you programmed using your old tool and then after that the benefits will start and you'll get faster and faster as you learn more with these sophisticated programs like them it takes not way too long to learn the basics but a lifetime to master and so throughout the time you're using this tool make sure you look things up as you go if you ever get to a point where you're like oh this is a really inefficient way of doing things is there a better way the answer is almost always yes because these text editors were written by programmers for programmers and so of course like the peep I wrote these tolls ran into the same kinds of issues and fixed them so that you don't need to deal with these anymore and so yeah as you're learning make sure you look things up as you go either use Google or feel free to send us emails if you have questions or come to office hours and we'll help you figure out how to do things really fast so as far as which editor to learn in previous iterations of this class we actually avoided teaching a specific editor because we didn't want to enforce our opinions on you guys but we actually think that it's really useful to teach you how to use one particular tool and use it well and so people have really strong opinions about editor so you can see the course notes for more links on this topic looking at which editors have been popular over the years Stack Overflow I'm sure you've all heard of that does a survey every year asking developers various questions and one thing to ask is which TextEdit Derk do you use and it seems to be that currently the most popular kind of graphical editor is vs code and the most popular editor that is based within a command line interface is vim and so we're going to be teaching you vim and there a couple reasons for this one is that all the instructors so me John and Jose use vim as our primary editor and we've been doing this for many years and we've been very happy with it and we think that there are a lot of interesting ideas behind them so even if you don't end up using this particular tool in the long term I think it's valuable to learn these ideas and also a lot of tools have actually been really excited about the ideas in vim and so they support a vim emulation mode for example vs code what's apparently the most popular editor in use today supports vim bindings and this vim emulation mode as of now has like 1.4 million downloads and as you'll see over the course of this lecture a lot of different tools like including your shell including things like the Python repple and like Jupiter notebook and all sorts of other things even your web browser can support of emulation mode and so yeah we're going to be teaching you this really neat tool today and in this lecture we can't really cover all of them right it's a very powerful tool but our goal is to teach you and the core philosophy of them like the really neat ideas behind it and then in addition to that some of the basics like how do you open a file close a file navigate around a file make edits and things like that and you may not remember every single little detail from this lecture because we're gonna go pretty fast through some of the material but it's all in the lecture notes and then the exercises actually give you links to some tutorials and things so I highly recommend that you actually go through all the exercises at least the non advanced exercises any questions so far great okay so one of the really cool ideas behind them is that vim is a modal editor what does this mean modal comes from the word mode and this means that vim has multiple operating modes and this is kind of developed from the idea that when you're programming there often times where you're doing different types of things like sometimes you're reading code sometimes you're making small edits to code like you're finding a particular point like changing a little thing somewhere sometimes you're just writing a lot of code in one go like suppose you're just writing a function from scratch and so there's different operating modes for doing these different types of things and so I'm actually want to write this down on the blackboard so I'll have a useful thing to refer to later so when you start vim up it starts up in what's called normal mode and in this mode all the different key combinations behave in one way and then there are different key combinations that switch you between normal mode and other modes which change the meaning of different keys so for the most part you'll be spending most of your time in vim in normal mode or what is called insert mode and to go to insert mode you press the key I for normal mode and to go from insert mode back to normal mode you press the Escape key a little note on notation because we'll need this later in the notation I'm going to be using in this lecture and what's also in the lecture notes and what vim uses to give you feedback they have a couple different ways of talking about different keys so when they're talking about bare keys like just the eye key on your keyboard they'll just say eye but for a different key combinations like when you press control and something like say control V it's notated in one of like approximately three ways one way that can be notated is a caret and then the control character so this is control V another way this might be written I think we've written it this way in lecture notes as control-v this is probably the one you're more used to seeing and then in some parts of them this is written as angle brackets C - V close angle bracket so just a little bit of notation that will be useful later so yeah vim has a couple different modes where normal mode is designed for navigating around a file reading things going from file to file things like that and then insert mode is where you type in text so most keys that you press here will just go into your text buffer where as keys that you press here are not being put into the buffer and instead are used for things like navigation or making edits and actually the picture is a little bit more complicated than this there are a whole bunch of other modes and I'm just gonna write them down here because we'll have them here to refer to later and so if it also has a replace mode for rather than inserting text and kind of pushing what's ahead of it forward it will overwrite text and then it has a bunch of different modes for selection so it has a mode called visual mode and then it has visual line and visual block this one is enter via the R key this was entered via the V key this one is entered via shift B and this one is entered via control V and then there's the command line mode which is entered via the colon key okay so now that we have that on the board to refer to later we can actually try some of this out all right so one thing we noticed looking at that picture is that to go from normal mode to any of the other modes we press some key but to go from any of the other modes back to normal mode where we spend a lot of our time we use the Escape key on our keyboard so for this reason since you under pressing the Escape key a lot when using vim a lot of programmers rebind one of the keys on their keyboard to be escape because it's really inconvenient to reach up with your left pinkie to press that tiny little Escape key in the corner of your keyboard and so a lot of people use the caps lock key instead so it's right there in the home row and we have some links in the lecture notes for how you can do this key rebinding okay so now that we've talked about kind of one of the core ideas of vim the idea of modal editing we can talk about some of the basics like how do you open up this text editor how do you open file save files and things like that and so this is a command line based program although there are some graphical variants and the way you start this program is by running vim one thing you might notice is that in the bottom left corner of my screen they actually saw what I just typed this will be useful later in this lecture where I'm actually typing in commands for vim and I'll be saying what I'm typing but you'll also see it on the screen so if I press ctrl C see it says ctrl C over there is that text big enough for everybody to read great okay so the way we open vim is just by running the program vim on our command line and this comes pre-installed on most systems and if you don't have it you can install it using your package manager vim can also take an argument if we want to use it to edit a particular file instead of just opening up the program then later opening a file so for example I have a file in this directory this is actually the lecture notes for this lecture so I can do vim editors MD and press ENTER and then boom them is started and then in this lecture I'm not running vim in the completely Exton I've configured a couple of things that behave a little bit nicer by defaults little things like having line numbers on the left or having some more status information on the bottom and if you want to start with this default configuration we have a link to this in the lecture notes so you can get a slightly more sane config by default. So, once you've opened Vim, what do you do? Well, as I said earlier, Vim starts in normal mode, so if I just start typing letters like, say, type X it didn't insert X into the buffer. You can see the cursor up in the top left: it actually deleted one of the characters. That's because I'm in normal mode, not insert mode. So insert mode is basically what you're used to with all the other text editors you've used in the past, where there's a cursor somewhere, you press the character, and it just goes into your buffer. I'm instead in vim you start a normal mode and you can press I to go into insert mode so see I've pressed I and then in the bottom left notice that it says - - insert the bottom left always tells you what mode you're in unless this normal mode in which case it's blank and now that I'm an insert mode if I press the X character for example see it just gets inserted into my text buffer and I can backspace over at type other stuff and now my text editor kind of behaves like you'd expect any other program to behave so from this point how to go back to normal mode if I want to stop inserting characters. Yes, exactly. I press escape. And, that's the symbol my keystroke visualizer uses for escape, so just be aware of that. And then, Vim has this idea, that using the mouse is inefficient, like your hands are on the keyboard, moving your hand over to the mouse takes a lot of time, right, like you don't want to waste those couple of milliseconds while you're programming, like in the middle of things. So, instead, all Vim functionality can be accessed just through the keyboard. And, it's all sorts of things you might be used to doing like opening files by going, like, file open, or file save, or things like that, or instead access through the keyboard. And, how is that done? That's done through one of the other Vim modes that are on the board over there. In particular, through command line mode. So, if you're in normal mode, and you press the ":" key, you'll notice that the cursor - I guess my visualizer is covering the thing right now but it's gone - the cursor jumps to the bottom - the bottom left - and it shows that ":" I just typed. Now, I can type in a command. So, you can think of this almost like the command shell that we've talked been talking about over the last few days, except this is Vim's command shell, so you give Vim commands here, instead of shell commands. And there are a bunch of built-in commands that do all the things that you're used to. Like, for example, one command that you might want to know is how to quit this editor. You might notice that if you're in normal mode, I can press "Escape" to go back from command line mode to normal mode, and I press "control C", unlike what happens to a lot of programs, this doesn't quit Vim. So, how do I quit Vim? I can press ":", and then go into command line mode, and then I can type in the command "quit". "Q-U-I-T". You'll see that I - maybe I should move this over to the middle or something - see, it says ":quit" and I press ENTER, and it quits Vim. I can open Vim up again. There's actually a short form for this command, just ":q", and that'll do the same thing. And, there are a bunch of other useful commands like this. So, some other handy ones to know are how do you save a file? So, suppose I make some edits here, like "hello world". So, I pressed "i" to go into insert mode - or let me redo that - I press "i" to go into insert mode. Right now, I can use the down arrow to... I think I've slightly I should fix that. Can you fix the config, actually, John? Never mind that. Okay, so, suppose I go down to this line, and I press "i" to go into insert mode, and type in some text, and then press "escape" to go back to normal mode. Now, how do I actually save this file? Well, there's another command for that. So, ":" to go into command mode, and then I can type "W"... ...and press "Enter". "W" stands for write. And, it says in the bottom "editors.md" whatever blah blah written. And, so, this means it saved the file and so now if I ":q" to quit and open the same file, again, you'll see that the changes have been persisted. There are a couple other there's... So, there's a ton of different Vim commands that are useful for different reasons. But, I'll just explain a couple more to you now. One command that's really useful is help. ":help" And you can do ":help", and then type in a particular key, or a particular command, and get help for that keystroke or that command. So, if I want to know what ":w" does, I can do : help : W, and that'll give me the documentation on : w or : write. If I do : q, it'll close this window and bring me back to where I was before. And, notice that ":help :w" is different from ":help w", because the W key is the W that, like, when you're in normal mode and press W, what happens is just the W key here without the ":". And, if I look for help for ":w", that's the help for the W command. So, now you basically have the bare fundamentals needed to use them. right? You can open the editor, use it to edit a particular file, press "i" to go into insert mode and type in some text, press "escape" to go back to normal mode, and then :w to save your changes, :w to quit. So, like already you have the bare fundamentals necessary to edit files using Vim, albeit somewhat inefficiently. So, any questions so far? Yeah in the back. Yeah so the question is, What's the benefit of the normal mode? And, we'll talk about that in more detail, in like five minutes. But, in short, insert mode is just for typing in text. So, I'm in insert mode, I can type in text. But, when I'm programming, I actually spend a lot of time moving around my file making small little changes. So, I go here and like, oh maybe I want to change this HTTPS link to an HTTP. I can make like small point edits, things like that, in normal mode. And we'll see a whole lot more of that in about five minutes. Good question! Any other questions? Okay cool. So, moving along, one other thing that's kind of useful to know, I think, is, at a high level, Vim's model of buffers versus windows versus tabs. So, it's probably the case that whatever program you were using before, like Sublime Text or VS Code or whatever, you could open multiple files in it, right, and you could probably have multiple tabs open and have multiple windows open of your editor. So, Vim also has a notion of those different things. But, its model is a little bit different than most other programs. So, Vim maintains a set of open buffers - that's the word it uses for open files - and so, it has a set of open files, and then kind of separately from that, you can have a number of tabs, and tabs can have windows. The kind of weird thing which makes Vim a little bit different than the program you've probably used in the past is that there isn't necessarily a one-to-one correspondence between buffers and windows. So, one thing I can do, for example, here - and we'll show you the key combinations and stuff for this later - but one thing you can do is create two different windows. So, I have one window up here, and then one window down here. And, notice that the same files open in both windows. So, if I make some edits over here, they actually happen in the bottom window, as well, because it's the same buffer that's open in both windows. And, this is kind of useful, for, say, looking at two different parts of a single file at the same time. Like, so you want to be able to look at the top of a file, say at an import to your program, while you're down below, working somewhere else. So, this is one helpful thing to keep in mind, that Vim has this idea of - there are a number of tabs, and each tab has some number of windows, and then each window has, uh, corresponds to some buffer. But, a particular buffer can be open in zero or more windows at a time. Just one thing that confused me when I was initially learning Vim, so I want to explain that early on. And then, the ":q" command, which we talked about earlier, is not exactly quit. It's kind of "close the current window", and then, when there are no more open windows, Vim will quit. So, here, if I do ":q", it'll only close the window, I think, on the top here because that's the one I was in, and, now, the remaining window becomes fullscreen. I can do : Q again to close this. Now we're in the second tab that I'd opened. If I do :Q a final time, okay, now, Vim exits. And if you don't want to press ":q" way too many times... Okay, so, here I have three split windows. If I do ":qa", for quit all, it closes all the open windows. All right, so, now, to answer your question of "What is normal mode actually for?" This is another, really cool idea in Vim, and I think this is actually, like, the most fundamentally interesting idea of this program. It's that, like, you're all programmers, you like programming; Vim has this idea that Vim's normal mode, like, Vim's interface, itself, is a programming language. And, let me repeat that. That's like a kind of fundamentally interesting idea: the interface is a programming language. What does that mean? It means that different key combinations have different effects, and, once you learn the different effects, you can actually combine them together - just like in a programming language - you can learn different functions and stuff and then glue them all together to make an interesting program. In the same way, once you learn Vim's different movement and editing commands, and things like that, you can talk to Vim by programming Vim through its interface. And, once this becomes muscle memory, you can basically edit files at the speed at which you think. Like at least for me, I don't think I've been able to do this with any other text editor that I've used in the past, but this one gets pretty close. So, let's dig into how exactly normal mode works. So, you can try to follow along with this, like, open up some random file in Vim, and follow some of the key combinations I type in. So, one basic thing that you might want to do, is just navigate around a buffer. Like, move your cursor up/down/ left/right. And, so the way you do that in Vim, is using the hjkl keys, not the arrow keys. Though they do work by default, try to avoid them, because you don't want to have to move your hand all the way over to the arrow keys. Like, there's a ton of time you're wasting, right? HJKL is right on the home row. And, so, J moves down, K moves up, H moves left, and L moves right. And, this may seem a little unintuitive now; there was some historical reason for it, like, the keyboard the original vi developer used had the hjkl keys, like, labeled, and arranged in a way that made this more reasonable. But, this will very soon become muscle memory. So, this is the basic way you can move your cursor around while in normal mode. Now, what else can you do? Well, if we had to move around files like this, it'd be really slow. We don't want to have to hold down these keys, and like, wait for a long time for Vim to do its thing. And so, there are all these other, different key combinations for doing different movements. Also, by the way, this is all in the lecture notes, so you don't need to memorize every single key and its meaning right now. Just try to understand the overall idea that Vim's interface is a programming language. So, another thing you can do is press the W key. This moves the cursor forward by one word. And then, similarly, the "B" key moves the cursor backward by one word. So, this allows slightly more efficient movement within the line. There's also the "E" key for moving to the end of a word. I'm going to move this over a little bit. So, if I'm here, for example, and I press the "E" key it'll go to the end of this word, end of this word, end of the next word and so on. You can also move by whole lines, so zero moves to the beginning of a line, dollar sign moves to the end of a line, and the caret key moves to the first non-empty character on a line. So, let me find one of those, for example. So, here, my cursor's right here; if I press 0, my cursor goes to the beginning of the line, dollar sign, end of the current line; and if I press caret, where, like, on what character will the curser end up? Can anybody guess? So, caret goes to the first non-empty character on a line, kind of like Regex caret. Yeah, exactly! It goes to this dash. Let's talk about some more movement commands. There're ways to scroll up and down in a buffer, so control U goes up, and control D scrolls down. So, this is better than holding down the K or J keys, for example. This is a lot slower than moving by entire pages. Control D and control U. There's also ways to move by the entire buffer. So, capital "G" moves all the way down... "gg" moves all the way up. Some of these movement keys are mnemonics; so, they're like, a little bit easier to remember for that reason, right, like, "W" is word, "B" is beginning of word, E is end of word. Those all seem pretty logical. 0, caret and dollar, kind of inspired from Regex, so those make a little bit of sense. There's some other ones that, like, don't necessarily make way too much sense, but, there are only so many keys on your keyboard, so what are you going to do? For example, the "L" key moves your cursor to the lowest line that's shown on the screen. "L" for lowest makes sense, M for middle, and then H for highest, I guess. And, there's a whole bunch of other interesting movements like this. So, we're obviously not going to be able to cover all of them right now, but you'll be able to go through them in the Vim tutor exercise, which is exercise number one for this lecture. Some other ones I want to talk about now - maybe I'll talk about one more. There's another movement called "find". This is also kind of useful. Suppose I'm on this line, and I want to jump to the first character that equal's to... Like, I want to jump to the first "o". I can press "fo", and my cursor moves to the first "o". I've like, found "o". I can do fw and it'll move to the first "w", which I think is right here. fc: find the first C. I can also do the same thing, but backwards. If I do capital F, w, I can find the W that's before it. Capital F, s: find the s that's before that. And then, there's a variant of f, for find: t for to, so I can jump to O, and it jumps, like, until it's found o. But not on top of it, right before it. And capital T say, t, jumps backwards to the t except not all the way on top of it, one character before. And, so, you can already see that idea I talked about, of like, Vim is a programming language; you can, like, compose these commands. "F", and "T", are "find", and "to", and you can say "find" a particular character, or jump "to" a particular character. So, those are a couple of Vim movement commands. So, any questions about those so far? So this is - yeah, question? Or... no? Okay, cool. So, those are Vim movement commands. This is how you can navigate around a file quickly in normal mode. Now, another category of useful commands are editing commands. So, one we kind of already talked about is the "i" command for moving from "normal" mode to "insert" mode, where you can start just writing text. So, suppose I go up here and I press "i". Now I can type in whatever text I want "Hello world", "enter". Then, press "escape" to go back to normal mode, and I've made a change to my buffer. But, there are a whole bunch of other commands for making efficient edits that makes sense for when you're dealing with programming languages. So, one useful command that I accidentally used earlier, before teaching you about it, is the "o" command. So, suppose my cursor is, like, over here, and if I press "o", from normal mode, what it does, is it opens a new line below where my cursor is. That's what "o" stands for. And it, so it creates a new line, and it put me into insert mode. So, now I can start typing in some text, press escape, and go back to normal mode. And then, just like the "o" command, there's a capital "O" command, so if I'm here and I do capital "O", it puts me into insert mode above where I currently am. There's another Vim command for deleting things. So, suppose my cursor is, like, on top of this word right here, and I press the D key. "D" for delete. Oh, nothing happens; turns out that the D key needs to be combined with a movement command. So, remember we just talked about different movement commands, like hjkl, and, like, word, and backward word, and things like that. So, I press D. Whoops. I press D and I can press W, and it's deleted a word. So, let me undo that. Undoing in Vim is just u for undo. So, notice my cursor's right here. I do "dw": it's deleted a word. I can move around, and then delete another word. Suppose I'm - uh, keeps getting in the way Suppose I'm, like, somewhere in the middle of a word, and I want to delete to the end of a word. Any guesses for what combination of keys I'd use for that? "d" and what? de, exactly. Delete to the end of the word. Another useful editing command is the c command. c stands for change. So, change is really similar to delete, except change puts you in insert mode, because, like, I want to delete a thing, but change it to something else. So, if I'm here, and I do "ce", it's like, change to the end of the word. And, it gets rid of the contents until the end of the word, and notice it put me in insert mode. So now, whatever characters I type go into the buffer. If I press "escape", I go back into normal mode. And so, c and d are analogs: they both take motions as arguments. And, they will either delete that motion, or change that motion. So, for example, if you press the c key, there's also this pattern that, if you press a particular editing key twice, it'll have that effect on the given line. So, if I press "dd", that deletes the line. If I press "cc", that deletes the given line, but puts me in insert mode, so I can replace it with some other line. We'll cover a couple other, uh, editing commands, because then later we'll see how all these things interact together. So, another useful one is the x command. So, suppose my cursor is over some particular character. If I press "x", it just deletes that character. There's another command called r. If I'm over a particular character, and I press "r", it takes another character as an argument, and it replaces that particular character with some other character. And, I'll cover a couple more editing commands. So, I think one I talked about a moment ago - but, of course you can undo changes you've made in Vim. And the way you do that is by pressing "u" while you're in normal mode. So, u for undo is pretty easy to remember. So, I press "u" a whole bunch of times; it's undone all the changes I've made. And then, the opposite of undo is, of course, redo. And, the binding for that in Vim is control + R. All right, one other editing command I'm going to talk about is copy and paste because-oh yes, question? That's a - that's a great question! So, the question is, "Does 'undo' undo everything you've done since you've gone into insert mode, or just the last character?" It's - it's actually a little bit more complicated than that. "Undo" does, like, undoes the last change you've made. So, if you went into insert mode, and typed in some stuff, and went back into normal mode, and then press "u" for "undo", it'll undo all you've done in insert mode. But, if you've done some other type of editing command, like, say I press "x" to delete a character... If I do "u" for undo, it'll just undo that change that that editing command made. Now, does that answer the question? (Yeah) Great any other questions? Cool. So, I'll talk about copy and paste as well, because that's a popular one. The y command stands for copying, and the p command stands for pasting. y for "copy", because, yank. Like, that's the word they- that's the terminology that Vim uses for copying. And, these commands are- y also takes a motion as an argument. So if I do like, yy, it copies the current line. And, if I press "p" for "paste", notice that now these two lines are identical, because I've just pasted a line below. "u" for "undo". But if I do something like "yw", it's copied the word. And then I can do "p", and it just pasted that word again, right where my cursor was. One useful thing, especially in the context of copy and paste, is to be able to select a block of stuff and copy it, right? Like, this is probably how you used copy and paste in whatever editor you were using before. And so, that's where we get into the visual modes. So, these are another set of modes that are all related to each other, and that can be reached from normal mode, and they're used for selecting chunks of text. So, one mode is, just, regular visual mode. You can enter that by pressing v. And then, once you're in this mode, you can use most of the regular normal mode commands to move your pointer around. And it selects everything in between. So I can use, like, hjkl just to move the cursor, or I can use "w" to move by words, or different things like that, and it will select a block of text. And, once I've selected this block of text there are a whole bunch of different types of useful things you could do with it. One of the most popular things to do is copying this. So, once I've selected, I can do y to copy, and it puts me back into normal mode. And now, it's copied this to the - to the paste buffer. And then if I go somewhere else, and press "p", it pastes in that whole chunk of text I copied. And it's similar to visual mode, which selects kind of a contiguous stream of text. There's visual line mode: that can be reached by pressing capital V, and that selects whole lines at a time. And then there's VISUAL BLOCK mode, which can be selected by pressing "control" + " V", and that can select rectangular blocks of text. So this is something your old editor couldn't do. Alright, so, there's a lot more Vim editing commands to learn. There's lots of, like, really weird and fancy things. Like, for example, the tilde command changes the case of the character, or the selection that you've currently selected. So for example, I can take this, like, Visual Studio Code, and flip the case on the whole thing, by selecting it and pressing tilde. And, there's a whole bunch of other things like that; they get more and more esoteric as you go. So, we're not going to cover all of those, but you'll get to those in the exercises. So, those are Vim editing commands, and a lot of them can be composed with movement commands. So, any questions about either of those so far? Cool. So, moving along, another category of things -of commands- that are mostly relevant to normal mode are counts. So, you can give them a number, to do a particular thing, some number of times. So suppose my cursor is here, and I want to move down, like 1 2 3 4 lines. One way I can do that is by pressing "j" four times - go down four times. "kkkk" goes up four times. But, rather than pressing a particular key again, and again, I can use a count. So if I press "4", "j", it does j four times, right? Vim's interface is a programming language. If I do "4k", it moves up four times. If I am here, and I press "v" to go into visual mode... Okay so now I can move my cursor around, and select blocks of text. I can do, like, "eee" to select a couple of words, but, I could also go back here -v for visual mode- and press three e to select, like, three "ends of words" forward. And then of course these can also be combined with editing commands. So, like, suppose I want to delete seven words. I can do that by moving my cursor somewhere, and doing "7dw". Seven delete words. And so, this is particularly useful for things like, suppose my cursor is somewhere on the screen, and I'm looking somewhere else on the screen, or, I want my cursor to go to that particular line. Notice that I've set up relative line numbering on the left. So, wherever my cursor is, it shows the current line number, but everywhere else, it's just the offset from where I am. Now, suppose my cursor is here, but I want to move down to the like "Microsoft Word" down here, so that's eight lines down. So, what combination of keys would I press, to do that? Like, what's the most efficient way? Yeah, exactly! Let's try that out-8j-and my cursor moved down to this line. Okay. And then, one, final category of key meanings in Vim is something called modifiers. So we have, so far, movement, edits, counts, and, finally, we have modifiers. So, modifiers kind of change the meaning of a movement command a little bit. And, a couple modifiers that are especially useful are the "a" and "i" modifier. So, a stands for like around and "i" stands for inside. And, to see where this is really useful, I can move my cursor to somewhere like here, for example. So, hopefully, most of you are familiar with markdown syntax - and if not it doesn't matter too much. Uh, this is a link in markdown; it's a text rendered in square brackets, and then the link in parentheses. Suppose my cursor is inside here, and I want to change the text corresponding to this link. Well, one way I could do that is, like, move back here with b, and, like, 2dw, and then "i" to go into insert mode. That's one of the many ways I can make this change, and I can type in whatever other thing I want - u to undo, u to undo. Another way I could have done that is change two words - "c2w" - and then type in some other text. But, one final way I could do the same change is using the modifier commands to talk about how I want to interact with these different types of grouping things like parentheses and square brackets. So, one final way of doing this is change inside square brackets-"c" "i" "["-and that puts me into insert mode, after deleting the contents that are inside the brackets. So, do you see how we can take all these different ingredients, like we talked about "change", and we could combine that with different movement commands. We talked about inside, how it's a modifier. And then we talked about, uh... we didn't talk about parentheses. But, if your cursor is hovering over a different, uh, different types of grouping things like parentheses, or square brackets, you can press the percent movement key to jump back and forth between matching parentheses. If I go over here and I do d, i, (, I can delete the contents inside these parentheses. And so, those are Vim, uh, modifiers. I guess we talked about i, but we didn't talk about a. If I do "da(", it deletes a whole, like parenthesized group including the parentheses so I is inside is around or including all right so those are basically the different categories of things you can combine together, when interacting with Vim's interface. So, any questions about that or the overall idea of this interface being a programming language? Cool. So, let's do a quick demo, to kind of demonstrate the power of this editor. And, it will kind of help us see how this tool can work really fast and kind of match the speed at which we think. So, over here is a very broken "fizzbuzz" implementation that doesn't actually print anything. Uh, hopefully, most of you have heard of "fizzbuzz" - if not, I'll explain it super briefly. Uh, "fizzbuzz" is a programming exercise where you print the numbers 1 through n, but when the number is divisible by 3, you print fizz - when it's divisible by 5, you print buzz. And, when it's divisible by both 3, and 5. you print fizzbuzz. And, if none of those apply, you just print the number. So, you should print like 1, 2, fizz, 4, buzz, and so on. But, if I run this program, it doesn't print anything here I have them on the left in just a terminal on the right ok so there's a bunch of issues with this one is that main is never called so let's start off with fixing that so here's how I would make this change and notice how few keystrokes this requires capital G means go to the bottom of the file o opens a new line below and now I can just type in stuff so I'm an insert mode okay so I've typed in whatever change I want to make escape to go back to normal mode if I do : W so command mode right let me go back here okay now at least my program prints something when I run it another issue with this program is that it starts at 0 instead of 1 so let's go fix that so I want to go over to this range whoops this range thing and it shouldn't be going from 0 to limit it should be going from 1 to limit plus 1 1 command which I didn't show you about is how you search in vim so you press forward slash to close this and restart it if you press forward slash it starts search so if I type in range enter my cursor goes from wherever it was before to the first instance of range it found so it's a really efficient way of moving where I want to move WW to move forward two words I to go into insert mode add the one comma space escape I'm back in normal mode this is a very common pattern in vim you stay in normal mode you go somewhere you go into insert mode you make a tiny change and you jump right back to normal mode like normal mode is home and that's where you should be most of the time I also want to add a plus one so e to go to the end of this word a for a pend plus one escape alright fix that problem and other issue is that this program prints fizz for both divisible by three and five so let's fix that slash fizz searches for fizz been oppressed and it goes to the next match see I press E I quote changes what's inside the quote so it's deleted the fizz and put me in insert mode right in between those two quotes and I can type in whatever I want escape to go back to normal mode so great I've fixed that particular problem another problem with this program is that it prints fizz and Buzz on separate lines for multiples of 15 so let's let's go and fix that let me go down to this line here one way I can don't actually worry about like the actual contents of this program like this some stupid program that doesn't matter pay attention to what keys I'm pressing in vim that allow me to make changes to this program really efficiently so my cursor is on this line i press dollar to go to the end of this line i for insert mode okay and i'm typing some stuff escape to go back to normal mode now I want to make the same change the print below look at this JJ dot so what dot dozen vim is it repeats the previous editing command that was made and so this is a really nice way of doing repetitive tasks without typing the same thing over and over again so in that particular case that inserted comma end quote and so it applied the same thing on this line when I press dot and then when I guess one final part of this demo is we will fix the issue that this program maybe should take a command-line argument instead of having this hard-coded 10 down here so how do we do that I'll press GG to go to the top capital o so now I've opened a line above and I'm going to type in some text like imports this enter escape to go back to normal mode and then I want to go down to where this 10 is so slash 10 makes me jump straight down there CI pren to edit what's inside the parentheses and now I can type in like whatever thing I need to type in here and then once I've done this my program does fizzbuzz correctly I think I missed one change I wanted to make but it doesn't matter this demonstrates that you can make lots of changes really fast so any questions about this demo or the overall idea we've been talking about ok so this will be covered Tuesday so the kind of outside environment I'm running vim on the left and my shell on the right and then this is team ox on the outside one variant of that question might be like how do you switch between different vim windows and you can see the lecture notes for that but there's a key binding for that so if you have the same window open or multiple things open there's a way of doing that question ah good question so delete takes a motion and then removes those contents but keeps you in normal mode so you can keep just moving around in a file what change does is very similar to delete it takes motions and treats them in the same way deletes those contents but then puts you in insert mode and so it saves you from typing one extra keystroke so if I'm here for example I want to delete main DW deletes a word but now if I press whatever key likes I press J it just moved me down if I undo that do cw4 change a word now it's actually put me into insert mode and I can type in whatever I want it to insert so DWI is the same thing as CW but it saves a keystroke one thing we've linked in the resources is something called vim golf basically people have set up a game online where you can get an editing task and try to figure out the minimal number of keystrokes necessary to complete that editing it's actually really addictive so I'd only suggest going on their chest and script time I think I saw a hand for another question yeah uh period yeah one of the most useful of em commands good question any other questions cool so I think we have about five minutes left and I'm gonna briefly talk about a thing that's also covered in detail in the notes so make sure you look at the notes for this so vim is a programmers text editor and so of course it's highly programmable not only through its interface that's a programming language but also a couple of different ways there's lots of settings that you can tweak to match your preferences and you can also install plugins for them that do all sorts of useful stuff so the way vim is configured is through a file on disk called vim RC and you'll see this is a common pattern in a lot of shell based tools there'll be a plain text file that configures how the Tool Works and so if I edit this file and it may or may not exist on your machine yet but I've downloaded the we've created a kind of default vim RC for you and linked it on the course website so you can start with that one if I do vim tilde slash boom RC I can see here a bunch of comments and then particular commands like by default we want syntax highlighting on and we want line numbers if we didn't do some of these things like let me remove the stuff that sets line numbers if I remove those configurations and relaunch vim notice that I no longer have line numbers on the left but yeah so in short there's a lot of stuff you can configure with them we've given you a very basic configuration that tries to like remove some of the kind of weird behavior that's on by default in vim but we don't really try to enforce too many of our other opinions on you but of course like the three of us used them a lot and we have heavily customized VMR C's so we've linked to our personal configurations too if you want to take anything from that and also like thousands or like millions of people share their var C's on github so there's lots of places to look for inspiration there's also cool blog posts on this topic another thing you can do in vim is you can extend it with plugins that do all sorts of useful things this lets you do things like fuzzy file finding which a lot of text editors come with by default so you can get like a pop-up window you can type in a name of a file or approximately the name of a file and find it very quickly or there are things that show you like visualizations of undo history there are things that show you like file explorers things like that so we've linked to a couple of our favorite plugins on the course website and so I highly recommend becoming familiar with how to install a plug-in because it takes like three seconds and some of them are really cool and then finally the last topic I'll briefly mention before we finish today's lecture is vim mode and other programs so turns out that a lot of programmers we're really excited about VIMS interface and so they've implemented similar functionality and other tools for example like I've configured my Python repple to run in vim mode so I can like type in stuff here and if I press escape now I'm in normal mode in my Python repple and I can like move back and forth and like press X here delete a thing like CW change a word and do all those good things and it's not just the Python repple like I have my terminal behaving this way too so like I can type in whatever I want here and like escape and I'm in normal mode I can go here and like go into visual mode inside my terminal and like select blocks of text press tilde to change the case whatever so we've linked sir like how exactly you can enable vim mode for like bash z shell fish a lot of read line based programs like jupiter notebook a whole bunch of other things and if it's not another place you can probably find it by googling it because a lot of people like to have this sort of functionality and if you're really gonna like commit to learning them I think it's valuable to enable this sort of like vim emulation mode in every tool you use is like one or like make you learn the tool a lot better and to once you become good at vim like those skills will now transfer to all your other tools you use okay so I think that's it for our rapid introduction to them there's some other neat material that we weren't able to fit in today's lecture but it's in the lecture notes and then finally I highly recommend going through the exercises for today like at least for me personally I think spending time learning my text editor has been like the most beneficial thing out of like the kinds of things we're teaching in this class so yeah that's it for today's lecture and we'll see you tomorrow note that we've changed tomorrow's lecture to data wrangling Thursday and Tuesday lectures are now switched this is reflected on the course website in case anybody was going to come to one but not the other