Skip to content

m00qek/nvim-contabs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

61 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Contextual tabs for vim/neovim


Neovim (and just recently vim!) has a neat feature: each tab can have a different working directory. This plugin adds some functions and fzf commands to change the working directory of tabs.

nvim-contabs in action

Installation

nvim-contabs depends on fzf and, optionally, on vim-airline. If you use vim-plug:

Plug 'm00qek/nvim-contabs'

Configuration

You can use contabs in two ways. The first is by calling functions to change the tab working directory - which is great if you don't want to use FZF. Add to your config

" Change the working directory of current tab
command! -nargs=1 -complete=dir EP call contabs#project#edit(<q-args>)

" Open a new tab setting the working directory
command! -nargs=1 -complete=dir TP call contabs#project#tabedit(<q-args>)

Now you can run :EP ~/dev/myproject or :TP ~/dev/myproject.

The other way contabs work is by listing you projects in a FZF buffer. To use that you need to inform where to find your projects by setting g:contabs#project#locations in your config

let g:contabs#project#locations = [
  \ { 'path': '~/dev/aproject' },
  \ { 'path': '~/dev/anotherproject' },
  \]

Each item in the array is a location. You can add more options to the map:

option effect default
depth the level of subdirectories 0
git_only list only git repos v:false
entrypoint file to show when opening project []
formatter function to format project name on FZF buffer { x -> x }

Some examples of locations:

" directories using git satisfying '~/projects/*/*'
echo { 'path': '~/projects', 'depth': 2, 'git_only': v:true }

" point to '~/.config/nvim' and change its display on FZF buffer
echo { 'path': '~/.config/nvim', 'formatter': { _ -> 'Neovim Config' } }

" directories satisfying '$GOPATH/src/github.com/libgit2/*'
echo { 'path': '$GOPATH/src/github.com/libgit2', 'depth': 1 }

" directories using git satisfying '~/haskell/*' and show 'λ | ' before their paths
echo { 'path': '~/haskell', 'depth': 1, 'git_only': v:true, 'formatter': { dirpath -> 'λ | ' . dirpath } }

" directories using git satisfying '~/clojure/*' and, on project selection, open one of the entrypoint files
echo { 'path': '~/clojure', 'depth': 1, 'git_only': v:true, 'entrypoint': ['project.clj', 'tasks/build.boot'] }

The following nmaps open the FZF buffer:

"invoke fzf with the list of projects configured in g:contabs#project#locations
"the enabled hotkeys are { 'ctrl-t': 'tabedit', 'ctrl-e, <cr>': 'edit' }
nnoremap <silent> <Leader>p :call contabs#project#select()<CR>

"invoke fzf with the list of buffers of current tab working directory
"the enabled hotkeys are defined in g:fzf_action, but if this var is not 
"defined the command will use { 'ctrl-t': 'tabedit', 'ctrl-e, <cr>': 'edit', 'ctrl-v': 'vsp', 'ctrl-x': 'sp' }
nnoremap <silent> <Leader>b :call contabs#buffer#select()<CR>

vim-airline

When using contabs and vim-airline, by defautl, your tab titles will be the basename of it's current working directory. If you want to disable this feature add to your config:

let g:contabs#integrations#airline = v:false

vanilla vim/neovim tabline

If you use gvim, add to your config:

set guitablabel=%{contabs#integrations#tabline#label(tabpagenr())}

or, if you are using vim/neovim on terminal:

set tabline=%!contabs#integrations#tabline#create()

If you want to create your own tabline function, you can use the function contabs#integrations#tabline#raw_label(tabpagenr()) to just eval the chosen formatter.

Tabline

The labels are provided by formatters, which are functions operating over the tab current directory and location config. You can choose one of the predefined formatters using:

" you can use 'basename', 'path', 'pathshorten', 'project/path',
" 'project/pathshorten' or 'location/formatter'
let g:contabs#integrations#tabline#theme = 'project/path'

If you want to write you own formatter use

let g:contabs#integrations#tabline#theme = 'mytheme'
call contabs#integrations#tabline#register('mytheme',
\  { location, cwd ->  location.path . " | " . cwd })

where location is the related entry in g:contabs#project#locations and cwd is the current tab working directory

Contributing

To test you changes to the code you should use

make prepare
make nvim
make vim

Releases

No releases published

Packages

No packages published