function ls_get_columns
compile_opt strictarr, hidden
error = 0L
catch, error
if (error ne 0L) then begin
catch, /cancel
!quiet = oldQuiet
return, 80L
endif
oldQuiet = !quiet
!quiet = 1
columns = mg_termcolumns()
!quiet = oldQuiet
return, columns
end
function ls_permissions, files, info=info
compile_opt strictarr, hidden
type = [['-', 'd'], ['l', 'l']]
r = ['-', 'r']
w = ['-', 'w']
x = ['-', 'x']
bits = ['400'o, '200'o, '100'o, '040o', '020'o, '010'o, '004'o, '002'o, '001'o]
nFiles = n_elements(files)
permissions = strarr(nFiles)
for f = 0L, nFiles - 1L do begin
dummy = file_test(files[f], get_mode=mode)
ind = (bits and mode) gt 0
permissions[f] = $
type[info[f].directory, info[f].symlink] $
+ r[ind[0]] + w[ind[1]] + x[ind[2]] $
+ r[ind[3]] + w[ind[4]] + x[ind[5]] $
+ r[ind[6]] + w[ind[7]] + x[ind[8]]
endfor
return, permissions
end
function ls_human_size, sizes
compile_opt strictarr, hidden
nSizes = n_elements(sizes)
results = strarr(nSizes)
units = ['B', 'K', 'M', 'G', 'T', 'P']
for i = 0L, nSizes - 1L do begin
level = 0L
s = sizes[i]
while (s ge 1024L) do begin
s /= 1024L
level++
endwhile
results[i] = strtrim(s, 2) + units[level]
endfor
return, results
end
function ls_modification_times, mtimes
compile_opt strictarr, hidden
currentYear = long(strmid(systime(), 3, 4, /reverse_offset))
nMTimes = n_elements(mtimes)
results = strarr(nMTimes)
for f = 0L, nMTimes - 1L do begin
date = systime(0, mtimes[f])
day = strmid(date, 4, 6)
time = strmid(date, 11, 5)
year = long(strmid(date, 3, 4, /reverse_offset))
results[f] = day $
+ (year eq currentYear $
? string(time, format='(A6)') $
: string(year, format='(I6)'))
endfor
return, results
end
pro ls, pattern, all=all, long=long
compile_opt strictarr, hidden
oldQuiet = !quiet
!quiet = 1
sep = path_sep()
!quiet = oldQuiet
_pattern = n_elements(pattern) eq 0 ? '*' : pattern
files = file_search(_pattern, count=nFiles, $
match_all_initial_dot=keyword_set(all))
if (nFiles eq 0) then return
info = file_info(files)
names = files
for f = 0L, nFiles - 1L do begin
case 1 of
info[f].socket: names[f] = names[f] + '='
info[f].symlink: names[f] = names[f] + '@'
info[f].directory: names[f] = names[f] + path_sep()
info[f].execute: names[f] = names[f] + '*'
else:
endcase
endfor
if (keyword_set(long)) then begin
table = strarr(4, nFiles)
table[0, *] = ls_permissions(files, info=info)
table[1, *] = ls_human_size(strtrim(info.size, 2))
table[2, *] = ls_modification_times(info.mtime)
ind = where(info.symlink, nLinks)
if (nLinks gt 0) then begin
for f = 0L, nLinks - 1L do begin
names[ind[f]] = names[ind[f]] + ' -> '+ file_readlink(files[ind[f]])
endfor
endif
table[3, *] = names
print, table, format='(A-10, " ", A5, " ", A-12, " ", A)'
endif else begin
maxWidth = max(strlen(names)) + 1L
lineWidth = ls_get_columns()
nColumns = lineWidth / maxWidth
nRows = nFiles / nColumns + (nFiles mod nColumns ne 0)
nColumns = nFiles / nRows + (nFiles mod nRows ne 0)
padding = nColumns * nRows - nFiles
if (padding gt 0) then names = [names, strarr(padding)]
format = '(' + strtrim(nColumns, 2) + 'A-' + strtrim(maxWidth, 2) + ')'
print, transpose(reform(names, nRows, nColumns)), $
format=format
endelse
end