Lately, I’ve been brushing up on my Python skills, and decided to use wxPython for some GUI programming. But, I had some trouble installing wxPython in a Python virtual environment on Debian, so once I figured it out, I’ve recorded what I had to do in case anyone else needs to do the same thing.
Note that if you’re NOT using a virtual environment, it’s pretty easy: just install the “python3-wxgtk4.0” package. Of course, if you’re using Python 2, you’ll need something else, but because Python 2 has reached end-of-life, I don’t know why you’d want to use that! Anyways, just as a refresher, to install a Debian package, you’ll need to run the following from the command line as root:
apt-get install python3-wxgtk4.0
You may, of course, need to run it with sudo to run as root:
sudo apt-get install python3-wxgtk4.0
In this post, rather than saying whether to run something as root or as a regular user, I’m just going to prepend the root commands with “sudo”; if you get root access another way, do that instead.
OK, but as I said, I want to install wxPython in a Python virtual environment. The problem comes because Python needs to compile wxPython, so you need a number of development packages installed. You actually need hundreds of packages (!), but I’ve narrowed it down to a short list, and the other packages will be installed as dependencies of these ones.
Note that I am currently running Debian Buster. I’ve tried this out with a basic non-GUI install of Buster, as well as with the XFCE desktop installed (which I set up via “sudo tasksel install xfce-desktop”).
First thing you need to do if you’re going to use Python virtual environments on Debian is to install the Python virtual environment package:
sudo apt-get install python3-venv
Now, you can create your Python virtual environment:
python3 -m venv example-env
This will create your Python virtual environment in a directory called example-env.
Now, install all of required Debian development packages:
This will cause hundreds of packages to be installed, so don’t be surprised when that happens!
Once you’ve got those installed, you’re almost all set. Activate your Python virtual environment:
source example-env/bin/activate
Using Python’s “pip” program, install the “wheel” Python package into the virtual environment:
pip install wheel
And now, finally, you can install wxPython:
pip install wxPython
Be aware that this is going to result in the wxPython package being compiled, which can take a LONG time. Don’t be surprised if it takes an hour or more. But, once it’s successfully installed, you can use wxPython in your virtual environment! I tested it out by running the helloworld2.py program found on the wxPython Overview page.
In this post, I present step-by-step instructions for installing Anaconda, a Python package manager for data science, and a number of included data science Python packages, including Spyder and Jupyter Notebook.
What is Anaconda?
If you want to do some data science with Python, it is highly recommended that you use Anaconda. According to the Anaconda website, “Anaconda® is a package manager, an environment manager, a Python/R data science distribution, and a collection of over 1,500+ open source packages.” So, what that means is that it looks after installing and managing various Python packages for data science in an easy-to-use manner. It’s way easier than dealing with all the interactions and dependencies between the various versions of those packages.
Many scientific packages require a specific version of Python to run. It’s difficult to keep various Python installations on one computer from interacting and breaking, and harder to keep them up-to-date. Anaconda Distribution makes management of multiple Python versions on one computer easier, and provides a large collection of highly optimized, commonly used data science libraries to get you started faster.
What is included with Anaconda? From that Starter Guide, here’s the highlight of some of the things that are either installed with Anaconda, or can be installed with Anaconda:
Jupyter Notebook: web app that allows you to create and share documents that contain live code, equations, visualizations and explanatory text
R essentials: 80+ of the most used R packages for data science
That’s just a few of the highlights. There are over 1500 packages that can be installed with Anaconda.
This post leads you through the steps to install Anaconda on a computer running the Debian Linux distribution. My Debian box (actually, a Vagrant Virtualbox VM running Debian) uses the XFCE desktop environment; you’ll need some GUI to use Anaconda. But, you can also use the command-line based “conda” program if you don’t want a GUI.
Installing Anaconda
The Anaconda website is at https://www.anaconda.com. The documentation for it is at https://docs.anaconda.com/anaconda/. You can find the downloads at https://www.anaconda.com/distribution/; at the time of this writing, the latest version for Linux is Anaconda 2018.12. I’m going to use the Python 3.7 version; if you want to use the Python 2.7 version, download that instead. You can see all the downloads at https://repo.anaconda.com/archive/. Either download the installer with your browser, or download it from a Terminal window. I downloaded it from a Terminal window.
Open a Terminal window on the GUI, and download the latest 64-bit version of the Anaconda installer:
Be sure you execute this in the directory that you downloaded the file to!
Press enter to review the license agreement, hitting space to scroll through the agreement. When asked if you accept the license terms, type yes and press enter to accept.
Press enter to confirm the install location of /home/username/anaconda3 (for me, my username is vagrant)
The installer now installs a number of packages, and then asks if you want the installer to initialize Anaconda in your .bashrc file
Typically, you’ll want the installer to update your .bashrc file. Type yes and press enter to do so. You might not want it to if you have multiple installations of Anaconda, but that’s pretty rare.
After your .bashrc file is updated, you’ll be asked if you want to install Microsoft VSCode.
I’m not going to install it. Type no and press enter to NOT install Microsoft VSCode. Note: if you want to install it, you would need to run the installer as root.
Close and re-open the Terminal window so that the changes to your .bashrc file are read in.
You can check for successful installation by running “anaconda-navigator” from the terminal.
anaconda-navigator
When it starts up, you’ll be asked if you want to provide anonymized usage information. If you’re OK with that, click the “OK, and don’t show again” button (otherwise, it asks every time you start it up); if not, uncheck the “Yes, I’d like to help improve Anaconda.” checkbox, then click the “OK, and don’t show again” button.
And here’s Anaconda Navigator in all its glory!
Notice the applications that have been installed. I’ve got:
Jupyter Lab 0.35.3
Jupyter Notebook 5.7.4
Jupyter Qt console 4.4.3
Spyder 3.3.2
Exit anaconda-navigator (File / Quit). If told that Anaconda Navigator is still busy, click Yes to exit.
The installer and the packages that it includes are quite large. Let’s free up some space now. First, delete the file Anaconda3-2018.12-Linux-x86_64.sh.
rm Anaconda3-2018.12-Linux-x86_64.sh
Then, using conda, the command line version of Anaconda, remove the downloaded package installers. From the Terminal, run:
conda clean --tarballs
You’ll be given a list of all of the package installers that will be deleted, as well as the size of those files. You’ll then be asked whether to proceed; type y and press enter to delete them.
Updating packages installed with Anaconda
Now, let’s make sure we’ve got all of the latest versions of packages that have been installed with Anaconda. But, rather than using Anaconda, we’ll use the command line version, conda. The reason for this is you need to update packages one at a time with Anaconda; with conda, you can update everything at once.
In your Terminal window, execute:
conda update --all
This will check to see which packages can be updated, list them, and ask you to proceed. Type y and press enter.
After doing this, free up space again:
conda clean --tarballs
And, you’ve now got Anaconda installed and up-to-date!
In my three previous posts (Post 1, Post 2, Post 3), I detailed the steps involved in setting up a Debian Vagrant box on Windows 10. It contains lots of explanations and screenshots; if you know what you’re doing, and you just want to see the steps, this is the post for you!
Install the vagrant-vbguest plugin, if you don’t have it installed already:
vagrant plugin install vagrant-vbguest
Create the Vagrantfile:
vagrant init debian/buster64
Update the Vagrantfile by adding the following lines to the appropriate locations:
This is the third post in a series explaining how to set up a Debian Vagrant box on a Windows 10 machine. In the first post, I talk about how to download a Debian base box from the Hashicorp atlas repository of base boxes, and how to create a Virtual Machine from that base box. In the second post, I describe how to install the VirtualBox Guest Additions into your Debian box, and how to configure a shared folder between the VM and your Windows host machine. In this post, I describe how to install a GUI.
If you know what you’re doing, and you want to skip all the explanations and just see the steps involved, feel free to look at my summary!
Note: this blog post was written with Debian 9 Stretch, but I’ve tested it with 10 Buster, and everything works the same. The screenshots will vary slightly, but everything works good!
Setting up your Vagrantfile
We’re going to make some configuration changes to our Vagrantfile, so if your VM is currently running, shut it down:
vagrant halt
The first thing we’re going to want to do is to set up our Vagrantfile to configure VirtualBox with our Vagrant box. There are some minor changes we need if we’re going to run a GUI on our VM. Open up your Vagrantfile in your favourite text editor. Find the section of commented out lines that begin with “Provider-specific configuration”:
Add the following lines after that section:
config.vm.provider "virtualbox" do |vb|
vb.gui = true
vb.memory = "2048"
vb.customize ["modifyvm", :id, "--vram", "12"]
end
This part of my file now looks like:
What this does is configures VirtualBox. If you are using a different provider, say VMware, you’ll need to do something different; that’s outside the scope of this post.
What these lines do is as follows:
“vb.gui = true”: configures VirtualBox to appear when it is run. Up until now, when we start up our VM, we don’t actually see it. This line changes that.
“vb.memory = “2048””: assigns 2GB to your virtual machine. This isn’t necessary for running a GUI, but the default of 512MB isn’t enough for the development work I do. If you don’t have a lot of memory on your Windows host machine, leave this line out.
“vb.customize [“modifyvm”, :id, “–vram”, “12”]”: assigns 12MB of video RAM to the virtual video card. The default is 8MB, and that’s not quite enough to run full-screen on my 1920×1080 display. The minimum is 9MB, but I like to give myself a bit of wiggle room.
Installing the GUI
Now that we’ve got the Vagrantfile set up, start up the VM:
vagrant up
The VM will start as normal, but what will be different is that you’ll see the VirtualBox GUI running. We’ll just ignore it for now, and continue to ssh into our VM.
vagrant ssh
If it’s been a while since you set up your VM, you may want to make sure you’ve got all the latest packages, although this isn’t always necessary. I do it for completeness. Execute these commands inside your SSH session:
sudo apt-get update
sudo apt-get upgrade
Now, there’s a single command that we need to execute to install the GUI. I’m installing the XFCE desktop; it’s nice and simple and easy to use.
sudo tasksel install xfce-desktop
This command now goes out and downloads all the required packages, then installs them. Be warned that this is a slow process; when I did this as I was writing this post, it required downloading 944 packages! Also, know that if you want to wipe out your VM and recreate it with “vagrant destroy / vagrant up”, you’re going to have to download all these packages again. But, sometimes that can’t be helped…
Once the download and install completes, log out of your SSH session, reboot the VM, and it will start up with the GUI!
logout
vagrant halt
vagrant up
Using the GUI
Once your VM boots, you’ll have a GUI window:
You can use this window as-is, but it’s kind of small. I always maximize it. The first time you do this it’s going to look kind of strange:
Not a concern, as it will fix itself when we log in. Now, log in on the GUI, using the username of vagrant and the password of vagrant. The GUI will log you in, and resize to use the full screen:
And, you’re done! You’ve now got a Debian box with a GUI running in Vagrant!
Shutting down the VM
When I’m done working with the GUI, I always first log out of the GUI (Applications / Log Out from the XFCE menu, then choose Log Out), then I switch to my Windows command prompt window and do a “vagrant halt”. I don’t know if this is necessary, but it’s probably good practice: it lets the Debian GUI cleanly shut down, and then lets Vagrant cleanly shut down. It’s probably not a problem to just shut down the VM from the GUI, but I’m a little anal-retentive that way….
Short answer: Use the vagrant-vbguest plugin to make things easy!
This is the second post in a series of three that describe how I set up my Debian development environment in Vagrant on Windows 10, using VirtualBox as the provider. The first post shows how to set up a basic, command-line only, Debian box. The third describes how to install a GUI. In this post, I describe how to install the VirtualBox Guest Additions.
If you know what you’re doing, and you want to skip all the explanations and just see the steps involved, feel free to look at my summary!
Note: this blog post was written with Debian 9 Stretch, but I’ve tested it with 10 Buster, and everything works the same. The screenshots will vary slightly, but everything works good!
What does the VirtualBox Guest Additions offer?
According to the VirtualBox User Manual, installing the Guest Additions provides the following advantages (read the User Manual for more details):
Mouse pointer integration: makes it easier to use the mouse between the virtual machine and your Windows host)
Shared folders: makes accessing files between your VM and your Windows host easier
Better video support: not a big deal if you’re doing command-line only work, but if you’re using a GUI, it makes a huge difference. For me, I like to resize the GUI, and when I do that, the screen in Debian automatically resizes. Very nice.
Seamless windows: I’ve never actually used this. Read the manual for what it is (as I should do!).
Generic host/guest communication channels: Something else I’ve never used….
Time synchronization: synchronizes the time between your VM and the Windows host. If you ever pause your VM, this is really nice because it automatically updates the time in the VM when you unpause. Not something you’ll ever notice when you’re using it, but you will notice if you don’t have this feature!
Shared clipboard: Easy cut-and-paste between your VM and the Windows host.
Automated logons (credentials passing): Never used this, so I can’t really comment.
What’s involved in installing the VirtualBox Guest Additions?
You’re probably convinced now that having the VirtualBox Guest Additions installed is a good thing. Unfortunately, getting them installed is normally a bit of a pain. They are distributed within VirtualBox as an ISO file, which you can mount as a CD-ROM on your VM. Then, you run the install script, and everything happens nice (hopefully): installing new device drivers, adding kernel modules, etc., etc. But, the problem I had, is that I need to have a bunch of software installed in my VM before I can install the Guest Additions. I suppose that’s not that hard, I just need to figure out what I need first. I could even record the list of required software in a blog post!
Another problem is that every time you upgrade your version of VirtualBox, or the kernel in the virtual machine, you need to re-install the Guest Additions. If you don’t, things likely still will work, but it’s better to be safe than sorry. VirtualBox will warn you if you’re running a different version of the Guest Additions, but you’ll need to update them yourself.
But, there’s a better way!
Using the vagrant-vbguest plugin
Vagrant allows you to extend its functionality using plugins. There is a plugin, called vagrant-vbguest, that does all of the hard work for you involved in setting up the Guest Additions. Once you’ve got it installed, every time you run vagrant, it will check to see if the Guest Additions are installed, and at the correct version; if not, it will automatically install them (or upgrade them) for you. It will even automatically install the software required to do the installation!
I ALWAYS use the vagrant-vbguest plugin. It’s possible to use plugins on a per-VM basis (I’ve read, anyways, but I’ve never tried it), but it makes things so much simpler, why would you not want to do it?
Installing the vagrant-vbguest plugin
Installing the vagrant-vbguest plugin is VERY easy. Just execute:
vagrant plugin install vagrant-vbguest
This will go out to the Internet, download the plugin, and install it in Vagrant.
And that’s all there is to it!
Installing the VirtualBox Guest Additions with the vagrant-vbguest plugin
The wonderful thing about this plugin is, once it’s installed, you don’t have to do anything else! Every time you start up a Vagrant box with “vagrant up”, the plugin will ensure that the Guest Additions are installed; if they’re not, it will install it for you. Here we go:
vagrant up
And here’s some screenshots of the plugin in action. First, the VM boots as usual:
Then, Vagrant checks to see if the Guest Additions are installed:
Next, it checks to see if the packages required to install the Guest Additions are installed in the VM; if they’re not, it installs them:
I’m not going to bother showing the installation of these 34 packages. After they are installed, Vagrant mounts the Guest Additions ISO from VirtualBox into our VM:
Then, it actually installs the Guest Additions:
And finally, it starts up the Guest Additions, unmounts the ISO, and finishes the “vagrant up”:
Because we’ve made changes to the kernel, I always like to reboot the system after installing the Guest Additions. Maybe it’s not necessary, but I prefer to be safe. Just shut it down and restart:
vagrant halt
vagrant up
You’ll now see, as part of the bootup sequence, that Vagrant checks to ensure that the Guest Additions are installed and running:
Setting up shared folders in your VM
Now that we’ve got the Guest Additions installed in the VM, let’s set up shared folders, so that we can easily access our Windows files in our VM, and vice-versa. What we’ll do is set up a single folder that will be shared between the VM and the Windows host. First, shut down the VM:
vagrant halt
Now, use your favourite text editor to edit the “Vagrantfile” configuration file. Within that file, you’ll find some lines like:
We’re going to add a new line after this to specify how we want to set up our shared folder. What I’m going to do is have the current folder (the one with Vagrantfile in it) show up in my VM in the location /vagrant. To do this, add the following line after the lines above:
This tells Vagrant to mount the current folder (“.”) on the Windows host into the VM at location “/vagrant”, and to use a VirtualBox shared folder. There is also an “rsync” way of sharing folders, but that requires installing additional software on both Windows and the VM, and it doesn’t automatically sync the files. I much prefer the VirtualBox shared folders. Anyways, that section of my Vagrantfile now looks like:
Start Vagrant back up:
vagrant up
You’ll notice in the bootup sequence a message indicating the shared folder:
Using the shared folders
Let’s actually try out the shared folders. First, ssh into the VM:
vagrant ssh
If, from within the VM, you look at the contents of the /vagrant directory, you’ll see:
which is the same as what you see in File Explorer in Windows (not counting the hidden .vagrant folder!):
If you look at the contents of the Vagrantfile in the VM, you’ll see that it is the same as the file on Windows — they are the same file!
Next, try creating a file in the VM:
And you’ll see it’s also visible in Windows:
So, if you ever want to move files between the VM and the Windows host, just drop them in the appropriate folder, and you’re good to go!
Cleaning up
If you want to remove the plugin from Vagrant, it’s pretty easy to do:
vagrant plugin uninstall vagrant-vbguest
Note that this only uninstalls the plugin, it does not uninstall the VirtualBox Guest Additions. If you do want to uninstall the Guest Additions, I’d suggest destroying the box, and recreating:
vagrant destroy
vagrant up
I personally prefer having the Guest Additions installed, so I always have the plugin installed.
What’s next?
In the first post, I looked at how you can set up a basic Debian box in Vagrant. But, it’s command-line only. That’s OK for an old Unix hacker like me, but if you prefer a GUI, the next post talks about how to do that.
Update on July 23, 2019: Since the time I originally made this post, Debian has moved from version 9.6 Stretch to 10.0 Buster. I’ve updated the post accordingly. Thankfully, nothing changed but the name of the Vagrant box to use! If you still want to use Stretch, replace everywhere that it says stretch64 with buster64. Some of your error messages may be different, though…
Lately, for my Linux development, I’ve been using Vagrant, using VirtualBox as a provider. In Vagrant, I set up a Debian box and do my development on that. It’s nice and easy to set up, and if I want to restart with a clean installation of Debian, it’s very easy to do.
I’ll write three posts about how I set it up. In this first post, I detail the steps that I use to create a basic Debian box, with no GUI. In my second post, I describe the steps I use to set up VirtualBox’s Guest Additions, so that I can share files between my host Windows system and my Debian Vagrant box. In the third post, I give the steps that I use to set up a GUI.
If you know what you’re doing, and you want to skip all the explanations and just see the steps involved, feel free to look at my summary!
Debian’s Vagrant Box
The Debian project provides standard Vagrant boxes in the Vagrant Cloud box catalog. You can read about them on the Debian wiki, and look at the provided boxes on https://app.vagrantup.com/debian/. The latest version of Debian is version 10, codenamed Buster. At the time of writing this post, the latest point release was 10.0, and I’m using the 64-bit version of Debian. So, the Vagrant box I’m using is debian/buster64.
The Debian Vagrant box provides a standard basic Debian system, containing all packages with priority required, important, and standard. Note that it does NOT include a GUI; you’re just going to get a command-line version. We’ll look at how to set up a GUI in the third post.
Once you’ve got Vagrant and VirtualBox installed, you’re going to want to create the configuration file for your box. This file is called Vagrantfile. I’ve created a folder under my home directory called vagrant-VMs, and underneath that, another folder called buster. I’ve created multiple folders under vagrant-VMs, one for each Vagrant configuration, but in this post, I’m only discussing my Buster installation.
Here’s looking at my folder in File Explorer:
Open a command prompt, then change to the vagrant-VMs\buster folder:
cd vagrant-VMs\buster
Next, use Vagrant to create the Vagrantfile for us:
vagrant init debian/buster64
This will create the Vagrantfile that configures the usage of the Vagrant box. The box won’t actually be downloaded until you try to bring the box up for the first time.
Here’s a screenshot.
You might want to take a look at the Vagrantfile; it’s just a text file (actually, a Ruby program file), so you can look at it in your favourite text editor, such as Notepad, Notepad++, or Vim. There’s actually very little in the file; most of it is commented-out configuration, giving examples of things you may want to configure. But, for now, we’ll just leave things as they are.
Here’s a screenshot of the complete file (click to view it larger):
Creating the Virtual Machine
The next step is to create and start up the virtual machine. We’ll use the “vagrant up” command to do that. The first time you run this, it will connect to the Hashicorp atlas (a repository of Vagrant boxes, maintained by the developers of Vagrant) and download a copy of the box (called the “base box”). Then, it will create a virtual machine as a copy of the downloaded base box; subsequent executions will just use the virtual machine you’ve already created.
Note: Vagrant creates a folder to hold all its configuration data under your home directory, with the name .vagrant.d. If you’re curious where the downloaded base box goes, it goes underneath that folder, in a subfolder named boxes. On Windows, I use File History to back up my files; because these boxes are so big, and because I can easily re-download them, I don’t want to back them up, so I configure File History to not backup the .vagrant.d\boxes folder. There’s another folder that I also don’t back up, but I’ll mention that next…
Second note: the virtual machine gets created in a folder in your home directory called “VirtualBox VMs”. Once again, I don’t want to back these up, so I add this folder to my list of excluded folders in File History. You may want to back them up, but as I said before, you can easily recreate these VMs, so it’s a waste of backup space to back them up.
OK, so let’s create our Virtual Machine:
vagrant up
You’ll see a whole bunch of messages. Vagrant goes through the following steps when it creates the VM:
Imports the debian/buster64 base box and uses it to create a new VM
Configures the networking of the new VM
Boots the VM, and waits for the booting to complete
Uses SSH to connect to the VM, and replaces the SSH key in the VM (more on that later)
Checks to see if the VirtualBox guest additions are installed.
You’ll now see one of two messages about the VirtualBox guest additions. If they are not installed in the Vagrant box (they shouldn’t be, but version 10.0.0 of the box seems to include them), you’ll get a scary error message telling you that you should install them, and that a lot of things won’t work until you install them. Ignore that for now; I’ll look at installing the guest additions in my next post. If they are installed (version 10.0.0, I’m looking at you!), you may get a slightly less scary message that the guest additions on the VM don’t match the installed version of VirtualBox. Don’t worry about that, as we’ll install the proper version in the next post.
At the time of writing, I also get a VERY scary error message about attempting to rsync a shared folder. Once again, don’t worry about that; we’ll resolve that in the next post as well.
With regards to SSH: the buster64 box that was downloaded from the Hashicorp atlas has a well-known SSH key, but you really want that to be secret. But, if it was secret, we wouldn’t be able to connect to the VM. So, when we first bring up the VM, Vagrant connects to the VM using the well-known key, then generates a secret key, and replaces the well-known key with our new secret key. Finally, it disconnects and reconnects using the new key, just to make sure everything is working OK.
Here’s a screenshot of all the output (click to enlarge):
You’ll notice that it doesn’t appear that the VM is running. The “vagrant up” command completes and returns us to the command prompt, and there isn’t a VirtualBox GUI. But, don’t worry, VirtualBox is running; you just can’t see it! If you really want, you can start up Windows’ Task Manager, and see the VBoxHeadless process listed under Background Processes. Or, you can start up VirtualBox, and you’ll see that you’ve got a running VM!
Bringing Debian Up-to-date
There may be security patches issued by Debian that aren’t incorporated into your imported box. The next thing we’re going to do is to bring all the software up-to-date.
Log in to the VM using the “vagrant ssh” command:
vagrant ssh
This will connect to the VM using SSH, and will log you in to an account named “vagrant”. This account was present in the Vagrant box you downloaded; it’s a standard convention used by Vagrant boxes. If you ever need to log in without using the “vagrant ssh” command, the password is also “vagrant”.
Here’s a screenshot:
Once you’re logged in, you’ll be at the Debian command prompt. We’ll want to execute the following commands:
sudo apt-get update
sudo apt-get upgrade
The first command will connect to the Debian package repository, and download a list of all of the latest versions of Debian packages. The second command will download and install any packages that have been updated in the repository since the Vagrant base box was created.
Here’s a screenshot of executing the update:
and another of executing the upgrade (click to enlarge). Note that your packages being updated almost certainly will be different from mine.
Depending on which packages have been updated, there are two other possible commands you may need to execute. If you get a message about some packages being held back, execute this command:
sudo apt-get dist-upgrade
And, if you get a message that some packages are no longer needed, you can remove them with:
sudo apt-get autoremove
Actually, there’s really no harm in executing both of these commands anyways, since we’re setting up a new VM; they just might not do anything.
And now, we’re done! We’ve got an up-to-date Debian system running.
Log out of the SSH session to return to the Windows command prompt:
logout
Shutting down the Virtual Machine
The last thing to do is to shut down the virtual machine. That’s very easy to do from the Windows command prompt. Execute:
vagrant halt
And you’ll get a message that Vagrant is gracefully shutting down the virtual machine.
Next time you want to start the VM back up, just go to your vagrant-VMs\buster folder (or whatever you called it), and re-execute “vagrant up”. It won’t need to recreate the VM; it’ll just use it as it was the last time you used it.
Do you want to clean up?
For completeness, I should mention how you can clean up what you’ve done.
If you want to delete the VM that you created, execute:
vagrant destroy
That will delete the virtual machine. You can easily recreate the VM, though, just be executing “vagrant up” again. This is a nice easy way to start your VM over fresh if you mess it up somehow. It leaves your Vagrantfile intact, so any configuration changes you made in there will be used the next time you recreate the virtual machine. But, any changes you made inside the VM (such as updating Debian!) will need to be redone.
If you also want to remove the base box, execute:
vagrant box remove debian/buster64
If you want to use it again, you’ll need to re-download it; executing “vagrant up” will automatically do that for you if you need it.
Next steps
It’s very useful to have the VirtualBox guest additions installed on your system; I detail how to do that in my next post. This will allow you to share files between your VM and your Windows machine that the VM is running on. Also, if you’re running a GUI (which I’ll describe how to set up in my third post), it allows you to resize the window, which is very handy!
This is part of a series of tips on using Vi. To see the complete series, click here.
If you want to move around in a document quickly with vi, there are 3 useful commands (or 6, depending on how you look at it) for moving word-by-word.
Pressing the w key will move you forward word-by-word. For example, if you’ve got the line:
This is a test of moving word-by-word.
and your cursor is positioned on any character in “This”, you can press w and the cursor will be moved to the start of the next word, “is”. Pressing w again will move the cursor again, this time to “a”.
If you want to move backwards word-by-word, you can use the b key. For example, if the cursor is positioned at the start of “moving”, pressing b will move the cursor to the start of “of”. Pressing b again will move the cursor to “test”, and so on.
If you want to move forward to the end of a word, you can press the e key. With the cursor placed on the start of “This”, pressing e will move the cursor to the “s” at the end of “This”. If the cursor is already positioned at the end of a word, pressing e will move you to the end of the next word. For example, with the cursor positioned on the “s” in “This”, pressing e will move the cursor to the end of “is”.
But I mentioned that there are really 6 commands. Try the following line of text:
Let’s eat, Grandma.
(A classic example of the importance of punctuation!) If the cursor is positioned on the “L” in “Let’s”, pressing w will move the cursor to the apostrophe. Pressing it again will move the cursor to the “s”, and pressing it three more times will move you to the “e” in “eat”, the comma, and the “G” in “Grandma”. So, as you can see, the w command considers punctuation to be separate words.
If you press Shift-W instead, vi ignores punctuation. With the cursor on the “L” of “Let’s”, pressing Shift-W moves the cursor to the “e” in “eat”, and pressing it again will move the cursor to the “G” in “Grandma”.
Similarly, Shift-B moves the cursor backwards a word, ignoring punctuation. With the cursor on the “a” at the end of “Grandma”, pressing Shift-B once will move the cursor to the beginning of “Grandma”. If you were to press b now, the cursor would be positioned on the comma, but if you press Shift-B, the cursor is positioned on the “e” at the start of “eat”.
Finally, Shift-E works similarly with punctuation. With the cursor on the “L” in “Let’s”, pressing e moves the cursor to the “t” in “Let’s”, but pressing Shift-E moves the cursor to the “s”.
Summary:
w moves the cursor forward a word at a time, and stops at punctuation
Shift-W moves the cursor forward a word at a time, ignoring punctuation
b moves the cursor backward a word at a time, and stops at punctuation
Shift-B moves the cursor backward a word at a time, ignoring punctuation
e moves the cursor to the end of the word, or to the next word if it’s already at the end of the word, and stops at punctuation
Shift-E moves the cursor to the end of the word, or to the next word if it’s already at the end of the word, ignoring punctuation.
This is part of a series of tips on using Vi. To see the complete series, click here.
If you want to search for something in a file, you can use the forward slash character: /. Type forward-slash, the text that you want to search for, then press the Return key. Vi will take you to the next place in the document where that text appears, and will place the cursor on the first character. So, if I wanted to search for my name, Shane, I would type:
/Shane
and press Return. If the text doesn’t appear in the file, I’ll get a message on the status line telling me that (the exact contents of the message depend on which version of vi you are running).
If you want to search for the same text again, you can just type the forward slash followed by Return — vi will remember what the last text you searched for, and will search for it again. But, if you type anything after the slash, it will search for that instead.
Another thing you can do to search for the same text is to press the n key — it will take you to the next occurrence of that text!
/ searches forward; if you want to search backwards, use the question mark instead. If I want to search for the previous occurrence of my name, I type
?Shane
And if I want to search for the same text again, it works just like the forward slash — type ? followed by Return, and it remembers what I searched for last, and searches backwards for that again.
OK, here’s some magic — if I press n, it searches in the same direction as my last search! If I had been searching forward, then press n to search for the same text, it searches forward. But, if I had been searching backward with ?, pressing n will now search backward for the same text!
The search string can also include some simple regular expressions. If I want to search for my name at the start of a line of text, I use ^:
/^Shane
Or, if I want to search for it at the end of a line of text, I use $:
/Shane$
Finally, if I want to go back to the line I was on just before my previous search, I can press the backquote twice: “. This will take me to my previous position.
This is part of a series of tips on using Vi. To see the complete series, click here.
When someone wants to move up or down in a file that they are editing, I often notice that they either use the arrow keys to move one line at a time, or the Page Up and Page Down keys to move a screen at a time. Although this works fine, it has the disadvantage that you have to move your hands off the home keys, which messes up your touch typing. Fortunately, vi offers commands for doing the same thing:
Ctrl-F works like Page Down: it moves you down a page in the document, leaving the last two lines on the previous page as the top two lines of the next page to help retain context. You can remember Ctrl-F as “move Forward”.
Ctrl-B works like Page Up: it moves you up a page in the document, leaving the top two lines on the previous page as the bottom two lines of the next page to help retain context. The mnemonic for this command is “move Backward”.
But maybe you don’t want to move a full page at a time — maybe the common 2 lines isn’t enough context. You can also scroll up and down half a page at a time:
Ctrl-D moves you down half a page. The previous bottom line is now displayed in the middle of your screen. You can remember this with “move Down”.
Ctrl-U moves you up half a page. The previous top line is now displayed in the middle of your screen. Remember this one with “move Up”.
Finally, maybe you just want to move the display one line up or down:
Ctrl-E moves the display up one line, but, unlike the previous commands, it doesn’t move your cursor — your cursor stays on the same line it was on before executing Ctrl-E. Another way of thinking of this command is that it exposes a new line at the bottom of the screen, hence the mnemonic “Expose a line”.
Ctrl-Y is the opposite of Ctrl-E: it moves the display down one line (exposes a new line at the top of the screen), and leaves your cursor in the current position. Sadly, I’ve got no easy memory trick for remembering this one — if you’ve got one, add it in the comments below!
This is part of a series of tips on using Vi. To see the complete series, click here.
I notice a lot of my students using the arrow keys to move around when they’re editing a file in vi. That works fine, but the big problem with it is that you have to move your hands off of the home keys to do it. vi has a much better way of doing it: use the h, j, k, and l keys to move around one character at a time! It’s so much quicker, because your hands stay on the home keys of the keyboard.
The keys and how they move the cursor are:
h: moves one character to the left (like the left arrow key)
j: moves down one line, staying in the same column (like the down arrow key)
k: moves up one line, staying in the same column (like the up arrow key)
l: moves one character to the right (like the right arrow key)
They seem awkward at first, but you get used to them pretty quickly. Actually, they’ve become so ingrained to me, I don’t even think about them — in fact, I had to open up vi and try them out to remember which key moved in which direction!
To help you get used to the keys, it helps to practice by playing the old-school game rogue, as it uses the same directional keys!