Last active
July 2, 2021 00:34
-
-
Save zQueal/816e2e459964ddefaf1a2a205931e8c5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"" This was made by Reddit user u/SamLovesNotion. Also with the help of - https://tdaly.co.uk/projects/vim-statusline-generator/ for learning the syntax. Sorry for English & grammar, this post was made in hurry. | |
" Images - https://www.reddit.com/r/vim/comments/ld8h2j/i_made_a_status_line_from_scratch_no_plugins_used/ | |
" I have used Nerd icon fonts. Icons won't work without them. https://github.com/ryanoasis/nerd-fonts/ | |
" This statusline looks exactly like Vim Airline (even more customizable & powerful) & loads faster than Vim airline. Only take few ms to load. | |
" STARTUP TIME - With Vim Airline - ~250ms. With this statusline - ~100ms. Without any statusline - ~98ms. | |
" Add all of this at the end of your vimrc OR Create separate file like 'statusline.vim' & 'colorsgroup.vim' & source those files in your main vimrc. | |
" e.g. source "~/.config/vim/statusline.vim" | |
" Color highlighting groups | |
" Add this AFTER `colorscheme` option in your vimrc. Otherwise your colorscheme will clear this highlightings. OR use ColorScheme autocommand. VERY IMPORTANT. | |
" Color pallet | |
" Green - #2BBB4F (BG) - #080808 (FG) | |
" Blue - #4799EB | |
" Violet - #986FEC | |
" Yellow - #D7A542 | |
" Orange - #EB754D | |
" Grey1 - #202020 | |
" Grey - #303030 | |
" Define color variables | |
let g:StslineColorGreen = "#2BBB4F" | |
let g:StslineColorBlue = "#4799EB" | |
let g:StslineColorViolet = "#986FEC" | |
let g:StslineColorYellow = "#D7A542" | |
let g:StslineColorOrange = "#EB754D" | |
let g:StslineColorLight = "#C0C0C0" | |
let g:StslineColorDark = "#080808" | |
let g:StslineColorDark1 = "#181818" | |
let g:StslineColorDark2 = "#202020" | |
let g:StslineColorDark3 = "#303030" | |
" Define colors | |
let g:StslineBackColor = g:StslineColorDark2 | |
let g:StslineOnBackColor = g:StslineColorLight | |
"let g:StslinePriColor = g:StslineColorGreen | |
let g:StslineOnPriColor = g:StslineColorDark | |
let g:StslineSecColor = g:StslineColorDark3 | |
let g:StslineOnSecColor = g:StslineColorLight | |
" Create highlight groups | |
execute 'highlight StslineSecColorFG guifg=' . g:StslineSecColor ' guibg=' . g:StslineBackColor | |
execute 'highlight StslineSecColorBG guifg=' . g:StslineColorLight ' guibg=' . g:StslineSecColor | |
execute 'highlight StslineBackColorBG guifg=' . g:StslineColorLight ' guibg=' . g:StslineBackColor | |
execute 'highlight StslineBackColorFGSecColorBG guifg=' . g:StslineBackColor ' guibg=' . g:StslineSecColor | |
execute 'highlight StslineSecColorFGBackColorBG guifg=' . g:StslineSecColor ' guibg=' . g:StslineBackColor | |
execute 'highlight StslineModColorFG guifg=' . g:StslineColorYellow ' guibg=' . g:StslineBackColor | |
" Statusline | |
" Enable statusline | |
set laststatus=2 | |
" Disable showmode - i.e. Don't show mode like --INSERT-- in current statusline. | |
set noshowmode | |
" Enable GUI colors for terminals (Some terminals may not support this, so you'll have to *manually* set color pallet for tui colors. Lie tuibg=255, tuifg=120, etc.). | |
set termguicolors | |
" Understand statusline elements | |
" %{StslineMode()} = Output of a function | |
" %#StslinePriColorBG# = Highlight group | |
" %F, %c, etc. are variables which contain value like - current file path, current colums, etc. | |
" %{&readonly?\"\ \":\"\"} = If file is readonly ? Then "Lock icon" Else : "Nothing" | |
" %{get(b:,'coc_git_status',b:GitBranch)} = If b:coc_git_status efists, then it's value, else value of b:GitBranch | |
" &filetype, things starting with & are also like variables with info. | |
" \ - Is for escaping a space. \" is for escaping a double quote. | |
" %{&fenc!='utf-8'?\"\ \":''} = If file encoding is NOT!= 'utf-8' ? THEN output a "Space" else : no character | |
" Define active statusline | |
function! ActivateStatusline() | |
call GetFileType() | |
setlocal statusline=%#StslinePriColorBG#\ %{StslineMode()}%#StslineSecColorBG#%{get(b:,'coc_git_status',b:GitBranch)}%{get(b:,'coc_git_blame','')}%#StslineBackColorFGPriColorBG#%#StslinePriColorFG#\ %{&readonly?\"\ \":\"\"}%F\ %#StslineModColorFG#%{&modified?\"\ \":\"\"}%=%#StslinePriColorFG#\ %{b:FiletypeIcon}%{&filetype}\ %#StslineSecColorFG#%#StslineSecColorBG#%{&fenc!='utf-8'?\"\ \":''}%{&fenc!='utf-8'?&fenc:''}%{&fenc!='utf-8'?\"\ \":''}%#StslinePriColorFGSecColorBG#%#StslinePriColorBG#\ %p\%%\ %#StslinePriColorBGBold#%l%#StslinePriColorBG#/%L\ :%c\ | |
endfunction | |
" Define Inactive statusline | |
function! DeactivateStatusline() | |
if !exists("b:GitBranch") || b:GitBranch == '' | |
setlocal statusline=%#StslineSecColorBG#\ INACTIVE\ %#StslineSecColorBG#%{get(b:,'coc_git_statusline',b:GitBranch)}%{get(b:,'coc_git_blame','')}%#StslineBackColorFGSecColorBG#%#StslineBackColorBG#\ %{&readonly?\"\ \":\"\"}%F\ %#StslineModColorFG#%{&modified?\"\ \":\"\"}%=%#StslineBackColorBG#\ %{b:FiletypeIcon}%{&filetype}\ %#StslineSecColorFGBackColorBG#%#StslineSecColorBG#\ %p\%%\ %l/%L\ :%c\ | |
else | |
setlocal statusline=%#StslineSecColorBG#%{get(b:,'coc_git_statusline',b:GitBranch)}%{get(b:,'coc_git_blame','')}%#StslineBackColorFGSecColorBG#%#StslineBackColorBG#\ %{&readonly?\"\ \":\"\"}%F\ %#StslineModColorFG#%{&modified?\"\ \":\"\"}%=%#StslineBackColorBG#\ %{b:FiletypeIcon}%{&filetype}\ %#StslineSecColorFGBackColorBG#%#StslineSecColorBG#\ %p\%%\ %l/%L\ :%c\ | |
endif | |
endfunction | |
" Get Statusline mode & also set primary color for that mode | |
function! StslineMode() | |
let l:CurrentMode=mode() | |
if l:CurrentMode==#"n" | |
let g:StslinePriColor = g:StslineColorGreen | |
let b:CurrentMode = "NORMAL " | |
elseif l:CurrentMode==#"i" | |
let g:StslinePriColor = g:StslineColorViolet | |
let b:CurrentMode = "INSERT " | |
elseif l:CurrentMode==#"c" | |
let g:StslinePriColor = g:StslineColorYellow | |
let b:CurrentMode = "COMMAND " | |
elseif l:CurrentMode==#"v" | |
let g:StslinePriColor = g:StslineColorBlue | |
let b:CurrentMode = "VISUAL " | |
elseif l:CurrentMode==#"V" | |
let g:StslinePriColor = g:StslineColorBlue | |
let b:CurrentMode = "V-LINE " | |
elseif l:CurrentMode==#"\<C-v>" | |
let g:StslinePriColor = g:StslineColorBlue | |
let b:CurrentMode = "V-BLOCK " | |
elseif l:CurrentMode==#"R" | |
let g:StslinePriColor = g:StslineColorViolet | |
let b:CurrentMode = "REPLACE " | |
elseif l:CurrentMode==#"s" | |
let g:StslinePriColor = g:StslineColorBlue | |
let b:CurrentMode = "SELECT " | |
elseif l:CurrentMode==#"t" | |
let g:StslinePriColor =g:StslineColorYellow | |
let b:CurrentMode = "TERM " | |
elseif l:CurrentMode==#"!" | |
let g:StslinePriColor = g:StslineColorYellow | |
let b:CurrentMode = "SHELL " | |
endif | |
call UpdateStslineColors() | |
return b:CurrentMode | |
endfunction | |
" Update colors. Recreate highlight groups with new Primary color value. | |
function! UpdateStslineColors() | |
execute 'highlight StslinePriColorBG guifg=' . g:StslineOnPriColor ' guibg=' . g:StslinePriColor | |
execute 'highlight StslinePriColorBGBold guifg=' . g:StslineOnPriColor ' guibg=' . g:StslinePriColor ' gui=bold' | |
execute 'highlight StslinePriColorFG guifg=' . g:StslinePriColor ' guibg=' . g:StslineBackColor | |
execute 'highlight StslinePriColorFGSecColorBG guifg=' . g:StslinePriColor ' guibg=' . g:StslineSecColor | |
execute 'highlight StslineSecColorFGPriColorBG guifg=' . g:StslineSecColor ' guibg=' . g:StslinePriColor | |
if !exists("b:GitBranch") || b:GitBranch == '' | |
execute 'highlight StslineBackColorFGPriColorBG guifg=' . g:StslineBackColor ' guibg=' . g:StslinePriColor | |
endif | |
endfunction | |
" Get git branch name | |
function! GetGitBranch() | |
let b:GitBranch="" | |
try | |
let l:dir=expand('%:p:h') | |
let l:gitrevparse = system("git -C ".l:dir." rev-parse --abbrev-ref HEAD") | |
if !v:shell_error | |
let b:GitBranch=" ".substitute(l:gitrevparse, '\n', '', 'g')." " | |
execute 'highlight StslineBackColorFGPriColorBG guifg=' . g:StslineBackColor ' guibg=' . g:StslineSecColor | |
endif | |
catch | |
endtry | |
endfunction | |
" Get filetype & custom icon. Put your most used file types first for optimized performance. | |
function! GetFileType() | |
if &filetype == 'typescript' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == 'html' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == 'scss' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == 'css' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == 'javascript' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == 'javascriptreact' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == 'markdown' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == 'sh' || &filetype == 'zsh' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == 'vim' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == '' | |
let b:FiletypeIcon = '' | |
elseif &filetype == 'rust' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == 'ruby' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == 'cpp' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == 'c' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == 'go' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == 'lua' | |
let b:FiletypeIcon = ' ' | |
elseif &filetype == 'haskel' | |
let b:FiletypeIcon = ' ' | |
else | |
let b:FiletypeIcon = ' ' | |
endif | |
endfunction | |
" Get git branch name after entering a buffer | |
augroup GetGitBranch | |
autocmd! | |
autocmd BufEnter * call GetGitBranch() | |
augroup END | |
" Set active / inactive statusline after entering, leaving buffer | |
augroup SetStslineline | |
autocmd! | |
autocmd BufEnter,WinEnter * call ActivateStatusline() | |
autocmd BufLeave,WinLeave * call DeactivateStatusline() | |
augroup END |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment