jugyo-termtter 1.1.3 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +115 -0
- data/README.rdoc +25 -10
- data/Rakefile +53 -34
- data/lib/plugins/cool.rb +2 -5
- data/lib/plugins/curry.rb +43 -0
- data/lib/plugins/db.rb +91 -0
- data/lib/plugins/{auto_reload.rb → defaults/auto_reload.rb} +5 -1
- data/lib/plugins/defaults/command_line.rb +111 -0
- data/lib/plugins/{exec.rb → defaults/exec.rb} +2 -7
- data/lib/plugins/{fib.rb → defaults/fib.rb} +1 -4
- data/lib/plugins/defaults/retweet.rb +34 -0
- data/lib/plugins/{standard_commands.rb → defaults/standard_commands.rb} +88 -162
- data/lib/plugins/defaults/standard_completion.rb +67 -0
- data/lib/plugins/defaults/stdout.rb +148 -0
- data/lib/plugins/defaults.rb +14 -0
- data/lib/plugins/en2ja.rb +11 -5
- data/lib/plugins/english.rb +2 -2
- data/lib/plugins/expand-tinyurl.rb +27 -6
- data/lib/plugins/github-issues.rb +192 -0
- data/lib/plugins/group.rb +30 -4
- data/lib/plugins/growl.rb +10 -1
- data/lib/plugins/http_server/favicon.ico +0 -0
- data/lib/plugins/http_server/index.html +117 -0
- data/lib/plugins/http_server.rb +82 -0
- data/lib/plugins/irb.rb +6 -0
- data/lib/plugins/l2.rb +1 -1
- data/lib/plugins/list_with_opts.rb +0 -3
- data/lib/plugins/log.rb +6 -9
- data/lib/plugins/modify_arg_hook_sample.rb +3 -5
- data/lib/plugins/multi_reply.rb +0 -5
- data/lib/plugins/notify-send.rb +1 -1
- data/lib/plugins/notify-send2.rb +1 -1
- data/lib/plugins/notify-send3.rb +11 -3
- data/lib/plugins/open_url.rb +5 -17
- data/lib/plugins/otsune.rb +3 -9
- data/lib/plugins/outputz.rb +1 -1
- data/lib/plugins/pool.rb +30 -0
- data/lib/plugins/protected_filter.rb +9 -0
- data/lib/plugins/quicklook.rb +1 -1
- data/lib/plugins/saykanji.rb +81 -0
- data/lib/plugins/shell.rb +1 -6
- data/lib/plugins/sl.rb +8 -8
- data/lib/plugins/tinyurl.rb +26 -7
- data/lib/plugins/trends.rb +84 -0
- data/lib/plugins/twitpic.rb +46 -0
- data/lib/plugins/uri-open.rb +33 -28
- data/lib/plugins/wassr.rb +0 -3
- data/lib/plugins/whois.rb +45 -0
- data/lib/plugins/yhara.rb +2 -6
- data/lib/termtter/client.rb +91 -103
- data/lib/termtter/command.rb +24 -9
- data/lib/termtter/config.rb +8 -6
- data/lib/termtter/config_setup.rb +1 -1
- data/lib/termtter/config_template.erb +1 -4
- data/lib/termtter/hook.rb +2 -2
- data/lib/termtter/optparse.rb +14 -1
- data/lib/termtter/system_extensions.rb +3 -2
- data/lib/termtter/task_manager.rb +1 -5
- data/lib/termtter/version.rb +1 -1
- data/spec/plugins/cool_spec.rb +1 -1
- data/spec/plugins/curry_spec.rb +13 -0
- data/spec/plugins/db_spec.rb +62 -0
- data/spec/plugins/english_spec.rb +2 -2
- data/spec/plugins/fib_spec.rb +2 -2
- data/spec/plugins/filter_spec.rb +2 -2
- data/spec/plugins/pause_spec.rb +1 -1
- data/spec/plugins/primes_spec.rb +2 -2
- data/spec/plugins/shell_spec.rb +1 -1
- data/spec/plugins/sl_spec.rb +1 -1
- data/spec/plugins/{standard_plugins_spec.rb → standard_commands_spec.rb} +2 -2
- data/spec/plugins/whois_spec.rb +20 -0
- data/spec/termtter/client_spec.rb +151 -33
- data/spec/termtter/command_spec.rb +68 -35
- data/spec/termtter/config_spec.rb +10 -0
- data/spec/termtter/optparse_spec.rb +16 -0
- data/spec/termtter_spec.rb +7 -8
- metadata +48 -19
- data/History.txt +0 -4
- data/lib/plugins/direct_messages.rb +0 -36
- data/lib/plugins/retweet.rb +0 -46
- data/lib/plugins/stdout.rb +0 -77
data/ChangeLog
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
== 1.3.0 2009-07-27
|
2
|
+
|
3
|
+
Koichiro Ohba (3):
|
4
|
+
Added group_filter.
|
5
|
+
|
6
|
+
Shin-ichiro OGAWA (1):
|
7
|
+
Fix retweet command.
|
8
|
+
|
9
|
+
Tomohiro Nishimura (17):
|
10
|
+
add github-issues plugin
|
11
|
+
add icomment command to github-issues plugin
|
12
|
+
add isearch command to github-issues plugin
|
13
|
+
now help command allow you to search specific one
|
14
|
+
add functionality of hash tag tracking for sl plugin
|
15
|
+
fix Termtter::Client.plug bug
|
16
|
+
add pool plugin
|
17
|
+
add comment for retweet plugin
|
18
|
+
register_command can take command name as symbol
|
19
|
+
add trends plugin
|
20
|
+
remove configatron method (already 1.2.0)
|
21
|
+
|
22
|
+
Yasuhiro Matsumoto (1):
|
23
|
+
some color was broken on windows.
|
24
|
+
|
25
|
+
emasaka (33):
|
26
|
+
expand-tinyurl.rb: added force_encoding for Ruby 1.9
|
27
|
+
expand-tinyurl.rb: added config "skip_users"
|
28
|
+
expand-tinyurl.rb: added config "shortters"
|
29
|
+
expand-tinyurl.rb: add_filter -> register_hook
|
30
|
+
expand-tinyurl.rb: refactored expand_url method
|
31
|
+
set permission 0600 when creating config file
|
32
|
+
modified regexp of ff.im (plugin/expand-tinyurl.rb)
|
33
|
+
moved "t.plug 'auto_reload'" to the end of default config file.
|
34
|
+
Defined dummy Encoding::UTF_8 for Ruby 1.8 (expand-tinyurl.rb)
|
35
|
+
use multiple URL shortening APIs.
|
36
|
+
separated options and texts in nofity-send* plugins
|
37
|
+
trap SIGCONT to redraw prompt
|
38
|
+
|
39
|
+
jugyo (79):
|
40
|
+
Fixed modify_arg_for_* hook
|
41
|
+
Added a hook point for completion.
|
42
|
+
Changed the signature of register_hook
|
43
|
+
Updated a sample script
|
44
|
+
Added a plugin 'standard_completion'.
|
45
|
+
Changed to load a plugin 'standard_completion' as default plugin.
|
46
|
+
Changed to use completion of standard_completion.rb
|
47
|
+
Implemented easy_reply
|
48
|
+
Implemented completion for hashtags.
|
49
|
+
Fixed regex for completion of search keywords.
|
50
|
+
Implemented a db plugins.
|
51
|
+
Fixed bug for associations.
|
52
|
+
Added a method 'confirm'.
|
53
|
+
Added a command 'db_clear'.
|
54
|
+
Changed confirm to call block if given.
|
55
|
+
Fixed confirm to call pause and resume.
|
56
|
+
Added commands 'do_list' and 'db_execute'
|
57
|
+
Removed alias 'l' from command 'db_list'.
|
58
|
+
Fixed hook :collect_statuses_for_db
|
59
|
+
Fixed a bug devel option is not working.
|
60
|
+
Removed setting for config.devel
|
61
|
+
Changed to remove dir 'rdoc' when 'rake clean'.
|
62
|
+
Fixed 'spec_opts'
|
63
|
+
Create a plugin 'defaults' that load deafult plugins.
|
64
|
+
Added a task to generate gemspec.
|
65
|
+
Fixed completion_proc
|
66
|
+
Fixed path of standard plugins.
|
67
|
+
Implemented the http sever plugin.
|
68
|
+
Changed port configurable
|
69
|
+
Changed path for execute command.
|
70
|
+
Changed to handle files
|
71
|
+
Added favicon.ico
|
72
|
+
Created a web client.
|
73
|
+
Fixed bugs for ajax
|
74
|
+
Modified html
|
75
|
+
コマンドの処理を全て TaskManager の invoke_and_wait の中でやるようにした
|
76
|
+
Fixed commands plug and plugins.
|
77
|
+
Added a option 'show_as_thread' to stdout.
|
78
|
+
Added options sticky and priority to plugin growl.
|
79
|
+
Applied a patch from Kiwamu Okabe to notify-send3
|
80
|
+
Added a command 'twitpic' for upload an image to TwitPic.
|
81
|
+
Moved a plug 'devel'.
|
82
|
+
Added a default task to Rakefile
|
83
|
+
Moved retweet plugin to defaults
|
84
|
+
Moved fib plugin to defaults
|
85
|
+
Moved exec plugin to defaults
|
86
|
+
Added a alias '!' for exec command.
|
87
|
+
Renamed alias of exit command 'e' to 'quit'.
|
88
|
+
Deleted a disused plugin
|
89
|
+
Created a plugin 'command_line'.
|
90
|
+
Added a irb command.
|
91
|
+
Changed to case sensitive for user name completion.
|
92
|
+
Fixed Rakefile. (closed #82)
|
93
|
+
Changed to not handle error at TaskManager#invoke_and_wait
|
94
|
+
Created the hook point 'prepare_command', and clean the code.
|
95
|
+
Changed to use the hook point 'prepare_command' for curry.
|
96
|
+
Added completion for curry command.
|
97
|
+
Created a new hook point named 'prepare_prompt'.
|
98
|
+
Changed to use prepare_prompt for curry, and changed specs as command.
|
99
|
+
|
100
|
+
ktgy (5):
|
101
|
+
Added saykanji.rb
|
102
|
+
|
103
|
+
ujihisa (13):
|
104
|
+
Added -m
|
105
|
+
Fixed wrong warning message
|
106
|
+
Termtter::Client.plug: Enable to receive array
|
107
|
+
Added new plugin 'curry'
|
108
|
+
|
109
|
+
yoppi (2):
|
110
|
+
Added 'whois' command
|
111
|
+
|
112
|
+
== 0.0.1 2008-12-26
|
113
|
+
|
114
|
+
* 1 major enhancement:
|
115
|
+
* Initial release
|
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= termtter
|
2
2
|
|
3
|
-
http://
|
3
|
+
http://termtter.org/
|
4
4
|
|
5
5
|
== DESCRIPTION:
|
6
6
|
|
@@ -34,7 +34,7 @@ Search
|
|
34
34
|
|
35
35
|
== REQUIREMENTS:
|
36
36
|
|
37
|
-
* json_pure
|
37
|
+
* json_pure or json
|
38
38
|
* termcolor
|
39
39
|
* rubytter
|
40
40
|
|
@@ -62,26 +62,41 @@ If you would like to use proxy server, add configurations like this:
|
|
62
62
|
You can to load plugins in this way:
|
63
63
|
|
64
64
|
Termtter::Client.init do |t|
|
65
|
-
t.plug '
|
66
|
-
t.plug '
|
67
|
-
t.plug 'auto_reload'
|
65
|
+
t.plug 'fib'
|
66
|
+
t.plug 'growl'
|
68
67
|
end
|
69
68
|
|
70
69
|
To update the config, just restart your termtter proccess.
|
71
70
|
|
72
71
|
== FORUM:
|
73
72
|
|
74
|
-
http://
|
75
|
-
|
76
|
-
== DOCUMENT:
|
77
|
-
|
78
|
-
http://wiki.github.com/jugyo/termtter/home (in Japanese)
|
73
|
+
http://groups.google.co.jp/group/termtter
|
79
74
|
|
80
75
|
== TODO:
|
81
76
|
|
82
77
|
- Enhance the document and spec
|
83
78
|
- Improve the UI(a status view, etc...)
|
84
79
|
|
80
|
+
== ADVANCED USAGE:
|
81
|
+
|
82
|
+
t.plug 'curry'
|
83
|
+
|
84
|
+
Your termtter can curry commands.
|
85
|
+
|
86
|
+
> curry u
|
87
|
+
u > hi
|
88
|
+
updated => hi
|
89
|
+
u > curry @ujm
|
90
|
+
u @ujm > hi
|
91
|
+
updated => @ujm hi
|
92
|
+
u @ujm > uncurry
|
93
|
+
>
|
94
|
+
|
95
|
+
You can also type `<` as curry.
|
96
|
+
|
97
|
+
> < u
|
98
|
+
u >
|
99
|
+
|
85
100
|
== LICENSE:
|
86
101
|
|
87
102
|
(The MIT License)
|
data/Rakefile
CHANGED
@@ -1,27 +1,23 @@
|
|
1
1
|
$:.unshift File.dirname(__FILE__) + '/lib'
|
2
|
+
|
2
3
|
require 'spec/rake/spectask'
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
end
|
4
|
+
require 'rake/clean'
|
5
|
+
require 'rake/gempackagetask'
|
6
|
+
require 'rake/rdoctask'
|
7
|
+
require 'termtter/version'
|
8
8
|
|
9
|
-
desc
|
10
|
-
task :
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
s.
|
17
|
-
s.
|
18
|
-
s.
|
19
|
-
s.
|
20
|
-
|
21
|
-
#{Dir['test/**/*.rb', 'test/**/*.json'].join(' ')}
|
22
|
-
README.rdoc
|
23
|
-
History.txt
|
24
|
-
Rakefile )
|
9
|
+
desc "default task"
|
10
|
+
task :default => [:install, :spec]
|
11
|
+
|
12
|
+
name = 'termtter'
|
13
|
+
version = Termtter::VERSION
|
14
|
+
|
15
|
+
spec = Gem::Specification.new do |s|
|
16
|
+
s.name = name
|
17
|
+
s.version = version
|
18
|
+
s.summary = "Terminal based Twitter client."
|
19
|
+
s.description = "Termtter is a terminal based Twitter client."
|
20
|
+
s.files = %w(Rakefile README.rdoc ChangeLog) + Dir.glob("{lib,spec,test}/**/*")
|
25
21
|
s.executables = ["kill_termtter", "termtter"]
|
26
22
|
s.add_dependency("json_pure", ">= 1.1.3")
|
27
23
|
s.add_dependency("highline", ">= 1.5.0")
|
@@ -33,23 +29,46 @@ Gem::Specification.new do |s|
|
|
33
29
|
s.rubyforge_project = 'termtter'
|
34
30
|
s.has_rdoc = true
|
35
31
|
s.rdoc_options = ["--main", "README.rdoc", "--exclude", "spec"]
|
36
|
-
s.extra_rdoc_files = ["README.rdoc", "
|
32
|
+
s.extra_rdoc_files = ["README.rdoc", "ChangeLog"]
|
37
33
|
end
|
38
|
-
|
34
|
+
|
35
|
+
Rake::GemPackageTask.new(spec) do |p|
|
36
|
+
p.need_tar = true
|
37
|
+
end
|
38
|
+
|
39
|
+
task :gemspec do
|
40
|
+
filename = "#{name}.gemspec"
|
41
|
+
open(filename, 'w') do |f|
|
42
|
+
f.write spec.to_ruby
|
39
43
|
end
|
40
|
-
puts
|
44
|
+
puts <<-EOS
|
45
|
+
Successfully generated gemspec
|
46
|
+
Name: #{name}
|
47
|
+
Version: #{version}
|
48
|
+
File: #{filename}
|
49
|
+
EOS
|
41
50
|
end
|
42
51
|
|
43
|
-
|
44
|
-
|
45
|
-
system 'gem', 'build', 'termtter.gemspec'
|
52
|
+
task :install => [ :package ] do
|
53
|
+
sh %{sudo gem install pkg/#{name}-#{version}.gem}
|
46
54
|
end
|
47
55
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
56
|
+
task :uninstall => [ :clean ] do
|
57
|
+
sh %{sudo gem uninstall #{name}}
|
58
|
+
end
|
59
|
+
|
60
|
+
desc 'run all specs'
|
61
|
+
Spec::Rake::SpecTask.new do |t|
|
62
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
63
|
+
t.spec_opts = ['-c']
|
55
64
|
end
|
65
|
+
|
66
|
+
Rake::RDocTask.new do |t|
|
67
|
+
t.rdoc_dir = 'rdoc'
|
68
|
+
t.title = "rest-client, fetch RESTful resources effortlessly"
|
69
|
+
t.options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object'
|
70
|
+
t.options << '--charset' << 'utf-8'
|
71
|
+
t.rdoc_files.include('README.rdoc', 'lib/**/*.rb')
|
72
|
+
end
|
73
|
+
|
74
|
+
CLEAN.include [ 'pkg', 'rdoc' ]
|
data/lib/plugins/cool.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
module Termtter::Client
|
4
|
-
register_macro(:cool, "update
|
5
|
-
:help => ['cool {SCREENNAME}', 'update "@{SCREENNAME} cool."']
|
6
|
-
:completion_proc => lambda {|cmd, args|
|
7
|
-
find_user_candidates args, "#{cmd} %s"
|
8
|
-
}
|
4
|
+
register_macro(:cool, "update %s cool.",
|
5
|
+
:help => ['cool {SCREENNAME}', 'update "@{SCREENNAME} cool."']
|
9
6
|
)
|
10
7
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Termtter::Client
|
4
|
+
public_storage[:curry] = ''
|
5
|
+
|
6
|
+
register_command(
|
7
|
+
:name => :curry,
|
8
|
+
:alias => :<,
|
9
|
+
:exec => lambda {|arg|
|
10
|
+
unless arg.empty?
|
11
|
+
public_storage[:curry] += arg + ' '
|
12
|
+
end
|
13
|
+
},
|
14
|
+
:completion => lambda {|cmd, arg|
|
15
|
+
commands.map{|name, command| command.complement(arg)}.
|
16
|
+
flatten.
|
17
|
+
compact.
|
18
|
+
map{|i| "#{cmd} #{i}"}
|
19
|
+
}
|
20
|
+
)
|
21
|
+
|
22
|
+
register_command(
|
23
|
+
:name => :uncurry,
|
24
|
+
:alias => :>,
|
25
|
+
:exec=> lambda {|arg|
|
26
|
+
public_storage[:curry] = ''
|
27
|
+
}
|
28
|
+
)
|
29
|
+
|
30
|
+
register_hook(
|
31
|
+
:name => :apply_curry,
|
32
|
+
:point => :prepare_command,
|
33
|
+
:exec => lambda {|text|
|
34
|
+
/^(curry|<|uncurry|>)/ =~ text ? text : public_storage[:curry] + text
|
35
|
+
}
|
36
|
+
)
|
37
|
+
|
38
|
+
register_hook(
|
39
|
+
:name => :curry_prompt,
|
40
|
+
:point => :prepare_prompt,
|
41
|
+
:exec => lambda {|prompt| public_storage[:curry] + prompt }
|
42
|
+
)
|
43
|
+
end
|
data/lib/plugins/db.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'sequel'
|
3
|
+
|
4
|
+
config.plugins.db.set_default(:path, Termtter::CONF_DIR + '/termtter.db')
|
5
|
+
|
6
|
+
DB = Sequel.sqlite(config.plugins.db.path) unless defined? DB
|
7
|
+
|
8
|
+
unless DB.table_exists?(:statuses)
|
9
|
+
DB.create_table :statuses do
|
10
|
+
primary_key :id
|
11
|
+
Integer :user_id
|
12
|
+
String :text
|
13
|
+
String :source
|
14
|
+
String :created_at
|
15
|
+
Integer :in_reply_to_status_id
|
16
|
+
Integer :in_reply_to_user_id
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
unless DB.table_exists?(:users)
|
21
|
+
DB.create_table :users do
|
22
|
+
primary_key :id
|
23
|
+
String :screen_name
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class Status < Sequel::Model(:statuses)
|
28
|
+
many_to_one :user
|
29
|
+
end
|
30
|
+
|
31
|
+
class User < Sequel::Model(:users)
|
32
|
+
one_to_many :statuses
|
33
|
+
end
|
34
|
+
|
35
|
+
module Termtter
|
36
|
+
module Client
|
37
|
+
register_hook(:collect_statuses_for_db, :point => :pre_filter) do |statuses, event|
|
38
|
+
statuses.each do |s|
|
39
|
+
|
40
|
+
# Save statuses
|
41
|
+
if Status.filter(:id => s.id).empty?
|
42
|
+
status = {}
|
43
|
+
Status.columns.each do |col|
|
44
|
+
status[col] =
|
45
|
+
case col
|
46
|
+
when :user_id
|
47
|
+
s.user.id
|
48
|
+
else
|
49
|
+
s[col] rescue nil
|
50
|
+
end
|
51
|
+
end
|
52
|
+
Status << status
|
53
|
+
end
|
54
|
+
|
55
|
+
# Save users
|
56
|
+
if User.filter(:id => s.user.id).empty?
|
57
|
+
user = {}
|
58
|
+
User.columns.each do |col|
|
59
|
+
user[col] = s.user[col]
|
60
|
+
end
|
61
|
+
User << user
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
register_command(:db_search, :alias => :ds) do |arg|
|
68
|
+
statuses = Status.filter(:text.like("%#{arg}%")).limit(20)
|
69
|
+
output(statuses, :db_search)
|
70
|
+
end
|
71
|
+
|
72
|
+
register_command(:db_clear) do |arg|
|
73
|
+
if confirm('Are you shure?')
|
74
|
+
User.delete
|
75
|
+
Status.delete
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
register_command(:db_list) do |arg|
|
80
|
+
user_name = normalize_as_user_name(arg)
|
81
|
+
statuses = Status.join(:users, :id => :user_id).filter(:users__screen_name => user_name).limit(20)
|
82
|
+
output(statuses, :db_search)
|
83
|
+
end
|
84
|
+
|
85
|
+
register_command(:db_execute) do |arg|
|
86
|
+
DB.execute(arg).each do |row|
|
87
|
+
p row
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'singleton'
|
3
|
+
|
4
|
+
module Termtter
|
5
|
+
class CommandLine
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def start
|
10
|
+
instance.start
|
11
|
+
end
|
12
|
+
|
13
|
+
def stop
|
14
|
+
instance.stop
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def start
|
19
|
+
start_input_thread
|
20
|
+
end
|
21
|
+
|
22
|
+
def stop
|
23
|
+
@input_thread.kill
|
24
|
+
end
|
25
|
+
|
26
|
+
def call(command_text)
|
27
|
+
# Example:
|
28
|
+
# t.register_hook(:post_all, :point => :prepare_command) do |s|
|
29
|
+
# "update #{s}"
|
30
|
+
# end
|
31
|
+
Client.get_hooks('prepare_command').each {|hook|
|
32
|
+
command_text = hook.call(command_text)
|
33
|
+
}
|
34
|
+
Client.call_commands(command_text)
|
35
|
+
end
|
36
|
+
|
37
|
+
def prompt
|
38
|
+
prompt_text = config.prompt
|
39
|
+
Client.get_hooks('prepare_prompt').each {|hook|
|
40
|
+
prompt_text = hook.call(prompt_text)
|
41
|
+
}
|
42
|
+
prompt_text
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def start_input_thread
|
48
|
+
setup_readline()
|
49
|
+
trap_setting()
|
50
|
+
@input_thread = Thread.new do
|
51
|
+
while buf = Readline.readline(ERB.new(prompt).result(Termtter::API.twitter.__send__(:binding)), true)
|
52
|
+
Readline::HISTORY.pop if buf.empty?
|
53
|
+
begin
|
54
|
+
call(buf)
|
55
|
+
rescue Exception => e
|
56
|
+
Client.handle_error(e)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
@input_thread.join
|
61
|
+
end
|
62
|
+
|
63
|
+
def setup_readline
|
64
|
+
if Readline.respond_to?(:basic_word_break_characters=)
|
65
|
+
Readline.basic_word_break_characters= "\t\n\"\\'`><=;|&{("
|
66
|
+
end
|
67
|
+
Readline.completion_proc = lambda {|input|
|
68
|
+
begin
|
69
|
+
words = []
|
70
|
+
words << Client.commands.map {|name, command| command.complement(input) }
|
71
|
+
Client.get_hooks(:completion).each do |hook|
|
72
|
+
words << hook.call(input) rescue nil
|
73
|
+
end
|
74
|
+
words.flatten.compact
|
75
|
+
rescue Exception => e
|
76
|
+
Client.handle_error(e)
|
77
|
+
end
|
78
|
+
}
|
79
|
+
vi_or_emacs = config.editing_mode
|
80
|
+
unless vi_or_emacs.empty?
|
81
|
+
Readline.__send__("#{vi_or_emacs}_editing_mode")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def trap_setting()
|
86
|
+
begin
|
87
|
+
stty_save = `stty -g`.chomp
|
88
|
+
trap("INT") do
|
89
|
+
begin
|
90
|
+
system "stty", stty_save
|
91
|
+
ensure
|
92
|
+
Client.call_commands('exit')
|
93
|
+
end
|
94
|
+
end
|
95
|
+
trap("CONT") do
|
96
|
+
Readline.refresh_line
|
97
|
+
end
|
98
|
+
rescue ArgumentError
|
99
|
+
rescue Errno::ENOENT
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
Client.register_hook(:initialize_command_line, :point => :launched) do
|
105
|
+
CommandLine.start
|
106
|
+
end
|
107
|
+
|
108
|
+
Client.register_hook(:finalize_command_line, :point => :exit) do
|
109
|
+
CommandLine.stop
|
110
|
+
end
|
111
|
+
end
|
@@ -3,14 +3,9 @@
|
|
3
3
|
module Termtter::Client
|
4
4
|
register_command(
|
5
5
|
:name => :exec,
|
6
|
+
:alias => :'!',
|
6
7
|
:exec_proc => lambda{|arg|
|
7
|
-
|
8
|
-
begin
|
9
|
-
pause
|
10
|
-
system *arg.split(/\s+/)
|
11
|
-
ensure
|
12
|
-
resume
|
13
|
-
end
|
8
|
+
system *arg.split(/\s+/) if arg
|
14
9
|
},
|
15
10
|
:help => ['exec SHELL_COMMAND', 'execute a shell command']
|
16
11
|
)
|
@@ -15,14 +15,11 @@ module Termtter::Client
|
|
15
15
|
:name => :fibyou,
|
16
16
|
:exec_proc => lambda {|arg|
|
17
17
|
/(\w+)\s(\d+)/ =~ arg
|
18
|
-
name = $1
|
18
|
+
name = normalize_as_user_name($1)
|
19
19
|
n = $2.to_i
|
20
20
|
text = "@#{name} fib(#{n}) = #{fib n}"
|
21
21
|
Termtter::API.twitter.update(text)
|
22
22
|
puts "=> " << text
|
23
|
-
},
|
24
|
-
:completion_proc => lambda {|cmd, arg|
|
25
|
-
find_user_candidates arg, "#{cmd} %s"
|
26
23
|
}
|
27
24
|
)
|
28
25
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
config.plugins.retweet.set_default(:format, '<%= comment %>RT @<%=s.user.screen_name%>: <%=s.text%>')
|
4
|
+
|
5
|
+
module Termtter::Client
|
6
|
+
def self.post_retweet(s, comment = nil)
|
7
|
+
comment += ' ' unless comment.nil?
|
8
|
+
text = ERB.new(config.plugins.retweet.format).result(binding)
|
9
|
+
Termtter::API.twitter.update(text)
|
10
|
+
puts "=> #{text}"
|
11
|
+
end
|
12
|
+
|
13
|
+
register_command(
|
14
|
+
:name => :retweet,
|
15
|
+
:aliases => [:rt],
|
16
|
+
:help => ['retweet,rt (ID|@USER)', 'Post a retweet message'],
|
17
|
+
:exec_proc => lambda {|arg|
|
18
|
+
arg, comment = arg.split(/\s/, 2)
|
19
|
+
if public_storage[:typable_id] && s = typable_id_status(arg)
|
20
|
+
post_retweet(s, comment)
|
21
|
+
else
|
22
|
+
case arg
|
23
|
+
when /(\d+)/
|
24
|
+
post_retweet(Termtter::API.twitter.show(arg), comment)
|
25
|
+
when /@([A-Za-z0-9_]+)/
|
26
|
+
user = $1
|
27
|
+
statuses = Termtter::API.twitter.user_timeline(user)
|
28
|
+
return if statuses.empty?
|
29
|
+
post_retweet(statuses[0], comment)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
}
|
33
|
+
)
|
34
|
+
end
|