Skip to content

Commit

Permalink
Add support for fish shell
Browse files Browse the repository at this point in the history
The `&&` and the `||` operators aren't available in fish.
The equivalents are `; and` and `; or`.
Also single parentheses are used for command substitution.
The fish equivalents are `begin` and `end`.
But they aren't needed here.
  • Loading branch information
Manuel Johannes Messner authored and airblade committed Aug 17, 2015
1 parent fe10e64 commit 0ca15c8
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 10 deletions.
29 changes: 20 additions & 9 deletions autoload/gitgutter/diff.vim
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,21 @@ let s:hunk_re = '^@@ -\(\d\+\),\?\(\d*\) +\(\d\+\),\?\(\d*\) @@'


function! gitgutter#diff#run_diff(realtime, use_external_grep)
" Wrap compound commands in parentheses to make Windows happy.
let cmd = '('
" Detect whether user uses fish shell
let l:fish = &shell =~# 'fish'

if !l:fish
" Wrap compound commands in parentheses to make Windows happy.
let cmd = '('
else
let cmd = ''
end

let bufnr = gitgutter#utility#bufnr()
let tracked = getbufvar(bufnr, 'gitgutter_tracked') " i.e. tracked by git
if !tracked
let cmd .= 'git ls-files --error-unmatch '.gitgutter#utility#shellescape(gitgutter#utility#filename()).' && ('
let cmd .= 'git ls-files --error-unmatch '.gitgutter#utility#shellescape(gitgutter#utility#filename())
let cmd .= l:fish ? '; and ' : ' && ('
endif

if a:realtime
Expand All @@ -29,7 +37,8 @@ function! gitgutter#diff#run_diff(realtime, use_external_grep)
let blob_file .= '.'.extension
let buff_file .= '.'.extension
endif
let cmd .= 'git show '.blob_name.' > '.blob_file.' && '
let cmd .= 'git show '.blob_name.' > '.blob_file
let cmd .= l:fish ? '; and ' : ' && '

" Writing the whole buffer resets the '[ and '] marks and also the
" 'modified' flag (if &cpoptions includes '+'). These are unwanted
Expand Down Expand Up @@ -61,14 +70,16 @@ function! gitgutter#diff#run_diff(realtime, use_external_grep)
" differences are found. However we want to treat non-matches and
" differences as non-erroneous behaviour; so we OR the command with one
" which always exits with success (0).
let cmd.= ' || exit 0'
let cmd.= l:fish ? '; or exit 0' : ' || exit 0'
endif

let cmd .= ')'

if !tracked
if !l:fish
let cmd .= ')'
endif

if !tracked
let cmd .= ')'
endif
end

let diff = gitgutter#utility#system(gitgutter#utility#command_in_directory_of_file(cmd))

Expand Down
3 changes: 2 additions & 1 deletion autoload/gitgutter/utility.vim
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,8 @@ function! gitgutter#utility#file_relative_to_repo_root()
endfunction

function! gitgutter#utility#command_in_directory_of_file(cmd)
return 'cd ' . gitgutter#utility#shellescape(gitgutter#utility#directory_of_file()) . ' && ' . a:cmd
let l:fish = &shell =~# 'fish'
return 'cd ' . gitgutter#utility#shellescape(gitgutter#utility#directory_of_file()) . (l:fish ? '; and ' : ' && ') . a:cmd
endfunction

function! gitgutter#utility#highlight_name_for_change(text)
Expand Down

0 comments on commit 0ca15c8

Please sign in to comment.