termrc 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1fe6b6ea69f9c28c5440f07d8c3693125e5cd65c
4
+ data.tar.gz: 98a1ac37eeda6e058883069d2c20a524bdbdee2e
5
+ SHA512:
6
+ metadata.gz: 0baba665dcbac8ca1eb5fb1d7b5308000a43a801a2775ca46a694a106c70c5cef8ab1469b3c401b6830015b864ec5772c0d201b5edd660ff713b8af2e208408f
7
+ data.tar.gz: 56d0210faf7b921f9c9cf8ae18e8aa1d733a7c5245ee50a76a9e6d0b52123aaee1c6a5da1f6e921abdd0148deccc0d201c58ab54eab29977817f8a9e5f9f53b0
data/.gitignore ADDED
File without changes
data/.termrc ADDED
@@ -0,0 +1,11 @@
1
+
2
+ root:
3
+ ~/code/github/termrc-gem
4
+
5
+ commands:
6
+ gs: git status
7
+ rake: rake -T
8
+
9
+ layout:
10
+ - [ 'gs' ]
11
+ - [ 'rake' ]
data/README.md ADDED
@@ -0,0 +1,57 @@
1
+
2
+ <img src="https://rawgithub.com/briangonzalez/termrc/master/images/osx.svg" width=25 style="margin-right: 10px"> termrc
3
+ ======
4
+ Take your iTerm2 environments with you wherever you go.
5
+
6
+ Description
7
+ -----------
8
+ Termrc allows you to store information about your project's environment for a given project in a small YAML file called a `.termrc` file. Restoring your project's environment is as simple as calling `termrc start`. Enjoy.
9
+
10
+ Installation
11
+ ------------
12
+ ```bash
13
+ $ gem install termrc
14
+ $ termrc create
15
+ $ termrc start
16
+ ```
17
+
18
+ .termrc file
19
+ ----------
20
+ The `.termrc` file is a [YAML](http://en.wikipedia.org/wiki/YAML) file which stores information about your project's environment. An environment, in this context, is an iTerm2 window with various panes, each with a different default command that is run when the pane opens. The `layout` dictates what your window looks like, while `commands` gives you a set of commands you can call for each pane.
21
+
22
+ **Example .termrc**
23
+
24
+ ```yaml
25
+ commands:
26
+ here: echo "Hello, here."
27
+ there: echo "Hello, there."
28
+ world: echo "Hello, world."
29
+ me: echo "Hello, me."
30
+ you: echo "Hello, you."
31
+
32
+ layout:
33
+ - [ 'here', 'there' ] # row 1, with 2 panes
34
+ - [ 'world' ] # row 2, with 1 pane
35
+ - [ 'me', 'you' ] # row 3, with 2 panes
36
+ ```
37
+
38
+ **The Result**
39
+
40
+ A `.termrc` file is a YAML file which requires two keys: `commands` and a `layout`. Each item in `layout` corresponds to a row of panes in iTerm2. So, for instance, the example `.termrc` file above would produce a new iTerm2 window with the following commands running inside each pane:
41
+
42
+ <img src="https://rawgithub.com/briangonzalez/termrc/master/images/termrc-screen.png">
43
+
44
+ You can supply an optional third key, `root`, which indicates the root directory you'd like each command to be run inside of.
45
+
46
+ License
47
+ --------
48
+ Released under the MIT License.
49
+
50
+ Questions?
51
+ ----------
52
+ Find me on [Twitter](http://twitter.com/brianmgonzalez).
53
+
54
+ Resources
55
+ ---------
56
+ - [iTerm2 - Scripting with Applescript](https://code.google.com/p/iterm2/wiki/AppleScript)
57
+ - [iTerm2 - Working with panes](https://code.google.com/p/iterm2/issues/detail?id=559)
data/Rakefile ADDED
@@ -0,0 +1,36 @@
1
+ namespace :gem do
2
+
3
+ desc "build"
4
+ task :build do
5
+ puts %x[rm -rf *.gem]
6
+ puts %x[gem build *.gemspec]
7
+ end
8
+
9
+ desc "install"
10
+ task :install do
11
+ puts %x[gem install *.gem]
12
+ puts %x[rm -rf *.gem]
13
+ end
14
+
15
+ desc "release"
16
+ task :release do
17
+ gems = Dir.glob("*.gem").length
18
+ puts gems
19
+ raise "0 or > 1 gem in directory; aborting!" if gems != 1
20
+ puts %x[gem push *.gem]
21
+ puts %x[rm -rf *.gem]
22
+ end
23
+
24
+ desc "build & install"
25
+ task :build_and_install do
26
+ Rake::Task["gem:build"].invoke
27
+ Rake::Task["gem:install"].invoke
28
+ end
29
+
30
+ desc "build & release"
31
+ task :build_and_release do
32
+ Rake::Task["gem:build"].invoke
33
+ Rake::Task["gem:release"].invoke
34
+ end
35
+
36
+ end
data/bin/termrc ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Abort beautifully with ctrl+c.
4
+ Signal.trap(:INT) { abort "\nAborting." }
5
+
6
+ # Require
7
+ dir = File.expand_path('../..', __FILE__)
8
+ require File.join(dir, 'lib', 'termrc')
9
+
10
+ # Then start
11
+ Termrc::Cli.start
@@ -0,0 +1,35 @@
1
+
2
+ tell application "iTerm"
3
+
4
+ -- Create a new terminal window.
5
+ set myterm to (make new terminal)
6
+
7
+ tell myterm
8
+
9
+ -- Create a new session.
10
+ set mysession to (make new session at the end of sessions)
11
+
12
+ -- Create rows.
13
+ [rows]
14
+
15
+ -- Sleep for a bit while we catch up.
16
+ [sleep]
17
+
18
+ -- Create panes within each row.
19
+ [panes]
20
+
21
+ -- Terminate session 1, which is unused.
22
+ terminate the first session
23
+
24
+ -- Sleep for a bit while we catch up.
25
+ [sleep]
26
+
27
+ -- Create all commands for a given pane (item).
28
+ [commands]
29
+
30
+ end tell
31
+
32
+ -- Reposition window.
33
+ set the bounds of the first window to {10, 10, 600, 600}
34
+
35
+ end tell
@@ -0,0 +1,14 @@
1
+ root:
2
+ ~
3
+
4
+ commands:
5
+ here: echo "Hello, here."
6
+ there: echo "Hello, there."
7
+ world: echo "Hello, world."
8
+ me: echo "Hello, me."
9
+ you: echo "Hello, you."
10
+
11
+ layout:
12
+ - [ 'here', 'there' ] # row 1, with 2 panes
13
+ - [ 'world' ] # row 2, with 1 pane
14
+ - [ 'me', 'you' ] # row 3, with 2 panes
@@ -0,0 +1,18 @@
1
+
2
+ require 'yaml'
3
+
4
+ :Builder
5
+
6
+ module Termrc
7
+
8
+ class Base
9
+
10
+ def initialize(file)
11
+ @yml = YAML.load File.read( file )
12
+ @builder = Termrc::Builder.new( @yml )
13
+ @builder.run!
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,108 @@
1
+
2
+ require 'yaml'
3
+ require 'tempfile'
4
+
5
+ module Termrc
6
+
7
+ class Builder
8
+
9
+ SLEEP_INTERVAL = 1
10
+ TEMPLATE_FILE = File.join( File.expand_path('../..', __FILE__), 'template', 'run.osascript' )
11
+ TEMPLATE = File.read( TEMPLATE_FILE )
12
+
13
+ def initialize(yml)
14
+ @root = yml['root']
15
+ @commands = yml['commands']
16
+ @layout = yml['layout']
17
+ end
18
+
19
+ def run!
20
+ f = applescript_file
21
+ puts `/usr/bin/osascript #{f.path}`
22
+ f.unlink
23
+ end
24
+
25
+ def applescript_file
26
+ t = TEMPLATE
27
+ t = t.gsub("[rows]", rows)
28
+ t = t.gsub("[sleep]", sleep)
29
+ t = t.gsub("[panes]", panes)
30
+ t = t.gsub("[commands]", commands)
31
+ t
32
+
33
+ file = Tempfile.new('termrc.osascript')
34
+ file.write(t)
35
+ file.close
36
+ file
37
+ end
38
+
39
+ def rows
40
+ Array.new( row_count, new_row ).join("\n")
41
+ end
42
+
43
+ def panes
44
+ cmd = next_pane # back to the top
45
+ cmd = next_pane # back to the top
46
+
47
+ @layout.each do |cmds|
48
+ cmd << Array.new( cmds.length - 1, new_column ).join("\n")
49
+ cmd << next_pane
50
+ cmd << "\n"
51
+ end
52
+
53
+ cmd
54
+ end
55
+
56
+ def commands
57
+ cmd = ""
58
+
59
+ index = 1
60
+ @layout.each do |commands|
61
+ commands.each do |name|
62
+ cmd << execute_command(index, @commands[name] )
63
+ index += 1
64
+ end
65
+ end
66
+
67
+ cmd
68
+ end
69
+
70
+ def row_count
71
+ @row_count ||= @layout.length
72
+ end
73
+
74
+ protected
75
+
76
+ def sleep
77
+ "do shell script \"sleep #{SLEEP_INTERVAL}\" \n"
78
+ end
79
+
80
+ def new_row
81
+ keystroke("D", "command down")
82
+ end
83
+
84
+ def new_column
85
+ keystroke("d", "command down")
86
+ end
87
+
88
+ def next_pane
89
+ keystroke("]", "command down")
90
+ end
91
+
92
+ def execute_command(item, command)
93
+ command = command.gsub('"', '\\"')
94
+ command = command.gsub("'", "\\'")
95
+ command = "cd #{@root} && " + command if @root
96
+ "tell item #{item} of sessions to write text \"#{command}\" \n"
97
+ end
98
+
99
+ def keystroke(key, using="")
100
+ cmd = "tell application \"System Events\" to keystroke \"#{key}\" "
101
+ cmd << "using #{using} \n" if using
102
+ cmd << "\n" if !using
103
+ cmd
104
+ end
105
+
106
+ end
107
+
108
+ end
data/lib/termrc/cli.rb ADDED
@@ -0,0 +1,58 @@
1
+ require 'thor'
2
+ require 'fileutils'
3
+
4
+ module Termrc
5
+
6
+ TERMRC_TEMPLATE = File.join( File.expand_path('../..', __FILE__), 'template', 'termrc_base.template' )
7
+
8
+ class Cli < Thor
9
+ include Thor::Actions
10
+
11
+ map 'c' => :create
12
+ map 'l' => :list
13
+ map 's' => :start
14
+
15
+ desc 'create', 'Create termrc file (Shortcut: c)'
16
+ def create
17
+
18
+ if File.exist? '.termrc'
19
+ raise Thor::Error.new "Error: '.termrc' already exists!"
20
+ else
21
+ say "Creating .termrc file..", :yellow
22
+ FileUtils.cp TERMRC_TEMPLATE, '.termrc'
23
+
24
+ say "Success! \n\n", :yellow
25
+
26
+ say "Now run your new termrc file by calling `termrc start`", :blue
27
+ end
28
+ end
29
+
30
+ desc 'list', 'List termrc files (Shortcut: l, Options: --folder=<folder>)'
31
+ method_option :folder, :type => :string, :required => false
32
+ def list
33
+ folder = options[:folder] || '.'
34
+ say "Looking for termrc files in '#{folder}':", :yellow
35
+
36
+ a = `find #{folder} | grep -w \.termrc$`
37
+ say a
38
+
39
+ say "None found.", :red if a.length < 1
40
+ end
41
+
42
+ desc 'start', 'Start termrc file (Shortcut: s, Options: --file=<termc file>)'
43
+ method_option :file, :type => :string, :required => false
44
+ def start
45
+ file = options[:file] || '.termrc'
46
+ raise Thor::Error.new "File '#{file}'' does not exist!" unless File.exist? file
47
+
48
+ say "Starting termrc file: '#{file}'", :yellow
49
+ begin
50
+ Termrc::Base.new( File.expand_path(file) )
51
+ rescue Exception => e
52
+ say "\nError while starting termrc file:", :red
53
+ puts e
54
+ end
55
+ end
56
+
57
+ end
58
+ end
data/lib/termrc.rb ADDED
@@ -0,0 +1,6 @@
1
+ module Termrc
2
+ dir = File.expand_path('..', __FILE__)
3
+ autoload :Base, File.join(dir, 'termrc', 'base')
4
+ autoload :Cli, File.join(dir, 'termrc', 'cli')
5
+ autoload :Builder, File.join(dir, 'termrc', 'builder')
6
+ end
data/termrc.gemspec ADDED
@@ -0,0 +1,16 @@
1
+ Gem::Specification.new do |gem|
2
+ gem.authors = ["Brian Gonzalez"]
3
+ gem.email = ["me@briangonzalez.org"]
4
+ gem.description = "Take your iTerm2 environments with you wherever you go."
5
+ gem.summary = "Take your iTerm2 environments with you wherever you go."
6
+ gem.homepage = "https://github.com/briangonzalez/termrc"
7
+
8
+ gem.files = `git ls-files`.split($\).reject{|f| f =~ /^images/ } # Exclude images
9
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
10
+ gem.executables << 'termrc'
11
+ gem.name = "termrc"
12
+ gem.version = '0.1.0'
13
+ gem.license = 'MIT'
14
+
15
+ gem.add_runtime_dependency 'thor', '~> 0.18.0'
16
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: termrc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Brian Gonzalez
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 0.18.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 0.18.0
27
+ description: Take your iTerm2 environments with you wherever you go.
28
+ email:
29
+ - me@briangonzalez.org
30
+ executables:
31
+ - termrc
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - .gitignore
36
+ - .termrc
37
+ - README.md
38
+ - Rakefile
39
+ - bin/termrc
40
+ - lib/template/run.osascript
41
+ - lib/template/termrc_base.template
42
+ - lib/termrc.rb
43
+ - lib/termrc/base.rb
44
+ - lib/termrc/builder.rb
45
+ - lib/termrc/cli.rb
46
+ - termrc.gemspec
47
+ homepage: https://github.com/briangonzalez/termrc
48
+ licenses:
49
+ - MIT
50
+ metadata: {}
51
+ post_install_message:
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubyforge_project:
67
+ rubygems_version: 2.0.3
68
+ signing_key:
69
+ specification_version: 4
70
+ summary: Take your iTerm2 environments with you wherever you go.
71
+ test_files: []