Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to open another file in background Vim from Bash command-line?

I am transitioning from using Gvim to console Vim.

I open a file in Vim, and then suspend Vim, run a few commands on the command-line and then want to return to Vim.

  • Ctrl+Z (in normal mode) suspends Vim and drops back to the console
  • fg can be used to return focus to Vim
  • jobs lists background jobs and can be used to get the job number to bring a given job to the foreground (e.g., fg %2 to bring job 2 to the foreground).

However, when Vim is in the background and I issue vim file, the file opens in a new instance of Vim.

I'm used to using the --remote option with Gvim to open a file in an existing Gvim instance.

Question:

  • How can I open another file in a background Vim from the command-line?
  • Is this a reasonable workflow for moving between console and Vim?

Update:

I just read this answer by @jamessan which provides a few ideas. He shows the following code snippet:

vim --servername foo somefile.txt
:shell
<do stuff in your shell>
vim --servername foo --remote otherfile.txt
fg

However, I'd have to think about how to make it easier to use perhaps with some aliases.

  • Would this be a good approach?
  • How could it be made efficient to use?
like image 533
Jeromy Anglim Avatar asked May 14 '11 04:05

Jeromy Anglim


1 Answers

This is also what I need. I found this thread, though no satisfying approach, happy to see people having same requirement like me.

My approach is

add below to .bashrc

v() {
    vim_id=`jobs|sed -n "/vim/s/\[\([0-9]\)\]+.*/\1/p"`
    if [ -n "$vim_id" ]; then
        echo "tabedit $@" > ~/.vim_swap/e.vim && fg $vim_id
    else
        vim $@
    fi
}

add below to .vimrc

nnoremap <silent> <space>e :source $HOME/.vim_swap/e.vim<Bar>:call writefile([], $HOME."/.vim_swap/e.vim")<CR>

Then v foo.c to open first file, editing..., ctrl-z to suspend vim, do shell stuff, v bar.h to bring vim foreground.

And in VIM, press <Space>e to tabedit bar.h.

So the idea is to generate vim command from shell command, save them to a temp .vim file. In VIM, map key to source the .vim file and clear it.

like image 192
brook hong Avatar answered Sep 28 '22 18:09

brook hong