yac 1.3.2 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,13 @@
1
+ === 1.4.0 / 2008-12-28
2
+
3
+ * highlight commands,e.g: $ ls
4
+ * <rename/add> use '@' as prefix will impact the main repository,otherwise private repository
5
+ * use built-in configure file,if ~/.yacrc doesn't exist
6
+ * doesn't init empty repository,if havn't provide 'clone-from'
7
+ * truncate filename when choose for tidiness
8
+ * if file is empty then delete <edit/add>
9
+ * ...
10
+
1
11
  === 1.3.0 / 2008-11-20
2
12
 
3
13
  * add office support (odf,odp,ods,uof,doc...)
data/Manifest CHANGED
@@ -1,10 +1,10 @@
1
+ Manifest
1
2
  CHANGELOG
2
3
  resources/yacrc
3
4
  bin/yac
4
5
  Rakefile
5
- yac.gemspec
6
6
  lib/git.rb
7
7
  lib/format.rb
8
+ lib/symbol.rb
8
9
  lib/yac.rb
9
10
  README.rdoc
10
- Manifest
data/README.rdoc CHANGED
@@ -13,79 +13,66 @@
13
13
 
14
14
  == How To Use
15
15
 
16
- === To initialize repositories:
17
- When you run any command,The repositories will be initialize automatically.
16
+ === Initialize repositories:
17
+ $ yac -i
18
18
 
19
- === To show a cheat sheet:
20
- $ yac (show) [cheatsheet] ( you can use * for any chars)
21
- Eg:
22
- $ yac lin*x
23
- $ yac l/o/a To show linux/gentoo/masked
19
+ === Show a cheat sheet:
20
+ $ yac /cheatsheet/ ( * => any chars)
21
+ E.g:
22
+ $ yac lin*x => linux linux/welcome
23
+ $ yac l/o/a => linux/gentoo/masked linux/gentoo/layman
24
24
 
25
25
  === To edit a cheat sheet
26
- $ yac -e [cheatsheet] (Yes,you can use * for any chars also,then choose one to edit)
26
+ $ yac -e /cheatsheet/ ( * => any chars)
27
27
 
28
28
  === To add a cheat sheet
29
- $ yac -a [cheatsheet] (OMG,you can also use *)
30
- Eg:
29
+ $ yac -a /cheatsheet/ ( * => any chars)
30
+ ('rename/add' use '@' as prefix will impact the main repository,otherwise private repository)
31
+ Eg:
31
32
  $ yac -a li*x/install
32
- Then will display all directories match /li*x/,feel freely to choose one of them,
33
- A new file named install.ch will be added to the directory!
34
33
  $ yac -a l/oo/install
35
- Oh,no,you can choose linux/gentoo as the directory for the install file
36
34
 
37
35
  === To rm a cheat sheet
38
- $ yac -r [cheatsheet] (Sure,you can use *)
36
+ $ yac -r [cheatsheet] ( * => any chars)
39
37
 
40
38
  === Search all sheets
41
- $ yac -S [keyword] (@Take Attention:@ You are allowed to use perl-like Regex)
42
- Eg:
39
+ $ yac -S [keyword] (@Take Attention:@ Perl-like Regexp)
40
+ Eg:
43
41
  $ yac -S lin.*x
44
- $ yac -S '\$:' To Search $:
45
- And Even:
42
+ $ yac -S '\$:' => To Search $:
46
43
  $ yac -S "r(uby|ails)"
47
44
 
48
45
  === Update repositories
49
- $ yac -u main => Update main repository
50
- $ yac -u all => Update all repositories
51
- $ yac -u => Update private repository
46
+ $ yac -u main => main repository
47
+ $ yac -u all => all repositories
48
+ $ yac -u => private repository
52
49
 
53
50
  === Shell
54
- $ yac -s main => Open the main repository's shell
55
- $ yac -s => Open the private repository's shell
51
+ $ yac -s main => Main repository's shell
52
+ $ yac -s => Private repository's shell
56
53
 
57
54
  == Repository Push
58
- $ yac -p main => Push the main repository
59
- $ yac -p all => Push all repositories
60
- $ yac -p => Push the private repository
55
+ $ yac -p main => Main repository
56
+ $ yac -p all => All repositories
57
+ $ yac -p => Private repository
61
58
 
62
59
  == Rename/mv a cheatsheet:
63
- $ yac -m [orign_name] [new_name]
60
+ $ yac -m [orign_name] [new_name]
61
+ ('rename/add' use '@' as prefix impact the main repository,otherwise private repository)
64
62
 
65
63
  === Help (display this file)
66
- $ yac -h
64
+ $ yac -h
67
65
 
68
66
  === Version
69
- $ yac -v
70
-
71
- === Documents format
72
- All text file add ".ch" as suffix for butter editor highlight
73
- (A very very simple vim script can be found here : http://www.vim.org/scripts/script.php?script_id=2399)
74
-
75
- At the beginning of the row,plus N = for the N-class title
76
-
77
- Words wrapped by @ for highlight
67
+ $ yac -v
78
68
 
79
69
  === The configure file
80
- Default use $HOME/.yacrc , See the example file under resources directory
81
-
82
- === Others
83
- Add @ before [keyword] will only affect the main repository
70
+ <$HOME/.yacrc> OR <Example file under resources directory>
84
71
 
85
72
  == REQUIREMENTS:
86
73
  * Ruby
87
74
  * Git
88
- * rubygems
75
+ * RubyGems
89
76
 
90
77
  == LICENSE:
91
78
 
@@ -94,5 +81,5 @@ This software is shared by GPL3 License
94
81
  Copyright (c) 2008 Jinzhu Zhang
95
82
 
96
83
  == BY: Jinzhu Zhang
97
- http://www.zhangjinzhu.com
98
- wosmvp (no-spam) gmail (no-spam) com
84
+ http://www.zhangjinzhu.com
85
+ wosmvp (no-spam) gmail (no-spam) com
data/bin/yac CHANGED
@@ -1,3 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
  require File.join(File.dirname(__FILE__), "..", "lib", "yac.rb")
3
+
3
4
  Yac.new(ARGV)
data/lib/format.rb CHANGED
@@ -1,86 +1,57 @@
1
- class Symbol
2
- def to_proc
3
- Proc.new { |*args| args.shift.__send__(self, *args) }
1
+ module Format
2
+
3
+ def Error(x)
4
+ colorful "Please Provide A Valid Command To Operate #{x} (~/.yacrc)",'warn'
4
5
  end
5
- end
6
6
 
7
- module Format
8
- Pdf_Error = "Please Modify ~/.yacrc To Provide A Valid Command To Operate PDF Document"
9
- Image_Error = "Please Modify ~/.yacrc To Provide A Valid Command To Operate Image Document"
10
- Office_Error = "Please Modify ~/.yacrc To Provide A Valid Command To Operate Office Document"
11
- Doc_Error = "Please Modify ~/.yacrc To Provide A Valid Command To Operate Text Document"
7
+ def handle_file(file,action = 'show')
8
+ colorful(file,"filename")
12
9
 
13
- def format_file(file)
14
- colorful(file,"filename") if file
15
10
  case `file "#{file}" 2>/dev/null`
16
11
  when / PDF document/
17
- colorful(Pdf_Error,'warn') unless system("#{Yac::CONFIG["pdf_command"]||'evince'} '#{file}' 2>/dev/null")
12
+ Error('PDF') unless system("#{Yac::CONFIG["#{action}_pdf"]} '#{file}' ")
18
13
  when /( image)|( bitmap)|(\.svg)/
19
- colorful(Image_Error,'warn') unless system("#{Yac::CONFIG["image_command"]||'eog'} '#{file}' 2>/dev/null")
14
+ Error('Image') unless system("#{Yac::CONFIG["#{action}_image"]} '#{file}'")
20
15
  when /Office Document/
21
- open_office(file)
16
+ Error('Office') unless system("#{Yac::CONFIG["#{action}_office"]} '#{file}'")
22
17
  else
23
- if File.extname(file) =~ /^\.(od[tfspg]|uof)$/ #Support odf uof ods odp...
24
- open_office(file)
18
+ if File.extname(file) =~ /^\.(od[tfspg]|uof)$/ # FileType: odf uof ods odp ...
19
+ Error('Office') unless system("#{Yac::CONFIG["#{action}_office"]} '#{file}'")
25
20
  else
26
- File.new(file).each do |x|
27
- format_section(x)
28
- end
21
+ action =~ /show/ ? File.new(file).each {|x| format_text(x)} : edit_text(file)
29
22
  end
30
23
  end
31
24
  end
32
25
 
33
- def format_section(section,empha_regexp = false)
34
- if section =~ /^(=+)\s+(.*)/
35
- level,stuff = $1.size,$2
36
- # Highlight the keyword when searching
37
- stuff = empha(stuff,"head#{level}",empha_regexp) if empha_regexp
38
- colorful("\s"*(level-1) + stuff,"head#{level}")
39
- else
40
- section = empha(section,"text",empha_regexp) if empha_regexp
41
- colorful(section)
42
- end
26
+ def edit_text(file)
27
+ FileUtils.mkdir_p(File.dirname(file)) # Prepare Directory When Add File
28
+ Error('Text') unless system("#{Yac::CONFIG["editor"]||ENV['EDITOR']} '#{file}'")
43
29
  end
44
30
 
45
- def edit_file(file)
46
- case `file "#{file}" 2>/dev/null`
47
- when / PDF /
48
- colorful(Pdf_Error,'warn') unless system("#{Yac::CONFIG["pdf_edit_command"]||'ooffice'} '#{file}' 2>/dev/null")
49
- when /( image )|(\.svg)/
50
- colorful(Image_Error,'warn') unless system("#{Yac::CONFIG["image_edit_command"]||'gimp'} '#{file}' 2>/dev/null")
51
- when /Office Document/
52
- open_office(file)
31
+ def format_text(section,empha_regexp = false)
32
+ if section =~ /^(=+)\s+(.*)/
33
+ level,section = $1.size,$2
34
+ # Highlight keyword when searching
35
+ section = empha(section,"head#{level}",empha_regexp) if empha_regexp
36
+ colorful("\s"*(level-1) + section,"head#{level}")
53
37
  else
54
- if File.extname(file) =~ /^\.(od[tfspg]|uof)$/ #Support odf uof ods odp...
55
- open_office(file)
56
- else
57
- edit_text(file)
58
- end
38
+ # command or plain text
39
+ level = (section =~ /^\s*\$\s+/) ? 'shell' : 'text'
40
+ section.sub!(/^(\s*\$\s+.*)/,"\e[#{@color['shell']}m"+'\1'+"\e[0m")
41
+ section = empha(section,level,empha_regexp) if empha_regexp
42
+ colorful(section)
59
43
  end
60
44
  end
61
45
 
62
- def open_office(file)
63
- colorful(Office_Error,'warn') unless system("#{Yac::CONFIG["office_command"]||'ooffice'} '#{file}' 2>/dev/null")
64
- end
65
-
66
- def edit_text(file)
67
- prepare_dir(file)
68
- colorful(Doc_Error,'warn') unless system("#{Yac::CONFIG["editor"] || ENV['EDITOR'] ||'vim'} '#{file}' 2>/dev/null")
69
- end
70
-
71
46
  def colorful(stuff,level="text",line_break = true)
72
47
  stuff = empha(stuff,level)
73
- print "\e[%sm%s\e[0m " % [Yac::CONFIG[level],stuff.rstrip]
48
+ print "\e[%sm%s\e[0m " % [@color[level],stuff.rstrip]
74
49
  print "\n" if line_break
75
50
  end
76
51
 
77
52
  def empha(stuff,level="text",empha_regexp=/(@(.*)@)/)
78
53
  stuff.to_s.scan(empha_regexp) do |x|
79
- return stuff.gsub(x[0],"\e[0m\e[#{Yac::CONFIG["empha"]}m%s\e[0m\e[%sm" % [x[1],Yac::CONFIG[level]])
54
+ return stuff.gsub(x[0],"\e[0m\e[#{@color["empha"]}m%s\e[0m\e[%sm" % [x[1],@color[level]])
80
55
  end
81
56
  end
82
-
83
- def prepare_dir(file)
84
- FileUtils.mkdir_p(File.dirname(file))
85
- end
86
57
  end
data/lib/git.rb CHANGED
@@ -1,41 +1,45 @@
1
1
  class Git
2
- def initialize(path)
3
- @working_path = path
4
- end
5
-
6
- def self.clone(from,path,name)
7
- `cd #{path} && git clone #{from} #{name}`
8
- end
9
-
10
- def self.init(path)
11
- `cd #{path} && git init`
12
- end
13
-
14
- def mv(orig,new,with_commit = true)
15
- `cd '#@working_path' && git mv #{orig} #{new}`
16
- self.commit("#{clean_name(orig)} Renamed to #{clean_name(new)}") if with_commit
17
- end
18
-
19
- def add(file,with_commit = true)
20
- `cd '#@working_path' && git add '#{file}'`
21
- self.commit("#{clean_name(file)} Added") if with_commit
22
- end
23
-
24
- def edit(file,with_commit = true)
25
- `cd '#@working_path' && git add '#{file}'`
26
- self.commit("#{clean_name(file)} Updated") if with_commit
27
- end
28
-
29
- def rm(file,with_commit=true)
30
- `cd '#@working_path' && git rm -f '#{file}'`
31
- self.commit("#{clean_name(file)} Removed") if with_commit
32
- end
33
-
34
- def commit(msg,*args)
35
- `cd '#@working_path' && git commit #{args.to_s} -m '#{msg}'`
36
- end
37
-
38
- def clean_name(f)
39
- return f.sub(/^(.*)?\/(main|private)\/(.*)/,'\3').sub(/^@/,'')
2
+ class << self
3
+ def clone(from,path)
4
+ system("git clone #{from} #{path}")
5
+ end
6
+
7
+ def init(path)
8
+ system("mkdir -p #{path}")
9
+ system("cd #{path} && git init")
10
+ end
11
+
12
+ def mv(orig,new)
13
+ FileUtils.mkdir_p(File.dirname(new))
14
+ system("git mv #{orig} #{new}")
15
+ self.commit("#{cleanup_name(orig)} Renamed to #{cleanup_name(new)}")
16
+ end
17
+
18
+ def add(file)
19
+ if File.exist?(file)
20
+ return system("rm #{file}") if File.zero?(file)
21
+ system("git add '#{file}'")
22
+ self.commit("#{cleanup_name(file)} Added")
23
+ end
24
+ end
25
+
26
+ def edit(file)
27
+ return rm(file) if File.zero?(file)
28
+ system("git add '#{file}'")
29
+ self.commit("#{cleanup_name(file)} Updated")
30
+ end
31
+
32
+ def rm(file)
33
+ system("git rm -f '#{file}'")
34
+ self.commit("#{cleanup_name(file)} Removed")
35
+ end
36
+
37
+ def commit(msg,*args)
38
+ system("git commit #{args.to_s} -m '#{msg}' >/dev/null")
39
+ end
40
+
41
+ def cleanup_name(f)
42
+ return f.sub(/^(.*)?\/(main|private)\/(.*)/,'\3').sub(/^@/,'')
43
+ end
40
44
  end
41
45
  end
data/lib/symbol.rb ADDED
@@ -0,0 +1,5 @@
1
+ class Symbol
2
+ def to_proc
3
+ Proc.new { |*args| args.shift.__send__(self, *args) }
4
+ end
5
+ end
data/lib/yac.rb CHANGED
@@ -1,188 +1,190 @@
1
1
  $LOAD_PATH << File.dirname(__FILE__)
2
- %w(git fileutils yaml format).each {|f| require f}
2
+ %w(git fileutils yaml format symbol).each {|f| require f}
3
3
 
4
- module Yac
4
+ module Yac
5
5
  include Format
6
6
  extend self
7
- VERSION = '1.3.2'
8
- YACRC = File.join("#{ENV['HOME']}",".yacrc")
9
7
 
10
- FileUtils.cp(File.join(File.dirname(__FILE__), "..","resources","yacrc"), YACRC) unless File.exist?(YACRC)
8
+ VERSION = '1.4.0'
9
+
10
+ @color = {
11
+ 'head1' => "1;31",
12
+ 'head2' => "1;36",
13
+ 'head3' => "1;33",
14
+ 'head4' => "1;32",
15
+ 'head5' => "1;34",
16
+ 'head6' => "1;35",
17
+ 'head7' => "1;37",
18
+
19
+ 'shell' => "01;35",
20
+ 'warn' => "31",
21
+ 'notice' => "33",
22
+ 'empha' => "31",
23
+ 'filename' => "34",
24
+ 'line_number' => "32",
25
+ }
11
26
 
12
- CONFIG = YAML.load_file(File.join(ENV['HOME'],".yacrc"))
27
+ YACRC = File.join("#{ENV['HOME']}",".yacrc")
28
+ CONFIG = YAML.load_file( File.exist?(YACRC) ? YACRC :
29
+ File.join(File.dirname(__FILE__), "..","resources","yacrc"))
13
30
 
14
31
  CONFIG["root"] ||= File.join(ENV['HOME'],".yac")
15
32
 
16
- @main_path, @pri_path = File.join(CONFIG["root"],"/main/"), File.join(CONFIG["root"],"/private/")
17
- @main_git = Git.new(@main_path)
18
- @pri_git = Git.new(@pri_path)
33
+ @main_path = File.join(CONFIG["root"],"/main/")
34
+ @pri_path = File.join(CONFIG["root"],"/private/")
19
35
 
20
36
  def new(args)
21
- init unless File.exist?(@main_path) && File.exist?(@pri_path)
22
37
  (help && exit) if args.empty?
23
- case args.first
24
- when "-S" then search(args[1,args.size])
25
- when "-u" then update(args[1,args.size])
26
- when "-p" then push(args[1,args.size])
27
- when "-l" then log(args[1,args.size])
28
- when "-a" then add(args[1,args.size])
29
- when "-e" then edit(args[1,args.size])
38
+ operate,target = args.first,args[1,args.size].join(' ')
39
+ case operate
40
+ when "-i" then init
41
+ when "-S" then search(target)
42
+ when "-u" then update(target)
43
+ when "-p" then push(target)
44
+ when "-l" then log(target)
45
+ when "-a" then add(target)
46
+ when "-e" then edit(target)
30
47
  when /^(help|-h|yac|--help)$/ then help
31
- when "-s" then shell(args[1,args.size])
32
- when "-r" then rm(args[1,args.size])
48
+ when "-s" then shell(target)
49
+ when "-r" then rm(target)
33
50
  when "-m" then mv(args[1,args.size])
34
51
  when "-v" then colorful("Yac Version: #{Yac::VERSION}",'notice')
35
- else show(args)
52
+ else show(operate + ' ' + target)
36
53
  end
37
54
  end
38
55
 
39
56
  def init
40
- FileUtils.mkdir_p(CONFIG['root'])
41
57
  {"main" => @main_path,"private" => @pri_path}.each do |name,path|
42
58
  if File.exist?(path)
43
59
  colorful("#{name} repository has already initialized.","notice")
44
- else
45
- if CONFIG["#{name}"] && CONFIG["#{name}"]['clone-from']
46
- colorful("Initialize #{name} repository from #{CONFIG[name]['clone-from']} to #{CONFIG['root']}/#{name}","notice")
47
- Git.clone(CONFIG["#{name}"]['clone-from'],CONFIG['root'],name)
48
- else
49
- colorful("Initialize #{name} repository from scratch to #{CONFIG['root']}/#{name}","notice")
50
- prepare_dir(path)
51
- Git.init(path)
52
- end
60
+ elsif CONFIG["#{name}"] && CONFIG["#{name}"]['clone-from']
61
+ colorful("Initialize #{name} repository from #{CONFIG[name]['clone-from']}","notice")
62
+ Git.clone(CONFIG["#{name}"]['clone-from'],path)
53
63
  end
54
64
  end
55
65
  end
56
66
 
57
67
  def show(args)
58
- args.each {|x| show_single(x)}
68
+ loop do
69
+ file = search_name(args,"Show")
70
+ file ? handle_file(file) : break
71
+ end
59
72
  end
60
73
 
61
74
  def search(args)
62
- args.each {|x| search_content(x)}
63
- end
64
-
65
- def update(args)
66
- git_command(args,'pull')
67
- rescue
68
- colorful("ERROR: can not update the repository,\n\n#{$!}","warn")
69
- end
70
-
71
- def push(args)
72
- git_command(args,'push')
73
- rescue
74
- colorful("Usage:\nyac push ( main | all )\n\nTry `yac -h` for more help\n\n#{$1}","warn")
75
- end
76
-
77
- def log(args)
78
- git_command(args,'log --color --date-order --reverse')
75
+ search_content(args)
79
76
  end
80
77
 
81
- def git_command(env,command)
82
- case env.to_s
83
- when /main/ then git_path = [@main_path]
84
- when /all/ then git_path = [@main_path,@pri_path]
85
- else git_path = [@pri_path]
86
- end
87
-
88
- git_path.each do |x|
89
- colorful(x,'filename')
90
- colorful( `cd #{x} && git #{command}` ,"notice")
78
+ def add(args)
79
+ file = add_file(args,'.yac')
80
+ if file && confirm("You Are Adding #{file}")
81
+ edit_text(file)
82
+ Git.add(file)
91
83
  end
92
84
  end
93
85
 
94
86
  def edit(args)
95
- args.each {|x| edit_single(x)}
96
- end
97
-
98
- def add(args)
99
- args.each {|x| add_single(x)}
87
+ file = search_name(args,"Edit")
88
+ if file
89
+ handle_file(file,'edit')
90
+ Git.edit(file)
91
+ end
100
92
  end
101
93
 
102
94
  def rm(args)
103
- args.each {|x| rm_single(x)}
95
+ file = search_name(args,"Remove")
96
+ if file && confirm("You Are Removing #{file}.")
97
+ Git.rm(file)
98
+ end
104
99
  end
105
100
 
106
101
  def help
107
- format_file(File.dirname(__FILE__)+"/../README.rdoc")
102
+ handle_file(File.dirname(__FILE__)+"/../README.rdoc")
108
103
  end
109
104
 
110
105
  def shell(args)
111
- case args.to_s
112
- when /main/
106
+ if args.to_s =~ /main/
113
107
  colorful(" Welcome To The Main Yac Repository","notice")
114
- system "cd '#{@main_path}'; sh"
108
+ system("cd '#{@main_path}'; sh")
115
109
  else
116
110
  colorful(" Welcome To The Private Yac Repository","notice")
117
- system "cd '#{@pri_path}'; sh"
111
+ system("cd '#{@pri_path}'; sh")
118
112
  end
119
113
  end
120
114
 
121
115
  def mv(args)
122
- (colorful("Usage:\nyac mv [orign_name] [new_name]\n\nTry `yac -h` for more help","warn");exit) unless args.size == 2
116
+ (colorful("Usage:\nyac mv [orign_name] [new_name]","warn");exit) unless args.size == 2
123
117
  file = search_name(args[0],"Rename")
124
- #You can use $ yac mv linux.ch linux/ to rename linux.ch to linux/linux.ch
125
- new_filename = args[1].sub(/\/$/,file.sub(/.*\/(.*)(\..*)/,'/\1')).sub(/^(@)?/,file =~ /^#{@main_path}/ ? "@":"")
126
- new_name = add_file(new_filename ,file.sub(/.*(\..*)/,'\1'))
118
+
119
+ # You can use $ yac mv linux linux/ to rename linux to linux/linux
120
+ new_filename = args[1] =~ /\/$/ ? args[1] : args[1] + file.match(/[^\/]$/).to_s
121
+ new_filename = '@' + new_filename if file =~ /^#{@main_path}/
122
+ new_name = add_file(new_filename)
123
+
127
124
  if new_name && confirm("You Are Renaming #{file} To #{new_name}")
128
- prepare_dir(new_name)
129
- @working_git.mv(file,new_name)
125
+ Git.mv(file,new_name)
130
126
  end
131
127
  end
132
128
 
133
129
  protected
134
- def add_single(args)
135
- file = add_file(args)
136
- if file && confirm("You Are Adding #{file}")
137
- edit_text(file)
138
- @working_git.add(file)
139
- end
140
- end
141
-
142
- def add_file(args,suffix = ".ch")
143
- if args.include?('/') && args =~ /(@?)(?:(.*)\/)(.+)/ #choose directory
130
+ def add_file(args,*suffix)
131
+ suffix = suffix ? suffix.to_s : ''
132
+ if args.include?('/') && args =~ /(@?)(?:(.*)\/)(.+)/ #choose directory
144
133
  prefix,path_name,file_name = $1,$2,$3
145
- path = prefix.empty? ? @pri_path : @main_path #choose git path
146
- # Yes,you can use 'l/e' to choose 'linux/gentoo'
134
+ path = prefix.empty? ? @pri_path : @main_path #choose git path
135
+ # Use 'l/e' to choose 'linux/gentoo'
147
136
  all_path = %x{
148
- find #{path} -type d -iwholename '#{path}*#{path_name.gsub(/\//,'*/*')}*' -not -iwholename '*.git*'| sed 's/^.*\\/\\(private\\|main\\)\\//#{prefix}/'
137
+ find -L #{path} -type d -iwholename '#{path}*#{path_name.gsub(/\//,'*/*')}*' -not -iwholename '*\/.git\/*' | sed 's/^.*\\/\\(private\\|main\\)\\//#{prefix}/'
149
138
  }.to_a.map(&:strip).concat([prefix+path_name]).uniq
150
139
 
151
140
  colorful("Which directory do you want to use:","notice")
152
141
  choosed_path = choose_one(all_path)
153
- return full_path(choosed_path + "/" + file_name + suffix) if choosed_path
142
+ return choosed_path ? full_path(choosed_path + "/" + file_name + suffix) : false
154
143
  else
155
- return full_path(args+suffix)
144
+ return full_path(args + suffix)
156
145
  end
157
146
  end
158
147
 
159
- def show_single(args)
160
- loop do
161
- file = search_name(args,"Show")
162
- file ? format_file(file) : break
163
- end
148
+ #
149
+ # Git
150
+ #
151
+
152
+ def update(args)
153
+ git_command(args,'pull')
164
154
  end
165
155
 
166
- def rm_single(args)
167
- file = search_name(args,"Remove")
168
- if file && confirm("You Are Removing #{file}.")
169
- @working_git.rm(file)
170
- end
156
+ def push(args)
157
+ git_command(args,'push')
171
158
  end
172
159
 
173
- def edit_single(args)
174
- file = search_name(args,"Edit")
175
- if file
176
- edit_file(file)
177
- @working_git.edit(file)
160
+ def log(args)
161
+ git_command(args,'log --color')
162
+ end
163
+
164
+ def git_command(env,command)
165
+ case env.to_s
166
+ when /main/ then git_path = [@main_path]
167
+ when /all/ then git_path = [@main_path,@pri_path]
168
+ else git_path = [@pri_path]
169
+ end
170
+
171
+ git_path.each do |x|
172
+ colorful(x,'filename')
173
+ system("cd #{x} && git #{command}")
178
174
  end
179
175
  end
180
176
 
181
- def search_name(args,msg = nil)
182
- path = (args =~ /^(@)/) ? [@main_path] : [@main_path , @pri_path]
177
+ #
178
+ # Search
179
+ #
180
+
181
+ def search_name(args,msg)
182
+ path = (args =~ /^(@)/) ? [@pri_path] : [@main_path , @pri_path]
183
183
  result = []
184
184
  path.each do |x|
185
- result.concat(`find "#{x}" -type f -iwholename '#{x}*#{args.gsub(/\//,'*/*').sub(/^@/,'').strip}*' -not -iwholename '*\/.git\/*'| sed 's/^.*\\/\\(private\\|main\\)\\//#{x=~/main/ ? '@':'' }/'`.to_a)
185
+ result.concat( %x{
186
+ find -L "#{x}" -type f -iwholename '#{x}*#{args.gsub(/\//,'*/*').sub(/^@/,'').strip}*' -not -iwholename '*\/.git\/*'| sed 's/^.*\\/\\(private\\|main\\)\\//#{x=~/main/ ? '@':'' }/'
187
+ }.to_a )
186
188
  end
187
189
 
188
190
  if result.empty?
@@ -195,58 +197,65 @@ module Yac
195
197
  end
196
198
 
197
199
  def search_content(args)
198
- result = `find "#{@pri_path}" -iname '*.ch' -not -iwholename '*\/.git\/*' -exec grep -HniP '#{args}' '{}' \\;`.to_a
199
- result.concat(`find "#{@main_path}" -iname '*.ch' -not -iwholename '*\/.git\/*' -exec grep -HniP '#{args}' '{}' \\; | sed 's/^/@/g'`.to_a)
200
+ # find -type f -exec sh -c 'file="{}";type=$(file $file);[[ $type =~ " text" ]] && echo $file' \; => Too slow
201
+
202
+ # If use @ as prefix , only search private repository
203
+ result = args.sub!(/^@/,'') ? [] : %x(
204
+ find "#{@main_path}" -not -iwholename '*\/.git\/*' | grep -E '*\.[ch|yac|yml]'| xargs grep -HniP '#{args}' | sed 's/^/@/g'
205
+ ).to_a
206
+
207
+ result.concat %x(
208
+ find "#{@pri_path}" -not -iwholename '*\/.git\/*' | grep -E '*\.[ch|yac|yml]'| xargs grep -HniP '#{args}'
209
+ ).to_a
210
+
200
211
  all_result = []
201
212
  result.each do |x|
202
213
  stuff = x.split(':',3)
203
214
  colorful(File.basename(stuff[0]).sub(/\..*/,''),"filename",false)
204
215
  colorful(stuff[1],"line_number",false)
205
- format_section(stuff[2],/((#{args}))/i)
216
+ format_text(stuff[2],/((#{args}))/i)
206
217
  all_result << stuff[0].sub(/(@?).*\/(?:main|private)\/(.*)/,'\1'+'\2')
207
218
  end
208
219
  all_result.uniq!
209
220
  loop do
210
- colorful("All files Contain #{args.strip},Choose one to show","notice")
221
+ colorful("All files Contain #{args.strip}","notice")
211
222
  file = full_path(choose_one(all_result))
212
- file ? format_file(file) : break
223
+ file ? handle_file(file) : break
213
224
  end
214
225
  end
215
226
 
216
- def full_path(args)
217
- return false unless args
218
- if args =~ /^@/
219
- @working_git = @main_git
220
- file = @main_path + args.sub(/^@/,"")
221
- else
222
- @working_git = @pri_git
223
- file = @pri_path + args
224
- end
225
- return file.strip
227
+ def full_path(filename)
228
+ return false unless filename
229
+ filename.sub!(/^@/,'') ? Dir.chdir(@main_path) : Dir.chdir(@pri_path)
230
+ return filename.strip
226
231
  end
227
232
 
228
233
  def confirm(*msg)
229
- colorful("#{msg.to_s}\nAre You Sure (Y/N) (q to quit):","notice",false)
234
+ colorful("#{msg.to_s}\nAre You Sure (Y/N) (q:quit):","notice",false)
230
235
  return STDIN.gets.to_s =~ /n|q/i ? false : true
231
236
  end
232
237
 
233
- def choose_one(stuff)
234
- if stuff.size > 0
235
- stuff.each_index do |x|
236
- colorful("%2s" % (x+1).to_s,"line_number",false)
237
- printf "%-22s\t" % [stuff[x].rstrip]
238
- print "\n" if (x+1)%3 == 0
239
- end
240
- printf "\n"
241
- num = choose_range(stuff.size)
242
- return stuff[num-1].to_s.strip #return the filename
238
+ def choose_one(args)
239
+ return false unless args.size > 0
240
+
241
+ args.each_index do |x|
242
+ printf "\e[%dm%3s\e[0m" % [args[x] =~ /^@/ ? 36:34,x+1]
243
+ printf " %-22s" % [trancate_filename(args[x].strip)]
244
+ print "\n" if (x+1)%3 == 0
243
245
  end
244
- rescue #Rescue for user input q to quit
246
+ puts "\n" if args.size%3 != 0
247
+
248
+ num = choose_range(args.size)
249
+ return num ? args[num-1].to_s.strip : false #return the filename
250
+ end
251
+
252
+ def trancate_filename(name)
253
+ name.sub!(/\..*$/,'').sub!(/^@/,'')
254
+ content = name.size > 22 ? '..' + name.reverse[0,20].reverse : name
245
255
  end
246
256
 
247
- #choose a valid number
248
257
  def choose_range(size)
249
- colorful("Please Input A Valid Number To Choose (1..#{size}) (q to quit): ","notice",false)
258
+ colorful("Please Input A Valid Number (1..#{size}) (q:quit): ","notice",false)
250
259
  num = STDIN.gets
251
260
  return false if num =~ /q/i
252
261
  choosed_num = num.strip.empty? ? 1 : num.to_i
data/resources/yacrc CHANGED
@@ -1,54 +1,19 @@
1
1
  #root:
2
- # add_if_not_exist: true
2
+
3
3
  main:
4
4
  clone-from: git://github.com/wosmvp/cheat.git
5
- # push-to:
5
+ # push-to:
6
6
  private:
7
- # clone-from:
8
- # push-to:
7
+ # clone-from:
8
+ # push-to:
9
9
 
10
- pdf_command: evince
11
- office_command: ooffice
12
- #image_command: evince
13
- #editor: vim
14
- #pdf_edit_command: ooffice
15
- #image_edit_command: gimp
16
10
 
17
- head1: "1;31"
18
- head2: "1;36"
19
- head3: "1;33"
20
- head4: "1;32"
21
- head5: "1;34"
22
- head6: "1;35"
23
- head7: "1;37"
11
+ editor: vim
24
12
 
25
- warn: "31"
26
- notice: "33"
27
- empha: "31;43"
28
- filename: "34"
29
- line_number: "32"
30
- text:
13
+ show_pdf: evince
14
+ show_image: eog
15
+ show_office: ooffice
31
16
 
32
- # How To Set Color
33
- #1 - Change text to hicolor (bold) mode
34
- #4 - " " " Underline
35
- #5 - " " " Blink
36
- #8 - " " " Hidden (same color as bg)
37
- #30 - " " " Black
38
- #31 - " " " Red
39
- #32 - " " " Green
40
- #33 - " " " Yellow
41
- #34 - " " " Blue
42
- #35 - " " " Magenta
43
- #36 - " " " Cyan
44
- #37 - " " " White
45
- #40 - Change background to Black
46
- #41 - " " " Red
47
- #42 - " " " Green
48
- #43 - " " " Yellow
49
- #44 - " " " Blue
50
- #45 - " " " Magenta
51
- #46 - " " " Cyan
52
- #47 - " " " White
53
- #0 - Turn off all attributes.
54
- #7 - Change to Black text on a White background
17
+ edit_pdf: ooffice
18
+ edit_image: gimp
19
+ edit_office: ooffice
data/yac.gemspec CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{yac}
5
- s.version = "1.3.2"
5
+ s.version = "1.4.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Jinzhu Zhang"]
9
- s.date = %q{2008-12-15}
9
+ s.date = %q{2008-12-28}
10
10
  s.default_executable = %q{yac}
11
11
  s.description = %q{Yet Another Cheat: sexy command line tool for cheat sheet.}
12
12
  s.email = %q{wosmvp@gmail.com}
13
13
  s.executables = ["yac"]
14
- s.extra_rdoc_files = ["CHANGELOG", "bin/yac", "lib/git.rb", "lib/format.rb", "lib/yac.rb", "README.rdoc"]
15
- s.files = ["CHANGELOG", "resources/yacrc", "bin/yac", "Rakefile", "yac.gemspec", "lib/git.rb", "lib/format.rb", "lib/yac.rb", "README.rdoc", "Manifest"]
14
+ s.extra_rdoc_files = ["CHANGELOG", "bin/yac", "lib/git.rb", "lib/format.rb", "lib/symbol.rb", "lib/yac.rb", "README.rdoc"]
15
+ s.files = ["Manifest", "CHANGELOG", "resources/yacrc", "bin/yac", "Rakefile", "lib/git.rb", "lib/format.rb", "lib/symbol.rb", "lib/yac.rb", "README.rdoc", "yac.gemspec"]
16
16
  s.has_rdoc = true
17
17
  s.homepage = %q{http://www.zhangjinzhu.com}
18
18
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Yac", "--main", "README.rdoc"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yac
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jinzhu Zhang
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-15 00:00:00 +08:00
12
+ date: 2008-12-28 00:00:00 +08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -24,19 +24,21 @@ extra_rdoc_files:
24
24
  - bin/yac
25
25
  - lib/git.rb
26
26
  - lib/format.rb
27
+ - lib/symbol.rb
27
28
  - lib/yac.rb
28
29
  - README.rdoc
29
30
  files:
31
+ - Manifest
30
32
  - CHANGELOG
31
33
  - resources/yacrc
32
34
  - bin/yac
33
35
  - Rakefile
34
- - yac.gemspec
35
36
  - lib/git.rb
36
37
  - lib/format.rb
38
+ - lib/symbol.rb
37
39
  - lib/yac.rb
38
40
  - README.rdoc
39
- - Manifest
41
+ - yac.gemspec
40
42
  has_rdoc: true
41
43
  homepage: http://www.zhangjinzhu.com
42
44
  post_install_message: