yap-shell 0.4.6 → 0.4.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4cc89c28c4f112f3ff1abef087ca640c1adaa5b4
4
- data.tar.gz: bf3879fbceac69355832fa42e082510898d0b739
3
+ metadata.gz: a31682029b9cbd355da08f48de73df26f18ac7e3
4
+ data.tar.gz: 11cac119d25dc8a0b19037c128cd7c08992449d1
5
5
  SHA512:
6
- metadata.gz: b473a1906ba0a6476ecd08dae4434f450e89f157b459ce45af5d69db6a0b311eaab8fba10cfd893c9fd4f41442f8e89836d31e71bdc440b8f657e9881251c262
7
- data.tar.gz: 1eb6e01f677f55f4b3203e513b6b2f51334a2546876804f863cbf96c2ec9a27f17b41efc30b04754dbc4f8fed96ad615c3b74f0ce6813a53954b7e5918347bbc
6
+ metadata.gz: 73674732a59260cf427392a8cc6617bb0d78a602dc2c49f8c5a588d2e952805a0d0bb51fa086961a7d938d411f4c76f12874a44085a6748d5e4db06ae3c49ec8
7
+ data.tar.gz: fa6f4ee6f68e5c426a36ebe600be7a158cf3bfccc448694299af5cf4569a77753b13d735c87058489ad1740a27503c6381faee10369bce92f28829ba286b021e
@@ -24,10 +24,10 @@ class TabCompletion < Addon
24
24
  end
25
25
 
26
26
  def to_s
27
- @text
27
+ @text.to_s
28
28
  end
29
- alias :to_str :to_s
30
- alias :inspect :to_s
29
+ alias_method :to_str, :to_s
30
+ alias_method :inspect, :to_s
31
31
  end
32
32
 
33
33
  COMPLETIONS = [ BasicCompletion ]
@@ -19,7 +19,7 @@ module Yap
19
19
 
20
20
  @rcfiles = [
21
21
  "#{ENV['HOME']}/.yaprc",
22
- yap_path.join("yaprc")
22
+ preferred_yaprc_path
23
23
  ]
24
24
  end
25
25
 
@@ -27,6 +27,14 @@ module Yap
27
27
  yap_path.join(part)
28
28
  end
29
29
 
30
+ def preferred_yaprc_path
31
+ yap_path.join("yaprc")
32
+ end
33
+
34
+ def yaprc_template_path
35
+ Pathname.new(File.dirname(__FILE__)).join('../../rcfiles/yaprc')
36
+ end
37
+
30
38
  def yap_path
31
39
  Pathname.new "#{ENV['HOME']}/.yap"
32
40
  end
@@ -34,8 +34,11 @@ module Yap::Shell
34
34
  rescue Yap::Shell::Parser::Lexer::NonterminatedString,
35
35
  Yap::Shell::Parser::Lexer::LineContinuationFound => ex
36
36
  Treefell['shell'].puts "rescued #{ex}, asking user for more input"
37
- line << read_another_line_of_input
38
- retry
37
+ more_input = read_another_line_of_input
38
+ if more_input
39
+ line << more_input
40
+ retry
41
+ end
39
42
  rescue ::Yap::Shell::CommandUnknownError => ex
40
43
  Treefell['shell'].puts "rescued #{ex}, telling user"
41
44
  puts " CommandError: #{ex.message}"
@@ -1,5 +1,5 @@
1
1
  module Yap
2
2
  module Shell
3
- VERSION = "0.4.6"
3
+ VERSION = "0.4.8"
4
4
  end
5
5
  end
data/lib/yap/world.rb CHANGED
@@ -32,7 +32,26 @@ module Yap
32
32
  dom = build_editor_dom
33
33
 
34
34
  # ensure yap directory exists
35
- FileUtils.mkdir_p configuration.yap_path
35
+ if !File.exists?(configuration.yap_path)
36
+ puts
37
+ puts yellow("Yap directory not found: #{configuration.yap_path}")
38
+ puts
39
+ puts "Initializing yap for the first time:"
40
+ puts
41
+
42
+ print " Creating #{configuration.yap_path} "
43
+ FileUtils.mkdir_p configuration.yap_path
44
+ puts green("done")
45
+
46
+ print " Creating default #{configuration.preferred_yaprc_path} "
47
+ FileUtils.cp configuration.yaprc_template_path, configuration.yap_path
48
+ puts green("done")
49
+ puts
50
+ puts "To tweak yap take a look at #{configuration.preferred_yaprc_path}."
51
+ puts
52
+ puts "Reloading shell"
53
+ reload!
54
+ end
36
55
 
37
56
  @editor = RawLine::Editor.create(dom: dom)
38
57
 
@@ -84,6 +103,10 @@ module Yap
84
103
  @editor.unbind(key)
85
104
  end
86
105
 
106
+ def reload!
107
+ exec File.expand_path($0)
108
+ end
109
+
87
110
  def func(name, &blk)
88
111
  Yap::Shell::ShellCommand.define_shell_function(name, &blk)
89
112
  end
@@ -1,16 +1,23 @@
1
1
  #!/usr/bin/ruby
2
2
 
3
+ ###############################################################################
4
+ # ENVIRONMENT VARIABLES
5
+ #------------------------------------------------------------------------------
6
+ # When yap boots up it constructs a world for the running shell. The world
7
+ # has it's own copy of environment variables. Below is an example of
8
+ # modifying your PATH environment variables.
3
9
  world.env["PATH"] = [
4
10
  world.env["HOME"] + "/.rbenv/shims",
5
11
  "/usr/local/bin",
6
12
  world.env["PATH"]
7
13
  ].join(":")
8
14
 
9
- require 'chronic'
10
- require 'term/ansicolor'
11
- require 'terminfo'
12
15
 
13
- # Resize history to be infinite
16
+ ###############################################################################
17
+ # SHELL HISTORY
18
+ #------------------------------------------------------------------------------
19
+ # Here's an example of resizing shell history to be of infinite size. If you
20
+ # set this to a numeric value then it will only maintain that many entries.
14
21
  infinity = 1 / 0.0
15
22
  world.history.resize(infinity)
16
23
 
@@ -19,63 +26,71 @@ func :reload! do |args:, stdin:, stdout:, stderr:|
19
26
  stdout.print " Saving history "
20
27
  world.addons[:history].save
21
28
  stdout.puts Term::ANSIColor.green("done")
22
- exec File.expand_path($0)
29
+ world.reload!
23
30
  end
24
31
 
25
32
 
26
- completion_cache = {}
27
-
28
- # tab_completion_display do |matches|
33
+ ###############################################################################
34
+ # CONFIGURING YOUR PROMPT
35
+ #------------------------------------------------------------------------------
36
+ # Your prompt can be whatever you can code it to be. It can be static or
37
+ # or dynamic. You can also update the prompt indirectly so that it live
38
+ # updates regardless of if you hit enter.
29
39
  #
30
- # end
31
-
32
- tab_completion :rake, /^(rake|be rake)\s+(.*)/ do |input_fragment, match_data|
33
- # |config|
34
- # config.completions do |input_fragment, match_data|
35
- results = completion_cache[Dir.pwd] ||= `bundle exec rake -T`.gsub(/^rake\s*/, '').split(/\n/)
36
-
37
- task_rgx = /^#{Regexp.escape(input_fragment.word[:text])}/
38
- results.grep(task_rgx).map do |text|
39
- {
40
- type: :rake,
41
- text: text.gsub(/\s*#.*$/, ''),
42
- descriptive_text: Term::ANSIColor.yellow(text)
43
- }
44
- # end
45
- end
46
- end
47
-
40
+ # The easiest thing to do is to set the prompt to a static string, but it's
41
+ # also the least useful way to utilize your prompt, e.g.:
48
42
  #
49
- # Configuring your prompt. This can be set to a static value or to a
50
- # Proc like object that responds to #call. If it responds to call it will
51
- # be used every time the prompt is to be re-drawn
43
+ # yap> world.prompt = 'my-prompt>'
52
44
  #
53
- last_prompt = nil
54
- self.prompt = -> do
45
+ # A more useful way to configure your prompt is by using a lambda/proc (or
46
+ # anything that responds to 'call'). This proc will be called whenever
47
+ # the prompt needs to be rendered, so it can be as dynamic as you like. Below
48
+ # is an example of setting a prompt with a bunch of git smarts.
49
+ #
50
+ # One other thing worth noting is that you can re-render the prompt without
51
+ # having to hit enter to run a statement. If this piques your interest check
52
+ # out the prompt_updates/ addon included in the yap-shell gem. It's in the
53
+ # YAP_SHELL_INSTALL_DIR/addons/promp_updates/ directory.
54
+ #
55
+ # Now, here's an example of a smart prompt with some git intelligence:
56
+
57
+ world.prompt = -> do
58
+ # use ~ instead of full-path to home directory
55
59
  pwd = Dir.pwd.sub Regexp.new(ENV['HOME']), '~'
56
60
 
61
+ # identify our current branch
57
62
  git_current_branch = `git branch 2>/dev/null | sed -n '/\* /s///p'`.chomp
58
- if git_current_branch.length > 0
63
+
64
+ # is the current directory a part of a git enabled directory structure?
65
+ current_dir_is_git_aware = git_current_branch.length > 0
66
+
67
+ if current_dir_is_git_aware
59
68
  git_current_branch += " "
69
+
70
+ # are there unstaged changes?
60
71
  git_dirty_not_cached = `git diff --shortstat 2>/dev/null`.length > 0
72
+
73
+ # are there staged changes?
61
74
  git_dirty_cached = `git diff --shortstat --cached 2>/dev/null`.length > 0
62
75
 
63
76
  if git_dirty_not_cached || git_dirty_cached
77
+ # uncommitted changes
64
78
  git_branch = intense_cyan(git_current_branch)
65
79
  else
80
+ # no uncommitted changes
66
81
  git_branch = cyan(git_current_branch)
67
82
  end
68
83
  else
69
84
  git_branch = ""
70
85
  end
71
86
 
72
- arrow = ''
73
-
74
- # ~/source/playground/yap master ➜
75
- last_prompt = "#{dark(green('£'))} #{yellow(pwd)} #{git_branch}#{red(arrow)} "
87
+ # Example: ~/source/playground/yap master
88
+ "#{yellow(pwd)} #{git_branch}#{red('➜')} "
76
89
  end
77
90
 
78
- #
91
+ ###############################################################################
92
+ # SECONDARY PROMPT
93
+ #------------------------------------------------------------------------------
79
94
  # The secondary_prompt is equivalent to the PS2 prompt in bash. It is what
80
95
  # is displayed when entering a multiline command. It can be set to a string
81
96
  # or a proc. It defaults to '> '
@@ -120,7 +135,7 @@ self.secondary_prompt = '> '
120
135
  # Sets the default trigger key for all keyboard macros
121
136
  world.addons[:keyboard_macros].trigger_key = ?\C-g
122
137
 
123
- # Sets the default cancel key for all keyboard macros
138
+ # Sets the default cancel key (space) for all keyboard macros
124
139
  world.addons[:keyboard_macros].cancel_key = " "
125
140
 
126
141
  # Sets the default timeout for macros. When set to nil you will have to
@@ -144,12 +159,13 @@ end
144
159
  # by specifying it when you call .configure(...).
145
160
  world.addons[:keyboard_macros].configure(trigger_key: ?\C-g) do |macro|
146
161
  macro.start do
147
- world.editor.content_box.children = [
148
- TerminalLayout::Box.new(content: "am i floating1?", style: {display: :float, float: :right, height: 1, width: "am i floating1?".length}),
149
- TerminalLayout::Box.new(content: "What up12?", style: {display: :block}),
150
- TerminalLayout::Box.new(content: "Not much21", style: {display: :block}),
151
- TerminalLayout::Box.new(content: "am i floating3?", style: {display: :float, float: :left, height: 1, width: "am i floating1?".length}),
152
- ]
162
+ # TODO: FUTURE
163
+ # world.editor.content_box.children = [
164
+ # TerminalLayout::Box.new(content: "am i floating1?", style: {display: :float, float: :right, height: 1, width: "am i floating1?".length}),
165
+ # TerminalLayout::Box.new(content: "What up12?", style: {display: :block}),
166
+ # TerminalLayout::Box.new(content: "Not much21", style: {display: :block}),
167
+ # TerminalLayout::Box.new(content: "am i floating3?", style: {display: :float, float: :left, height: 1, width: "am i floating1?".length}),
168
+ # ]
153
169
  end
154
170
 
155
171
  macro.stop do
@@ -183,6 +199,8 @@ world.addons[:keyboard_macros].configure(trigger_key: ?\C-g) do |macro|
183
199
  end
184
200
  end
185
201
 
202
+ # The below macro shows that you can have macros start with a different
203
+ # trigger keys.
186
204
  # world.addons[:keyboard_macros].configure(trigger_key: :ctrl_h) do |macros|
187
205
  # macros.define 'h123', -> {
188
206
  # box = TerminalLayout::Box.new(content: "Right?", style: { display: :block, float: :right, height: 1, width: 50 })
data/yap-shell.gemspec CHANGED
@@ -30,6 +30,10 @@ Gem::Specification.new do |spec|
30
30
  |
31
31
  | alias yap='env -i PATH=$PATH RUBYOPT="-rubygems -EUTF-8" HOME=$HOME sh -c "rbenv local 2.2.3 && yap"'
32
32
  |
33
+ |If you are interested in tracing yap's execution you can add the DEBUG and TREEFELL_OUT options:
34
+ |
35
+ | alias yap-debug='env -i DEBUG=* TREEFELL_OUT=/tmp/yap-debug.log PATH=$PATH RUBYOPT="-rubygems -EUTF-8" HOME=$HOME sh -c "rbenv local 2.2.3 && yap"'
36
+ |
33
37
  |Then, `source ~/.profile` or reload your shell. Now you can finally run:
34
38
  |
35
39
  | yap
@@ -65,7 +69,7 @@ Gem::Specification.new do |spec|
65
69
  spec.add_dependency "term-ansicolor", "~> 1.3"
66
70
  spec.add_dependency "ruby-termios", "~> 0.9.6"
67
71
  spec.add_dependency "ruby-terminfo", "~> 0.1.1"
68
- spec.add_dependency "yap-rawline", "~> 0.3.1"
72
+ spec.add_dependency "yap-rawline", "~> 0.3.2"
69
73
  spec.add_dependency "treefell", "~> 0.2.3"
70
74
 
71
75
  spec.add_development_dependency "bundler", "~> 1.6"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yap-shell
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.6
4
+ version: 0.4.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zach Dennis
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.3.1
89
+ version: 0.3.2
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.3.1
96
+ version: 0.3.2
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: treefell
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -209,7 +209,7 @@ files:
209
209
  - lib/yap/shell/version.rb
210
210
  - lib/yap/world.rb
211
211
  - lib/yap/world/addons.rb
212
- - rcfiles/.yaprc
212
+ - rcfiles/yaprc
213
213
  - scripts/4
214
214
  - scripts/bg-vim
215
215
  - scripts/fail
@@ -232,6 +232,9 @@ post_install_message: "\nGreetings forward-thinking traveler!\n\nLet's waste no
232
232
  it into this very release.\n\n\e[033mLastly\e[0m, create an alias to the yap executable
233
233
  using the ruby version\nyou just installed it for. For example, with rbenv I use
234
234
  the below\nalias in my ~/.profile file:\n\n alias yap='env -i PATH=$PATH RUBYOPT=\"-rubygems
235
+ -EUTF-8\" HOME=$HOME sh -c \"rbenv local 2.2.3 && yap\"'\n\nIf you are interested
236
+ in tracing yap's execution you can add the DEBUG and TREEFELL_OUT options:\n\n alias
237
+ yap-debug='env -i DEBUG=* TREEFELL_OUT=/tmp/yap-debug.log PATH=$PATH RUBYOPT=\"-rubygems
235
238
  -EUTF-8\" HOME=$HOME sh -c \"rbenv local 2.2.3 && yap\"'\n\nThen, `source ~/.profile`
236
239
  or reload your shell. Now you can finally run:\n\n yap\n\nYou know your tooling
237
240
  better than me. If you need things to go a little\ndifferently than above you go