chrisjpowers-iterm_window 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/LICENSE +21 -0
  2. data/README.rdoc +69 -0
  3. data/lib/iterm_window.rb +231 -0
  4. metadata +55 -0
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2009 Chris Powers, The Killswitch Collective
2
+ http://killswitchcollective.com
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,69 @@
1
+ = iTermWindow
2
+
3
+ <em>Developed March 17, 2008 by Chris Powers, Killswitch Collective http://killswitchcollective.com</em>
4
+
5
+ The ItermWindow class models an iTerm terminal window and allows for full control via Ruby commands.
6
+ Under the hood, this class is a wrapper of iTerm's Applescript scripting API. Methods are used to
7
+ generate Applescript code which is run as an <tt>osascript</tt> command when the ItermWindow initialization
8
+ block is closed.
9
+
10
+ ItermWindow::Tab models a tab (session) in an iTerm terminal window and allows for it to be controlled by Ruby.
11
+ These tabs can be created with either the ItermWindow#open_bookmark method or the ItermWindow#open_tab
12
+ method. Each tab is given a name (symbol) by which it can be accessed later in the code using
13
+ the tab name as an ItermWindow method.
14
+
15
+ == EXAMPLE - Open a new iTerm window, cd to a project and open it in TextMate
16
+
17
+ require 'rubygems'
18
+ require 'chrisjpowers-iterm_window'
19
+
20
+ ItermWindow.open do
21
+ open_tab :my_tab do
22
+ write "cd ~/projects/my_project/trunk"
23
+ write "mate ./"
24
+ end
25
+ end
26
+
27
+ == EXAMPLE - Use the current iTerm window, cd to a project and open in TextMate, launch the server and the console and title them
28
+
29
+ ItermWindow.current do
30
+ open_tab :project_dir do
31
+ write "cd ~/projects/my_project/trunk"
32
+ write "mate ./"
33
+ set_title "MyProject Dir"
34
+ end
35
+ open_tab :server do
36
+ write "cd ~/projects/my_project/trunk"
37
+ write "script/server -p 3005"
38
+ set_title "MyProject Server"
39
+ end
40
+ open_tab :console do
41
+ write "cd ~/projects/my_project/trunk"
42
+ write "script/console"
43
+ set_title "MyProject Console"
44
+ end
45
+ end
46
+
47
+ == EXAMPLE - Same thing, but use bookmarks that were made for the server and console. Also, switch focus back to project dir.
48
+
49
+ ItermWindow.current do
50
+ open_tab :project_dir do
51
+ write "cd ~/projects/my_project/trunk"
52
+ write "mate ./"
53
+ end
54
+ open_bookmark :server, 'MyProject Server'
55
+ open_bookmark :console, 'MyProject Console'
56
+ project_dir.select
57
+
58
+ == EXAMPLE - Arbitrarily open two tabs, switch between them and run methods/blocks with Tab#select method and Tab#write directly
59
+
60
+ ItermWindow.open do
61
+ open_tab :first_tab
62
+ open_tab :second_tab
63
+ first_tab.select do
64
+ write 'cd ~/projects'
65
+ write 'ls'
66
+ end
67
+ second_tab.write "echo 'hello there!'"
68
+ first_tab.select # brings first tab back to focus
69
+ end
@@ -0,0 +1,231 @@
1
+ # Developed March 17, 2008 by Chris Powers, Killswitch Collective http://killswitchcollective.com
2
+ #
3
+ # The ItermWindow class models an iTerm terminal window and allows for full control via Ruby commands.
4
+ # Under the hood, this class is a wrapper of iTerm's Applescript scripting API. Methods are used to
5
+ # generate Applescript code which is run as an <tt>osascript</tt> command when the ItermWindow initialization
6
+ # block is closed.
7
+ #
8
+ # ItermWindow::Tab models a tab (session) in an iTerm terminal window and allows for it to be controlled by Ruby.
9
+ # These tabs can be created with either the ItermWindow#open_bookmark method or the ItermWindow#open_tab
10
+ # method. Each tab is given a name (symbol) by which it can be accessed later as a method of ItermWindow.
11
+ #
12
+ # EXAMPLE - Open a new iTerm window, cd to a project and open it in TextMate
13
+ #
14
+ # ItermWindow.open do
15
+ # open_tab :my_tab do
16
+ # write "cd ~/projects/my_project/trunk"
17
+ # write "mate ./"
18
+ # end
19
+ # end
20
+ #
21
+ # EXAMPLE - Use the current iTerm window, cd to a project and open in TextMate, launch the server and the console and title them
22
+ #
23
+ # ItermWindow.current do
24
+ # open_tab :project_dir do
25
+ # write "cd ~/projects/my_project/trunk"
26
+ # write "mate ./"
27
+ # set_title "MyProject Dir"
28
+ # end
29
+ #
30
+ # window.open_tab :server do
31
+ # write "cd ~/projects/my_project/trunk"
32
+ # write "script/server -p 3005"
33
+ # set_title "MyProject Server"
34
+ # end
35
+ # window.open_tab :console do
36
+ # write "cd ~/projects/my_project/trunk"
37
+ # write "script/console"
38
+ # set_title "MyProject Console"
39
+ # end
40
+ # end
41
+ #
42
+ # EXAMPLE - Same thing, but use bookmarks that were made for the server and console. Also, switch focus back to project dir.
43
+ #
44
+ # ItermWindow.current do
45
+ # open_tab :project_dir do
46
+ # write "cd ~/projects/my_project/trunk"
47
+ # write "mate ./"
48
+ # end
49
+ # open_bookmark :server, 'MyProject Server'
50
+ # open_bookmark :console, 'MyProject Console'
51
+ # project_dir.select
52
+ #
53
+ # EXAMPLE - Arbitrarily open two tabs, switch between them and run methods/blocks with Tab#select method and Tab#write directly
54
+ #
55
+ # ItermWindow.open do
56
+ # open_tab :first_tab
57
+ # open_tab :second_tab
58
+ # first_tab.select do
59
+ # write 'cd ~/projects'
60
+ # write 'ls'
61
+ # end
62
+ # second_tab.write "echo 'hello there!'"
63
+ # first_tab.select # brings first tab back to focus
64
+ # end
65
+
66
+
67
+ # The ItermWindow class models an iTerm terminal window and allows for full control via Ruby commands.
68
+ class ItermWindow
69
+
70
+ # While you can directly use ItermWindow.new, using either ItermWindow.open or
71
+ # ItermWindow.current is the preferred method.
72
+ def initialize(window_type = :new, &block)
73
+ @buffer = []
74
+ @tabs = {}
75
+ run_commands window_type, &block
76
+ send_output
77
+ end
78
+
79
+ # Creates a new terminal window, runs the block on it
80
+ def self.open(&block)
81
+ new(:new, &block)
82
+ end
83
+
84
+ # Selects the first terminal window, runs the block on it
85
+ def self.current(&block)
86
+ new(:current, &block)
87
+ end
88
+
89
+ # Creates a new tab from a bookmark, runs the block on it
90
+ def open_bookmark(name, bookmark, &block)
91
+ create_tab(name, bookmark, &block)
92
+ end
93
+
94
+ # Creates a new tab from 'Default Session', runs the block on it
95
+ def open_tab(name, &block)
96
+ create_tab(name, 'Default Session', &block)
97
+ end
98
+
99
+ # Outputs a single line of Applescript code
100
+ def output(command)
101
+ @buffer << command.gsub(/'/, '"')
102
+ end
103
+
104
+
105
+ private
106
+
107
+ # Outputs @buffer to the command line as an osascript function
108
+ def send_output
109
+ buffer_str = @buffer.map {|line| "-e '#{line}'"}.join(' ')
110
+ `osascript #{buffer_str}`
111
+ # puts buffer_str
112
+ end
113
+
114
+ # Initializes the terminal window
115
+ def run_commands(window_type, &block)
116
+ window_types = {:new => '(make new terminal)', :current => 'first terminal'}
117
+ raise ArgumentError, "ItermWindow#run_commands should be passed :new or :current." unless window_types.keys.include? window_type
118
+ output "tell application 'iTerm'"
119
+ output "activate"
120
+ output "set myterm to #{window_types[window_type]}"
121
+ output "tell myterm"
122
+ self.instance_eval(&block) if block_given?
123
+ output "end tell"
124
+ output "end tell"
125
+ end
126
+
127
+ # Creates a new Tab object, either default or from a bookmark
128
+ def create_tab(name, bookmark=nil, &block)
129
+ @tabs[name] = Tab.new(self, name, bookmark, &block)
130
+ end
131
+
132
+ # Access the tabs by their names
133
+ def method_missing(method_name, *args, &block)
134
+ @tabs[method_name] || super
135
+ end
136
+
137
+
138
+
139
+ # The Tab class models a tab (session) in an iTerm terminal window and allows for it to be controlled by Ruby.
140
+ class Tab
141
+
142
+ attr_reader :name
143
+ attr_reader :bookmark
144
+
145
+ def initialize(window, name, bookmark = nil, &block)
146
+ @name = name
147
+ @bookmark = bookmark
148
+ @window = window
149
+ @currently_executing_block = false
150
+ output "launch session '#{@bookmark}'"
151
+ # store tty id for later access
152
+ output "set #{name}_tty to the tty of the last session"
153
+ execute_block &block if block_given?
154
+ end
155
+
156
+ # Brings a tab into focus, runs a block on it if passed
157
+ def select(&block)
158
+ if block_given?
159
+ execute_block &block
160
+ else
161
+ output "select session id #{name}_tty"
162
+ end
163
+ end
164
+
165
+ # Writes a command into the terminal tab
166
+ def write(command)
167
+ if @currently_executing_block
168
+ output "write text '#{command}'"
169
+ else
170
+ execute_block { write command }
171
+ end
172
+ end
173
+
174
+ # Sets the title of the tab (ie the text on the iTerm tab itself)
175
+ def set_title(str)
176
+ if @currently_executing_block
177
+ output "set name to '#{str}'"
178
+ else
179
+ execute_block { set_title = str }
180
+ end
181
+ end
182
+
183
+ # These style methods keep crashing iTerm for some reason...
184
+
185
+ # # Sets the tab's font color
186
+ # def set_font_color(str)
187
+ # if @currently_executing_block
188
+ # output "set foreground color to '#{str}'"
189
+ # else
190
+ # execute_block { set_font_color = str }
191
+ # end
192
+ # end
193
+ #
194
+ # # Sets the tab's background color
195
+ # def set_background_color(str)
196
+ # if @currently_executing_block
197
+ # output "set background color to '#{str}'"
198
+ # else
199
+ # execute_block { set_bg_color = str }
200
+ # end
201
+ # end
202
+ # alias_method :set_bg_color, :set_background_color
203
+ #
204
+ # # Sets the tab's transparency
205
+ # def set_transparency(float)
206
+ # if @currently_executing_block
207
+ # output "set transparency to '#{float}'"
208
+ # else
209
+ # execute_block { set_transparency = float }
210
+ # end
211
+ # end
212
+
213
+ # Runs a block on this tab with proper opening and closing statements
214
+ def execute_block(&block)
215
+ @currently_executing_block = true
216
+ output "tell session id #{name}_tty"
217
+ self.instance_eval(&block)
218
+ output "end tell"
219
+ @currently_executing_block = false
220
+ end
221
+
222
+ private
223
+
224
+ def output(command)
225
+ @window.output command
226
+ end
227
+
228
+
229
+ end
230
+
231
+ end
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chrisjpowers-iterm_window
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.2
5
+ platform: ruby
6
+ authors:
7
+ - Chris Powers
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-02-20 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: chris@killswitchcollective.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - README.rdoc
26
+ - LICENSE
27
+ - lib/iterm_window.rb
28
+ has_rdoc: true
29
+ homepage: http://killswitchcollective.com
30
+ post_install_message:
31
+ rdoc_options: []
32
+
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: "0"
40
+ version:
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ version:
47
+ requirements: []
48
+
49
+ rubyforge_project:
50
+ rubygems_version: 1.2.0
51
+ signing_key:
52
+ specification_version: 2
53
+ summary: The ItermWindow class models an iTerm terminal window and allows for full control via Ruby commands.
54
+ test_files: []
55
+