I recently faced quite a challenging problem. I had to write C++ code and compile it on a remote server. Why would I need to compile on a remote server? Well, first my laptop is not very powerful and compiling takes some time, in comparison to the server which proved to be much faster. Moreover, my code was supposed to compile on the server "out of the box", as it was meant to be executed and tested there. Hence, no dependencies, no customized environmnent, and so forth.
Anyway, I then started looking for a way to use Vim over SSH effectively, without having to switch between terminals to compile. What's more, I wanted it to be as fast as possible. After asking for help on StackOverflow, I got a very helpful answer. I finally came up with the following solution. Let's get started!
~/.ssh/config and add your remote host.
Host my_server Hostname <server> User <user> IdentityFile ~/.ssh/id_rsa ControlMaster auto ControlPath ~/.ssh/%C # ControlPath ~/.ssh/cm_socket/%r@%h:%p ControlPersist yes
Then, enable pubkey authentication using
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server. You should now be able to connect using
ssh my_server. This will establish a permanent connection. As an example, simply open another terminal and try to connect to that server, you'll notice how fast it is this time!
Later, you'll be able to disconnect from the server using
ssh -O exit my_server.
Tmux is obviously a must-have and is thus already installed.
Before starting editing files, you definitely want your Vim to be smart. Hence we'll use the plugin vim-dispatch, which allows use to run the command
:make asynchronously from Vim, in another Tmux pane (the new command introduced by this plugin is
Editing and compiling
Once you're connected over SSH, let's edit files on the server using Vim. Let's go!
Then, in Vim, type the following commands:
# The next two lines have the same effect, # except that the first one needs spaces to be escaped :set makeprg=ssh\ my_server\ 'make && ./main && exit' :let &makeprg="ssh my_server 'make && ./main && exit'" :map <f10> :Copen<cr>G :map <f9> :update<cr>:Make<cr> :map <f12> :cclose<cr>
The last three commands are just shortcuts meant to make the world a better place... or just developers happier.
That's it! I hope it was helpful.