From 19120d4f9761c67d99ed1ce3da6084b83f5a49c9 Mon Sep 17 00:00:00 2001 From: srdusr Date: Sat, 30 Aug 2025 19:22:59 +0200 Subject: Linux-specific dotfiles --- linux/home/.vim/autoload/statusline.vim | 227 ++++++++++++++++ .../.vim/pack/plugins/start/vim-tmux-navigator | 1 + linux/home/.vim/vimrc | 296 +++++++++++++++++++++ 3 files changed, 524 insertions(+) create mode 100644 linux/home/.vim/autoload/statusline.vim create mode 160000 linux/home/.vim/pack/plugins/start/vim-tmux-navigator create mode 100644 linux/home/.vim/vimrc (limited to 'linux/home/.vim') diff --git a/linux/home/.vim/autoload/statusline.vim b/linux/home/.vim/autoload/statusline.vim new file mode 100644 index 0000000..5e5a671 --- /dev/null +++ b/linux/home/.vim/autoload/statusline.vim @@ -0,0 +1,227 @@ +"" 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" + + + + +" statusline.vim + +" NOTE: This has been edited to fit my needs and is intended to be autoloaded in the autoload directory: "~/.vim/autoload/statusline.vim" + +if exists('g:loaded_statusline') | finish | endif +let g:loaded_statusline = 1 + +" Color highlighting groups +" Add this AFTER `colorscheme` option in your vimrc. Otherwise your colorscheme will clear these 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.) +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 + +let space = ' ' + +" Define active statusline +function! autoload#statusline#ActivateStatusline() abort + call autoload#statusline#GetFileType() + setlocal statusline=%#StslinePriColorBG#\ \ %{autoload#statusline#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\ \ %#{space} +endfunction + +" Define Inactive statusline +function! autoload#statusline#DeactivateStatusline() abort + 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! autoload#statusline#StslineMode() abort + 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 ==# '\' + let g:StslinePriColor = g:StslineColorBlue + let b:CurrentMode = 'V-BLOCK ' + elseif l:CurrentMode ==# 'V' + let g:StslinePriColor = g:StslineColorBlue + let b:CurrentMode = 'V-LINE ' + 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 autoload#statusline#UpdateStslineColors() + + return b:CurrentMode +endfunction + +" Update colors. Recreate highlight groups with new Primary color value. +function! autoload#statusline#UpdateStslineColors() abort + 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! autoload#statusline#GetGitBranch() abort + 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! autoload#statusline#GetFileType() abort + 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 + +" Automatically update git branch name when entering a buffer +augroup GetGitBranch + autocmd! + autocmd BufEnter * call autoload#statusline#GetGitBranch() +augroup END + +" Set active / inactive statusline when entering or leaving a buffer +augroup SetStsline + autocmd! + autocmd BufEnter,WinEnter * call autoload#statusline#ActivateStatusline() + autocmd BufLeave,WinLeave * call autoload#statusline#DeactivateStatusline() +augroup END + +call autoload#statusline#ActivateStatusline() + diff --git a/linux/home/.vim/pack/plugins/start/vim-tmux-navigator b/linux/home/.vim/pack/plugins/start/vim-tmux-navigator new file mode 160000 index 0000000..38b1d04 --- /dev/null +++ b/linux/home/.vim/pack/plugins/start/vim-tmux-navigator @@ -0,0 +1 @@ +Subproject commit 38b1d0402c4600543281dc85b3f51884205674b6 diff --git a/linux/home/.vim/vimrc b/linux/home/.vim/vimrc new file mode 100644 index 0000000..ce034e9 --- /dev/null +++ b/linux/home/.vim/vimrc @@ -0,0 +1,296 @@ +"=============================================================================== +" Mappings/Keybindings/Commands +"=============================================================================== + +let mapleader = ";" " map leader to Semi colon + +inoremap jk " Use to escape + +" Easier split navigations, just ctrl-j instead of ctrl-w then j +nnoremap +nnoremap +nnoremap +nnoremap + +" Recent files (MRU) +nnoremap m :browse old +" Search files by name +"nnoremap p :find **/** +" browse files from same dir as current file +nnoremap e :e %:p:h + +" Combine buffers list with buffer name +"nnoremap b :buffers:buffer + +" Jump to a buffer +nnoremap b :ls t:b + +" Map buffer next, prev and delete to +map n :bn +map p :bp +map d :bd + +" tab navigation +noremap h :tabprevious +noremap l :tabnext +noremap k :tabfirst +noremap j :tablast +noremap n :tabnew +noremap e :tabedit +noremap c :tabclose +noremap m :tabm + +" Swap two pieces of text, use x to cut in visual mode, then use Ctrl-x in +" visual mode to select text to swap with +:vnoremap `.``gvP``P + +" To resize in different steps, you can create maps that will adjust the window +" size differently. For example to increase the window size by a factor of 1.5 +" and decrease the window size by 0.67, you can map this: +"nnoremap + :exe "resize " . (winheight(0) * 3/2) +"nnoremap - :exe "resize " . (winheight(0) * 2/3) +nnoremap + :resize +5 +nnoremap - :resize -5 +nnoremap > :vertical resize +5 +nnoremap < :vertical resize -5 + +" Toggle set number +"nnoremap $ :NumbersToggle +"nnoremap % :NumbersOnOff + +" Copy and Paste with and +"vmap y:call system("xclip -i -selection clipboard", getreg("\"")):call system("xclip -i", getreg("\"")) +"nmap :call setreg("\"",system("xclip -o -selection clipboard"))p +nnoremap p (v:register == '"' && &clipboard =~ 'unnamed' ? '"*p' : '"' . v:register . 'p') + +" Use command :Vb for Visual Block or since is used for Copy +command! Vb normal! + +" Map to save/edit a root permission/read-only file, only works in +" traditional vim and not neovim +cmap w!! %!sudo tee > /dev/null + +nnoremap x :silent !chmod +x % + +"nnoremap <[-p> m`op`` +" Paste on next line +"nnoremap <]-p> m`Op`` + +"inoremap " +"set keywordprg=:help +"runtime ftplugin/man.vim + + +"=============================================================================== +" Settings +"=============================================================================== + +" Neovim requires xclip, check if normal vim has +clipboard by +" <:echo has('clipboard')> from within Vim (if the output is 1, good to +" go otherwise 0 then need a build that has it +" Next two commands make vim use X11 clipboard +set clipboard+=unnamedplus +let g:clipbrdDefaultReg = '+' + +"let g:loaded_clipboard_provider = 1 +" <:e %:h/filename> will create a new file named filename in the same +" directory as the currently open file, and write it. +set autochdir " or use this to use <:e> to create a file in current directory +set splitright " make vsplit put the new buffer on the right of the current buffer +set splitbelow " make split put the new buffer below the current buffer +" :Bclose script (delete a buffer without closing the window) sourced as a +" plugin in ~/.config/nvim/plugin/bclose.vim | keymap: bd +"let bclose_multiple = 1 +"set syntax +" Compute syntax highlighting from beginning of file. (By default, vim only +" looks 200 lines back, which can make it highlight code incorrectly in some +" long files.) +autocmd BufEnter * :syntax sync fromstart +" Don't syntax highlight markdown because it's often wrong +autocmd! FileType mkd setlocal syn=off +set ttyfast +set lazyredraw +" Set lazyredraw to false +"let &lazyredraw = 0 +set timeout timeoutlen=1000 ttimeoutlen=100 " fix slow O inserts +set scrolloff=8 sidescrolloff=8 +set tabstop=4 softtabstop=4 shiftwidth=4 expandtab +set autoindent +set smartindent +" Also load indent files, to automatically do language-dependent indenting. +filetype plugin indent on +set exrc +set relativenumber +set hidden +set noerrorbells +set nowrap +set ignorecase +set smartcase +set noswapfile +set nobackup +set incsearch +"set cursorline +set showmatch +set showcmd +set incsearch +set hlsearch +set laststatus=2 +let g:python3_host_prog = '/usr/bin/python3' +"let g:loaded_python3_provider = 1 +let g:sh_noisk=1 +set modeline +set modelines=3 " modelines (comments that set vim options on a per-file basis) +set foldmethod=manual +set nofoldenable " turn folding off +" Insert only one space when joining lines that contain sentence-terminating +" punctuation like `.`. +set nojoinspaces +set autoread " if a file is changed outside of vim, automatically reload it without asking +set diffopt=vertical " diffs are shown side-by-side not above/below +set signcolumn=no " always show the sign column +set textwidth=80 +set mouse=a + +" FILE BROWSING: +let g:netrw_banner=0 " disable annoying banner +let g:netrw_browse_split=4 " open in prior window +let g:netrw_altv=1 " open splits to the right +let g:netrw_liststyle=3 " tree view +let g:netrw_fastbrowse = 0 +autocmd FileType netrw setl bufhidden=wipe + +" Faster vimgrep/grep via ripgrep +if executable("rg") + set grepprg=rg\ --vimgrep\ --no-heading + set grepformat=%f:%l:%c:%m,%f:%l:%m +endif + + +"=============================================================================== +" Colorscheme +"=============================================================================== + +" enable syntax, plugins (for netrw) and indentation +syntax enable + +"set shell=zsh +set termguicolors +set guicursor= +let &t_SI = "\e[6 q" +let &t_EI = "\e[2 q" + +"colorscheme desert +"colorscheme city-lights +set background=dark +highlight Normal guibg=NONE ctermbg=NONE +highlight EndOfBuffer ctermfg=NONE ctermbg=NONE + + +"------------------------------------------------------------------------------- + + +"=============================================================================== +" Functions/Scripts +"=============================================================================== + +" Enable mouse scrollback +"--------------------------------------- +set mouse=a +tnoremap +tnoremap +function! ClearTerminal() + set scrollback=1 + let &g:scrollback=1 + echo &scrollback + call feedkeys("\i") + call feedkeys("clear\") + call feedkeys("\\") + call feedkeys("\i") + sleep 100m + let &scrollback=s:scroll_value +endfunction + +"------------------------------------------------------------------------------- + +" :Rename {newname} +"--------------------------------------- +function! RenameFile() + let old_name = expand('%') + let new_name = input('New file name: ', expand('%'), 'file') + if new_name != '' && new_name != old_name + exec ':saveas ' . new_name + exec ':silent !rm ' . old_name + redraw! + endif +endfunction +map r :call RenameFile() + +"------------------------------------------------------------------------------- + +" Return to the same line when we reopen a file +"--------------------------------------- + augroup line_return + au! + au BufReadPost * + \ if line("'\"") > 0 && line("'\"") <= line("$") | + \ execute 'normal! g`"zvzz' | + \ endif + augroup END + +"------------------------------------------------------------------------------- +" +" Function to update tmux status and .vi-mode file +"--------------------------------------- +function! UpdateTmuxStatus() abort + " Check if the current buffer has a man filetype + if &filetype ==# 'man' + return + endif + + " Determine the mode name based on the mode value + let mode = mode() + let mode_name = '' + if mode ==# 'n' + let mode_name = '-- NORMAL --' + elseif mode ==# 'i' || mode ==# 'ic' + let mode_name = '-- INSERT --' + else + let mode_name = '-- NORMAL --' + endif + + " Write the mode name to the file + call writefile([mode_name], expand('$HOME') . '/.vi-mode') + +endfunction + +" Function to refresh tmux status +function! s:UpdateTmux() abort + call system('tmux refresh-client -S') +endfunction + +" Set up autocommands for tmux status update +if !empty($TMUX) && system('command -v tmux >/dev/null 2>&1') == 0 +augroup TmuxStatus + autocmd! + autocmd ModeChanged * call UpdateTmuxStatus() | call s:UpdateTmux() +augroup END +endif + +"------------------------------------------------------------------------------- + + +"=============================================================================== +" Statusline Configuration +"=============================================================================== + +" Autoload statusline +"--------------------------------------- +" Load statusline script +if filereadable(expand("~/.vim/autoload/statusline.vim")) + source ~/.vim/autoload/statusline.vim +endif + +" Call the statusline activation function +call autoload#statusline#ActivateStatusline() + +"------------------------------------------------------------------------------- -- cgit v1.2.3