清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
#!/usr/bin/perl # sydi_dmenu --- # # Filename: sydi_dmenu # Description: This script make dmenu more 'smart' choosing program # run by making a counter to each command. Simplely use # this script as how u r using dmenu. # Author: Sylvester Y. Shi # Maintainer: Sylvester Y. Shi # Created: 一 11月 28 21:15:47 2011 (+0800) # Version: 0.1 # Last-Updated: 一 11月 28 21:27:52 2011 (+0800) # By: Sylvester Y. Shi # Update #: 16 # URL: http://blog.sydi.org/ # Keywords: dmenu, smart, perl # Compatibility: dmenu 4.4.1+, or less than it, but without test. # # # Commentary: # varible $data_file is the data file using this script, change it # as u like to satified ur need. # # The script is writtern by `sylvester' for fun, u can contact to me # as follow. # mail: cedsyd@gmail.com # weibo: sylvester324 # Change Log: # 28-Nov-2011 Sylvester Y. Shi # Last-Updated: 一 11月 28 21:23:47 2011 (+0800) #2 (Sylvester Y. Shi) # Create File. # # # # *This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 3, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 51 Franklin Street, Fifth # Floor, Boston, MA 02110-1301, USA. # # # Code: use autodie; my $data_file = "/home/sylvester/bin/data.dmenu.sydi"; my @bin_dirs = split /:/, $ENV{PATH}; my %all_bins; sub check_data_file { system("touch $data_file") if not -e $data_file; } sub load_data { open my $fh, "lsx @bin_dirs 2>/dev/null |"; my %now_bins = map { chomp; $_ => 0 } <$fh>; close $fh; open my $fh_old, "<$data_file"; my %old_bins = map { chomp; split / /,$_ } <$fh_old>; close $fh_old; %all_bins = (%now_bins, %old_bins); } sub sort_bins { my @bins = keys %all_bins; my @sorted_bins = sort { $all_bins{$b} cmp $all_bins{$a} } @bins; } sub get_bins_str { my $sorted_bins = shift; my $bins_str; foreach (@$sorted_bins) { $bins_str .= "$_\n"; } return $bins_str; } sub call_dmenu { my $bins_str = shift; my @args = map { "'$_'" } @ARGV; open my $fh, "echo '$bins_str' | dmenu @args |"; my $cmd = <$fh>; chomp $cmd; $all_bins{$cmd}++ if $cmd ne '' and exists $all_bins{$cmd}; print $cmd; } sub keep_in_data_file { open my $fh_old, ">$data_file"; while (my ($key, $value) = each %all_bins) { print $fh_old "$key $value\n"; } close $fh_old; } check_data_file; load_data; my @sorted_bins = sort_bins; my $bins_str = get_bins_str \@sorted_bins; call_dmenu $bins_str; keep_in_data_file; # # sydi_dmenu ends here