dblume commited on 2024-03-06 22:50:15
Showing 8 changed files, with 1005 additions and 12 deletions.
This is the first cut, and there will be multiple subsequent changes.
... | ... |
@@ -0,0 +1,113 @@ |
1 |
+" Vim color file |
|
2 |
+" Maintainer: Hans Fugal <hans@fugal.net> |
|
3 |
+" Last Change: $Date: 2004/06/13 19:30:30 $ |
|
4 |
+" Last Change: $Date: 2004/06/13 19:30:30 $ |
|
5 |
+" URL: http://hans.fugal.net/vim/colors/desert.vim |
|
6 |
+" Version: $Id: desert.vim,v 1.1 2004/06/13 19:30:30 vimboss Exp $ |
|
7 |
+ |
|
8 |
+" cool help screens |
|
9 |
+" :he group-name |
|
10 |
+" :he highlight-groups |
|
11 |
+" :he cterm-colors |
|
12 |
+ |
|
13 |
+set background=dark |
|
14 |
+if version > 580 |
|
15 |
+ " no guarantees for version 5.8 and below, but this makes it stop |
|
16 |
+ " complaining |
|
17 |
+ hi clear |
|
18 |
+ if exists("syntax_on") |
|
19 |
+ syntax reset |
|
20 |
+ endif |
|
21 |
+endif |
|
22 |
+let g:colors_name="desert" |
|
23 |
+ |
|
24 |
+hi Normal guifg=White guibg=grey20 |
|
25 |
+ |
|
26 |
+" highlight groups |
|
27 |
+hi Cursor guibg=khaki guifg=slategrey |
|
28 |
+"hi CursorIM |
|
29 |
+"hi Directory |
|
30 |
+"hi DiffAdd |
|
31 |
+"hi DiffChange |
|
32 |
+"hi DiffDelete |
|
33 |
+"hi DiffText |
|
34 |
+"hi ErrorMsg |
|
35 |
+hi VertSplit guibg=#c2bfa5 guifg=grey50 gui=none |
|
36 |
+hi Folded guibg=grey30 guifg=gold |
|
37 |
+hi FoldColumn guibg=grey30 guifg=tan |
|
38 |
+hi IncSearch guifg=slategrey guibg=khaki |
|
39 |
+"hi LineNr |
|
40 |
+hi ModeMsg guifg=goldenrod |
|
41 |
+hi MoreMsg guifg=SeaGreen |
|
42 |
+hi NonText guifg=LightBlue guibg=grey30 |
|
43 |
+hi Question guifg=springgreen |
|
44 |
+hi Search guibg=peru guifg=wheat |
|
45 |
+hi SpecialKey guifg=yellowgreen |
|
46 |
+hi StatusLine guibg=#c2bfa5 guifg=black gui=none |
|
47 |
+hi StatusLineNC guibg=#c2bfa5 guifg=grey50 gui=none |
|
48 |
+hi Title guifg=indianred |
|
49 |
+hi Visual gui=none guifg=khaki guibg=olivedrab |
|
50 |
+"hi VisualNOS |
|
51 |
+hi WarningMsg guifg=salmon |
|
52 |
+"hi WildMenu |
|
53 |
+"hi Menu |
|
54 |
+"hi Scrollbar |
|
55 |
+"hi Tooltip |
|
56 |
+ |
|
57 |
+" syntax highlighting groups |
|
58 |
+hi Comment guifg=SkyBlue |
|
59 |
+hi Constant guifg=#ffa0a0 |
|
60 |
+hi Identifier guifg=palegreen |
|
61 |
+hi Statement guifg=khaki |
|
62 |
+hi PreProc guifg=indianred |
|
63 |
+hi Type guifg=darkkhaki |
|
64 |
+hi Special guifg=navajowhite |
|
65 |
+"hi Underlined |
|
66 |
+hi Ignore guifg=grey40 |
|
67 |
+"hi Error |
|
68 |
+hi Todo guifg=orangered guibg=yellow2 |
|
69 |
+ |
|
70 |
+" color terminal definitions |
|
71 |
+hi SpecialKey ctermfg=darkgreen |
|
72 |
+hi NonText cterm=bold ctermfg=darkblue |
|
73 |
+hi Directory ctermfg=darkcyan |
|
74 |
+hi ErrorMsg cterm=bold ctermfg=7 ctermbg=1 |
|
75 |
+hi IncSearch cterm=NONE ctermfg=yellow ctermbg=green |
|
76 |
+hi Search cterm=NONE ctermfg=grey ctermbg=25 |
|
77 |
+hi MoreMsg ctermfg=darkgreen |
|
78 |
+hi ModeMsg cterm=NONE ctermfg=brown |
|
79 |
+hi LineNr ctermfg=3 |
|
80 |
+hi Question ctermfg=green |
|
81 |
+hi StatusLine cterm=bold,reverse |
|
82 |
+hi StatusLineNC cterm=reverse |
|
83 |
+hi VertSplit cterm=reverse |
|
84 |
+hi Title ctermfg=74 |
|
85 |
+hi Visual cterm=reverse |
|
86 |
+hi VisualNOS cterm=bold,underline |
|
87 |
+hi WarningMsg ctermfg=1 |
|
88 |
+hi WildMenu ctermfg=0 ctermbg=3 |
|
89 |
+hi Folded ctermfg=darkgrey ctermbg=NONE |
|
90 |
+hi FoldColumn ctermfg=darkgrey ctermbg=NONE |
|
91 |
+hi DiffAdd term=reverse ctermbg=28 ctermfg=254 |
|
92 |
+hi DiffChange term=reverse ctermbg=239 ctermfg=251 |
|
93 |
+hi DiffText term=reverse ctermbg=30 ctermfg=254 |
|
94 |
+hi DiffDelete term=reverse ctermbg=52 ctermfg=black |
|
95 |
+hi Comment ctermfg=darkcyan |
|
96 |
+hi Constant ctermfg=brown |
|
97 |
+hi Special ctermfg=74 |
|
98 |
+hi Identifier ctermfg=6 |
|
99 |
+hi Statement ctermfg=3 |
|
100 |
+hi PreProc ctermfg=74 |
|
101 |
+hi Type ctermfg=2 |
|
102 |
+hi Underlined cterm=underline ctermfg=74 |
|
103 |
+hi Ignore cterm=bold ctermfg=7 |
|
104 |
+hi Ignore ctermfg=darkgrey |
|
105 |
+hi Error cterm=bold ctermfg=7 ctermbg=1 |
|
106 |
+hi Pmenu ctermbg=33 ctermfg=235 |
|
107 |
+hi PmenuSel ctermbg=14 ctermfg=0 |
|
108 |
+hi TabLineSel ctermfg=white ctermbg=239 |
|
109 |
+hi TabLine ctermfg=247 ctermbg=237 |
|
110 |
+hi TabLineFill ctermfg=235 |
|
111 |
+ |
|
112 |
+ |
|
113 |
+"vim: sw=4 |
... | ... |
@@ -0,0 +1,393 @@ |
1 |
+" Version 2024-03-06.1 - Original, with many bugs |
|
2 |
+set bs=2 " allow backspacing over everything in insert mode |
|
3 |
+set wildmenu " Allows command-line completion with tab |
|
4 |
+set autoindent " Copy indent from current line when starting a new line |
|
5 |
+set smartindent " Do smart auto indenting when starting new line |
|
6 |
+set smarttab " Honor 'shiftwidth', 'tabstop' or 'softtabstop' |
|
7 |
+set hlsearch " highlight all matches for previous search |
|
8 |
+set foldlevel=99 |
|
9 |
+set nowrap " no wrapping text lines on the screen (exceptions below) |
|
10 |
+set sidescroll=5 |
|
11 |
+set listchars+=tab:>-,precedes:<,extends:>,nbsp:· " for :set list |
|
12 |
+set iskeyword+=- " Add - to list of non-word-breaking chars. |
|
13 |
+set scrolloff=0 " EC2 defaults to 5. Set explicitly to be consistent |
|
14 |
+set notermguicolors " Only needed for neovim while I port my color schemes |
|
15 |
+ |
|
16 |
+if v:version >= 703 |
|
17 |
+ " Do save the undo tree to file, but not in the local directory. |
|
18 |
+ " Don't forget to mkdir ~/.nvim_undo |
|
19 |
+ set undodir=~/.nvim_undo,. |
|
20 |
+ set undofile " undo even after closing and reopening a file |
|
21 |
+endif |
|
22 |
+ |
|
23 |
+" The following two lines set the use of perl regex, aka "very magic" |
|
24 |
+nnoremap / /\v |
|
25 |
+vnoremap / /\v |
|
26 |
+ |
|
27 |
+" Make j and k move to the next row, not file line |
|
28 |
+nnoremap j gj |
|
29 |
+nnoremap k gk |
|
30 |
+ |
|
31 |
+" From Steve Losh: http://learnvimscriptthehardway.stevelosh.com/chapters/10.html |
|
32 |
+" Map jk to ESC in insert mode (except when navigating popup menu) |
|
33 |
+inoremap <expr> jk pumvisible() ? '' : '<esc>' |
|
34 |
+inoremap <expr> j pumvisible() ? '<Down>' : 'j' |
|
35 |
+inoremap <expr> k pumvisible() ? '<Up>' : 'k' |
|
36 |
+ |
|
37 |
+" https://stevelosh.com/blog/2010/09/coming-home-to-vim/#s3-why-i-came-back-to-vim |
|
38 |
+nnoremap <leader>v <C-w>v<C-w>l |
|
39 |
+nnoremap <C-h> <C-w>h |
|
40 |
+nnoremap <C-j> <C-w>j |
|
41 |
+nnoremap <C-k> <C-w>k |
|
42 |
+nnoremap <C-l> <C-w>l |
|
43 |
+ |
|
44 |
+" clear search highlights |
|
45 |
+nnoremap <cr> :noh<cr><cr> |
|
46 |
+ |
|
47 |
+" tab switches to previous/next buffer |
|
48 |
+nnoremap <Tab> :bp<cr> |
|
49 |
+nnoremap <S-Tab> :bn<cr> |
|
50 |
+ |
|
51 |
+syntax on |
|
52 |
+ |
|
53 |
+set t_Co=256 |
|
54 |
+if v:version >= 703 |
|
55 |
+" set colorcolumn=80 |
|
56 |
+endif |
|
57 |
+if has('gui_running') " Didn't work: if &term != 'builtin_gui' |
|
58 |
+ " Light backgrounds for GUI experiences |
|
59 |
+ set background=light |
|
60 |
+ " colorscheme peaksea |
|
61 |
+ colorscheme tolerable |
|
62 |
+ if v:version >= 703 |
|
63 |
+ highlight ColorColumn ctermbg=255 guibg=#F6F6F6 |
|
64 |
+ endif |
|
65 |
+ highlight statusline ctermfg=17 ctermbg=Gray " override scheme |
|
66 |
+ highlight statuslineNC ctermfg=20 ctermbg=LightGray" override scheme |
|
67 |
+ if has('win32') |
|
68 |
+ set guifont=DejaVu_Sans_Mono_for_Powerline:h10:cANSI:qDRAFT |
|
69 |
+ endif |
|
70 |
+ set lines=50 columns=100 |
|
71 |
+else |
|
72 |
+ " Dark backgrounds for tty experiences |
|
73 |
+ set background=dark |
|
74 |
+ colorscheme nvim_desert |
|
75 |
+ if v:version >= 703 |
|
76 |
+ highlight ColorColumn ctermbg=233 guibg=Black " dark gray (or 17, dark blue) |
|
77 |
+ endif |
|
78 |
+ highlight statusline ctermfg=24 ctermbg=250 " override scheme |
|
79 |
+ highlight statuslineNC ctermfg=236 ctermbg=Gray " override scheme |
|
80 |
+ highlight MatchParen term=reverse ctermbg=23 " 23 is more subtle than default |
|
81 |
+endif |
|
82 |
+ |
|
83 |
+au InsertEnter * hi statusline guibg=Cyan ctermfg=20 guifg=Black ctermbg=248 |
|
84 |
+au InsertLeave * hi statusline term=bold,reverse cterm=bold,reverse ctermfg=24 ctermbg=250 guifg=black guibg=#c2bfa5 |
|
85 |
+ |
|
86 |
+" set mouse=v " visual mode, not working great for PuTTY |
|
87 |
+ |
|
88 |
+set tags=tags;/ |
|
89 |
+ |
|
90 |
+set history=50 |
|
91 |
+set laststatus=2 |
|
92 |
+ |
|
93 |
+function! StatuslineGit() |
|
94 |
+ let l:branchname = system("git rev-parse --abbrev-ref HEAD 2>/dev/null | tr -d '\n'") |
|
95 |
+ return strlen(l:branchname) > 0 ? ' | branch:'.l:branchname : '' |
|
96 |
+endfunction |
|
97 |
+ |
|
98 |
+function! Current_mode() |
|
99 |
+ let l:currentmode={ |
|
100 |
+ \ 'n' : 'NORMAL', |
|
101 |
+ \ 'v' : 'VISUAL', |
|
102 |
+ \ 'V' : 'V·LINE', |
|
103 |
+ \ '' : 'V·BLOCK', |
|
104 |
+ \ 's' : 'SELECT', |
|
105 |
+ \ 'S' : 'S·LINE', |
|
106 |
+ \ 'i' : 'INSERT', |
|
107 |
+ \ 'r' : 'I·REPLACE', |
|
108 |
+ \ 'R' : 'REPLACE', |
|
109 |
+ \ 'Rv' : 'V·REPLACE', |
|
110 |
+ \ 'c' : 'COMMAND', |
|
111 |
+ \} |
|
112 |
+ return get(l:currentmode, mode(), mode()) |
|
113 |
+endfunction |
|
114 |
+ |
|
115 |
+function! Trim_brackets(fn) |
|
116 |
+ if v:version > 800 |
|
117 |
+ return trim(a:fn, "[]") |
|
118 |
+ else |
|
119 |
+ return a:fn |
|
120 |
+ endif |
|
121 |
+endfunction |
|
122 |
+ |
|
123 |
+set statusline=\ %{Current_mode()} |
|
124 |
+set statusline+=%{&paste?'\ \ ·\ PASTE':''} |
|
125 |
+"set statusline+=%{StatuslineGit()} |
|
126 |
+set statusline+=\ │\ %f |
|
127 |
+set statusline+=%m |
|
128 |
+set statusline+=\ %r |
|
129 |
+set statusline+=\ %= |
|
130 |
+set statusline+=%h |
|
131 |
+set statusline+=\ %{Trim_brackets(&filetype)} |
|
132 |
+set statusline+=\ %#StatusLineNC# |
|
133 |
+set statusline+=\ %{&fileencoding?&fileencoding:&encoding} |
|
134 |
+set statusline+=\[%{&fileformat}\] |
|
135 |
+set statusline+=\ │\ %p%%\ = |
|
136 |
+set statusline+=\ %l/%L\ :\ %c\ |
|
137 |
+ |
|
138 |
+set encoding=utf-8 |
|
139 |
+ |
|
140 |
+" Fast saving |
|
141 |
+nmap <leader>w :w!<cr> |
|
142 |
+" I use relative number for cursor movement. |
|
143 |
+nmap <leader>r :set relativenumber!<cr> |
|
144 |
+nmap <leader>n :set number!<cr> |
|
145 |
+ |
|
146 |
+" Useful mappings for managing tabs |
|
147 |
+" Tab Previous: gT or C-PageUp |
|
148 |
+" Tab Next: gt or C-PageDown |
|
149 |
+nmap <leader>tn :tabnew |
|
150 |
+nmap <leader>to :tabonly<cr> |
|
151 |
+nmap <leader>tc :tabclose<cr> |
|
152 |
+nmap <leader>tm :tabmove |
|
153 |
+nmap <leader>1 1gt |
|
154 |
+nmap <leader>2 2gt |
|
155 |
+nmap <leader>3 3gt |
|
156 |
+nmap <leader>4 4gt |
|
157 |
+nmap <leader>5 5gt |
|
158 |
+nmap <leader>6 6gt |
|
159 |
+nmap <leader>7 7gt |
|
160 |
+nmap <leader>8 8gt |
|
161 |
+nmap <leader>9 9gt |
|
162 |
+ |
|
163 |
+" Open current buffer in new tab. Close with C-w,c |
|
164 |
+" https://vim.fandom.com/wiki/Maximize_window_and_return_to_previous_split_structure |
|
165 |
+function! OpenCurrentAsNewTab() |
|
166 |
+ let l:currentView = winsaveview() |
|
167 |
+ tabedit % |
|
168 |
+ call winrestview(l:currentView) |
|
169 |
+endfunction |
|
170 |
+nmap <leader>o :call OpenCurrentAsNewTab()<CR> |
|
171 |
+ |
|
172 |
+" pastetoggle |
|
173 |
+nmap <leader>p :set invpaste paste?<cr> |
|
174 |
+ |
|
175 |
+" Control+p to paste onto next line |
|
176 |
+nmap <C-p> :pu<cr> |
|
177 |
+ |
|
178 |
+" Make netrw's Explore behave a little like NERDTreeToggle |
|
179 |
+" http://vimcasts.org/blog/2013/01/oil-and-vinegar-split-windows-and-project-drawer/ |
|
180 |
+function! ToggleNetrw() |
|
181 |
+ if bufwinnr("NetrwTreeListing") > 0 |
|
182 |
+ for i in range(1, bufnr("$")) |
|
183 |
+ if (getbufvar(i, "&filetype") == "netrw") |
|
184 |
+ silent exe "bwipeout " . i |
|
185 |
+ return |
|
186 |
+ endif |
|
187 |
+ endfor |
|
188 |
+ endif |
|
189 |
+ silent Vexplore %:p:h |
|
190 |
+endfunction |
|
191 |
+nmap <leader>e :call ToggleNetrw()<cr> |
|
192 |
+ |
|
193 |
+" install taglist |
|
194 |
+let Tlist_GainFocus_On_ToggleOpen = 1 " Jump to taglist window on open |
|
195 |
+let Tlist_Exit_OnlyWindow = 1 " if you are the last, kill yourself |
|
196 |
+let Tlist_Close_On_Select = 1 " Close taglist window on select |
|
197 |
+nmap <leader>l :TlistToggle<cr> |
|
198 |
+ |
|
199 |
+" install vim-bbye |
|
200 |
+nmap <leader>bd :Bdelete<cr> |
|
201 |
+ |
|
202 |
+" Visual mode mappings |
|
203 |
+""" |
|
204 |
+ |
|
205 |
+" map sort function to a key |
|
206 |
+vnoremap <leader>s :sort<cr> |
|
207 |
+ |
|
208 |
+"easier moving of code blocks |
|
209 |
+vnoremap < <gv |
|
210 |
+vnoremap > >gv |
|
211 |
+ |
|
212 |
+" If too many file system events are getting triggered. |
|
213 |
+set nobackup " ~ files |
|
214 |
+set nowritebackup " Don't write buff to temp, delete orig, rename temp to orig |
|
215 |
+set noswapfile " .swp files |
|
216 |
+ |
|
217 |
+" Allow tags to open another buffer even if this one is modified |
|
218 |
+set hidden |
|
219 |
+ |
|
220 |
+" Switch between source and header files |
|
221 |
+function! SwitchSourceHeader() |
|
222 |
+ let s:ext = expand("%:e") |
|
223 |
+ let s:base = expand("%:t:r") |
|
224 |
+ let s:cmd = "find " . s:base |
|
225 |
+ if (s:ext == "cpp" || s:ext == "c") |
|
226 |
+ if findfile(s:base . ".h" ) != "" | exe s:cmd . ".h" | return | en |
|
227 |
+ if findfile(s:base . ".hpp") != "" | exe s:cmd . ".hpp" | return | en |
|
228 |
+ else |
|
229 |
+ if findfile(s:base . ".cpp") != "" | exe s:cmd . ".cpp" | return | en |
|
230 |
+ if findfile(s:base . ".c" ) != "" | exe s:cmd . ".c" | return | en |
|
231 |
+ endif |
|
232 |
+endfunc |
|
233 |
+ |
|
234 |
+" Demonstrates a way to look in a mirror directory |
|
235 |
+" function! OpenOther() |
|
236 |
+" if expand("%:e") == "cpp" |
|
237 |
+" exe "split" fnameescape(expand("%:p:r:s?src?include?").".h") |
|
238 |
+" elseif expand("%:e") == "h" |
|
239 |
+" exe "split" fnameescape(expand("%:p:r:s?include?src?").".cpp") |
|
240 |
+" endif |
|
241 |
+" endfunc |
|
242 |
+ |
|
243 |
+" Delete trailing white space on save, useful for Python and CoffeeScript ;) |
|
244 |
+function! DeleteTrailingWS() |
|
245 |
+ exe "normal mz" |
|
246 |
+ %s/\s\+$//ge |
|
247 |
+ exe "normal `z" |
|
248 |
+endfunc |
|
249 |
+ |
|
250 |
+function! OpenInOtherWindow() |
|
251 |
+ if winnr('$') == 1 |
|
252 |
+ exe "wincmd F" |
|
253 |
+ else |
|
254 |
+ let curNum = winnr() |
|
255 |
+ let oldBuf = bufnr( "%" ) |
|
256 |
+ if curNum == 1 |
|
257 |
+ let othNum = 2 |
|
258 |
+ else |
|
259 |
+ let othNum = 1 |
|
260 |
+ endif |
|
261 |
+ exe "normal! gF" |
|
262 |
+ let newBuf = bufnr( "%" ) |
|
263 |
+ let newLine = line(".") |
|
264 |
+ exe 'hide buf' oldBuf |
|
265 |
+ exe othNum . "wincmd w" |
|
266 |
+ exe 'hide buf' newBuf |
|
267 |
+ exe "normal! " . newLine . "G" |
|
268 |
+ endif |
|
269 |
+endfunc |
|
270 |
+ |
|
271 |
+nmap <silent> <leader>F :call OpenInOtherWindow()<cr> |
|
272 |
+nmap <silent> <leader>f :call OpenInOtherWindow()<cr> |
|
273 |
+ |
|
274 |
+if has("autocmd") |
|
275 |
+ autocmd BufWrite *.py :call DeleteTrailingWS() " Delete trailing whitespace |
|
276 |
+ " Don't let smartindent unindent the # character in Python files |
|
277 |
+ autocmd FileType python inoremap # X<c-h># |
|
278 |
+ autocmd FileType python,c,cpp,php,brs,sh set expandtab " Use spaces instead of tabs |
|
279 |
+ autocmd Filetype make setl noexpandtab " ...not for files that use tabs. |
|
280 |
+ |
|
281 |
+ " Use the vim command %retab before applying the following |
|
282 |
+ " two with files that have 8-space tabs. |
|
283 |
+ autocmd FileType c,cpp,python,php set tabstop=4 |
|
284 |
+ autocmd FileType c,cpp,php set shiftwidth=4 |
|
285 |
+ |
|
286 |
+ autocmd FileType python set foldmethod=indent " 'za' to fold |
|
287 |
+ |
|
288 |
+ autocmd FileType c,cpp nmap <buffer> <leader>s :call SwitchSourceHeader()<cr> |
|
289 |
+ autocmd FileType c,cpp set foldmethod=syntax |
|
290 |
+ |
|
291 |
+ if v:version >= 703 |
|
292 |
+ " I toggle out of relative number when Vim's focus is lost, because |
|
293 |
+ " if I'm not editing, then I may be referring to errors with line numbers. |
|
294 |
+ autocmd FocusLost * if &relativenumber | set number | endif |
|
295 |
+ autocmd FocusGained * if &number | set relativenumber | endif |
|
296 |
+ endif |
|
297 |
+ |
|
298 |
+ autocmd BufRead *.txt set wrap linebreak " "soft" wrap of existing lines |
|
299 |
+ autocmd BufRead README set wrap linebreak " "soft" wrap of existing lines |
|
300 |
+ autocmd BufRead *.rs :setlocal tags=./rusty-tags.vi;/ |
|
301 |
+ |
|
302 |
+ " When editing a file, always jump to the last cursor position |
|
303 |
+ autocmd BufReadPost * |
|
304 |
+ \ if &ft != "p4changelist" && &ft != "gitcommit" && line("'\"") > 0 && line ("'\"") <= line("$") | |
|
305 |
+ \ exe "normal! g'\"" | |
|
306 |
+ \ endif |
|
307 |
+endif |
|
308 |
+ |
|
309 |
+" This requires vim to be compiled with +python |
|
310 |
+" Use auto complete in insert mode with ctrl-x, ctrl-o |
|
311 |
+" See :help new-omni-completion for more. |
|
312 |
+filetype plugin on |
|
313 |
+set omnifunc=syntaxcomplete#Complete |
|
314 |
+ |
|
315 |
+" Torn on whether I like the omni completion preview window left open or not. |
|
316 |
+" autocmd CompleteDone * pclose |
|
317 |
+ |
|
318 |
+" Omni completion via ctrl-space (in addition to ctrl-x ctrl-o) |
|
319 |
+inoremap <Nul> <C-x><C-o> |
|
320 |
+ |
|
321 |
+" cscope |
|
322 |
+if has("cscope") |
|
323 |
+ set cscopetag " Use both cscope and ctag for 'ctrl-]' |
|
324 |
+ set csto=1 " 0=cscope first; 1=ctags first |
|
325 |
+ set cscopequickfix=s-,c-,d-,i-,t-,e-,a- " cscope to quickfix window |
|
326 |
+ |
|
327 |
+ set nocsverb |
|
328 |
+ " add any database in current directory |
|
329 |
+ if filereadable("cscope.out") |
|
330 |
+ cs add cscope.out |
|
331 |
+ " else add database pointed to by environment |
|
332 |
+ elseif $CSCOPE_DB != "" |
|
333 |
+ cs add $CSCOPE_DB |
|
334 |
+ endif |
|
335 |
+ set csverb |
|
336 |
+endif |
|
337 |
+ |
|
338 |
+" From https://stackoverflow.com/questions/15393301/how-to-automatically-sort-quickfix-entries-by-line-text-in-vim |
|
339 |
+" :grep term % |
|
340 |
+" :grep -r term path/ |
|
341 |
+" :cw |
|
342 |
+" :ccl (or C-w,q) |
|
343 |
+autocmd! QuickfixCmdPost * call MaybeSortQuickfix('QfStrCmp') |
|
344 |
+ |
|
345 |
+function! MaybeSortQuickfix(fn) |
|
346 |
+" exe 'normal! ' " Doesn't work. Wanted to jump back to where we were. |
|
347 |
+ let t = getqflist({'title': 1}).title |
|
348 |
+ " Only sort the files if for search-style commands, not "make". |
|
349 |
+ if stridx(t, "cs ") == 0 || stridx(t, ":gr") == 0 || stridx(t, ":vim") == 0 || stridx(t, ":rg") == 0 |
|
350 |
+ call setqflist(sort(getqflist(), a:fn), 'r') |
|
351 |
+ call setqflist([], 'r', {'title': t}) |
|
352 |
+ endif |
|
353 |
+ cwindow |
|
354 |
+endfunction |
|
355 |
+ |
|
356 |
+function! QfStrCmp(e1, e2) |
|
357 |
+ let [t1, t2] = [bufname(a:e1.bufnr), bufname(a:e2.bufnr)] |
|
358 |
+ return t1 <# t2 ? -1 : t1 ==# t2 ? 0 : 1 |
|
359 |
+endfunction |
|
360 |
+ |
|
361 |
+" Use ripgrep for search instead of grep |
|
362 |
+if executable('rg') |
|
363 |
+ " set grepprg=rg\ --vimgrep\ --hidden\ —glob '!.git' |
|
364 |
+ set grepprg=rg |
|
365 |
+endif |
|
366 |
+" Navigate quickfix list with ease |
|
367 |
+nnoremap <silent> [q :cprevious<CR> |
|
368 |
+nnoremap <silent> ]q :cnext<CR> |
|
369 |
+ |
|
370 |
+" I use Roboto Mono from https://github.com/powerline/fonts |
|
371 |
+" On iTerm2, Preferences -> Profiles -> Text -> Font |
|
372 |
+" Cygwin64 won't let you choose it. Launch Cygwin64 as follows: |
|
373 |
+" C:\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico -o Font="Roboto Mono for Powerline" - |
|
374 |
+ |
|
375 |
+" Settings that make netrw more like NERDTree |
|
376 |
+let g:netrw_banner = 0 |
|
377 |
+let g:netrw_liststyle = 3 |
|
378 |
+let g:netrw_browse_split = 4 |
|
379 |
+let g:netrw_altv = 1 |
|
380 |
+" set g:netrw_winsize to negative for absolute width, positive for relative |
|
381 |
+let g:netrw_winsize = -36 |
|
382 |
+" let g:netrw_winsize = 35 |
|
383 |
+" sort is affecting only: directories on the top, files below |
|
384 |
+let g:netrw_sort_sequence = '[\/]$,*' |
|
385 |
+ |
|
386 |
+" Experimenting with vim-rooter |
|
387 |
+let g:rooter_patterns = ['.git', 'Makefile', 'builds/'] |
|
388 |
+let g:rooter_cd_cmd = 'lcd' |
|
389 |
+let g:rooter_manual_only = 1 |
|
390 |
+ |
|
391 |
+" In some environments, Vim starts in replace mode: |
|
392 |
+" https://superuser.com/questions/1284561/why-is-vim-starting-in-replace-mode |
|
393 |
+" set t_u7= |
... | ... |
@@ -0,0 +1,19 @@ |
1 |
+Copyright (c) 2023, David Blume |
|
2 |
+ |
|
3 |
+Permission is hereby granted, free of charge, to any person obtaining |
|
4 |
+a copy of this software and associated documentation files (the "Software"), |
|
5 |
+to deal in the Software without restriction, including without limitation |
|
6 |
+the rights to use, copy, modify, merge, publish, distribute, sublicense, |
|
7 |
+and/or sell copies of the Software, and to permit persons to whom the |
|
8 |
+Software is furnished to do so, subject to the following conditions: |
|
9 |
+ |
|
10 |
+The above copyright notice and this permission notice shall be included |
|
11 |
+in all copies or substantial portions of the Software. |
|
12 |
+ |
|
13 |
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
14 |
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
15 |
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
|
16 |
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
17 |
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
18 |
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
|
19 |
+DEALINGS IN THE SOFTWARE. |
... | ... |
@@ -0,0 +1,128 @@ |
1 |
+[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/dblume/gittab/main/LICENSE) |
|
2 |
+![vim8](https://img.shields.io/badge/vim-8.x-green.svg) |
|
3 |
+ |
|
4 |
+## Vim Git-Tab |
|
5 |
+ |
|
6 |
+These are handy context-sensitive Git commands in Vim that load the results in |
|
7 |
+a new tab. The commands infer what you want from the current filename and |
|
8 |
+whether there's a commit hash under the cursor. |
|
9 |
+ |
|
10 |
+These commands are for investigating the history of files. They are: |
|
11 |
+ |
|
12 |
+* `Blame` |
|
13 |
+* `Log` |
|
14 |
+* `Show` and `ShowFile` |
|
15 |
+* `Diff` |
|
16 |
+ |
|
17 |
+This simple plugin is enough to do 95% of the Git dives I do. If you still want |
|
18 |
+to do even more with Git while in Vim, consider Tim Pope's comprehensive |
|
19 |
+[vim-fugitive](https://github.com/tpope/vim-fugitive). |
|
20 |
+ |
|
21 |
+## Installation |
|
22 |
+ |
|
23 |
+Install into Vim's built-in package support: |
|
24 |
+ |
|
25 |
+ mkdir -p ~/.vim/pack/plugins/start |
|
26 |
+ cd ~/.vim/pack/plugins/start |
|
27 |
+ git clone --filter=blob:none -b main --single-branch https://github.com/dblume/gittab |
|
28 |
+ vim -u NONE -c "helptags gittab/doc" -c q |
|
29 |
+ |
|
30 |
+ |
|
31 |
+## Common Use Example |
|
32 |
+ |
|
33 |
+Say you're on "index.html", and you need to know why a section looks the way |
|
34 |
+it does. Run `:Blame` to see a buffer of "git blame" open at the same line |
|
35 |
+where you are so you don't lose any context. |
|
36 |
+ |
|
37 |
+Or run `:Log` to see a list of only the commits that _affect that file_. This |
|
38 |
+is nice in a repo of thousands of commits, but only dozens are to this file. |
|
39 |
+ |
|
40 |
+If you see a commit of interest, move the cursor over it, and type `:Diff` to |
|
41 |
+see what changes were made by that commit, or `:Show` to see the full commit |
|
42 |
+description. |
|
43 |
+ |
|
44 |
+Then you can keep exploring, and each command infers what you want by which |
|
45 |
+type of buffer you're in or what commit your cursor is on. |
|
46 |
+ |
|
47 |
+ |
|
48 |
+## The Commands |
|
49 |
+ |
|
50 |
+When you're browsing a file in a Git repository, these commands provide a very |
|
51 |
+simple and convenient flow for digging into their history. |
|
52 |
+ |
|
53 |
+All you have to know is Blame, Log, Show, and Diff. |
|
54 |
+ |
|
55 |
+The following image is an oversimplification, but shows that with the above |
|
56 |
+four commands, one can easily and quickly navigate various views of a file and |
|
57 |
+its commit history. |
|
58 |
+ |
|
59 |
+![gittab.png](https://dblume.github.io/images/gittab.png) |
|
60 |
+ |
|
61 |
+### :Blame |
|
62 |
+ |
|
63 |
+When you're on a regular file or a `:ShowFile` buffer, opens up a `git blame` |
|
64 |
+buffer in a new tab and positions the cursor at the same relative spot in the |
|
65 |
+Blame buffer. |
|
66 |
+ |
|
67 |
+Example, run Blame on a `:ShowFile` buffer named "git show 1234abcd:README.md", |
|
68 |
+and you get a `:Blame` buffer named "git blame 1234abcd -- README.md". |
|
69 |
+ |
|
70 |
+### :Log |
|
71 |
+ |
|
72 |
+When you're on a regular file or a `:ShowFile` buffer, opens up a `git log` |
|
73 |
+buffer in a new tab for the commits that _affect only that file_. By default, |
|
74 |
+runs log as: |
|
75 |
+ |
|
76 |
+ git log --no-color --graph --date=short --pretty="format:%h %ad %s %an %d" |
|
77 |
+ |
|
78 |
+And you can pass in additional Git arguments like `--all`. |
|
79 |
+ |
|
80 |
+ :Log --all |
|
81 |
+ |
|
82 |
+The reason Log defaults to one-line logs is because `:Show` and `:Diff` are so |
|
83 |
+easy to use to dive in deeper to the individual commits. |
|
84 |
+ |
|
85 |
+Handy arguments are `--all`, `--merges`, `--date-order`, `--first-parent`, and |
|
86 |
+`--ancestry-path`. |
|
87 |
+ |
|
88 |
+### :Show and :ShowFile |
|
89 |
+ |
|
90 |
+These require the cursor to be positioned on a hash, so you'd most likely be |
|
91 |
+in a `:Log` or `:Blame` buffer when you want to use these commands. |
|
92 |
+ |
|
93 |
+When you're on a `:Log` or `:Blame` buffer **`:Show`** opens a buffer in a |
|
94 |
+new tab that shows the full commit message for the hash under the cursor. |
|
95 |
+ |
|
96 |
+**`:ShowFile`** opens a buffer in a new tab that shows the contents of the file |
|
97 |
+at the hash under the cursor. |
|
98 |
+ |
|
99 |
+Ex., If the cursor is on "1234abcd" on `:Blame` buffer `git blame -- README.md` |
|
100 |
+then: |
|
101 |
+ |
|
102 |
+| Command | Resultant Buffer | |
|
103 |
+| --- | --- | |
|
104 |
+| :Show | git show 1234abcd -- README.md | |
|
105 |
+| :ShowFile | git show 1234abcd:README.md | |
|
106 |
+ |
|
107 |
+### :Diff |
|
108 |
+ |
|
109 |
+If you're on a regular file that's different from HEAD, `:Diff` will perform a |
|
110 |
+`git diff` on the file from HEAD. If it's the same as HEAD, then `:Diff` will |
|
111 |
+perform a `git diff` against that file's previous commit. |
|
112 |
+ |
|
113 |
+If the cursor is on a commit hash (as available on :Blame, :Log, and :Show |
|
114 |
+buffers), then `:Diff` will perform a diff against the previous commit to that |
|
115 |
+one. |
|
116 |
+ |
|
117 |
+If the active window is of a `:Diff` buffer, then `:Diff` will perform a |
|
118 |
+`git diff` of that buffer with that revision's parent. |
|
119 |
+ |
|
120 |
+## Is it any good? |
|
121 |
+ |
|
122 |
+[Yes](https://news.ycombinator.com/item?id=3067434). |
|
123 |
+ |
|
124 |
+The diagram was made with [Excalidraw](https://excalidraw.com/). |
|
125 |
+ |
|
126 |
+## Licence |
|
127 |
+ |
|
128 |
+This software uses the [MIT License](https://raw.githubusercontent.com/dblume/gittab/main/LICENSE.txt) |
... | ... |
@@ -0,0 +1,107 @@ |
1 |
+*gittab.txt* Plugin that provides simple Git functions in Vim |
|
2 |
+ |
|
3 |
+ _______ __ ______ __ |
|
4 |
+ / ____(_) /_ /_ __/___ _/ /_ |
|
5 |
+ / / __/ / __/ / / / __ `/ __ \ |
|
6 |
+ / /_/ / / /_ / / / /_/ / /_/ / |
|
7 |
+ \____/_/\__/ /_/ \__,_/_.___/ |
|
8 |
+ |
|
9 |
+============================================================================== |
|
10 |
+Gittab |gittab| |
|
11 |
+Introduction ........................................... |gittab-introduction| |
|
12 |
+Commands ................................................... |gittab-commands| |
|
13 |
+ :Blame ............................................................ |:Blame| |
|
14 |
+ :Log ................................................................ |:Log| |
|
15 |
+ :Show .............................................................. |:Show| |
|
16 |
+ :ShowFile ...................................................... |:ShowFile| |
|
17 |
+ :Diff .............................................................. :|Diff| |
|
18 |
+ |
|
19 |
+ |
|
20 |
+============================================================================== |
|
21 |
+Introduction *gittab* *gittab-introduction* |
|
22 |
+ |
|
23 |
+These are handy context-sensitive Git commands in Vim that load the results in |
|
24 |
+a new tab. The commands automatically infer what you want from the current |
|
25 |
+filename and whether there's a commit hash under the cursor. |
|
26 |
+ |
|
27 |
+These commands are for investigating the history of files. The supported |
|
28 |
+commands are: |
|
29 |
+ |
|
30 |
+ :Blame |
|
31 |
+ :Log |
|
32 |
+ :Show and :ShowFile |
|
33 |
+ :Diff |
|
34 |
+ |
|
35 |
+When you're browsing a file in a Git repository, these commands provide a very |
|
36 |
+simple and convenient flow for digging into their history. |
|
37 |
+ |
|
38 |
+All you have to know is Blame, Log, Show, and Diff. |
|
39 |
+ |
|
40 |
+============================================================================== |
|
41 |
+The Commands *gittab-commands* |
|
42 |
+ |
|
43 |
+:Blame *:Blame* |
|
44 |
+------ |
|
45 |
+ |
|
46 |
+When you're on a regular file or a `:ShowFile` buffer, opens up a "git blame" |
|
47 |
+buffer in a new tab for the file at that commit, and positions the |
|
48 |
+cursor at the same relative spot. |
|
49 |
+ |
|
50 |
+Example, run Blame on a `:ShowFile` buffer named "git show 1234abcd:README.md", |
|
51 |
+and you get a `:Blame` buffer named "git blame 1234abcd -- README.md". |
|
52 |
+ |
|
53 |
+:Log {args} *:Log* |
|
54 |
+----------- |
|
55 |
+ |
|
56 |
+When you're on a regular file or a `:ShowFile` buffer, opens up a git log |
|
57 |
+buffer in a new tab. By default, runs log as: |
|
58 |
+ |
|
59 |
+ git log --no-color --graph --date=short --pretty="format:%h %ad %s %an %d" |
|
60 |
+ |
|
61 |
+And you can pass in additional Git arguments like --all. |
|
62 |
+ |
|
63 |
+ :Log --all |
|
64 |
+ |
|
65 |
+The reason Log defaults to one-line logs is because `:Show` and `:Diff` are so |
|
66 |
+easy to use to dive in deeper to the individual commits. |
|
67 |
+ |
|
68 |
+Handy arguments are --all, --merges, --date-order, --first-parent, and |
|
69 |
+--ancestry-path. |
|
70 |
+ |
|
71 |
+:Show *:Show* |
|
72 |
+----- |
|
73 |
+ |
|
74 |
+These require the cursor to be positioned on a hash, so you'd most likely be |
|
75 |
+in a `:Log` or `:Blame` buffer when you want to use these commands. |
|
76 |
+ |
|
77 |
+When you're on a `:Blame` buffer, a `:Log` buffer, `:Show` opens a |
|
78 |
+buffer in a new tab that shows the full commit message for the hash under the |
|
79 |
+cursor. |
|
80 |
+ |
|
81 |
+:ShowFile *:ShowFile* |
|
82 |
+--------- |
|
83 |
+ |
|
84 |
+`:ShowFile` opens a buffer in a new tab that shows the contents of the file |
|
85 |
+at the hash under the cursor. |
|
86 |
+ |
|
87 |
+Ex., If the cursor is on "1234abcd" on `:Blame` buffer "git blame -- README.md" |
|
88 |
+then: |
|
89 |
+ |
|
90 |
+| Command | Resultant Buffer | |
|
91 |
+| --- | --- | |
|
92 |
+| :Show | git show 1234abcd -- README.md | |
|
93 |
+| :ShowFile | git show 1234abcd:README.md | |
|
94 |
+ |
|
95 |
+:Diff *:Diff* |
|
96 |
+----- |
|
97 |
+ |
|
98 |
+If you're on a regular file that's different from HEAD, `:Diff` will perform a |
|
99 |
+`git diff` on the file from HEAD. If it's the same as HEAD, then `:Diff` will |
|
100 |
+perform a `git diff` against that file's previous commit. |
|
101 |
+ |
|
102 |
+If the cursor is on a commit hash (as available on :Blame, :Log, and :Show |
|
103 |
+buffers), then `:Diff` will perform a diff against the previous commit to that |
|
104 |
+one. |
|
105 |
+ |
|
106 |
+============================================================================== |
|
107 |
+vim:tw=78:sw=4:ts=8:ft=help:norl: |
... | ... |
@@ -0,0 +1,207 @@ |
1 |
+if exists("g:loaded_gittab") || &cp | finish | endif |
|
2 |
+let g:loaded_gittab = 1 |
|
3 |
+ |
|
4 |
+"A helper function that tries to show a buffer if it already exists |
|
5 |
+function! s:ShowBufInNewTab(bufname) |
|
6 |
+ let l:bnr = bufnr(a:bufname) |
|
7 |
+ if l:bnr > 0 |
|
8 |
+ tabnew |
|
9 |
+ exec 'buffer ' . l:bnr |
|
10 |
+ return 1 |
|
11 |
+ endif |
|
12 |
+ return 0 |
|
13 |
+endfunction |
|
14 |
+ |
|
15 |
+"A helper function that tries to show a buffer if it already exists |
|
16 |
+function! s:ShowBufInNewSplit(bufname) |
|
17 |
+ let l:bnr = bufnr(a:bufname) |
|
18 |
+ if l:bnr > 0 |
|
19 |
+" bo vne |
|
20 |
+ vne |
|
21 |
+ exec 'buffer ' . l:bnr |
|
22 |
+ return 1 |
|
23 |
+ endif |
|
24 |
+ return 0 |
|
25 |
+endfunction |
|
26 |
+ |
|
27 |
+function! s:GitBlame(...) |
|
28 |
+ let l:hash = expand('<cword>') |
|
29 |
+ let l:currentView = winsaveview() |
|
30 |
+ let l:args = a:1 |
|
31 |
+ if strlen(l:args) |
|
32 |
+ " Add a space to the end |
|
33 |
+ let l:args = l:args . " " |
|
34 |
+ endif |
|
35 |
+ " If in a Blame window already, do blame for some prior commit |
|
36 |
+ if l:hash =~ '^[0-9a-f]\{7,40}$' && stridx(expand('%'), ' -- ') != -1 |
|
37 |
+ let l:fname = split(expand('%'), ' -- ')[-1] |
|
38 |
+ let l:bufname = 'git blame ' . l:args . l:hash . '^ -- ' . l:fname |
|
39 |
+ if !s:ShowBufInNewTab(l:bufname) |
|
40 |
+ exec 'tabnew | r! git blame ' . l:args . l:hash . '^ -- ' . shellescape(l:fname) |
|
41 |
+ exec 'silent :file ' . fnameescape(l:bufname) |
|
42 |
+ endif |
|
43 |
+ else |
|
44 |
+ let l:fname = expand('%') |
|
45 |
+ let l:hash = '' |
|
46 |
+ " Show fnames will have ':' in them. |
|
47 |
+ if stridx(l:fname, ':') != -1 |
|
48 |
+ let l:fname_parts = split(l:fname, ':') |
|
49 |
+ let l:fname = l:fname_parts[-1] |
|
50 |
+ let l:hash = split(l:fname_parts[0], ' ')[-1] |
|
51 |
+ endif |
|
52 |
+ if strlen(l:hash) |
|
53 |
+ let l:bufname = 'git blame ' . l:args . l:hash . ' -- ' . l:fname |
|
54 |
+ if !s:ShowBufInNewTab(l:bufname) |
|
55 |
+ exec 'tabnew | r! git blame ' . l:args . l:hash . ' -- ' . shellescape(l:fname) |
|
56 |
+ exec 'silent :file ' . fnameescape(l:bufname) |
|
57 |
+ endif |
|
58 |
+ else |
|
59 |
+ let l:bufname = 'git blame ' . l:args . '-- ' . l:fname |
|
60 |
+ if !s:ShowBufInNewTab(l:bufname) |
|
61 |
+ exec 'tabnew | r! git blame ' . l:args . '-- ' . shellescape(l:fname) |
|
62 |
+ exec 'silent :file ' . fnameescape(l:bufname) |
|
63 |
+ endif |
|
64 |
+ endif |
|
65 |
+ endif |
|
66 |
+ 0d_ |
|
67 |
+ call winrestview(l:currentView) |
|
68 |
+ setl buftype=nofile |
|
69 |
+endfunction |
|
70 |
+command -nargs=* Blame :call s:GitBlame(<q-args>) |
|
71 |
+ |
|
72 |
+function! s:GitShow(commit_or_file, ...) |
|
73 |
+ let l:fname = expand('%') |
|
74 |
+ let l:hash = expand('<cword>') |
|
75 |
+ if l:hash =~ '^[0-9a-f]\{7,40}$' |
|
76 |
+ if stridx(l:fname, ' -- ') != -1 |
|
77 |
+ let l:fname = split(l:fname, ' -- ')[-1] |
|
78 |
+ endif |
|
79 |
+ let l:args = a:1 |
|
80 |
+ if strlen(l:args) |
|
81 |
+ " Add a space to the end |
|
82 |
+ let l:args = l:args . " " |
|
83 |
+ endif |
|
84 |
+ if a:commit_or_file != "file" |
|
85 |
+ let l:bufname = 'git show ' . l:args . l:hash . ' -- ' . l:fname |
|
86 |
+ if !s:ShowBufInNewTab(l:bufname) |
|
87 |
+ " Have Show show all the affected files, so don't actually use "--" |
|
88 |
+ " exec 'tabnew | r! git show ' . l:hash . ' -- ' . shellescape(l:fname) |
|
89 |
+ exec 'tabnew | r! git show ' . l:args . l:hash |
|
90 |
+ " We lie here (' -- ') to have a filename the other git commands can use. |
|
91 |
+ exec 'silent :file ' . fnameescape(l:bufname) |
|
92 |
+ endif |
|
93 |
+ 0d_ |
|
94 |
+ else |
|
95 |
+ let l:currentView = winsaveview() |
|
96 |
+ let l:bufname = 'git show ' . l:args . l:hash . ':' . l:fname |
|
97 |
+ if !s:ShowBufInNewTab(l:bufname) |
|
98 |
+ exec 'tabnew | r! git show ' . l:args. l:hash . ':' . shellescape(l:fname) |
|
99 |
+ exec 'silent :file ' . fnameescape(l:bufname) |
|
100 |
+ endif |
|
101 |
+ 0d_ |
|
102 |
+ call winrestview(l:currentView) |
|
103 |
+ endif |
|
104 |
+ setl buftype=nofile |
|
105 |
+ else |
|
106 |
+ echo l:hash . ' is not a git hash.' |
|
107 |
+ endif |
|
108 |
+endfunction |
|
109 |
+command -nargs=* Show :call s:GitShow("commit", <q-args>) |
|
110 |
+command -nargs=* ShowFile :call s:GitShow("file", <q-args>) |
|
111 |
+ |
|
112 |
+function! s:GitDiff() |
|
113 |
+ let l:fname = expand('%:.') |
|
114 |
+ let l:buf = winbufnr(0) |
|
115 |
+ let l:commit = 'HEAD' |
|
116 |
+ let l:hash = expand('<cword>') |
|
117 |
+ let l:currentView = winsaveview() |
|
118 |
+ |
|
119 |
+ " If the current word is a hash, then diff that vs. previous |
|
120 |
+ if l:hash =~ '^[0-9a-f]\{7,40}$' && stridx(expand('%'), ' -- ') != -1 |
|
121 |
+ let l:fname = split(expand('%'), ' -- ')[-1] |
|
122 |
+ let l:bufname = 'git show ' . l:hash . '^:' . l:fname |
|
123 |
+ if !s:ShowBufInNewTab(l:bufname) |
|
124 |
+ exec ':tabnew | silent r! git show ' . l:hash . '^:$(git rev-parse --show-prefix)' . shellescape(l:fname) |
|
125 |
+ setl buftype=nofile |
|
126 |
+ 0d_ |
|
127 |
+ exec 'silent :file ' . fnameescape(l:bufname) |
|
128 |
+ endif |
|
129 |
+ |
|
130 |
+ let l:bufname = 'git show ' . l:hash . ':' . l:fname |
|
131 |
+ if !s:ShowBufInNewSplit(l:bufname) |
|
132 |
+ exec 'vne | silent r! git show ' . l:hash . ':$(git rev-parse --show-prefix)' . shellescape(l:fname) |
|
133 |
+ setl buftype=nofile |
|
134 |
+ exec 'silent :file ' . fnameescape(l:bufname) |
|
135 |
+ 0d_ |
|
136 |
+ endif |
|
137 |
+ elseif stridx(expand('%'), ':') != -1 |
|
138 |
+ " If we're in a 'git show' buffer, then extract fname and hash from there |
|
139 |
+ let l:fname_parts = split(l:fname, ':') |
|
140 |
+ let l:fname = l:fname_parts[-1] |
|
141 |
+ let l:hash = split(l:fname_parts[0], ' ')[-1] |
|
142 |
+ " TODO: Below few lines are identical to above, so remove dupes. |
|
143 |
+ let l:bufname = 'git show ' . l:hash . '^:' . l:fname |
|
144 |
+ if !s:ShowBufInNewTab(l:bufname) |
|
145 |
+ exec ':tabnew | silent r! git show ' . l:hash . '^:$(git rev-parse --show-prefix)' . shellescape(l:fname) |
|
146 |
+ setl buftype=nofile |
|
147 |
+ 0d_ |
|
148 |
+ exec 'silent :file ' . fnameescape(l:bufname) |
|
149 |
+ endif |
|
150 |
+ |
|
151 |
+ let l:bufname = 'git show ' . l:hash . ':' . l:fname |
|
152 |
+ if !s:ShowBufInNewSplit(l:bufname) |
|
153 |
+ exec 'vne | silent r! git show ' . l:hash . ':$(git rev-parse --show-prefix)' . shellescape(l:fname) |
|
154 |
+ setl buftype=nofile |
|
155 |
+ exec 'silent :file ' . fnameescape(l:bufname) |
|
156 |
+ 0d_ |
|
157 |
+ endif |
|
158 |
+ else |
|
159 |
+ " If the buffer is not different then repo, then diff HEAD vs file's previous commit |
|
160 |
+ let l:o = system("git status --porcelain | grep " . l:fname) |
|
161 |
+ if v:shell_error != 0 |
|
162 |
+ let l:commit = system('git log -2 --pretty=format:"%h" -- ' . l:fname . ' | tail -n 1') |
|
163 |
+ endif |
|
164 |
+ |
|
165 |
+ let l:bufname = 'git show ' . l:commit . ':' . l:fname |
|
166 |
+ " Bug if l:filename includes ".." |
|
167 |
+ if !s:ShowBufInNewTab(l:bufname) |
|
168 |
+ exec ':tabnew | r! git show ' . l:commit . ':$(git rev-parse --show-prefix)' . l:fname |
|
169 |
+ setl buftype=nofile |
|
170 |
+ 0d_ |
|
171 |
+ exec 'silent :file ' . fnameescape(l:bufname) |
|
172 |
+ endif |
|
173 |
+ exec 'vert sb '.l:buf |
|
174 |
+ endif |
|
175 |
+ call winrestview(l:currentView) |
|
176 |
+ windo diffthis |
|
177 |
+ setl buftype=nofile |
|
178 |
+ wincmd r |
|
179 |
+ wincmd l |
|
180 |
+endfunction |
|
181 |
+command Diff :call s:GitDiff() |
|
182 |
+ |
|
183 |
+function! s:GitLog(...) |
|
184 |
+ let l:fname = expand('%') |
|
185 |
+ if stridx(l:fname, ' -- ') != -1 |
|
186 |
+ let l:fname = split(l:fname, ' -- ')[-1] |
|
187 |
+ elseif stridx(l:fname, ':') != -1 |
|
188 |
+ let l:fname = split(l:fname, ':')[-1] |
|
189 |
+ endif |
|
190 |
+ let l:args = a:1 |
|
191 |
+ if strlen(l:args) |
|
192 |
+ " Add a space to the end |
|
193 |
+ let l:args = l:args . " " |
|
194 |
+ endif |
|
195 |
+ let l:bufname = 'git log ' . l:args . '-- ' . l:fname |
|
196 |
+ if !s:ShowBufInNewTab(l:bufname) |
|
197 |
+ exec 'tabnew | r! git log --no-color --graph --date=short ' . l:args . '--pretty="format:\%h \%ad \%s \%an \%d" -- ' . shellescape(l:fname) |
|
198 |
+ setl buftype=nofile |
|
199 |
+ 0d_ |
|
200 |
+ exec 'silent :file ' . fnameescape(l:bufname) |
|
201 |
+ endif |
|
202 |
+endfunction |
|
203 |
+ |
|
204 |
+" Handy arguments are --all, --merges, --date-order, --first-parent, --ancestry-path |
|
205 |
+command -nargs=* Log :call s:GitLog(<q-args>) |
|
206 |
+ |
|
207 |
+" vim:set ft=vim sw=4 sts=4 et: |
... | ... |
@@ -47,16 +47,21 @@ See [config.dlma.com](http://config.dlma.com) for more. |
47 | 47 |
4. [visual-star-search](http://got-ravings.blogspot.com/2008/07/vim-pr0n-visual-search-mappings.html), so * and # work in visual mode too. |
48 | 48 |
5. [git-tab](https://github.com/dblume/gittab), use integrated context-sensitive git commands |
49 | 49 |
6. Assorted favorite colors like [desert](https://github.com/dblume/desert.vim). |
50 |
-3. .gitconfig and .gitignore |
|
51 |
-4. .tmux.conf |
|
52 |
-5. .inputrc, for vi mode and a [partially matched command history traversal](http://askubuntu.com/questions/59846/bash-history-search-partial-up-arrow/59855#59855). |
|
53 |
-6. .editrc, for vi mode and tab word completion in macOS. |
|
54 |
-7. .ssh/config, for a [fix for CVE-2016-0777](https://news.ycombinator.com/item?id=10901588). (Or upgrade to OpenSSH 7.1p2 released Jan 14, 2016 from http://www.openssh.com.) |
|
55 |
-8. .ripgreprc, for ripgrep, or [rg](https://github.com/BurntSushi/ripgrep/). |
|
56 |
-9. .gdbinit |
|
57 |
-10. .visidatarc, to hide [visidata's](https://www.visidata.org/) menu at the top, for the old school UI. |
|
58 |
-11. .config/gitui/key\_bindings.ron, for vim key bindings in [gitui](https://github.com/extrawurst/gitui). |
|
59 |
-11. [i3](https://i3wm.org/) configs. |
|
50 |
+3. Neovim resources |
|
51 |
+ 1. .config/nvim/init.vim |
|
52 |
+ 2. An empty .nvim\_undo directory |
|
53 |
+ 3. .config/nvim/colors/nvim\_desert.vim |
|
54 |
+ 4. .local/share/nvim/site/plugin/ plugins |
|
55 |
+4. .gitconfig and .gitignore |
|
56 |
+5. .tmux.conf |
|
57 |
+6. .inputrc, for vi mode and a [partially matched command history traversal](http://askubuntu.com/questions/59846/bash-history-search-partial-up-arrow/59855#59855). |
|
58 |
+7. .editrc, for vi mode and tab word completion in macOS. |
|
59 |
+8. .ssh/config, for a [fix for CVE-2016-0777](https://news.ycombinator.com/item?id=10901588). (Or upgrade to OpenSSH 7.1p2 released Jan 14, 2016 from http://www.openssh.com.) |
|
60 |
+9. .ripgreprc, for ripgrep, or [rg](https://github.com/BurntSushi/ripgrep/). |
|
61 |
+10. .gdbinit |
|
62 |
+11. .visidatarc, to hide [visidata's](https://www.visidata.org/) menu at the top, for the old school UI. |
|
63 |
+12. .config/gitui/key\_bindings.ron, for vim key bindings in [gitui](https://github.com/extrawurst/gitui). |
|
64 |
+13. [i3](https://i3wm.org/) configs. |
|
60 | 65 |
|
61 | 66 |
#### Optional manual steps for fresh setups |
62 | 67 |
|
... | ... |
@@ -7,7 +7,8 @@ declare -a dotfiles=(".bashrc" ".bash_profile" ".vimrc" ".editrc" ".gitconfig" |
7 | 7 |
".gitignore" ".inputrc" ".tmux.conf" ".ssh/config" ".ripgreprc" |
8 | 8 |
".gdbinit" ".config/gitui/key_bindings.ron" ".visidatarc" |
9 | 9 |
".config/i3/config" ".config/i3status/config" |
10 |
- ".config/dunst/dunstrc") |
|
10 |
+ ".config/dunst/dunstrc" ".config/nvim/init.vim" |
|
11 |
+ ".config/nvim/colors/nvim_desert.vim") |
|
11 | 12 |
declare -i dry_run=0 |
12 | 13 |
|
13 | 14 |
## exit the shell (with status 2) after printing the message |
... | ... |
@@ -88,10 +89,30 @@ else |
88 | 89 |
echo No change to the .vim/ directories. |
89 | 90 |
fi |
90 | 91 |
|
91 |
-# Make a directory for vim undo |
|
92 |
+# TODO: Neovim's plugins go in ~/.local/share/nvim/site/plugin/ |
|
93 |
+# https://neovim.io/doc/user/usr_05.html |
|
94 |
+if ! diff -qr "$HOME"/.local/share/nvim/site/plugin .local/share/nvim/site/plugin > /dev/null ; then |
|
95 |
+ if [ $dry_run -eq 0 ]; then |
|
96 |
+ if [ -d "$HOME"/.local/share/nvim/site/plugin/ ]; then |
|
97 |
+ mkdir -p "${backup_dir}"/.local/share/nvim/site/plugin |
|
98 |
+ mv "$HOME"/.local/share/nvim/site/plugin/* "${backup_dir}"/.local/share/nvim/site/plugin/ |
|
99 |
+ else |
|
100 |
+ mkdir -p "$HOME"/.local/share/nvim/site/plugin |
|
101 |
+ fi |
|
102 |
+ cp -r .local/share/nvim/site/plugin/* "$HOME"/.local/share/nvim/site/plugin/ |
|
103 |
+ fi |
|
104 |
+ echo Check the plugins in .local/share/nvim/site/plugin/ |
|
105 |
+else |
|
106 |
+ echo No change to the .local/share/nvim/site/plugin/ directories. |
|
107 |
+fi |
|
108 |
+ |
|
109 |
+# Make a directory for vim and neovim undo |
|
92 | 110 |
if [ ! -d "$HOME"/.vim_undo ]; then |
93 | 111 |
((dry_run==0)) && mkdir -p "$HOME"/.vim_undo |
94 | 112 |
fi |
113 |
+if [ ! -d "$HOME"/.nvim_undo ]; then |
|
114 |
+ ((dry_run==0)) && mkdir -p "$HOME"/.nvim_undo |
|
115 |
+fi |
|
95 | 116 |
|
96 | 117 |
# I have device local secrets in .localrc and a github secret in .gitconfig.local |
97 | 118 |
for i in ".gitconfig.local" ".localrc" |
98 | 119 |