Openbox:Pipemenus:Dirsmenu
From Openbox
(Difference between revisions)
AaylaSecura (Talk | contribs) m |
AaylaSecura (Talk | contribs) m (Fixed a minor bug (escape a literal ^ rather than beginning of string)) |
||
Line 40: | Line 40: | ||
$base_dir =~ s/\\/\/g; | $base_dir =~ s/\\/\/g; | ||
# escape special characters in bash | # escape special characters in bash | ||
− | $base_dir =~ s/(\ |'|`|!|^|&|\*|\(|\)|\[|\]|\{|\}|&#..)/\\$1/g; | + | $base_dir =~ s/(\ |'|`|!|\^|&|\*|\(|\)|\[|\]|\{|\}|&#..)/\\$1/g; |
say "<openbox_pipe_menu>"; | say "<openbox_pipe_menu>"; | ||
Line 61: | Line 61: | ||
$stripped_dir =~ s/_/__/g; | $stripped_dir =~ s/_/__/g; | ||
# escape special characters in bash | # escape special characters in bash | ||
− | $dir =~ s/(\ |'|`|!|^|&|\*|\(|\)|\[|\]|\{|\}|&#..)/\\$1/g; | + | $dir =~ s/(\ |'|`|!|\^|&|\*|\(|\)|\[|\]|\{|\}|&#..)/\\$1/g; |
# exclude . from directory list | # exclude . from directory list | ||
if ( "$dir" eq "$base_dir" ) { next DIRS; } | if ( "$dir" eq "$base_dir" ) { next DIRS; } | ||
Line 80: | Line 80: | ||
$stripped_file =~ s/_/__/g; | $stripped_file =~ s/_/__/g; | ||
# escape special characters in bash | # escape special characters in bash | ||
− | $file =~ s/(\ |'|`|!|^|&|\*|\(|\)|\[|\]|\{|\}|&#..)/\\$1/g; | + | $file =~ s/(\ |'|`|!|\^|&|\*|\(|\)|\[|\]|\{|\}|&#..)/\\$1/g; |
say "<item label=\"$stripped_file\">"; | say "<item label=\"$stripped_file\">"; | ||
say " <action name=\"Execute\"><execute>xdg-open $file </execute></action>"; | say " <action name=\"Execute\"><execute>xdg-open $file </execute></action>"; |
Revision as of 10:51, 8 July 2014
Another pipe menu for recursive directory listing. I tried to keep the code as simple and short as possible. It uses find to get the directories and the other files in the current directory and lists them in alphabetic order while making each directory a submenu. It escapes special characters and prints the underscore correctly (unlike obbrowser).
#!/usr/bin/perl # Openbox menu to recursively list directories and files. use File::Basename; sub say {print @_, "\n"} # set starting directory - this changes when the script is called with an argument (used for listing subdirectories) my $base_dir = '/'; # path to this script (needed as it calls itself to list subdirectories) my $path = "$ENV{HOME}/obmenus"; # your file browser my $browser = 'Thunar'; # when listing subdirectories, set the starting dir accordingly if ( "$ARGV[0]" ne "" ) { $base_dir = "$ARGV[0]"; } # escape possible single quotes in filename when using find my $tmp = $base_dir; $base_dir =~ s/'/'"'"'/g; # directories and links to such as submenus (in alphabetic order, hidden first) my @dirs = sort split /\n/, `find -L \'$base_dir\' -maxdepth 1 -type d`; # all other types of files as items (in alphabetic order, hidden first) my @files = sort split /\n/, `find -L \'$base_dir\' -maxdepth 1 ! -type d`; $base_dir = $tmp; undef $tmp; # replace some special characters by their html codes $base_dir =~ s/&/&/g; $base_dir =~ s/"/"/g; $base_dir =~ s/\$/$/g; $base_dir =~ s/</</g; $base_dir =~ s/=/=/g; $base_dir =~ s/>/>/g; $base_dir =~ s/\\/\/g; # escape special characters in bash $base_dir =~ s/(\ |'|`|!|\^|&|\*|\(|\)|\[|\]|\{|\}|&#..)/\\$1/g; say "<openbox_pipe_menu>"; say "<item label=\"Open in $browser\">"; say " <action name=\"Execute\"><execute>$browser $base_dir </execute></action>"; say "</item>"; say "<separator />"; # print directories first DIRS: foreach my $dir (@dirs) { $dir =~ s/&/&/g; $dir =~ s/"/"/g; $dir =~ s/\$/$/g; $dir =~ s/</</g; $dir =~ s/=/=/g; $dir =~ s/>/>/g; $dir =~ s/\\/\/g; # replace the underscore with a double underscore in the label to prevent openbox from interpreting it as a keyboard accelerator my $stripped_dir = basename($dir); $stripped_dir =~ s/_/__/g; # escape special characters in bash $dir =~ s/(\ |'|`|!|\^|&|\*|\(|\)|\[|\]|\{|\}|&#..)/\\$1/g; # exclude . from directory list if ( "$dir" eq "$base_dir" ) { next DIRS; } say "<menu id=\"$dir\" label=\"$stripped_dir\" execute=\"$path/dirsmenu $dir\" />"; } # print files next foreach my $file (@files) { $file =~ s/&/&/g; $file =~ s/"/"/g; $file =~ s/\$/$/g; $file =~ s/</</g; $file =~ s/=/=/g; $file =~ s/>/>/g; $file =~ s/\\/\/g; # replace the underscore with a double underscore in the label to prevent openbox from interpreting it as a keyboard accelerator my $stripped_file = basename($file); $stripped_file =~ s/_/__/g; # escape special characters in bash $file =~ s/(\ |'|`|!|\^|&|\*|\(|\)|\[|\]|\{|\}|&#..)/\\$1/g; say "<item label=\"$stripped_file\">"; say " <action name=\"Execute\"><execute>xdg-open $file </execute></action>"; say "</item>"; } say "</openbox_pipe_menu>";