Code Monkey home page Code Monkey logo

vim-tabber's Introduction

vim-tabber

A Vim plugin for labeling and manipulating tabs, visually styled after Powerline.

screenshot

Features

  • User-definable tab labels.
  • Default labels based on tab numbers.
  • Tab number and window count in each tab.
  • Commands to shift tabs left/right, move tabs, and jump to the last active tab.
  • Powerline-inspired styling and glyphs.

Installation

Install via pathogen.vim:

cd ~/.vim/bundle
git clone https://github.com/fweep/vim-tabber.git

Add this to your .vimrc:

set tabline=%!tabber#TabLine()

MacVim/GUI Mode

If using GUI mode (e.g. MacVim), you also need:

set guioptions-=e

This will use a traditional terminal Vim tabline rather than real GUI widget tabs.

Setting Labels

Tab labels default to pathshorten() on the active buffer name. If the buffer has no name, "[No Name]" is displayed. You can override the default label for a tab and set your own. The tab will use your label until you clear it or close the tab.

To set a label for the current tab:

:TabberLabel My Tab Name

To remove the label from the current tab:

:TabberClear

You can also set/remove labels on other tabs by prefixing the command with the tab number:

:4TabberLabel New Name For Tab Four
:4TabberClear

New Tabs

To create a new tab with a label:

:TabberNew Refactoring Controller

You can supply an optional count prefix to TabberNew, to specify where the new tab should be opened. This behavior is the same as Vim's :tabnew. See :help tabnew.

:TabberNew New Tab After Current Tab
:0TabberNew New First Tab
:2TabberNew New Third Tab
:999TabberNew New Last Tab

Navigating Tabs

To move to the last active tab:

:TabberSelectLastActive

Moving Tabs

Shift current tab left/right:

:TabberShiftLeft
:TabberShiftRight

Move active tab to a new location:

:TabberMove <target tab number>

This is identical to :tabmove.

Move tab 2 to tab 4:

:2TabberMove 3

Note that the tab is placed after the target tab, to follow the :tabmove convention. You can still use :tabmove as well.

To swap tab 1 and tab 3:

:1TabberSwap 3
:3TabberSwap 1

If tab 1 is the current tab:

:3TabberSwap
:TabberSwap 3

With ,ts mapped to :TabberSwap<CR>:

3,ts

Predefining Labels

You can predefine label names that will be used when a matching tab number opens:

let g:tabber_predefined_labels = { 1: 'Models', 2: 'Views', 3: 'Controllers' }

If Vim opens with one tab, it will be labeled "Models". When you open a second tab, it will be named "Controllers". When you open a fourth tab, it will use the normal naming rules.

If the tabs are re-arranged (e.g. by inserting a tab before a labeled one), the label will stay with the tab it was originally assigned to.

If a default label is no longer in use—either because you renamed it, or because the tab was closed—the next tab to open in that slot will be assigned the default label.

Default Labels

You can set a default label for tabs created with :TabberNew:

set g:tabber_default_user_label = 'Scratch'

You can set a default label for new tabs that are created without a label:

set g:tabber_default_unknown_label = 'Temp'

This will apply to tabs created by :tabnew, by other plugins, etc. It will apply to labels created by :TabberNew if g:tabber_default_user_label is not set.

Predefined labels always take precedence over these options.

Other Options

Prompt for a label if :TabberNew or :TabberLabel is called with no arguments, and no defaults apply:

let g:tabber_prompt_for_new_label = 1

Wrap tabs when shifting:

let g:tabber_wrap_when_shifting = 1

Control what's shown in unlabeled tabs. If the current directory is ~jim and ~/.vim/bundle/vim-tabber/README.md is loaded in the active window for the tab:

let g:tabber_filename_style = 'pathshorten' " .v/b/v/README.md
let g:tabber_filename_style = 'full'        " /home/jim/.vim/bundle/vim-tabber/README.md
let g:tabber_filename_style = 'relative'    " .vim/bundle/vim-tabber/README.md
let g:tabber_filename_style = 'filename'    " README.md

Use different divider styles:

let g:tabber_divider_style = 'compatible'
let g:tabber_divider_style = 'unicode'
let g:tabber_divider_style = 'fancy'

Example Bindings

Bind Ctrl-t to open a new tab at the end of the tab list with the label "Scratch":

nnoremap <C-t> :999TabberNew Scratch<CR>

Bind Ctrl-e to switch to the last active tab:

nnoremap <C-e> :TabberSelectLastActive<CR>

Compatibility

Tested with Vim and MacVim versions 7.3 and 7.4 in terminal mode, and MacVim GUI mode with set guioptions-=e. GUI mode with UI widget tabs (the default) does not work, as it does not invoke the tabline mechanism.

Limitations

Tab labels are lost when saving/restoring sessions. If you have configured default labels, they will be applied.

How I Use It

These mappings mask the Vim default Ctrl-t for navigating the tag stack, and possibly conflict with other bindings you may have, but should show what can be done with the plugin. The maps allow me to move tabs around with a count prefix without leaving normal mode.

In ~/.vimrc:

if filereadable('.vimrc-project')
  source .vimrc-project
endif

set tabline=%!tabber#TabLine()

let g:tabber_wrap_when_shifting = 1

nnoremap <silent> <C-t>            :999TabberNew<CR>
nnoremap <silent> <Leader><Leader> :TabberSelectLastActive<CR>
nnoremap <silent> <Leader>tn       :TabberNew<CR>
nnoremap <silent> <Leader>tm       :TabberMove<CR>
nnoremap <silent> <Leader>tc       :tabclose<CR>
nnoremap <silent> <Leader>tl       :TabberShiftLeft<CR>
nnoremap <silent> <Leader>tr       :TabberShiftRight<CR>
nnoremap <silent> <Leader>ts       :TabberSwap<CR>
nnoremap <silent> <Leader>1        :tabnext 1<CR>
nnoremap <silent> <Leader>2        :tabnext 2<CR>
nnoremap <silent> <Leader>3        :tabnext 3<CR>
nnoremap <silent> <Leader>4        :tabnext 4<CR>
nnoremap <silent> <Leader>5        :tabnext 5<CR>
nnoremap <silent> <Leader>6        :tabnext 6<CR>
nnoremap <silent> <Leader>7        :tabnext 7<CR>
nnoremap <silent> <Leader>8        :tabnext 8<CR>
nnoremap <silent> <Leader>9        :tabnext 9<CR>

In .vimrc-project in a Rails app root directory:

let g:tabber_predefined_labels = { 1: 'Controllers', 2: 'Views', 3: 'Models' }

Wish List

Right now, Tabber totally replaces your tabline. I'd like to figure out a way to plug this in to the regular tabline, so users can more easily configure it. The built-in tabline is already pretty configurable.

It'd be great if Tabber were as configurable as Powerline. I'm thinking about making Powerline a requirement, and leveraging all of its functions, including themes, etc. Since Lokaltog is in the middle of a Powerline rewrite, I'll wait and see what comes of that. He might include tabline support.

This could be split up into two plugins: one for styling and one for the tab manipulation utilities.

Author

Jim Stewart

Acknowledgements

Thanks to Kim Silkebækken for writing the excellent Powerline plugin! Some of Tabber's code was copied from or modeled after Powerline, to match color schemes and symbols. Thanks also to Tim Pope and others for providing great code from which to learn Vimscript.

MIT License

Copyright (C) 2012 Jim Stewart

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

vim-tabber's People

Contributors

fweep avatar trevoke avatar szw avatar blindfs avatar

Watchers

NoScripter avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.