Since the 1970’s, Vi and its successor Vim have been included by default on many operating systems, including almost all GNU/Linux distributions.
MacVim Vim - the text editor - for macOS Download MacVim Release Notes (r171) GitHub: MacVim GitHub page; Releases: Binary releases and release notes; FAQ: Answers to some frequently asked questions. Learn how to use TextEdit on your Mac to create and edit plain text, rich text (.rtfd), and HTML documents.
- Vim was made available in 1991 and is a free, open source software. Available both as a command line interface and as a standalone program with a GUI, Vim is a text editor that is a modal version of the vi editor created for Unix in the 1970s; Vim stands for vi improved.
- Subscribe to the vim-mac maillist to be informed about bugs and updates. Homebrew This is a terminal version installed with the 'brew' command. It is updated frequently.
- The vi editor is confusing if you’re not used to it. It takes a secret handshake to escape this application if you’ve stumbled into it. Here’s how to quit vi or vim on Linux, macOS, or any other Unix-like system.
Vim is free and open-source and is one of the most popular code editors. It can be downloaded on Vim official site.
Vim is a modal text editor, which means that it has a mode for writing text, a mode for running commands, etc.
Vim has a total of 12 different editing modes.
The three main modes are:
- Command mode (also sometimes reffered to as Normal mode) is where you can run commands. This is the default mode in which Vim starts up.
- Insert mode is the mode where you insert/write your text.
- Visual mode is where you visually select a bunch of text so that you can run a command/operation only on that part of the text.
Basic Vim Commands
Let’s start with an easy set of Vim commands to open, save, and exit Vim.
:e filename | Open filename for edition |
:w | Save file |
:q | Exit Vim |
:q! | Quit without saving |
:x | Write file (if changes has been made) and exit |
:sav filename | Saves file as filename |
. | Repeats the last change made in normal mode |
Moving in the File
While in command mode, the following set of commands will allow you to easily move the cursor in the file, jump to a particular line number, or set the cursor position at the beginning of the file.
k or Up Arrow | move the cursor position up one line |
j or Down Arrow | move the cursor down one line |
e | move the cursor to the end of the word |
b | move the cursor to the begining of the word |
0 | move the cursor to the begining of the line |
G | move the cursor to the end of the file |
gg | move the cursor to the begining of the file |
L | move the cursor to the bottom of the screen |
:59 | move cursor to line number 59. Replace 59 by the desired line number. |
% | Move cursor to matching parenthesis |
[[ | Jump to function start |
[{ | Jump to block start |
Cut, Copy & Paste
Here are some basic Vim commands to cut, copy and paste portions of text. All the commands below has to be ran in command mode.
y | Copy the selected text to clipboard |
p | Paste clipboard contents |
dd | Cut current line |
yy | Copy current line |
y$ | Copy to end of line |
D | Cut to end of line |
Search
In command mode, you can easily search for any string within a file. This is extremely useful for developers and sysadmins alike.
/word | Search word from top to bottom |
?word | Search word from bottom to top |
* | Search the word under cursor |
/cstring | Search STRING or string, case insensitive |
/jo[ha]n | Search john or joan |
/< the | Search the, theatre or then |
/the> | Search the or breathe |
/fred|joe | Search fred or joe |
/<dddd> | Search exactly 4 digits |
/^n{3} | Find 3 empty lines |
:bufdo /searchstr/ | Search in all open files |
bufdo %s/something/somethingelse/g | Search something in all the open buffers and replace it with somethingelse |
Replace
Vim command line tool is extremely useful to replace many occurences of a string by another within a file. Using more advanced commands, there are a lot of search and replace options available.
:%s/old/new/g | Replace all occurences of old by new in file |
:%s/onward/forward/gi | Replace onward by forward, case unsensitive |
:%s/old/new/gc | Replace all occurences with confirmation |
:%s/^/hello/g | Replace the begining of each line by hello |
:%s/$/Harry/g | Replace the end of each line by Harry |
:%s/onward/forward/gi | Replace onward by forward, case unsensitive |
:%s/ *$//g | Delete all white spaces |
:g/string/d | Delete all lines containing string |
:v/string/d | Delete all lines containing which didn’t contain string |
:s/Bill/Steve/ | Replace the first occurence of Bill by Steve in current line |
:s/Bill/Steve/g | Replace Bill by Steve in current line |
:%s/Bill/Steve/g | Replace Bill by Steve in all the file |
:%s/^M//g | Delete DOS carriage returns (^M) |
:%s/r/r/g | Transform DOS carriage returns in returns |
:%s#<[^>]+>##g | Delete HTML tags but keeps text |
:%s/^(.*)n1$/1/ | Delete lines which appears twice |
Ctrl+a | Increment number under the cursor |
Ctrl+x | Decrement number under cursor |
ggVGg? | Change text to Rot13 |
Case
Vim has some powerful commands to modify the case of text. All the commands below have to be run in command mode.
Vu | Lowercase line |
VU | Uppercase line |
g~~ | Invert case |
vEU | Switch word to uppercase |
vE~ | Modify word case |
ggguG | Set all text to lowercase |
gggUG | Set all text to uppercase |
:set ignorecase | Ignore case in searches |
:set smartcase | Ignore case in searches excepted if an uppercase letter is used |
:%s/<./u&/g | Sets first letter of each word to uppercase |
:%s/<./l&/g | Sets first letter of each word to lowercase |
:%s/.*/u& | Sets first letter of each line to uppercase |
:%s/.*/l& | Sets first letter of each line to lowercase |
Read and Write Files
Vim is clearly one of the most powerful text editors available. This section shows how you can manipulate files, insert the content of a file into another, and export portions of a file into a new file.
:1,10 w outfile | Saves lines 1 to 10 in outfile |
:1,10 w >> outfile | Appends lines 1 to 10 to outfile |
:r infile | Insert the content of infile |
:23r infile | Insert the content of infile under line 23 |
File Explorer
Vim features a built in file explorer, which allows you to explorer the content of your server without exiting the text editor.
:e . | Open integrated file explorer |
:Sex | Split window and open integrated file explorer |
:Sex! | Same as :Sex but split window vertically |
:browse e | Graphical file explorer |
:ls | List buffers |
:cd .. | Move to parent directory |
:args | List files |
:args *.php | Open file list |
:grep expression *.php | Returns a list of .php files contening expression |
gf | Open file name under cursor |
Interact With Unix
Vim is installed by default on most Unix based operating systems, including Mac OS and most GNU/Linux distros. It therefore feature various commands that allows you to interact with the OS.
:!pwd | Execute the pwd unix command, then returns to Vi |
!!pwd | Execute the pwd unix command and insert output in file |
:sh | Temporary returns to Unix |
$exit | Retourns to Vi |
Alignment
In command mode, you can quickly and easily align a file’s lines for better clarity.
:%!fmt | Align all lines |
!}fmt | Align all lines at the current position |
5!!fmt | Align the next 5 lines |
Tabs and Windows
One of my favorite Vim options is the ability to use tabs to edit various files at the same time. The following Vim commands will let you open, close, and organize your tabs for better productivity.
:tabnew | Creates a new tab |
gt | Show next tab |
:tabfirst | Show first tab |
:tablast | Show last tab |
:tabm n(position) | Rearrange tabs |
:tabdo %s/foo/bar/g | Execute a command in all tabs |
:tab ball | Puts all open files in tabs |
:new abc.txt | Edit abc.txt in new window |
Window Spliting
Vim allows you to split the screen horizontally or vertically, so you can edit many files at once using the insert mode.
:e filename | Edit filename in current window |
:split filename | Split the window and open filename |
ctrl-w up arrow | Puts cursor in top window |
ctrl-w ctrl-w | Puts cursor in next window |
ctrl-w_ | Maximize current window vertically |
ctrl-w| | Maximize current window horizontally |
ctrl-w= | Gives the same size to all windows |
10 ctrl-w+ | Add 10 lines to current window |
:vsplit file | Split window vertically |
:sview file | Same as :split in readonly mode |
:hide | Close current window |
:nly | Close all windows, excepted current |
:b 2 | Open #2 in this window |
Auto-Completion
Vim can use external dictionaries to provide auto-completion. This can be a real time saver, so pay attention to the commands below if you want to speed up your workflow.
Ctrl+n Ctrl+p (To be used in insert mode) | Complete word |
Ctrl+x Ctrl+l | Complete line |
:set dictionary=dict | Define dict as a dictionnary |
Ctrl+x Ctrl+k | Complete with dictionnary |
Marks
When editing large files, it can be tricky to move in the file and remember important sections. Happilly, Vim allows its users to create marks that can easily be accessed later. No need to remember a dozen of line numbers anymore!
Vim For Mac
m {a-z} | Marks current position as {a-z} |
‘ {a-z} | Move to position {a-z} |
” | Move to previous position |
Abbreviations
This little known trick lets you define abbreviations that can be reused later and as many times as needed.
:ab mail mail@provider.org | Define mail as abbreviation of mail@provider.org |
Text Indentation
Text indentation is vital when it comes to code readability. Luckily, Vim has a set of commands for the text editor to indent your lines in a clear and readable manner.
:set autoindent | Turn on auto-indent |
:set smartindent | Turn on intelligent auto-indent |
:set shiftwidth=4 | Defines 4 spaces as indent size |
ctrl-t, ctrl-d | Indent/un-indent in insert mode |
>> | Indent |
<< | Un-indent |
=% | Indent the code between parenthesis |
1GVG= | Indent the whole file |
Frequently Asked Questions
How do I Type Commands in Vim?
To type commands, you have to first activate Vim’s command mode. To do so, press the Esc
key of your keyboard. You can then type any command of your choice.
How do I Start Typing Text in Vim?
Vim must be in insert mode for you to type text. Simply press the i
key when in command mode to enter the insert mode.
On Which Hosting Plans Can You Use Vim?
Basically any Linux hosting will have Vim installed on the server. As long as you are able to access your server via SSH, you’ll be able to use Vim. Please refer to our best web hosting for developers guide to find out which hosts provide a SSH access.
Back to listThe Internet is full of articles on why you shouldn’t use Git submodules. While submodules are useful for a few use cases, they do have several drawbacks.
Are there alternatives? The answer is: yes! There are (at least) two tools that can help track the history of software dependencies in your project while allowing you to keep using Git:
git subtree
- Google repo
In this post we will look at git subtree
and show why it is an improvement – albeit not perfect – over git submodule.
What is git subtree
, and why should I use it?
git subtree
lets you nest one repository inside another as a sub-directory. It is one of several ways Git projects can manage project dependencies.
Why you may want to consider git subtree
- Management of a simple workflow is easy.
- Older version of Git are supported (even older than v1.5.2).
- The sub-project’s code is available right after the clone of the super project is done.
git subtree
does not require users of your repository to learn anything new. They can ignore the fact that you are usinggit subtree
to manage dependencies.git subtree
does not add new metadata files like git submodule does (i.e., .gitmodule).- Contents of the module can be modified without having a separate repository copy of the dependency somewhere else.
Drawbacks (but in our opinion they're largely acceptable):
- You must learn about a new merge strategy (i.e.
git subtree
). - Contributing code back upstream for the sub-projects is slightly more complicated.
- The responsibility of not mixing super and sub-project code in commits lies with you.
How to use git subtree
git subtree
is available in stock version of Git since May 2012 – v1.7.11 and above. The version installed by homebrew on OSX already has subtree properly wired, but on some platforms you might need to follow the installation instructions.
Here is a canonical example of tracking a vim plug-in using git subtree.
The quick and dirty way without remote tracking
If you just want a couple of one-liners to cut and paste, read this paragraph. First add git subtree
at a specified prefix folder:
Vim
(The common practice is to not store the entire history of the subproject in your main repository, but If you want to preserve it just omit the –squash flag.)
The above command produces this output:
As you can see this records a merge commit by squashing the whole history of the vim-surround repository into a single one:
If after a while you want to update the code of the plugin from the upstream repository you can just do a git subtree
pull:
This is very quick and painless, but the commands are slightly lengthy and hard to remember. We can make the commands shorter by adding the sub-project as a remote.
Adding the sub-project as a remote
Adding the subtree as a remote allows us to refer to it in shorter form:
Now we can add the subtree (as before), but now we can refer to the remote in short form:
The command to update the sub-project at a later date becomes:
Contributing back upstream
We can freely commit our fixes to the sub-project in our local working directory now. When it’s time to contribute back to the upstream project, we need to fork the project and add it as another remote:
Now we can use the subtree push command like the following:
After this we’re ready and we can open a pull-request to the maintainer of the package.
Can I do this without using the git subtree
command?
Yes! Yes you can. git subtree
is different from the subtree merge strategy. You can still use the merge strategy even if for some reason git subtree
is not available. Here is how you would go about it.
Add the dependency as a simple git remote
:
Before reading the contents of the dependency into the repository, it’s important to record a merge so that we can track the entire tree history of the plug-in up to this point:
Which outputs:
We then read the content of the latest tree-object into the plugin repository into our working directory ready to be committed:
Now we can commit (and it will be a merge commit that will preserve the history of the tree we read):
When we want to update the project we can now pull using the git subtree
merge strategy:
Git subtree
is a great alternative
After having used git submodules for a while, you'll see git subtree
solves lots of the problems with git submodule. As usual, with all things Git, there is a learning curve to make the most of the feature.
Follow me on Twitter @durdn for more things and stuff about Git. And check out Atlassian Bitbucket if you’re looking for a good tool to manage your Git repos.
Update: After publishing this piece, I also wrote an article on the power of Git subtree
.