1func GetCwdInfo(win, tab) 2 let tab_changed = 0 3 let mod = ":t" 4 if a:tab > 0 && a:tab != tabpagenr() 5 let tab_changed = 1 6 exec "tabnext " . a:tab 7 endif 8 let bufname = fnamemodify(bufname(winbufnr(a:win)), mod) 9 if tab_changed 10 tabprevious 11 endif 12 if a:win == 0 && a:tab == 0 13 let dirname = fnamemodify(getcwd(), mod) 14 let lflag = haslocaldir() 15 elseif a:tab == 0 16 let dirname = fnamemodify(getcwd(a:win), mod) 17 let lflag = haslocaldir(a:win) 18 else 19 let dirname = fnamemodify(getcwd(a:win, a:tab), mod) 20 let lflag = a:win->haslocaldir(a:tab) 21 endif 22 return bufname . ' ' . dirname . ' ' . lflag 23endfunc 24 25" Do all test in a separate window to avoid E211 when we recursively 26" delete the Xtopdir directory during cleanup 27func SetUp() 28 set visualbell 29 set nocp viminfo+=nviminfo 30 31 " On windows a swapfile in Xtopdir prevents it from being cleaned up. 32 set noswapfile 33 34 " On windows a stale "Xtopdir" directory may exist, remove it so that 35 " we start from a clean state. 36 call delete("Xtopdir", "rf") 37 new 38 eval 'Xtopdir'->mkdir() 39 cd Xtopdir 40 let g:topdir = getcwd() 41 call mkdir('Xdir1') 42 call mkdir('Xdir2') 43 call mkdir('Xdir3') 44endfunction 45 46let g:cwd=getcwd() 47function TearDown() 48 q 49 call chdir(g:cwd) 50 call delete("Xtopdir", "rf") 51endfunction 52 53function Test_GetCwd() 54 new a 55 new b 56 new c 57 3wincmd w 58 lcd Xdir1 59 call assert_equal("a Xdir1 1", GetCwdInfo(0, 0)) 60 call assert_equal(g:topdir, getcwd(-1)) 61 wincmd W 62 call assert_equal("b Xtopdir 0", GetCwdInfo(0, 0)) 63 call assert_equal(g:topdir, getcwd(-1)) 64 wincmd W 65 lcd Xdir3 66 call assert_equal("c Xdir3 1", GetCwdInfo(0, 0)) 67 call assert_equal("a Xdir1 1", GetCwdInfo(bufwinnr("a"), 0)) 68 call assert_equal("b Xtopdir 0", GetCwdInfo(bufwinnr("b"), 0)) 69 call assert_equal("c Xdir3 1", GetCwdInfo(bufwinnr("c"), 0)) 70 call assert_equal(g:topdir, getcwd(-1)) 71 wincmd W 72 call assert_equal("a Xdir1 1", GetCwdInfo(bufwinnr("a"), tabpagenr())) 73 call assert_equal("b Xtopdir 0", GetCwdInfo(bufwinnr("b"), tabpagenr())) 74 call assert_equal("c Xdir3 1", GetCwdInfo(bufwinnr("c"), tabpagenr())) 75 call assert_equal(g:topdir, getcwd(-1)) 76 77 tabnew x 78 new y 79 new z 80 3wincmd w 81 call assert_equal("x Xtopdir 0", GetCwdInfo(0, 0)) 82 call assert_equal(g:topdir, getcwd(-1)) 83 wincmd W 84 lcd Xdir2 85 call assert_equal("y Xdir2 1", GetCwdInfo(0, 0)) 86 call assert_equal(g:topdir, getcwd(-1)) 87 wincmd W 88 lcd Xdir3 89 call assert_equal("z Xdir3 1", GetCwdInfo(0, 0)) 90 call assert_equal("x Xtopdir 0", GetCwdInfo(bufwinnr("x"), 0)) 91 call assert_equal("y Xdir2 1", GetCwdInfo(bufwinnr("y"), 0)) 92 call assert_equal("z Xdir3 1", GetCwdInfo(bufwinnr("z"), 0)) 93 call assert_equal(g:topdir, getcwd(-1)) 94 let tp_nr = tabpagenr() 95 tabrewind 96 call assert_equal("x Xtopdir 0", GetCwdInfo(3, tp_nr)) 97 call assert_equal("y Xdir2 1", GetCwdInfo(2, tp_nr)) 98 call assert_equal("z Xdir3 1", GetCwdInfo(1, tp_nr)) 99 call assert_equal(g:topdir, getcwd(-1)) 100 " Non existing windows and tab pages 101 call assert_equal('', getcwd(100)) 102 call assert_equal(0, haslocaldir(100)) 103 call assert_equal('', getcwd(10, 1)) 104 call assert_equal(0, haslocaldir(10, 1)) 105 call assert_equal('', getcwd(1, 5)) 106 call assert_equal(0, haslocaldir(1, 5)) 107 call assert_fails('call getcwd([])', 'E745:') 108 call assert_fails('call getcwd(1, [])', 'E745:') 109 call assert_fails('call haslocaldir([])', 'E745:') 110 call assert_fails('call haslocaldir(1, [])', 'E745:') 111endfunc 112 113function Test_GetCwd_lcd_shellslash() 114 new 115 let root = fnamemodify('/', ':p') 116 exe 'lcd '.root 117 let cwd = getcwd() 118 if !exists('+shellslash') || &shellslash 119 call assert_equal(cwd[-1:], '/') 120 else 121 call assert_equal(cwd[-1:], '\') 122 endif 123endfunc 124 125" Test for :tcd 126function Test_Tab_Local_Cwd() 127 enew | only | tabonly 128 129 call mkdir('Xtabdir1') 130 call mkdir('Xtabdir2') 131 call mkdir('Xwindir1') 132 call mkdir('Xwindir2') 133 call mkdir('Xwindir3') 134 135 " Create three tabpages with three windows each 136 edit a 137 botright new b 138 botright new c 139 tabnew m 140 botright new n 141 botright new o 142 tabnew x 143 botright new y 144 botright new z 145 146 " Setup different directories for the tab pages and windows 147 tabrewind 148 1wincmd w 149 lcd Xwindir1 150 tabnext 151 tcd Xtabdir1 152 2wincmd w 153 lcd ../Xwindir2 154 tabnext 155 tcd Xtabdir2 156 3wincmd w 157 lcd ../Xwindir3 158 159 " Check the directories of various windows 160 call assert_equal("a Xwindir1 1", GetCwdInfo(1, 1)) 161 call assert_equal("b Xtopdir 0", GetCwdInfo(2, 1)) 162 call assert_equal("c Xtopdir 0", GetCwdInfo(3, 1)) 163 call assert_equal("m Xtabdir1 2", GetCwdInfo(1, 2)) 164 call assert_equal("n Xwindir2 1", GetCwdInfo(2, 2)) 165 call assert_equal("o Xtabdir1 2", GetCwdInfo(3, 2)) 166 call assert_equal("x Xtabdir2 2", GetCwdInfo(1, 3)) 167 call assert_equal("y Xtabdir2 2", GetCwdInfo(2, 3)) 168 call assert_equal("z Xwindir3 1", GetCwdInfo(3, 3)) 169 170 " Check the tabpage directories 171 call assert_equal('Xtopdir', fnamemodify(getcwd(-1, 1), ':t')) 172 call assert_equal('Xtabdir1', fnamemodify(getcwd(-1, 2), ':t')) 173 call assert_equal('Xtabdir2', fnamemodify(getcwd(-1, 3), ':t')) 174 call assert_equal('', fnamemodify(getcwd(-1, 4), ':t')) 175 176 " Jump to different windows in the tab pages and check the current directory 177 tabrewind | 1wincmd w 178 call assert_equal('Xwindir1', fnamemodify(getcwd(), ':t')) 179 call assert_equal('Xwindir1', fnamemodify(getcwd(0), ':t')) 180 call assert_equal('Xwindir1', fnamemodify(getcwd(0, 0), ':t')) 181 call assert_true(haslocaldir(0)) 182 call assert_equal(0, haslocaldir(-1, 0)) 183 call assert_equal('Xtopdir', fnamemodify(getcwd(-1, 0), ':t')) 184 call assert_equal(g:topdir, getcwd(-1)) 185 2wincmd w 186 call assert_equal('Xtopdir', fnamemodify(getcwd(), ':t')) 187 call assert_equal('Xtopdir', fnamemodify(getcwd(0), ':t')) 188 call assert_equal('Xtopdir', fnamemodify(getcwd(0, 0), ':t')) 189 call assert_false(haslocaldir(0)) 190 call assert_equal(0, haslocaldir(-1, 0)) 191 call assert_equal('Xtopdir', fnamemodify(getcwd(-1, 0), ':t')) 192 call assert_equal(g:topdir, getcwd(-1)) 193 tabnext | 1wincmd w 194 call assert_equal('Xtabdir1', fnamemodify(getcwd(), ':t')) 195 call assert_equal('Xtabdir1', fnamemodify(getcwd(0), ':t')) 196 call assert_equal('Xtabdir1', fnamemodify(getcwd(0, 0), ':t')) 197 call assert_true(haslocaldir(0)) 198 call assert_equal(2, haslocaldir(-1, 0)) 199 call assert_equal('Xtabdir1', fnamemodify(getcwd(-1, 0), ':t')) 200 call assert_equal(g:topdir, getcwd(-1)) 201 2wincmd w 202 call assert_equal('Xwindir2', fnamemodify(getcwd(), ':t')) 203 call assert_equal('Xwindir2', fnamemodify(getcwd(0), ':t')) 204 call assert_equal('Xwindir2', fnamemodify(getcwd(0, 0), ':t')) 205 call assert_true(haslocaldir(0)) 206 call assert_equal(2, haslocaldir(-1, 0)) 207 call assert_equal('Xtabdir1', fnamemodify(getcwd(-1, 0), ':t')) 208 call assert_equal(g:topdir, getcwd(-1)) 209 tabnext | 1wincmd w 210 call assert_equal('Xtabdir2', fnamemodify(getcwd(), ':t')) 211 call assert_equal('Xtabdir2', fnamemodify(getcwd(0), ':t')) 212 call assert_equal('Xtabdir2', fnamemodify(getcwd(0, 0), ':t')) 213 call assert_true(haslocaldir(0)) 214 call assert_equal(2, haslocaldir(-1, 0)) 215 call assert_equal('Xtabdir2', fnamemodify(getcwd(-1, 0), ':t')) 216 call assert_equal(g:topdir, getcwd(-1)) 217 3wincmd w 218 call assert_equal('Xwindir3', fnamemodify(getcwd(), ':t')) 219 call assert_equal('Xwindir3', fnamemodify(getcwd(0), ':t')) 220 call assert_equal('Xwindir3', fnamemodify(getcwd(0, 0), ':t')) 221 call assert_true(haslocaldir(0)) 222 call assert_equal(2, haslocaldir(-1, 0)) 223 call assert_equal('Xtabdir2', fnamemodify(getcwd(-1, 0), ':t')) 224 call assert_equal(g:topdir, getcwd(-1)) 225 226 " A new tab page should inherit the directory of the current tab page 227 tabrewind | 1wincmd w 228 tabnew g 229 call assert_equal("g Xwindir1 1", GetCwdInfo(0, 0)) 230 tabclose | tabrewind 231 2wincmd w 232 tabnew h 233 call assert_equal("h Xtopdir 0", GetCwdInfo(0, 0)) 234 tabclose 235 tabnext 2 | 1wincmd w 236 tabnew j 237 call assert_equal("j Xtabdir1 2", GetCwdInfo(0, 0)) 238 tabclose 239 240 " Change the global directory for the first tab page 241 tabrewind | 1wincmd w 242 cd ../Xdir1 243 call assert_equal("a Xdir1 0", GetCwdInfo(1, 1)) 244 call assert_equal("b Xdir1 0", GetCwdInfo(2, 1)) 245 call assert_equal("m Xtabdir1 2", GetCwdInfo(1, 2)) 246 call assert_equal("n Xwindir2 1", GetCwdInfo(2, 2)) 247 248 " Change the global directory for the second tab page 249 tabnext | 1wincmd w 250 cd ../Xdir3 251 call assert_equal("m Xdir3 0", GetCwdInfo(1, 2)) 252 call assert_equal("n Xwindir2 1", GetCwdInfo(2, 2)) 253 call assert_equal("o Xdir3 0", GetCwdInfo(3, 2)) 254 255 " Change the tab-local directory for the third tab page 256 tabnext | 1wincmd w 257 cd ../Xdir1 258 call assert_equal("x Xdir1 0", GetCwdInfo(1, 3)) 259 call assert_equal("y Xdir1 0", GetCwdInfo(2, 3)) 260 call assert_equal("z Xwindir3 1", GetCwdInfo(3, 3)) 261 262 enew | only | tabonly 263 new 264endfunc 265