dblume commited on 2023-04-26 10:28:31
Showing 1 changed files, with 29 additions and 7 deletions.
Now Blame, Show, Diff and Log all work together a little better. If the current word is a git hash then: * Blame: Will "git blame <hash>^ -- filename" * Diff: Will diff that commit with the previous one. This works even if running on a Log or Show window.
... | ... |
@@ -1,4 +1,4 @@ |
1 |
-" Version 2022-03-10.1 - Use Quickfix for cscope, add OpenCurrentAsNewTab |
|
1 |
+" Version 2023-04-26.1 - Harmonize the git commands for common recipes |
|
2 | 2 |
set nocompatible " Use Vim defaults, forget compatibility with vi. |
3 | 3 |
set bs=2 " allow backspacing over everything in insert mode |
4 | 4 |
set wildmenu " Allows command-line completion with tab |
... | ... |
@@ -149,7 +149,7 @@ function! GitBlame() |
149 | 149 |
let l:hash = expand('<cword>') |
150 | 150 |
let l:currentView = winsaveview() |
151 | 151 |
" If in a Blame window already, do blame for previous commit |
152 |
- if l:hash =~ '^[0-9a-f]\{8,40}$' && stridx(expand('%'), ' -- ') != -1 |
|
152 |
+ if l:hash =~ '^[0-9a-f]\{7,40}$' && stridx(expand('%'), ' -- ') != -1 |
|
153 | 153 |
let l:fname = split(expand('%'), ' -- ')[-1] |
154 | 154 |
exec 'tabnew | r! git blame ' . l:hash . '^ -- ' . shellescape(l:fname) |
155 | 155 |
exec 'silent :file git blame ' . l:hash . '^ -- ' . l:fname |
... | ... |
@@ -165,12 +165,19 @@ endfunction |
165 | 165 |
command Blame :call GitBlame() |
166 | 166 |
|
167 | 167 |
function! GitShow() |
168 |
+ let l:fname = expand('%') |
|
168 | 169 |
let l:hash = expand('<cword>') |
169 |
- if l:hash =~ '^[0-9a-f]\{8,40}$' |
|
170 |
+ if l:hash =~ '^[0-9a-f]\{7,40}$' |
|
171 |
+ if stridx(l:fname, ' -- ') != -1 |
|
172 |
+ let l:fname = split(l:fname, ' -- ')[-1] |
|
173 |
+ endif |
|
174 |
+ " Have Show show all the affected files, so don't actually use "--" |
|
175 |
+ " exec 'tabnew | r! git show ' . l:hash . ' -- ' . shellescape(l:fname) |
|
170 | 176 |
exec 'tabnew | r! git show ' . l:hash |
171 | 177 |
setl buftype=nofile |
172 | 178 |
0d_ |
173 |
- exec 'silent :file git show ' . l:hash |
|
179 |
+ " We lie here (' -- ') to have a filename the other git commands can use. |
|
180 |
+ exec 'silent :file git show ' . l:hash . ' -- ' . l:fname |
|
174 | 181 |
else |
175 | 182 |
echo l:hash . ' is not a git hash.' |
176 | 183 |
endif |
... | ... |
@@ -181,7 +188,21 @@ function! GitDiff() |
181 | 188 |
let l:fname = expand('%:.') |
182 | 189 |
let l:buf = winbufnr(0) |
183 | 190 |
let l:commit = 'HEAD' |
191 |
+ let l:hash = expand('<cword>') |
|
192 |
+ |
|
193 |
+ " If the current word is a hash, then diff that vs. previous |
|
194 |
+ if l:hash =~ '^[0-9a-f]\{7,40}$' && stridx(expand('%'), ' -- ') != -1 |
|
195 |
+ let l:fname = split(expand('%'), ' -- ')[-1] |
|
196 |
+ exec ':tabnew | silent r! git show ' . l:hash . '^:$(git rev-parse --show-prefix)' . shellescape(l:fname) |
|
197 |
+ setl buftype=nofile |
|
198 |
+ 0d_ |
|
199 |
+ exec 'silent :file git show '.l:hash .'^:' . l:fname |
|
184 | 200 |
|
201 |
+ exec 'vne | silent r! git show ' . l:hash . ':$(git rev-parse --show-prefix)' . shellescape(l:fname) |
|
202 |
+ setl buftype=nofile |
|
203 |
+ exec 'silent :file git show '.l:hash.':' . l:fname |
|
204 |
+ 0d_ |
|
205 |
+ else |
|
185 | 206 |
" If the buffer is not different then repo, then diff HEAD vs file's previous commit |
186 | 207 |
let l:o = system("git status --porcelain | grep " . l:fname) |
187 | 208 |
if v:shell_error != 0 |
... | ... |
@@ -194,6 +215,7 @@ function! GitDiff() |
194 | 215 |
0d_ |
195 | 216 |
exec 'silent :file git show '.l:commit.':' . l:fname |
196 | 217 |
exec 'vert sb '.l:buf |
218 |
+ endif |
|
197 | 219 |
windo diffthis |
198 | 220 |
setl buftype=nofile |
199 | 221 |
wincmd r |
... | ... |
@@ -202,11 +224,11 @@ endfunction |
202 | 224 |
command Diff :call GitDiff() |
203 | 225 |
|
204 | 226 |
function! GitLog() |
205 |
- let l:fname = expand('%:t') |
|
206 |
- exec 'tabnew | r! git log1 -- ' . shellescape(expand('%')) |
|
227 |
+ let l:fname = expand('%') |
|
228 |
+ exec 'tabnew | r! git log1 -- ' . shellescape(l:fname) |
|
207 | 229 |
setl buftype=nofile |
208 | 230 |
0d_ |
209 |
- exec 'silent :file git log1 ' . l:fname |
|
231 |
+ exec 'silent :file git log1 -- ' . l:fname |
|
210 | 232 |
endfunction |
211 | 233 |
command Log :call GitLog() |
212 | 234 |
|
213 | 235 |