consular 1.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +28 -0
- data/LICENSE +20 -0
- data/README.md +437 -0
- data/Rakefile +9 -0
- data/Termfile +7 -0
- data/bin/consular +13 -0
- data/consular.gemspec +40 -0
- data/lib/consular/cli.rb +220 -0
- data/lib/consular/core.rb +65 -0
- data/lib/consular/dsl.rb +220 -0
- data/lib/consular/version.rb +3 -0
- data/lib/consular.rb +68 -0
- data/lib/templates/consularc.tt +9 -0
- data/lib/templates/example.term.tt +21 -0
- data/lib/templates/example.yml.tt +16 -0
- data/spec/cli_spec.rb +194 -0
- data/spec/consular_spec.rb +30 -0
- data/spec/core_spec.rb +19 -0
- data/spec/dsl_spec.rb +76 -0
- data/spec/fixtures/bar.term +32 -0
- data/spec/fixtures/foo.yml +10 -0
- data/spec/spec_helper.rb +54 -0
- data/spec.watchr +67 -0
- metadata +172 -0
data/lib/consular/cli.rb
ADDED
@@ -0,0 +1,220 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
module Consular
|
4
|
+
|
5
|
+
# The CLI provides the command line interface for Consular. These are
|
6
|
+
# interfaced via the consular bin file.
|
7
|
+
class CLI < Thor
|
8
|
+
include Thor::Actions
|
9
|
+
|
10
|
+
# Source root for Thor to find templates
|
11
|
+
def self.source_root; File.expand_path('../../', __FILE__); end
|
12
|
+
|
13
|
+
# Run the Termfile or project script.
|
14
|
+
#
|
15
|
+
# @param [String] project
|
16
|
+
# Name of the project script. Otherwise leave blank for Termfile.
|
17
|
+
#
|
18
|
+
# @example
|
19
|
+
#
|
20
|
+
# # Executes global script foobar.term
|
21
|
+
# Consular::CLI.start ['start', 'foobar']
|
22
|
+
#
|
23
|
+
# # Executes global script foobar.yml
|
24
|
+
# Consular::CLI.start ['start', 'foobar.yml']
|
25
|
+
#
|
26
|
+
# # Executes the Termfile
|
27
|
+
# Consular::CLI.start ['start'] # ./Termfile
|
28
|
+
# Consular::CLI.start ['start', '-r=/tmp'] # /tmp/Termfile
|
29
|
+
#
|
30
|
+
# @api public
|
31
|
+
desc 'start [PROJECT]', 'runs the consular script. ex: `consular start` or `consular start foobar`'
|
32
|
+
method_option :root, :type => :string, :default => '.', :aliases => '-r'
|
33
|
+
def start(project = nil)
|
34
|
+
path = termfile_path(project)
|
35
|
+
message_unless_file(path) { valid_core.new(path).process! }
|
36
|
+
end
|
37
|
+
|
38
|
+
# Run the Termfile or project script setup.
|
39
|
+
#
|
40
|
+
# @param [String] project
|
41
|
+
# Name of the project script. Otherwise leave blank for Termfile.
|
42
|
+
#
|
43
|
+
# @example
|
44
|
+
#
|
45
|
+
# # Executes global script setup for foobar.term
|
46
|
+
# Consular::CLI.start ['setup', 'foobar']
|
47
|
+
#
|
48
|
+
# # Executes global script setup for foobar.yml
|
49
|
+
# Consular::CLI.start ['setup', 'foobar.yml']
|
50
|
+
#
|
51
|
+
# # Executes the Termfile setup
|
52
|
+
# Consular::CLI.start ['setup'] # ./Termfile
|
53
|
+
# Consular::CLI.start ['setup', '-r=/tmp'] # /tmp/Termfile
|
54
|
+
#
|
55
|
+
# @api public
|
56
|
+
desc 'setup [PROJECT]', 'run the consular script setup. ex: `consular setup` or `consular setup foobar`'
|
57
|
+
method_option :root, :type => :string, :default => '.', :aliases => '-r'
|
58
|
+
def setup(project = nil)
|
59
|
+
path = termfile_path(project)
|
60
|
+
message_unless_file(path) { valid_core.new(path).setup! }
|
61
|
+
end
|
62
|
+
|
63
|
+
# Lists all avaiable global scripts
|
64
|
+
#
|
65
|
+
# @example
|
66
|
+
#
|
67
|
+
# Consular::CLI.start ['list']
|
68
|
+
#
|
69
|
+
# @api public
|
70
|
+
desc 'list', 'lists all consular scripts'
|
71
|
+
def list
|
72
|
+
say "Global scripts available: \n"
|
73
|
+
Dir.glob("#{Consular.global_path}/*[^~]").each do |file|
|
74
|
+
name = File.basename(file, '.term')
|
75
|
+
title = file_comment(file)
|
76
|
+
say " * #{name} - #{title}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Create the global script directory for Consular.
|
81
|
+
#
|
82
|
+
# @example
|
83
|
+
#
|
84
|
+
# Consular::CLI.start ['init']
|
85
|
+
#
|
86
|
+
# @api public
|
87
|
+
desc 'init', 'create consular directory'
|
88
|
+
def init
|
89
|
+
empty_directory Consular.global_path
|
90
|
+
template 'templates/consularc.tt', File.join(ENV['HOME'],'.consularc'), :skip => true
|
91
|
+
end
|
92
|
+
|
93
|
+
# Edit the specified global script or Termfile.
|
94
|
+
#
|
95
|
+
# @param [String] project
|
96
|
+
# Name of project script.
|
97
|
+
#
|
98
|
+
# @example
|
99
|
+
#
|
100
|
+
# # opens foobar for editing
|
101
|
+
# Consular::CLI.start ['edit', 'foobar']
|
102
|
+
# # opens foobar with specified editor
|
103
|
+
# Consular::CLI.start ['edit', 'foobar', '-e=vim']
|
104
|
+
# # opens /tmp/Termfile
|
105
|
+
# Consular::CLI.start ['edit', '-r=/tmp']
|
106
|
+
#
|
107
|
+
# @api public
|
108
|
+
desc 'edit [PROJECT]', 'opens the Termfile to edit. ex: `consular edit` or `consular edit foobar`'
|
109
|
+
method_option :root, :type => :string, :default => '.', :aliases => '-r'
|
110
|
+
method_option :editor, :type => :string, :default => nil, :aliases => '-e'
|
111
|
+
method_option :capture, :type => :boolean, :default => false, :aliases => '-c'
|
112
|
+
def edit(project = nil)
|
113
|
+
type = project && project =~ /\.yml$/ ? 'yml' : 'term'
|
114
|
+
path = termfile_path project
|
115
|
+
template "templates/example.#{type}.tt", path, :skip => true
|
116
|
+
open_in_editor path, options[:editor]
|
117
|
+
end
|
118
|
+
|
119
|
+
# Delete the global script or Termfile
|
120
|
+
#
|
121
|
+
# @param [String] project
|
122
|
+
# Name of the project script.
|
123
|
+
#
|
124
|
+
# @example
|
125
|
+
#
|
126
|
+
# # deletes global script foobar.term
|
127
|
+
# Consular::CLI.start ['delete', 'foobar']
|
128
|
+
# # deletes global script foobar.yml
|
129
|
+
# Consular::CLI.start ['delete', 'foobaryml']
|
130
|
+
# # deletes /tmp/Termfile
|
131
|
+
# Consular::CLI.start ['delete', '-r=/tmp']
|
132
|
+
#
|
133
|
+
# @api public
|
134
|
+
desc 'delete [PROJECT]', 'delete the Termfile script. ex: `consular delete` or `consular delete foobar`'
|
135
|
+
method_option :root, :type => :string, :default => '.', :aliases => '-r'
|
136
|
+
def delete(project = nil)
|
137
|
+
path = termfile_path(project)
|
138
|
+
message_unless_file(path) { remove_file path }
|
139
|
+
end
|
140
|
+
|
141
|
+
no_tasks do
|
142
|
+
|
143
|
+
# Returns the first core that matchees the currrent system.
|
144
|
+
#
|
145
|
+
# @return [Core] Core that matches the system.
|
146
|
+
#
|
147
|
+
# @api private
|
148
|
+
def valid_core
|
149
|
+
Consular.cores.detect { |core| core.valid_system? }
|
150
|
+
end
|
151
|
+
# Returns the first comment in file. This is used
|
152
|
+
# as the title when listing out the scripts.
|
153
|
+
#
|
154
|
+
# @param [String] file
|
155
|
+
# path to file
|
156
|
+
#
|
157
|
+
# @api private
|
158
|
+
def file_comment(file)
|
159
|
+
first_line = File.readlines(file).first
|
160
|
+
first_line =~ /^\s*?#/ ? first_line.gsub('#','') : "\n"
|
161
|
+
end
|
162
|
+
|
163
|
+
# Returns the full pathname of the Termfile
|
164
|
+
#
|
165
|
+
# @param [String] project
|
166
|
+
# designated file/project name
|
167
|
+
#
|
168
|
+
# @return [String] full path name for Termfile.
|
169
|
+
#
|
170
|
+
# @example
|
171
|
+
# termfile_path #=> ROOT/Termfile
|
172
|
+
# termfile_path 'foo' #=> GLOBAL_PATH/foo.term
|
173
|
+
# termfile_path 'bar.yml' #=> GLOBAL_PATH/bar.yml
|
174
|
+
#
|
175
|
+
# @api private
|
176
|
+
def termfile_path(project = nil)
|
177
|
+
if !project || project.empty?
|
178
|
+
File.join(options[:root], 'Termfile')
|
179
|
+
else
|
180
|
+
path = project =~ /\..*/ ? project : project + '.term'
|
181
|
+
Consular.global_path path
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
# Opens Termfile in specified editor.
|
186
|
+
#
|
187
|
+
# @param [String] path
|
188
|
+
# Path to Termfile
|
189
|
+
# @param [String] editor
|
190
|
+
# Editor to open Termfile with.
|
191
|
+
#
|
192
|
+
# @example
|
193
|
+
# open_in_editor '/path/to/Termfile', 'vim'
|
194
|
+
#
|
195
|
+
# @api private
|
196
|
+
def open_in_editor(path, editor = nil)
|
197
|
+
editor = editor || Consular.default_editor || ENV['EDITOR']
|
198
|
+
system "#{editor || 'open'} #{path}"
|
199
|
+
end
|
200
|
+
|
201
|
+
# Returns an error message unless the file exists. If it does
|
202
|
+
# execute the block
|
203
|
+
#
|
204
|
+
# @param [String] file
|
205
|
+
# Path of file
|
206
|
+
# @param [Proc] blk
|
207
|
+
# Proc to execute if file exists.
|
208
|
+
#
|
209
|
+
# @api private
|
210
|
+
def message_unless_file(file, &blk)
|
211
|
+
if File.exists?(file)
|
212
|
+
blk.call
|
213
|
+
else
|
214
|
+
say "#{file} does not exist. Try running `consular edit` first.", :yellow
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
end
|
220
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Consular
|
2
|
+
# Defines the abstract definition of a core. This needs to be
|
3
|
+
# subclassed and have the appropriate methods defined so that
|
4
|
+
# the CLI runner knows how to execute the Termfile on
|
5
|
+
# each core. You will need to add the core to Consular like so:
|
6
|
+
#
|
7
|
+
# Consular.add_core self
|
8
|
+
#
|
9
|
+
class Core
|
10
|
+
attr_accessor :termfile
|
11
|
+
|
12
|
+
# Instantiated the hash from the Termfile into the
|
13
|
+
# core.
|
14
|
+
#
|
15
|
+
# @param [String] path
|
16
|
+
# Path to Termfile
|
17
|
+
#
|
18
|
+
# @api public
|
19
|
+
def initialize(path)
|
20
|
+
@termfile = Consular::DSL.new(path).to_hash
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
# Method called by runner to execute the Termfile setup
|
25
|
+
# on the core.
|
26
|
+
#
|
27
|
+
# @api public
|
28
|
+
def setup!
|
29
|
+
raise NotImplementedError, ".setup! needs to be defined for it to be ran by `terminitor setup`"
|
30
|
+
end
|
31
|
+
|
32
|
+
# Method called by the runner to execute the Termfile
|
33
|
+
# on the core.
|
34
|
+
#
|
35
|
+
# @api public
|
36
|
+
def process!
|
37
|
+
raise NotImplementedError, ".process! needs to be defined for it to be ran by `terminitor start`"
|
38
|
+
end
|
39
|
+
|
40
|
+
class << self
|
41
|
+
# Checks to see if the current system/terminal is the right
|
42
|
+
# one to use for this core. This is called by the CLI to check
|
43
|
+
# if a particular core should be used.
|
44
|
+
#
|
45
|
+
# @return [Boolean] Whether the current system is valid.
|
46
|
+
#
|
47
|
+
# @api public
|
48
|
+
def valid_system?
|
49
|
+
raise NotImplementedError, ".valid_system? needs to be defined for Consular to determine what system is belongs to."
|
50
|
+
end
|
51
|
+
|
52
|
+
# Captures the current terminal settings for the system. It will
|
53
|
+
# return a hash format like that of Consular::DSL so that Consular
|
54
|
+
# can write it back out into a Termfile.
|
55
|
+
#
|
56
|
+
# @return [Hash] Consular style hash.
|
57
|
+
#
|
58
|
+
# @api public
|
59
|
+
def capture!
|
60
|
+
raise NotImplementedError, "capture! is currently unavailable for this core."
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
data/lib/consular/dsl.rb
ADDED
@@ -0,0 +1,220 @@
|
|
1
|
+
require 'active_support/ordered_hash'
|
2
|
+
require 'active_support/core_ext/array/extract_options'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module Consular
|
6
|
+
|
7
|
+
# The DSL class provides the DSL for the Consular scripting file.
|
8
|
+
# It provides the basic commands such as:
|
9
|
+
# #setup - commands to run when invoked by 'consular setup'
|
10
|
+
# #window - commands to run in the context of a window
|
11
|
+
# #tab - commands to run in the context of tab
|
12
|
+
# #before - commands to run in the context before every tab context
|
13
|
+
#
|
14
|
+
# The DSL class can be extended to provide additional API's for core specific
|
15
|
+
# DSL.
|
16
|
+
class DSL
|
17
|
+
|
18
|
+
attr_reader :_setup, :_windows, :_context
|
19
|
+
|
20
|
+
# Initializes the DSL library and stores the commands.
|
21
|
+
#
|
22
|
+
# @param [String] path
|
23
|
+
# path to Consular script/ Termfile
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
# Consular::DSL.new 'foo/bar.term'
|
27
|
+
#
|
28
|
+
# @api public
|
29
|
+
def initialize(path)
|
30
|
+
@_setup = []
|
31
|
+
@_windows = ActiveSupport::OrderedHash.new
|
32
|
+
@_windows['default'] = window_hash
|
33
|
+
@_context = @_windows['default']
|
34
|
+
file = File.read(path)
|
35
|
+
if path =~ /\.yml$/
|
36
|
+
@_file = YAML.load file
|
37
|
+
extend Yaml
|
38
|
+
else
|
39
|
+
instance_eval file, __FILE__, __LINE__
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Run commands using prior to the workflow using the command `consular setup`.
|
44
|
+
# This allows you to perform any command that needs to be ran prior to setup
|
45
|
+
# a particular project/script.
|
46
|
+
#
|
47
|
+
# @param [Array<String>] commands
|
48
|
+
# Commands to be executed.
|
49
|
+
# @param [Proc] block
|
50
|
+
# Proc of commands to run.
|
51
|
+
#
|
52
|
+
# @example
|
53
|
+
# setup 'bundle install', 'brew update'
|
54
|
+
# setup { run 'bundle install' }
|
55
|
+
#
|
56
|
+
# @api public
|
57
|
+
def setup(*commands, &block)
|
58
|
+
block_given? ? run_context(@_setup, &block) : @_setup.concat(commands)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Run commands prior to each tab context.
|
62
|
+
#
|
63
|
+
# @param [Array<String>] commands
|
64
|
+
# Commands to be executed.
|
65
|
+
# @param [Proc] block
|
66
|
+
# Proc of commands to run
|
67
|
+
#
|
68
|
+
# @example
|
69
|
+
# # Executes `whoami` before tab with `ls` and `gitx`
|
70
|
+
# window do
|
71
|
+
# before { run 'whoami' }
|
72
|
+
# tab 'ls'
|
73
|
+
# tab 'gitx'
|
74
|
+
# end
|
75
|
+
#
|
76
|
+
# @api public
|
77
|
+
def before(*commands, &block)
|
78
|
+
context = (@_context[:before] ||= [])
|
79
|
+
block_given? ? run_context(context, &block) : context.concat(commands)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Run commands in the conext of a window.
|
83
|
+
#
|
84
|
+
# @param [Array] args
|
85
|
+
# Hash to pass options to each context of a window. Each core can
|
86
|
+
# implement the desired behavior for the window based on the options set here.
|
87
|
+
# Can also pass a string as first parameter which will be set as
|
88
|
+
# the :name
|
89
|
+
# @param [Proc] block
|
90
|
+
# block of commands to run in window context.
|
91
|
+
#
|
92
|
+
# @example
|
93
|
+
# window 'my project', :size => [80, 30] do
|
94
|
+
# run 'ps aux'
|
95
|
+
# end
|
96
|
+
#
|
97
|
+
# @api public
|
98
|
+
def window(*args, &block)
|
99
|
+
key = "window#{@_windows.keys.size}"
|
100
|
+
options = args.extract_options!
|
101
|
+
options[:name] = args.first unless args.empty?
|
102
|
+
context = (@_windows[key] = window_hash.merge(:options => options))
|
103
|
+
run_context context, &block
|
104
|
+
end
|
105
|
+
|
106
|
+
# Run commands in the context of a tab.
|
107
|
+
#
|
108
|
+
# @param [Array] args
|
109
|
+
# Accepts either:
|
110
|
+
# - an array of string commands
|
111
|
+
# - a hash containing options for the tab.
|
112
|
+
# @param [Proc] block
|
113
|
+
#
|
114
|
+
# @example
|
115
|
+
# tab 'first tab', :settings => 'Grass' do
|
116
|
+
# run 'ps aux'
|
117
|
+
# end
|
118
|
+
#
|
119
|
+
# tab 'ls', 'gitx'
|
120
|
+
#
|
121
|
+
# @api public
|
122
|
+
def tab(*args, &block)
|
123
|
+
tabs = @_context[:tabs]
|
124
|
+
key = "tab#{tabs.keys.size}"
|
125
|
+
return (tabs[key] = { :commands => args }) unless block_given?
|
126
|
+
|
127
|
+
context = (tabs[key] = {:commands => []})
|
128
|
+
options = args.extract_options!
|
129
|
+
options[:name] = args.first unless args.empty?
|
130
|
+
context[:options] = options
|
131
|
+
|
132
|
+
run_context context, &block
|
133
|
+
@_context = @_windows[@_windows.keys.last] # Jump back out into the context of the last window.
|
134
|
+
end
|
135
|
+
|
136
|
+
# Store commands to run in context.
|
137
|
+
#
|
138
|
+
# @param [Array<String>] commands
|
139
|
+
# Array of commands to be executed.
|
140
|
+
#
|
141
|
+
# @example
|
142
|
+
# run 'brew update', 'gitx'
|
143
|
+
#
|
144
|
+
# @api public
|
145
|
+
def run(*commands)
|
146
|
+
context = case
|
147
|
+
when @_context.is_a?(Hash) && @_context[:tabs]
|
148
|
+
@_context[:tabs]['default'][:commands]
|
149
|
+
when @_context.is_a?(Hash)
|
150
|
+
@_context[:commands]
|
151
|
+
else
|
152
|
+
@_context
|
153
|
+
end
|
154
|
+
context << commands.map { |c| c =~ /&$/ ? "(#{c})" : c }.join(" && ")
|
155
|
+
end
|
156
|
+
|
157
|
+
|
158
|
+
# Returns yaml file as Consular formmatted hash
|
159
|
+
#
|
160
|
+
# @return [Hash] Return hash format of Termfile
|
161
|
+
#
|
162
|
+
# @api semipublic
|
163
|
+
def to_hash
|
164
|
+
{ :setup => @_setup, :windows => @_windows }
|
165
|
+
end
|
166
|
+
|
167
|
+
private
|
168
|
+
|
169
|
+
# Execute the context
|
170
|
+
#
|
171
|
+
# @param [Hash] context
|
172
|
+
# hash of current context.
|
173
|
+
# @param [Proc] block
|
174
|
+
# the context's block to be executed
|
175
|
+
#
|
176
|
+
# @example
|
177
|
+
# run_context @_setup, &block
|
178
|
+
# run @tabs['name'], &block
|
179
|
+
#
|
180
|
+
# @api private
|
181
|
+
def run_context(context, &block)
|
182
|
+
@_context, @_old_context = context, @_context
|
183
|
+
instance_eval &block
|
184
|
+
@_context = @_old_context
|
185
|
+
end
|
186
|
+
|
187
|
+
def clean_up_context(context = last_open_window, old_context = nil)
|
188
|
+
@_context = context
|
189
|
+
@_old_context = old_context
|
190
|
+
end
|
191
|
+
|
192
|
+
def last_open_window
|
193
|
+
@_windows[@_windows.keys.last]
|
194
|
+
end
|
195
|
+
|
196
|
+
# Return the default hash format for windows
|
197
|
+
#
|
198
|
+
# @api private
|
199
|
+
def window_hash
|
200
|
+
{:tabs => {'default' =>{:commands=>[]}}}.dup
|
201
|
+
end
|
202
|
+
|
203
|
+
module Yaml
|
204
|
+
# Returns yaml file as formmatted hash
|
205
|
+
#
|
206
|
+
# @return [Hash] Hash format of Termfile
|
207
|
+
#
|
208
|
+
# @api public
|
209
|
+
def to_hash
|
210
|
+
@_file ||= {}
|
211
|
+
combined = @_file.inject({}) do |base, item|
|
212
|
+
item = {item.keys.first => {:commands => item.values.first, :options => {}}}
|
213
|
+
base.merge!(item)
|
214
|
+
base
|
215
|
+
end # merge the array of hashes.
|
216
|
+
{ :setup => nil, :windows => { 'default' => { :tabs => combined } } }
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
data/lib/consular.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
lib_dir = File.expand_path("..", __FILE__)
|
2
|
+
$:.unshift( lib_dir ) unless $:.include?( lib_dir )
|
3
|
+
|
4
|
+
require 'consular/version'
|
5
|
+
require 'consular/core'
|
6
|
+
require 'consular/dsl'
|
7
|
+
require 'consular/cli'
|
8
|
+
|
9
|
+
module Consular
|
10
|
+
|
11
|
+
class << self
|
12
|
+
attr_accessor :global_path, :default_editor
|
13
|
+
|
14
|
+
# Returns all avaialble cores.
|
15
|
+
#
|
16
|
+
# @return [Array<Core>] Consular cores.
|
17
|
+
#
|
18
|
+
# @api semipublic
|
19
|
+
def cores
|
20
|
+
@cores ||= []
|
21
|
+
end
|
22
|
+
|
23
|
+
# Add a core to Consular.
|
24
|
+
#
|
25
|
+
# @param [Core] klass
|
26
|
+
# Core to add.
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# Consular.add_core Consular::Cores::OSX
|
30
|
+
#
|
31
|
+
# @api semipublic
|
32
|
+
def add_core(klass)
|
33
|
+
cores << klass
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns the global script path. If not set,
|
37
|
+
# defaults to ~/.config/consular
|
38
|
+
#
|
39
|
+
# @param [String] path
|
40
|
+
# File name in path
|
41
|
+
#
|
42
|
+
# @return [String] global script path
|
43
|
+
#
|
44
|
+
# @api public
|
45
|
+
def global_path(path = nil)
|
46
|
+
root = @global_path || File.join(ENV['HOME'],'.config','consular')
|
47
|
+
File.join root, (path || '')
|
48
|
+
end
|
49
|
+
|
50
|
+
# Configure Consular options.
|
51
|
+
#
|
52
|
+
# @param [Proc] block
|
53
|
+
# Configuration block
|
54
|
+
#
|
55
|
+
# @example
|
56
|
+
#
|
57
|
+
# Consular.configure do |c|
|
58
|
+
# c.global_path = '~/.consular'
|
59
|
+
# c.default_editor = 'vim'
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
# @api public
|
63
|
+
def configure(&block)
|
64
|
+
yield self
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# COMMENT OF SCRIPT HERE
|
2
|
+
# you can make as many tabs as you wish...
|
3
|
+
# tab names are actually arbitrary at this point too.
|
4
|
+
|
5
|
+
setup 'echo "setup"'
|
6
|
+
|
7
|
+
tab "echo 'default'", "echo 'default tab'"
|
8
|
+
|
9
|
+
window do
|
10
|
+
|
11
|
+
tab "echo 'first tab'", "echo 'of window'"
|
12
|
+
|
13
|
+
tab "named tab", :settings => "Ocean" do
|
14
|
+
run "echo 'named tab'"
|
15
|
+
run "ls"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
window "autotest" do
|
20
|
+
tab "echo 'window and tab without options'"
|
21
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# COMMENT OF SCRIPT HERE
|
2
|
+
# you can make as many tabs as you wish...
|
3
|
+
# tab names are actually arbitrary at this point too.
|
4
|
+
---
|
5
|
+
- tab1:
|
6
|
+
- cd ~/foo/bar
|
7
|
+
- gitx
|
8
|
+
- tab2:
|
9
|
+
- mysql -u root
|
10
|
+
- use test;
|
11
|
+
- show tables;
|
12
|
+
- tab3: echo "hello world"
|
13
|
+
- tab4: cd ~/baz/ && git pull
|
14
|
+
- tab5:
|
15
|
+
- cd ~/foo/project
|
16
|
+
- autotest
|