dblume commited on 2023-06-17 22:46:13
Showing 1 changed files, with 33 additions and 6 deletions.
| ... | ... |
@@ -145,18 +145,36 @@ nmap <leader>o :call OpenCurrentAsNewTab()<CR> |
| 145 | 145 |
|
| 146 | 146 |
" git blame, show, diff and log |
| 147 | 147 |
" Delete these functions when you install https://github.com/tpope/vim-fugitive |
| 148 |
+ |
|
| 149 |
+"A helper function that tries to show a buffer if it already exists |
|
| 150 |
+function! ShowBufInNewTab(bufname) |
|
| 151 |
+ let l:bnr = bufnr(a:bufname) |
|
| 152 |
+ if l:bnr > 0 |
|
| 153 |
+ tabnew |
|
| 154 |
+ exec 'buffer ' . l:bnr |
|
| 155 |
+ return 1 |
|
| 156 |
+ endif |
|
| 157 |
+ return 0 |
|
| 158 |
+endfunction |
|
| 159 |
+ |
|
| 148 | 160 |
function! GitBlame() |
| 149 | 161 |
let l:hash = expand('<cword>')
|
| 150 | 162 |
let l:currentView = winsaveview() |
| 151 |
- " If in a Blame window already, do blame for previous commit |
|
| 163 |
+ " If in a Blame window already, do blame for some prior commit |
|
| 152 | 164 |
if l:hash =~ '^[0-9a-f]\{7,40}$' && stridx(expand('%'), ' -- ') != -1
|
| 153 | 165 |
let l:fname = split(expand('%'), ' -- ')[-1]
|
| 166 |
+ let l:bufname = 'git blame ' . l:hash . '^ -- ' . l:fname |
|
| 167 |
+ if !ShowBufInNewTab(l:bufname) |
|
| 154 | 168 |
exec 'tabnew | r! git blame ' . l:hash . '^ -- ' . shellescape(l:fname) |
| 155 |
- exec 'silent :file git blame ' . l:hash . '^ -- ' . l:fname |
|
| 169 |
+ exec 'silent :file ' . l:bufname |
|
| 170 |
+ endif |
|
| 156 | 171 |
else |
| 157 | 172 |
let l:fname = expand('%')
|
| 173 |
+ let l:bufname = 'git blame -- ' . l:fname |
|
| 174 |
+ if !ShowBufInNewTab(l:bufname) |
|
| 158 | 175 |
exec 'tabnew | r! git blame -- ' . shellescape(l:fname) |
| 159 |
- exec 'silent :file git blame -- ' . l:fname |
|
| 176 |
+ exec 'silent :file ' . l:bufname |
|
| 177 |
+ endif |
|
| 160 | 178 |
endif |
| 161 | 179 |
0d_ |
| 162 | 180 |
call winrestview(l:currentView) |
| ... | ... |
@@ -172,14 +190,20 @@ function! GitShow(commit_or_file) |
| 172 | 190 |
let l:fname = split(l:fname, ' -- ')[-1] |
| 173 | 191 |
endif |
| 174 | 192 |
if a:commit_or_file != "file" |
| 193 |
+ let l:bufname = 'git show ' . l:hash . ' -- ' . l:fname |
|
| 194 |
+ if !ShowBufInNewTab(l:bufname) |
|
| 175 | 195 |
" Have Show show all the affected files, so don't actually use "--" |
| 176 | 196 |
" exec 'tabnew | r! git show ' . l:hash . ' -- ' . shellescape(l:fname) |
| 177 | 197 |
exec 'tabnew | r! git show ' . l:hash |
| 178 | 198 |
" We lie here (' -- ') to have a filename the other git commands can use.
|
| 179 |
- exec 'silent :file git show ' . l:hash . ' -- ' . l:fname |
|
| 199 |
+ exec 'silent :file ' . l:bufname |
|
| 200 |
+ endif |
|
| 180 | 201 |
else |
| 202 |
+ let l:bufname = 'git show ' . l:hash . ':' . l:fname |
|
| 203 |
+ if !ShowBufInNewTab(l:bufname) |
|
| 181 | 204 |
exec 'tabnew | r! git show ' . l:hash . ':' . shellescape(l:fname) |
| 182 |
- exec 'silent :file git show ' . l:hash . ':' . l:fname |
|
| 205 |
+ exec 'silent :file ' . l:bufname |
|
| 206 |
+ endif |
|
| 183 | 207 |
endif |
| 184 | 208 |
setl buftype=nofile |
| 185 | 209 |
0d_ |
| ... | ... |
@@ -234,10 +258,13 @@ function! GitLog() |
| 234 | 258 |
if stridx(l:fname, ' -- ') != -1 |
| 235 | 259 |
let l:fname = split(l:fname, ' -- ')[-1] |
| 236 | 260 |
endif |
| 261 |
+ let l:bufname = 'git log1 -- ' . l:fname |
|
| 262 |
+ if !ShowBufInNewTab(l:bufname) |
|
| 237 | 263 |
exec 'tabnew | r! git log1 -- ' . shellescape(l:fname) |
| 238 | 264 |
setl buftype=nofile |
| 239 | 265 |
0d_ |
| 240 |
- exec 'silent :file git log1 -- ' . l:fname |
|
| 266 |
+ exec 'silent :file ' . l:bufname |
|
| 267 |
+ endif |
|
| 241 | 268 |
endfunction |
| 242 | 269 |
command Log :call GitLog() |
| 243 | 270 |
|
| 244 | 271 |