1#!/usr/bin/env ruby 2# 3# This script generates a directory browser, which lists the working 4# directory and allows you to open files or subdirectories by 5# double-clicking. 6 7# Create a scrollbar on the right side of the main window and a listbox 8# on the left side. 9 10require "tkscrollbox" 11 12# The procedure below is invoked to open a browser on a given file; if the 13# file is a directory then another instance of this program is invoked; if 14# the file is a regular file then the Mx editor is invoked to display 15# the file. 16 17$dirlist = {} 18 19def browsedir (dir) 20 if $dirlist.key? dir 21 $dirlist[dir] 22 else 23 top = if $dirlist.size > 0 then TkToplevel.new else nil end 24 list = TkScrollbox.new(top) { 25 relief 'raised' 26 width 20 27 height 20 28 setgrid 'yes' 29 pack 30 } 31 list.insert 'end', *`ls #{dir}`.split 32 33 # Set up bindings for the browser. 34 35 list.focus 36 list.bind "Control-q", proc{exit} 37 list.bind "Control-c", proc{exit} 38 list.bind "Control-p", proc{ 39 print "selection <", TkSelection.get, ">\n" 40 } 41 42 list.bind "Double-Button-1", proc{ 43 for i in TkSelection.get.split 44 print "clicked ", i, "\n" 45 browse dir, i 46 end 47 } 48 $dirlist[dir] = list 49 end 50end 51 52def browse (dir, file) 53 file="#{dir}/#{file}" 54 if File.directory? file 55 browsedir(file) 56 else 57 if File.file? file 58 if ENV['EDITOR'] 59 system format("%s %s&", ENV['EDITOR'], file) 60 else 61 system "xedit #{file}&" 62 end 63 else 64 STDERR.print "\"#{file}\" isn't a directory or regular file" 65 end 66 end 67end 68 69# Fill the listbox with a list of all the files in the directory (run 70# the "ls" command to get that information). 71 72if ARGV.length>0 73 dir = ARGV[0] 74else 75 dir="." 76end 77 78browsedir(dir) 79Tk.mainloop 80