@@ -390,7 +390,7 @@ function! s:OpenChangedFile()
390390 execute ' e ' .s: GetAbsolutePath (file )
391391endfunction
392392
393- function ! s: CanShowDiff (file_regexp )
393+ function ! s: CanShowDiff ()
394394 if mode () != ' n'
395395 return 0
396396 endif
@@ -401,7 +401,7 @@ function! s:CanShowDiff(file_regexp)
401401 return 0
402402 endif
403403
404- let file = s: GetCurrentMatchstr (a : file_regexp )
404+ let file = s: GetCurrentMatchstr (s : file_regexp )
405405 let num = s: GetBufWinnr (s: diff_buffer )
406406 if empty (file ) && num == -1
407407 return 0
@@ -411,12 +411,13 @@ function! s:CanShowDiff(file_regexp)
411411endfunction
412412
413413function ! s: ShowDiffOnChangelist ()
414- if ! s: CanShowDiff (s: file_regexp )
414+ if ! s: CanShowDiff ()
415415 return
416416 endif
417417
418418 let file = s: GetCurrentFile ()
419419 " Avoid E242
420+ echom ' show ' .file
420421 try
421422 call s: OpenBuffer (s: diff_buffer , ' vertical' )
422423 call s: SetupDiffBuffer (s: GetAbsolutePath (file ))
@@ -505,7 +506,7 @@ function! VimProjectAddChangeDetails(job, data, ...)
505506endfunction
506507
507508function ! s: ShowDiffOnGitLog (hash)
508- if ! s: CanShowDiff (s: file_regexp )
509+ if ! s: CanShowDiff ()
509510 return
510511 endif
511512 let file = s: GetCurrentFile ()
@@ -760,11 +761,11 @@ function! s:RenameFolder()
760761 echo
761762endfunction
762763
763- function ! s: GetShelfFolder (name )
764+ function ! s: GetShelfFolder ()
764765 let config_home = project#GetVariable (' config_home' )
765766 let project = project#GetVariable (' project' )
766767 let config = project#GetProjectConfigPath (config_home, project)
767- return config.' /shelf/' . a: name
768+ return config.' /shelf/'
768769endfunction
769770
770771function ! s: ShelfFile () range
@@ -781,18 +782,26 @@ function! s:ShelfFile() range
781782
782783 let name = input (' Shelf [' .join (files , ' , ' ).' ] to: ' )
783784 if ! empty (name)
784- let folder = s: GetShelfFolder (name)
785+ let folder = s: GetShelfFolder ().name
785786 if ! isdirectory (folder) && exists (' *mkdir' )
786787 call mkdir (folder, ' p' )
787788 endif
788789
789790 for file in files
790791 let cmd = ' git diff "' .file .' " > ' .folder.' /' .file .' .patch'
791- " echom cmd
792792 call project#RunShellCmd (cmd)
793793 if v: shell_error
794794 return
795795 endif
796+
797+ let patch_files = map (files , {idx, v - > v .' .patch' })
798+ let target = {
799+ \' name' : ' [Shelf] '.name,
800+ \' files ': patch_files,
801+ \' expand ': 1
802+ \}
803+
804+ call add (s: changelist , target)
796805 call s: ShowStatus (1 )
797806 call s: CloseBuffer (s: diff_buffer )
798807 endfor
@@ -861,6 +870,8 @@ function! VimProjectAllFolderNames(A, L, P)
861870 let folder_names = map (copy (s: changelist ), {idx, v - > v .name})
862871 call filter (folder_names, {idx, v - >
863872 \v != s: untracked_folder_name
873+ \& & v != s: unmerged_folder_name
874+ \& & v != s: staged_folder_name
864875 \& & v != folder.name
865876 \& & v = ~ a: A
866877 \} )
@@ -1043,6 +1054,10 @@ function! s:GetPrefixAndSuffix(folder)
10431054 endif
10441055 endfor
10451056
1057+ if has_key (a: folder , ' is_shelf' )
1058+ let file_num = len (a: folder .files )
1059+ endif
1060+
10461061 if ! file_num
10471062 let prefix = empty
10481063 elseif file_num == 1
@@ -1065,36 +1080,36 @@ function! s:UpdatePresetChangelist()
10651080 call add (unmerged_folder.files , s: GetFilename (file ))
10661081 endfor
10671082
1068- let default_folder = s: changelist [ 0 ]
1069- let default_folder .files = []
1070- for file in ( s: changed_files + s: untracked_files)
1083+ let untracked_folder = s: FindUntrackedFolder ()
1084+ let untracked_folder .files = []
1085+ for file in s: untracked_files
10711086 let included = 0
10721087 for folder in s: changelist
1073- if s: IsStagedFolder (folder)
1074- continue
1075- endif
10761088 if s: HasFile (folder.files , file )
10771089 let included = 1
10781090 endif
10791091 endfor
10801092
10811093 if ! included
1082- call add (default_folder .files , s: GetFilename (file ))
1094+ call add (untracked_folder .files , s: GetFilename (file ))
10831095 endif
10841096 endfor
10851097
1086- let untracked_folder = s: FindUntrackedFolder ()
1087- let untracked_folder .files = []
1088- for file in s: untracked_files
1098+ let default_folder = s: changelist [ 0 ]
1099+ let default_folder .files = []
1100+ for file in ( s: changed_files + s: untracked_files)
10891101 let included = 0
10901102 for folder in s: changelist
1103+ if s: IsStagedFolder (folder)
1104+ continue
1105+ endif
10911106 if s: HasFile (folder.files , file )
10921107 let included = 1
10931108 endif
10941109 endfor
10951110
10961111 if ! included
1097- call add (untracked_folder .files , s: GetFilename (file ))
1112+ call add (default_folder .files , s: GetFilename (file ))
10981113 endif
10991114 endfor
11001115
@@ -1105,6 +1120,45 @@ function! s:UpdatePresetChangelist()
11051120 endfor
11061121endfunction
11071122
1123+ function ! s: UpdateFolderOrNew (name, files )
1124+ for folder in s: changelist
1125+ if folder.name == a: name
1126+ let folder.files = a: files
1127+ return
1128+ endif
1129+ endfor
1130+
1131+ let new = {
1132+ \ ' name' : a: name ,
1133+ \ ' files' : a: files ,
1134+ \ ' expand' : 0 ,
1135+ \ ' is_shelf' : 1 ,
1136+ \}
1137+
1138+ call add (s: changelist , new )
1139+ endfunction
1140+
1141+ function ! s: IsShelfFolder (folder)
1142+ return has_key (a: folder , ' is_shelf' )
1143+ endfunction
1144+
1145+ function ! s: UpdateShelfChangelist ()
1146+ let shelf_folder = s: GetShelfFolder ()
1147+ if ! isdirectory (shelf_folder)
1148+ return
1149+ endif
1150+ let cmd = ' ls ' .shelf_folder
1151+ let folder_names = project#RunShellCmd (cmd)
1152+ for folder_name in folder_names
1153+ let folder_path = shelf_folder.folder_name
1154+ if isdirectory (folder_path)
1155+ let folder_path_cmd = ' ls ' .folder_path
1156+ let files = project#RunShellCmd (folder_path_cmd)
1157+ call s: UpdateFolderOrNew (folder_name, files )
1158+ endif
1159+ endfor
1160+ endfunction
1161+
11081162function ! s: UpdateChangelistDisplay ()
11091163 let s: display = []
11101164 for folder in s: changelist
@@ -1122,13 +1176,21 @@ function! s:UpdateChangelistDisplay()
11221176 else
11231177 let affected_files = s: changed_files + s: untracked_files
11241178 endif
1125- let all_files = s: SortAffectedFiles (affected_files)
1126- for file in all_files
1127- if s: HasFile ( folder.files , file )
1128- let file_item = s: GetChangedFileDisplay (file )
1179+
1180+ if s: IsShelfFolder (folder)
1181+ for file in folder.files
1182+ let file_item = s: GetShelfFileDisplay (file )
11291183 call add (s: display , file_item)
1130- endif
1131- endfor
1184+ endfor
1185+ else
1186+ let all_files = s: SortAffectedFiles (affected_files)
1187+ for file in all_files
1188+ if s: HasFile (folder.files , file )
1189+ let file_item = s: GetChangedFileDisplay (file )
1190+ call add (s: display , file_item)
1191+ endif
1192+ endfor
1193+ endif
11321194 endif
11331195 call add (s: display , ' ' )
11341196 endfor
@@ -1183,12 +1245,30 @@ function! s:GetChangedFileDisplay(file, prefix = ' ')
11831245 endif
11841246endfunction
11851247
1248+ function ! s: GetShelfFileDisplay (file , prefix = ' ' )
1249+ let sign = s: GetFileChangeSign (a: file )
1250+ " sign_mark is used by s:HighlightFiles
1251+ let sign_mark = ' '
1252+ if sign == ' D'
1253+ let sign_mark = ' $' " $ Deleted - Comment
1254+ elseif sign == ' A' || sign == ' ?'
1255+ let sign_mark = ' !' " ! Add or untrack - diffAdded
1256+ endif
1257+ let splitter = ' |'
1258+
1259+ let icon = project#GetIcon (a: file )
1260+
1261+ " Use unicode space for highlight
1262+ return a: prefix .sign_mark.icon .splitter.a: file .' '
1263+ endfunction
1264+
11861265function ! s: UpdateChangelist (run_git = 0 )
11871266 if a: run_git
11881267 call s: ParseGitStatus ()
11891268 endif
11901269
11911270 call s: UpdatePresetChangelist ()
1271+ call s: UpdateShelfChangelist ()
11921272 call s: UpdateChangelistDisplay ()
11931273 return 1
11941274endfunction
@@ -1292,6 +1372,12 @@ function! s:ShowStatus(run_git = 0)
12921372 let save_eventignore = &eventignore
12931373 set eventignore = all
12941374
1375+ let num = s: GetBufWinnr (s: changelist_buffer )
1376+ let on_changelist_buffer = num != -1
1377+ if on_changelist_buffer
1378+ let lnum = line (' .' )
1379+ endif
1380+
12951381 call s: OpenBuffer (s: changelist_buffer , ' belowright' )
12961382 call s: SetupChangelistBuffer ()
12971383 let success = s: UpdateChangelist (a: run_git )
@@ -1301,6 +1387,10 @@ function! s:ShowStatus(run_git = 0)
13011387 endif
13021388
13031389 let &eventignore = save_eventignore
1390+
1391+ if on_changelist_buffer
1392+ execute lnum
1393+ endif
13041394endfunction
13051395
13061396function ! s: SetupChangelistBuffer ()
0 commit comments