|
|
|
@ -0,0 +1,788 @@ |
|
|
|
|
# lightline.vim |
|
|
|
|
A light and configurable statusline/tabline for Vim |
|
|
|
|
|
|
|
|
|
https://github.com/itchyny/lightline.vim |
|
|
|
|
|
|
|
|
|
### powerline theme (default) |
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
### wombat (with the patched font) |
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
### jellybeans (with the patched font) |
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
### solarized theme (dark) |
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
### solarized theme (light) |
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
### PaperColor theme (light) |
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
### seoul256 theme |
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
### landscape theme (with the patched font) |
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
With branch name, read-only mark and modified mark. |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
landscape is my colorscheme, which is a high-contrast cui-supported colorscheme, available at https://github.com/itchyny/landscape.vim |
|
|
|
|
|
|
|
|
|
## Why yet another clone of powerline? |
|
|
|
|
+ [vim-powerline](https://github.com/Lokaltog/vim-powerline) is a nice plugin, but deprecated. |
|
|
|
|
+ [powerline](https://github.com/Lokaltog/powerline) is a nice plugin, but difficult to configure. |
|
|
|
|
+ [vim-airline](https://github.com/bling/vim-airline) is a nice plugin, but it uses too much functions of other plugins, which should be done by users in `.vimrc`. |
|
|
|
|
|
|
|
|
|
## Spirit of this plugin |
|
|
|
|
+ Minimalism. The core script is very small. |
|
|
|
|
+ Configurability. You can create your own component and easily add to the statusline/tabline. |
|
|
|
|
+ Orthogonality. Any plugin should not change the settings of another plugin. Such plugin-crossing settings should be written by users in `.vimrc`. |
|
|
|
|
|
|
|
|
|
## Author |
|
|
|
|
itchyny (https://github.com/itchyny) |
|
|
|
|
|
|
|
|
|
## License |
|
|
|
|
This software is released under the MIT License, see LICENSE. |
|
|
|
|
|
|
|
|
|
## Installation |
|
|
|
|
### Manually |
|
|
|
|
1. Put all files under $VIM. |
|
|
|
|
|
|
|
|
|
### Pathogen |
|
|
|
|
1. Install with the following command. |
|
|
|
|
|
|
|
|
|
git clone https://github.com/itchyny/lightline.vim ~/.vim/bundle/lightline.vim |
|
|
|
|
|
|
|
|
|
### Vundle (https://github.com/gmarik/Vundle.vim) |
|
|
|
|
1. Add the following configuration to your `.vimrc`. |
|
|
|
|
|
|
|
|
|
Plugin 'itchyny/lightline.vim' |
|
|
|
|
|
|
|
|
|
2. Install with `:PluginInstall`. |
|
|
|
|
|
|
|
|
|
### NeoBundle (https://github.com/Shougo/neobundle.vim) |
|
|
|
|
1. Add the following configuration to your `.vimrc`. |
|
|
|
|
|
|
|
|
|
NeoBundle 'itchyny/lightline.vim' |
|
|
|
|
|
|
|
|
|
2. Install with `:NeoBundleInstall`. |
|
|
|
|
|
|
|
|
|
### vim-plug (https://github.com/junegunn/vim-plug) |
|
|
|
|
1. Add the following configuration to your `.vimrc`. |
|
|
|
|
|
|
|
|
|
Plug 'itchyny/lightline.vim' |
|
|
|
|
|
|
|
|
|
2. Install with `:PlugInstall`. |
|
|
|
|
|
|
|
|
|
## Configuration tutorial |
|
|
|
|
By default, the statusline looks like: |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
If you use the wombat colorscheme, add the following settings to your `.vimrc` (or \_vimrc on Windows): |
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'colorscheme': 'wombat', |
|
|
|
|
\ } |
|
|
|
|
``` |
|
|
|
|
to get: |
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If your statusline looks like |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
and the cool statuslines appear only on `:vsp`, add |
|
|
|
|
```vim |
|
|
|
|
set laststatus=2 |
|
|
|
|
``` |
|
|
|
|
to your `.vimrc`. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If you have problem like |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
then add |
|
|
|
|
```sh |
|
|
|
|
export TERM=xterm-256color |
|
|
|
|
``` |
|
|
|
|
to your `.*shrc` and add |
|
|
|
|
```vim |
|
|
|
|
if !has('gui_running') |
|
|
|
|
set t_Co=256 |
|
|
|
|
endif |
|
|
|
|
``` |
|
|
|
|
to your `.vimrc`. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If the colors of the statusline do not change from the default colors, move the settings of `g:lightline` before setting the colorscheme. |
|
|
|
|
|
|
|
|
|
If you are reloading your `.vimrc` via `autocmd` and get this problem |
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
when saving it you need to add the nested flag to your `autocmd` like so |
|
|
|
|
|
|
|
|
|
```vim |
|
|
|
|
augroup reload_vimrc |
|
|
|
|
autocmd! |
|
|
|
|
autocmd bufwritepost $MYVIMRC nested source $MYVIMRC |
|
|
|
|
augroup END |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Colors appear correctly? Now let's see how to change the appearance. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
You may think that the default read-only mark is not so cool: |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
Then edit the read-only component. |
|
|
|
|
The lightline components are stored in `g:lightline.component`. |
|
|
|
|
So you add the settings of `g:lightline.component.readonly` in your `.vimrc`. (the following settings are effective with the patched font for vim-powerline): |
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'colorscheme': 'wombat', |
|
|
|
|
\ 'component': { |
|
|
|
|
\ 'readonly': '%{&readonly?"โญค":""}', |
|
|
|
|
\ } |
|
|
|
|
\ } |
|
|
|
|
``` |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
How nice! |
|
|
|
|
|
|
|
|
|
But the boundaries are quadrilateral. You may miss the powerline. |
|
|
|
|
You have installed a cool font for powerlines, so you can use it. |
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'colorscheme': 'wombat', |
|
|
|
|
\ 'component': { |
|
|
|
|
\ 'readonly': '%{&readonly?"โญค":""}', |
|
|
|
|
\ }, |
|
|
|
|
\ 'separator': { 'left': 'โฎ', 'right': 'โฎ' }, |
|
|
|
|
\ 'subseparator': { 'left': 'โฎ', 'right': 'โฎ' } |
|
|
|
|
\ } |
|
|
|
|
``` |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
Hurrah! Cool! |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If your statusline looks like: |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
the patched font is not installed. |
|
|
|
|
|
|
|
|
|
There are two kinds of patched fonts: |
|
|
|
|
|
|
|
|
|
+ The patched fonts for [vim-powerline](https://github.com/Lokaltog/vim-powerline): see https://github.com/Lokaltog/vim-powerline/tree/develop/fontpatcher |
|
|
|
|
+ The patched fonts for [powerline](https://github.com/Lokaltog/powerline): see https://github.com/Lokaltog/powerline-fonts |
|
|
|
|
|
|
|
|
|
Create or download a font and install it. |
|
|
|
|
And add the `guifont` setting to your `.vimrc` (see `:help 'guifont'` for more detail). |
|
|
|
|
If you are using the vim in a terminal, the font cannot be controlled in `.vimrc`. |
|
|
|
|
Open the setting of the terminal and select the patched font. |
|
|
|
|
|
|
|
|
|
This tutorial is based on the former, the font for vim-powerline (Inconsolata for Powerline). |
|
|
|
|
If you have installed the patched font for powerline, use the following settings instead. |
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'colorscheme': 'wombat', |
|
|
|
|
\ 'component': { |
|
|
|
|
\ 'readonly': '%{&readonly?"๎ข":""}', |
|
|
|
|
\ }, |
|
|
|
|
\ 'separator': { 'left': '๎ฐ', 'right': '๎ฒ' }, |
|
|
|
|
\ 'subseparator': { 'left': '๎ฑ', 'right': '๎ณ' } |
|
|
|
|
\ } |
|
|
|
|
``` |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
If you have installed the font for powerline and your statusline looks like |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
remove |
|
|
|
|
```vim |
|
|
|
|
set ambiwidth=double |
|
|
|
|
``` |
|
|
|
|
from your `.vimrc`. If you want to keep this setting, use the patched font for vim-powerline. |
|
|
|
|
+ https://github.com/Lokaltog/vim-powerline/tree/develop/fontpatcher |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If you will not install a patched font, use ascii characters like: |
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'colorscheme': 'wombat', |
|
|
|
|
\ 'component': { |
|
|
|
|
\ 'readonly': '%{&readonly?"x":""}', |
|
|
|
|
\ }, |
|
|
|
|
\ 'separator': { 'left': '', 'right': '' }, |
|
|
|
|
\ 'subseparator': { 'left': '|', 'right': '|' } |
|
|
|
|
\ } |
|
|
|
|
``` |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If the triangles do not appear (but you get some spaces or weird characters like <bf> or ยฟ), firstly try adding |
|
|
|
|
```vim |
|
|
|
|
set encoding=utf-8 |
|
|
|
|
scriptencoding utf-8 |
|
|
|
|
``` |
|
|
|
|
to the head of your `.vimrc`. |
|
|
|
|
Still you have weird characters, use the unicode numbers. For powerline font |
|
|
|
|
users: |
|
|
|
|
```vim |
|
|
|
|
\ 'separator': { 'left': "\ue0b0", 'right': "\ue0b2" }, |
|
|
|
|
\ 'subseparator': { 'left': "\ue0b1", 'right': "\ue0b3" } |
|
|
|
|
``` |
|
|
|
|
For vim-powerline font users: |
|
|
|
|
```vim |
|
|
|
|
\ 'separator': { 'left': "\u2b80", 'right': "\u2b82" }, |
|
|
|
|
\ 'subseparator': { 'left': "\u2b81", 'right': "\u2b83" } |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Almost all of things go well with the patched font but if the triangle looks weird: |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
If you are using iTerm2, change the following settings of iTerm2: |
|
|
|
|
+ set `Profiles>Colors>Minimum contrast` to the Lowest. |
|
|
|
|
+ set `Profiles>Window>Transparency` to the Opaquest. |
|
|
|
|
|
|
|
|
|
For other terminals, this weird-triangle problem will be resolved by disabling transparency or contrast adjustment. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If you want to get rid of the extraneous default vim mode information that is now provided by lightline: |
|
|
|
|
 |
|
|
|
|
```vim |
|
|
|
|
set noshowmode |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Now, let us get back to the tutorial (with the patched font for vim-powerline). |
|
|
|
|
You look into a help file to find the marks annoying. |
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
Help files are read-only and no-modifiable? We know that! |
|
|
|
|
OK, so you again edit the components. |
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'colorscheme': 'wombat', |
|
|
|
|
\ 'component': { |
|
|
|
|
\ 'readonly': '%{&filetype=="help"?"":&readonly?"โญค":""}', |
|
|
|
|
\ 'modified': '%{&filetype=="help"?"":&modified?"+":&modifiable?"":"-"}' |
|
|
|
|
\ }, |
|
|
|
|
\ 'separator': { 'left': 'โฎ', 'right': 'โฎ' }, |
|
|
|
|
\ 'subseparator': { 'left': 'โฎ', 'right': 'โฎ' } |
|
|
|
|
\ } |
|
|
|
|
``` |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
Huh? Weird! |
|
|
|
|
The components do not collapse even if they have no information! |
|
|
|
|
In order to avoid this situation, you set expressions to `g:lightline.component_visible_condition`, which should become 1 only when the corresponding components have information. |
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'colorscheme': 'wombat', |
|
|
|
|
\ 'component': { |
|
|
|
|
\ 'readonly': '%{&filetype=="help"?"":&readonly?"โญค":""}', |
|
|
|
|
\ 'modified': '%{&filetype=="help"?"":&modified?"+":&modifiable?"":"-"}' |
|
|
|
|
\ }, |
|
|
|
|
\ 'component_visible_condition': { |
|
|
|
|
\ 'readonly': '(&filetype!="help"&& &readonly)', |
|
|
|
|
\ 'modified': '(&filetype!="help"&&(&modified||!&modifiable))' |
|
|
|
|
\ }, |
|
|
|
|
\ 'separator': { 'left': 'โฎ', 'right': 'โฎ' }, |
|
|
|
|
\ 'subseparator': { 'left': 'โฎ', 'right': 'โฎ' } |
|
|
|
|
\ } |
|
|
|
|
``` |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
Okay. It works nice. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
How does lightline decide the components to show in the statusline? |
|
|
|
|
It's very simple. |
|
|
|
|
The variables to select components are `g:lightline.active.left` and `g:lightline.active.right`. |
|
|
|
|
For example, you add the `g:lightline.active.left` in `.vimrc`. |
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'colorscheme': 'wombat', |
|
|
|
|
\ 'active': { |
|
|
|
|
\ 'left': [ [ 'mode', 'paste' ], |
|
|
|
|
\ [ 'readonly', 'filename', 'modified' ] ] |
|
|
|
|
\ }, |
|
|
|
|
\ 'component': { |
|
|
|
|
\ 'readonly': '%{&filetype=="help"?"":&readonly?"โญค":""}', |
|
|
|
|
\ 'modified': '%{&filetype=="help"?"":&modified?"+":&modifiable?"":"-"}' |
|
|
|
|
\ }, |
|
|
|
|
\ 'component_visible_condition': { |
|
|
|
|
\ 'readonly': '(&filetype!="help"&& &readonly)', |
|
|
|
|
\ 'modified': '(&filetype!="help"&&(&modified||!&modifiable))' |
|
|
|
|
\ }, |
|
|
|
|
\ 'separator': { 'left': 'โฎ', 'right': 'โฎ' }, |
|
|
|
|
\ 'subseparator': { 'left': 'โฎ', 'right': 'โฎ' } |
|
|
|
|
\ } |
|
|
|
|
``` |
|
|
|
|
If the plugin arranges all the components (in a situation you `set paste` and the file `.vimrc` is read-only, try to modify): |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
The mode component, the paste component, read-only component, filename component and modified component in a row. |
|
|
|
|
Normally, the paste component does not show up. |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
If the file is not read-only (more common cases), the read-only component does not show up. |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Again look into `g:lightline.active.left`. |
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'active': { |
|
|
|
|
\ 'left': [ [ 'mode', 'paste' ], |
|
|
|
|
\ [ 'readonly', 'filename', 'modified' ] ] ... |
|
|
|
|
``` |
|
|
|
|
And the screen shot of all the components. |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
The mode and paste component are displayed in the same group. |
|
|
|
|
The read-only, filename and modified component are in the second group. |
|
|
|
|
It corresponds to the structure of `g:lightline.active.left`. |
|
|
|
|
You can configure the components in the statusline by the following four variables: |
|
|
|
|
+ `g:lightline.active.left` |
|
|
|
|
+ `g:lightline.active.right` |
|
|
|
|
+ `g:lightline.inactive.left` |
|
|
|
|
+ `g:lightline.inactive.right` |
|
|
|
|
|
|
|
|
|
Of course, your settings in `.vimrc` have priority over the default settings in lightline. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GitHub branch is important for us. |
|
|
|
|
And it is a default component in [powerline](https://github.com/Lokaltog/powerline) and [vim-powerline](https://github.com/Lokaltog/vim-powerline). |
|
|
|
|
However, lightline does not provide the branch feature by default. |
|
|
|
|
|
|
|
|
|
In order to show the branch in the statusline, you firstly install the [vim-fugitive](https://github.com/tpope/vim-fugitive) plugin. |
|
|
|
|
Then edit the `g:lightline` in your `.vimrc`. |
|
|
|
|
+ Add your fugitive component to `g:lightline.component`. |
|
|
|
|
+ Add the condition when the fugitive component has information to `g:lightline.component_visible_condition`. |
|
|
|
|
+ Add the component by inserting `'fugitive'` to `g:lightline.active.left`. |
|
|
|
|
|
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'colorscheme': 'wombat', |
|
|
|
|
\ 'active': { |
|
|
|
|
\ 'left': [ [ 'mode', 'paste' ], |
|
|
|
|
\ [ 'fugitive', 'readonly', 'filename', 'modified' ] ] |
|
|
|
|
\ }, |
|
|
|
|
\ 'component': { |
|
|
|
|
\ 'readonly': '%{&filetype=="help"?"":&readonly?"โญค":""}', |
|
|
|
|
\ 'modified': '%{&filetype=="help"?"":&modified?"+":&modifiable?"":"-"}', |
|
|
|
|
\ 'fugitive': '%{exists("*fugitive#head")?fugitive#head():""}' |
|
|
|
|
\ }, |
|
|
|
|
\ 'component_visible_condition': { |
|
|
|
|
\ 'readonly': '(&filetype!="help"&& &readonly)', |
|
|
|
|
\ 'modified': '(&filetype!="help"&&(&modified||!&modifiable))', |
|
|
|
|
\ 'fugitive': '(exists("*fugitive#head") && ""!=fugitive#head())' |
|
|
|
|
\ }, |
|
|
|
|
\ 'separator': { 'left': 'โฎ', 'right': 'โฎ' }, |
|
|
|
|
\ 'subseparator': { 'left': 'โฎ', 'right': 'โฎ' } |
|
|
|
|
\ } |
|
|
|
|
``` |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
Okay, the branch component is added! |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Now, you might get tired of setting both `'component'` and `'component_visible_condition'`. |
|
|
|
|
Or if you want to do something more complicated? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
In fact, the components can be created using functions. |
|
|
|
|
Add your function names for components to `g:lightline.component_function`. |
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'colorscheme': 'wombat', |
|
|
|
|
\ 'active': { |
|
|
|
|
\ 'left': [ [ 'mode', 'paste' ], |
|
|
|
|
\ [ 'fugitive', 'readonly', 'filename', 'modified' ] ] |
|
|
|
|
\ }, |
|
|
|
|
\ 'component_function': { |
|
|
|
|
\ 'fugitive': 'LightLineFugitive', |
|
|
|
|
\ 'readonly': 'LightLineReadonly', |
|
|
|
|
\ 'modified': 'LightLineModified' |
|
|
|
|
\ }, |
|
|
|
|
\ 'separator': { 'left': 'โฎ', 'right': 'โฎ' }, |
|
|
|
|
\ 'subseparator': { 'left': 'โฎ', 'right': 'โฎ' } |
|
|
|
|
\ } |
|
|
|
|
|
|
|
|
|
function! LightLineModified() |
|
|
|
|
if &filetype == "help" |
|
|
|
|
return "" |
|
|
|
|
elseif &modified |
|
|
|
|
return "+" |
|
|
|
|
elseif &modifiable |
|
|
|
|
return "" |
|
|
|
|
else |
|
|
|
|
return "" |
|
|
|
|
endif |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineReadonly() |
|
|
|
|
if &filetype == "help" |
|
|
|
|
return "" |
|
|
|
|
elseif &readonly |
|
|
|
|
return "โญค" |
|
|
|
|
else |
|
|
|
|
return "" |
|
|
|
|
endif |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineFugitive() |
|
|
|
|
return exists('*fugitive#head') ? fugitive#head() : '' |
|
|
|
|
endfunction |
|
|
|
|
``` |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
Fine and readable! |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Finally, you come up with concatenating the three components: the read-only mark, the filename and the modified mark. |
|
|
|
|
Now you may know what to do. |
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'colorscheme': 'wombat', |
|
|
|
|
\ 'active': { |
|
|
|
|
\ 'left': [ [ 'mode', 'paste' ], |
|
|
|
|
\ [ 'fugitive', 'filename' ] ] |
|
|
|
|
\ }, |
|
|
|
|
\ 'component_function': { |
|
|
|
|
\ 'fugitive': 'LightLineFugitive', |
|
|
|
|
\ 'readonly': 'LightLineReadonly', |
|
|
|
|
\ 'modified': 'LightLineModified', |
|
|
|
|
\ 'filename': 'LightLineFilename' |
|
|
|
|
\ }, |
|
|
|
|
\ 'separator': { 'left': 'โฎ', 'right': 'โฎ' }, |
|
|
|
|
\ 'subseparator': { 'left': 'โฎ', 'right': 'โฎ' } |
|
|
|
|
\ } |
|
|
|
|
|
|
|
|
|
function! LightLineModified() |
|
|
|
|
if &filetype == "help" |
|
|
|
|
return "" |
|
|
|
|
elseif &modified |
|
|
|
|
return "+" |
|
|
|
|
elseif &modifiable |
|
|
|
|
return "" |
|
|
|
|
else |
|
|
|
|
return "" |
|
|
|
|
endif |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineReadonly() |
|
|
|
|
if &filetype == "help" |
|
|
|
|
return "" |
|
|
|
|
elseif &readonly |
|
|
|
|
return "โญค" |
|
|
|
|
else |
|
|
|
|
return "" |
|
|
|
|
endif |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineFugitive() |
|
|
|
|
return exists('*fugitive#head') ? fugitive#head() : '' |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineFilename() |
|
|
|
|
return ('' != LightLineReadonly() ? LightLineReadonly() . ' ' : '') . |
|
|
|
|
\ ('' != expand('%:t') ? expand('%:t') : '[No Name]') . |
|
|
|
|
\ ('' != LightLineModified() ? ' ' . LightLineModified() : '') |
|
|
|
|
endfunction |
|
|
|
|
``` |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
Oops! We forgot the cool mark for the branch component! (work with the patched font for vim-powerline) |
|
|
|
|
```vim |
|
|
|
|
function! LightLineFugitive() |
|
|
|
|
if exists("*fugitive#head") |
|
|
|
|
let _ = fugitive#head() |
|
|
|
|
return _ !=# '' ? 'โญ '._ : '' |
|
|
|
|
endif |
|
|
|
|
return '' |
|
|
|
|
endfunction |
|
|
|
|
``` |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
How cool!!! |
|
|
|
|
|
|
|
|
|
Of course, you can name your component as you wish. |
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'active': { |
|
|
|
|
\ 'left': [ [ 'mode', 'paste' ], |
|
|
|
|
\ [ 'my_component' ] ] }, |
|
|
|
|
\ 'component_function': { |
|
|
|
|
\ 'my_component': 'LightLineComponent', ... |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
This is the end of the tutorial. For more information, see `:help lightline`. Good luck with your nice statuslines. |
|
|
|
|
|
|
|
|
|
### Cool characters for the patched fonts |
|
|
|
|
|
|
|
|
|
Symbol | Default | powerline | vim-powerline |
|
|
|
|
------------------ | ------- | ------------- | ------------- |
|
|
|
|
separator.left | '' | '๎ฐ' (\ue0b0) | 'โฎ' (\u2b80) |
|
|
|
|
separator.right | '' | '๎ฒ' (\ue0b2) | 'โฎ' (\u2b82) |
|
|
|
|
subseparator.left | '\|' | '๎ฑ' (\ue0b1) | 'โฎ' (\u2b81) |
|
|
|
|
subseparator.right | '\|' | '๎ณ' (\ue0b3) | 'โฎ' (\u2b83) |
|
|
|
|
branch symbol | -- | '๎ ' (\ue0a0) | 'โญ ' (\u2b60) |
|
|
|
|
readonly symbol | -- | '๎ข' (\ue0a2) | 'โญค' (\u2b64) |
|
|
|
|
linecolumn symbol | -- | '๎ก' (\ue0a1) | 'โญก' (\u2b81) |
|
|
|
|
|
|
|
|
|
### My settings |
|
|
|
|
I show my settings. I use the patched font for vim-powerline. |
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'colorscheme': 'landscape', |
|
|
|
|
\ 'mode_map': { 'c': 'NORMAL' }, |
|
|
|
|
\ 'active': { |
|
|
|
|
\ 'left': [ [ 'mode', 'paste' ], [ 'fugitive', 'filename' ] ] |
|
|
|
|
\ }, |
|
|
|
|
\ 'component_function': { |
|
|
|
|
\ 'modified': 'LightLineModified', |
|
|
|
|
\ 'readonly': 'LightLineReadonly', |
|
|
|
|
\ 'fugitive': 'LightLineFugitive', |
|
|
|
|
\ 'filename': 'LightLineFilename', |
|
|
|
|
\ 'fileformat': 'LightLineFileformat', |
|
|
|
|
\ 'filetype': 'LightLineFiletype', |
|
|
|
|
\ 'fileencoding': 'LightLineFileencoding', |
|
|
|
|
\ 'mode': 'LightLineMode', |
|
|
|
|
\ }, |
|
|
|
|
\ 'separator': { 'left': 'โฎ', 'right': 'โฎ' }, |
|
|
|
|
\ 'subseparator': { 'left': 'โฎ', 'right': 'โฎ' } |
|
|
|
|
\ } |
|
|
|
|
|
|
|
|
|
function! LightLineModified() |
|
|
|
|
return &ft =~ 'help\|vimfiler\|gundo' ? '' : &modified ? '+' : &modifiable ? '' : '-' |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineReadonly() |
|
|
|
|
return &ft !~? 'help\|vimfiler\|gundo' && &readonly ? 'โญค' : '' |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineFilename() |
|
|
|
|
return ('' != LightLineReadonly() ? LightLineReadonly() . ' ' : '') . |
|
|
|
|
\ (&ft == 'vimfiler' ? vimfiler#get_status_string() : |
|
|
|
|
\ &ft == 'unite' ? unite#get_status_string() : |
|
|
|
|
\ &ft == 'vimshell' ? vimshell#get_status_string() : |
|
|
|
|
\ '' != expand('%:t') ? expand('%:t') : '[No Name]') . |
|
|
|
|
\ ('' != LightLineModified() ? ' ' . LightLineModified() : '') |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineFugitive() |
|
|
|
|
if &ft !~? 'vimfiler\|gundo' && exists("*fugitive#head") |
|
|
|
|
let _ = fugitive#head() |
|
|
|
|
return _ !=# '' ? 'โญ '._ : '' |
|
|
|
|
endif |
|
|
|
|
return '' |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineFileformat() |
|
|
|
|
return winwidth(0) > 70 ? &fileformat : '' |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineFiletype() |
|
|
|
|
return winwidth(0) > 70 ? (&filetype !=# '' ? &filetype : 'no ft') : '' |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineFileencoding() |
|
|
|
|
return winwidth(0) > 70 ? (&fenc !=# '' ? &fenc : &enc) : '' |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineMode() |
|
|
|
|
return winwidth(0) > 60 ? lightline#mode() : '' |
|
|
|
|
endfunction |
|
|
|
|
``` |
|
|
|
|
When the current window width is narrow, the mode component and the file information component collapse. |
|
|
|
|
For example, the [gundo](https://github.com/sjl/gundo.vim) buffer is narrow. |
|
|
|
|
|
|
|
|
|
Before: |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
After: |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
Nice looking, isn't it? |
|
|
|
|
|
|
|
|
|
### For power users |
|
|
|
|
For users who uses following plugins. |
|
|
|
|
|
|
|
|
|
- [CtrlP](https://github.com/kien/ctrlp.vim) |
|
|
|
|
- [Tagbar](https://github.com/majutsushi/tagbar) |
|
|
|
|
- [Gundo](http://github.com/sjl/gundo.vim) |
|
|
|
|
- [NERDtree](http://github.com/scrooloose/nerdtree) |
|
|
|
|
- [Syntastic](https://github.com/scrooloose/syntastic) |
|
|
|
|
- [unite.vim](https://github.com/Shougo/unite.vim) |
|
|
|
|
- [vimfiler.vim](https://github.com/Shougo/vimfiler.vim) |
|
|
|
|
- [vimshell.vim](https://github.com/Shougo/vimshell.vim) |
|
|
|
|
|
|
|
|
|
```vim |
|
|
|
|
let g:lightline = { |
|
|
|
|
\ 'colorscheme': 'wombat', |
|
|
|
|
\ 'active': { |
|
|
|
|
\ 'left': [ [ 'mode', 'paste' ], [ 'fugitive', 'filename' ], ['ctrlpmark'] ], |
|
|
|
|
\ 'right': [ [ 'syntastic', 'lineinfo' ], ['percent'], [ 'fileformat', 'fileencoding', 'filetype' ] ] |
|
|
|
|
\ }, |
|
|
|
|
\ 'component_function': { |
|
|
|
|
\ 'fugitive': 'LightLineFugitive', |
|
|
|
|
\ 'filename': 'LightLineFilename', |
|
|
|
|
\ 'fileformat': 'LightLineFileformat', |
|
|
|
|
\ 'filetype': 'LightLineFiletype', |
|
|
|
|
\ 'fileencoding': 'LightLineFileencoding', |
|
|
|
|
\ 'mode': 'LightLineMode', |
|
|
|
|
\ 'ctrlpmark': 'CtrlPMark', |
|
|
|
|
\ }, |
|
|
|
|
\ 'component_expand': { |
|
|
|
|
\ 'syntastic': 'SyntasticStatuslineFlag', |
|
|
|
|
\ }, |
|
|
|
|
\ 'component_type': { |
|
|
|
|
\ 'syntastic': 'error', |
|
|
|
|
\ }, |
|
|
|
|
\ 'subseparator': { 'left': '|', 'right': '|' } |
|
|
|
|
\ } |
|
|
|
|
|
|
|
|
|
function! LightLineModified() |
|
|
|
|
return &ft =~ 'help' ? '' : &modified ? '+' : &modifiable ? '' : '-' |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineReadonly() |
|
|
|
|
return &ft !~? 'help' && &readonly ? 'RO' : '' |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineFilename() |
|
|
|
|
let fname = expand('%:t') |
|
|
|
|
return fname == 'ControlP' && has_key(g:lightline, 'ctrlp_item') ? g:lightline.ctrlp_item : |
|
|
|
|
\ fname == '__Tagbar__' ? g:lightline.fname : |
|
|
|
|
\ fname =~ '__Gundo\|NERD_tree' ? '' : |
|
|
|
|
\ &ft == 'vimfiler' ? vimfiler#get_status_string() : |
|
|
|
|
\ &ft == 'unite' ? unite#get_status_string() : |
|
|
|
|
\ &ft == 'vimshell' ? vimshell#get_status_string() : |
|
|
|
|
\ ('' != LightLineReadonly() ? LightLineReadonly() . ' ' : '') . |
|
|
|
|
\ ('' != fname ? fname : '[No Name]') . |
|
|
|
|
\ ('' != LightLineModified() ? ' ' . LightLineModified() : '') |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineFugitive() |
|
|
|
|
try |
|
|
|
|
if expand('%:t') !~? 'Tagbar\|Gundo\|NERD' && &ft !~? 'vimfiler' && exists('*fugitive#head') |
|
|
|
|
let mark = '' " edit here for cool mark |
|
|
|
|
let _ = fugitive#head() |
|
|
|
|
return _ !=# '' ? mark._ : '' |
|
|
|
|
endif |
|
|
|
|
catch |
|
|
|
|
endtry |
|
|
|
|
return '' |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineFileformat() |
|
|
|
|
return winwidth(0) > 70 ? &fileformat : '' |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineFiletype() |
|
|
|
|
return winwidth(0) > 70 ? (&filetype !=# '' ? &filetype : 'no ft') : '' |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineFileencoding() |
|
|
|
|
return winwidth(0) > 70 ? (&fenc !=# '' ? &fenc : &enc) : '' |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! LightLineMode() |
|
|
|
|
let fname = expand('%:t') |
|
|
|
|
return fname == '__Tagbar__' ? 'Tagbar' : |
|
|
|
|
\ fname == 'ControlP' ? 'CtrlP' : |
|
|
|
|
\ fname == '__Gundo__' ? 'Gundo' : |
|
|
|
|
\ fname == '__Gundo_Preview__' ? 'Gundo Preview' : |
|
|
|
|
\ fname =~ 'NERD_tree' ? 'NERDTree' : |
|
|
|
|
\ &ft == 'unite' ? 'Unite' : |
|
|
|
|
\ &ft == 'vimfiler' ? 'VimFiler' : |
|
|
|
|
\ &ft == 'vimshell' ? 'VimShell' : |
|
|
|
|
\ winwidth(0) > 60 ? lightline#mode() : '' |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! CtrlPMark() |
|
|
|
|
if expand('%:t') =~ 'ControlP' && has_key(g:lightline, 'ctrlp_item') |
|
|
|
|
call lightline#link('iR'[g:lightline.ctrlp_regex]) |
|
|
|
|
return lightline#concatenate([g:lightline.ctrlp_prev, g:lightline.ctrlp_item |
|
|
|
|
\ , g:lightline.ctrlp_next], 0) |
|
|
|
|
else |
|
|
|
|
return '' |
|
|
|
|
endif |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
let g:ctrlp_status_func = { |
|
|
|
|
\ 'main': 'CtrlPStatusFunc_1', |
|
|
|
|
\ 'prog': 'CtrlPStatusFunc_2', |
|
|
|
|
\ } |
|
|
|
|
|
|
|
|
|
function! CtrlPStatusFunc_1(focus, byfname, regex, prev, item, next, marked) |
|
|
|
|
let g:lightline.ctrlp_regex = a:regex |
|
|
|
|
let g:lightline.ctrlp_prev = a:prev |
|
|
|
|
let g:lightline.ctrlp_item = a:item |
|
|
|
|
let g:lightline.ctrlp_next = a:next |
|
|
|
|
return lightline#statusline(0) |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
function! CtrlPStatusFunc_2(str) |
|
|
|
|
return lightline#statusline(0) |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
let g:tagbar_status_func = 'TagbarStatusFunc' |
|
|
|
|
|
|
|
|
|
function! TagbarStatusFunc(current, sort, fname, ...) abort |
|
|
|
|
let g:lightline.fname = a:fname |
|
|
|
|
return lightline#statusline(0) |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
augroup AutoSyntastic |
|
|
|
|
autocmd! |
|
|
|
|
autocmd BufWritePost *.c,*.cpp call s:syntastic() |
|
|
|
|
augroup END |
|
|
|
|
function! s:syntastic() |
|
|
|
|
SyntasticCheck |
|
|
|
|
call lightline#update() |
|
|
|
|
endfunction |
|
|
|
|
|
|
|
|
|
let g:unite_force_overwrite_statusline = 0 |
|
|
|
|
let g:vimfiler_force_overwrite_statusline = 0 |
|
|
|
|
let g:vimshell_force_overwrite_statusline = 0 |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
### Note for developers of other plugins |
|
|
|
|
Appearance consistency matters. |
|
|
|
|
|
|
|
|
|
The statusline is an important space for Vim users. |
|
|
|
|
Overwriting the statusline forcibly in your plugin is not a good idea. |
|
|
|
|
It is not hospitality, but just an annoying feature. |
|
|
|
|
If your plugin has such a feature, add an option to be modest. |
|
|
|
|
|
|
|
|
|
A good design is the following. |
|
|
|
|
Firstly, give the users a clue to judge which buffer is the one your plugin creates. |
|
|
|
|
The filename is a manner and the filetype is another. |
|
|
|
|
Then, export a function which is useful to be shown in the statusline. |
|
|
|
|
Lastly, for advanced users, set important information in buffer variables. |
|
|
|
|
So that the users can obtain the condition of the plugin easily. |