textbringer 25 → 26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 32054ff4c06164a8e49a6d82bde0d32fb2aed2e7fa1c842fa908fbb57abd5a6f
4
- data.tar.gz: 7cebf42f75471bce99359f177344d0ce141cf617e9f350ac341a06253d48a4e8
3
+ metadata.gz: e2675c1e38b9c3e24666f87ebf58f4cede5bca7dfec811eec58cee700a500f33
4
+ data.tar.gz: b1835247ba5c703983dea5b80a84fb26b0f43954ee1cb9b737ac82e23a843278
5
5
  SHA512:
6
- metadata.gz: a96f17982fa5b370357fc97bfd5e14617a0af7df230e5ad40071f0b751e82860ea0a01f025f8279aa6f38847d59484f159fa9244ed057f084d537c8f3c5741c7
7
- data.tar.gz: 0fd05fb7d8aa16e51550e5276d549547b2023fad1b06aadc278fc41215da145a249fe868f632371811a10ab7680e4e9aa74e4db653665c733f2132a61e58456a
6
+ metadata.gz: 7bb45438e1cf3912540446ceeed8dcbbbfc1ac4c796242a7d63783e0741223051d4edd200aaa2aa5a1f0c8d01c0b7a8c94f3a9f576b303e29f6303357ae3f2b8
7
+ data.tar.gz: 30ed7d5c79192c5bfdf81122d018ae9269e30087b24be951a7d795c5a0e92aaf84aa7a9f2d58d476ed241e57b44d39ff15284549249127ac3ab811e79ce096ac
data/README.ja.md CHANGED
@@ -58,6 +58,14 @@ Textbringerが依存するcurses.gemをインストールする前に、ncursesw
58
58
  mod_meta_key = alt
59
59
  mod_meta_mode = esc
60
60
 
61
+ ### True color (24ビットカラー)
62
+
63
+ 端末エミュレータがtrue colorに対応している場合、`TERM`に`xterm-direct`を設定すると24ビットカラーが有効になります。
64
+
65
+ $ TERM=xterm-direct txtb
66
+
67
+ テーマで指定されたhex色が256色パレットに近似されず、そのまま表示されるようになります。
68
+
61
69
  ### 東アジアの曖昧な文字幅
62
70
 
63
71
  [曖昧な文字](http://unicode.org/reports/tr11/#Ambiguous)を全角扱いするには、以下の設定を~/.textbringer.rbに記述してください。
@@ -91,6 +99,22 @@ xterm、 mlterm、screenにはそれぞれ独自の設定項目があります
91
99
 
92
100
  cjkwidth on
93
101
 
102
+ ## テーマ
103
+
104
+ `Alt+x load_theme RET` で[textbringer/themes](lib/textbringer/themes)または~/.textbringer/themes内のテーマを読み込むことができます。
105
+
106
+ ~/.textbringer.rbでテーマを設定することもできます。
107
+
108
+ ```ruby
109
+ load_theme "catppuccin"
110
+ ```
111
+
112
+ テーマが独自の背景色を設定している場合に、端末のデフォルト背景色を使いたいときは`load_theme`の後に以下を追加してください。
113
+
114
+ ```ruby
115
+ set_background_color "default"
116
+ ```
117
+
94
118
  ## プラグイン
95
119
 
96
120
  * [Mournmail](https://github.com/shugo/mournmail): 電子メールクライアント
data/README.md CHANGED
@@ -60,6 +60,14 @@ Add the following lines to ~/.mlterm/main.
60
60
  mod_meta_key = alt
61
61
  mod_meta_mode = esc
62
62
 
63
+ ### True color (24-bit color)
64
+
65
+ If your terminal emulator supports true color, set `TERM` to `xterm-direct` to enable 24-bit color.
66
+
67
+ $ TERM=xterm-direct txtb
68
+
69
+ This allows themes to display their exact hex colors instead of approximating to the 256-color palette.
70
+
63
71
  ### East asian ambiguous width
64
72
 
65
73
  Add the following line to ~/.textbringer.rb to treat
@@ -103,6 +111,22 @@ Add the following line to ~/.screenrc.
103
111
  * [textbringer-presentation](https://github.com/shugo/textbringer-presentation): a presentation tool
104
112
  * [textbringer-ghost_text](https://github.com/shugo/textbringer-ghost_text): a [GhostText](https://github.com/fregante/GhostText) plugin
105
113
 
114
+ ## Themes
115
+
116
+ Type `Alt+x load_theme RET` to load a theme from [textbringer/themes](lib/textbringer/themes) or ~/.textbringer/themes.
117
+
118
+ Themes can also be loaded in ~/.textbringer.rb.
119
+
120
+ ```ruby
121
+ load_theme "catppuccin"
122
+ ```
123
+
124
+ If a theme sets its own background color but you prefer to use the terminal's default background, add the following after `load_theme`:
125
+
126
+ ```ruby
127
+ set_background_color "default"
128
+ ```
129
+
106
130
  ## Development
107
131
 
108
132
  After checking out the repo, run `bundle install` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -22,6 +22,30 @@ module Textbringer
22
22
  "brightwhite" => 15
23
23
  }
24
24
 
25
+ DIRECT_COLOR_THRESHOLD = 256 * 256 * 256
26
+
27
+ # Canonical RGB values for basic ANSI colors (xterm defaults),
28
+ # packed as 0xRRGGBB for use in direct color mode.
29
+ BASIC_COLORS_RGB = {
30
+ "default" => -1,
31
+ "black" => 0x000000,
32
+ "red" => 0xCD0000,
33
+ "green" => 0x00CD00,
34
+ "yellow" => 0xCDCD00,
35
+ "blue" => 0x0000EE,
36
+ "magenta" => 0xCD00CD,
37
+ "cyan" => 0x00CDCD,
38
+ "white" => 0xE5E5E5,
39
+ "brightblack" => 0x7F7F7F,
40
+ "brightred" => 0xFF0000,
41
+ "brightgreen" => 0x00FF00,
42
+ "brightyellow" => 0xFFFF00,
43
+ "brightblue" => 0x5C5CFF,
44
+ "brightmagenta" => 0xFF00FF,
45
+ "brightcyan" => 0x00FFFF,
46
+ "brightwhite" => 0xFFFFFF
47
+ }
48
+
25
49
  RGBColor = Struct.new(:r, :g, :b, :number)
26
50
 
27
51
  ADDITIONAL_COLORS = []
@@ -46,10 +70,17 @@ module Textbringer
46
70
  end
47
71
  end
48
72
 
73
+ def self.direct_color?
74
+ Window.colors >= DIRECT_COLOR_THRESHOLD
75
+ end
76
+
49
77
  def self.find_color_number(name)
50
78
  if name.is_a?(Integer)
51
79
  return name
52
80
  end
81
+ if direct_color?
82
+ return find_direct_color(name)
83
+ end
53
84
  case name
54
85
  when /\A\#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})\z/
55
86
  r = $1.to_i(16)
@@ -65,5 +96,20 @@ module Textbringer
65
96
  BASIC_COLORS[name]
66
97
  end
67
98
  end
99
+
100
+ def self.find_direct_color(name)
101
+ case name
102
+ when /\A\#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})\z/
103
+ r = $1.to_i(16)
104
+ g = $2.to_i(16)
105
+ b = $3.to_i(16)
106
+ (r << 16) | (g << 8) | b
107
+ else
108
+ unless BASIC_COLORS_RGB.key?(name)
109
+ raise EditorError, "No such color: #{name}"
110
+ end
111
+ BASIC_COLORS_RGB[name]
112
+ end
113
+ end
68
114
  end
69
115
  end
@@ -291,46 +291,48 @@ module Textbringer
291
291
  if CONFIG[:shell_file_name]
292
292
  cmd = [CONFIG[:shell_file_name], CONFIG[:shell_command_switch], cmd]
293
293
  end
294
- Open3.popen3(*cmd, opts) do |input, output, error, wait_thread|
295
- input.close
296
- catch(:finish) do
297
- loop do
298
- rs, = IO.select([output, error], nil, nil, 0.5)
299
- Window.redisplay
300
- rs&.each do |r|
301
- begin
302
- s = r.read_nonblock(1024).force_encoding("utf-8").
303
- scrub("\u{3013}").gsub(/\r\n/, "\n")
304
- buffer.insert(s)
305
- Window.redisplay
306
- rescue EOFError
307
- throw(:finish) if output.eof? && error.eof?
308
- rescue Errno::EAGAIN, Errno::EWOULDBLOCK
309
- Window.redisplay
310
- next
294
+ with_clean_env do |env|
295
+ Open3.popen3(env, *cmd, opts) do |input, output, error, wait_thread|
296
+ input.close
297
+ catch(:finish) do
298
+ loop do
299
+ rs, = IO.select([output, error], nil, nil, 0.5)
300
+ Window.redisplay
301
+ rs&.each do |r|
302
+ begin
303
+ s = r.read_nonblock(1024).force_encoding("utf-8").
304
+ scrub("\u{3013}").gsub(/\r\n/, "\n")
305
+ buffer.insert(s)
306
+ Window.redisplay
307
+ rescue EOFError
308
+ throw(:finish) if output.eof? && error.eof?
309
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK
310
+ Window.redisplay
311
+ next
312
+ end
311
313
  end
312
- end
313
- if received_keyboard_quit?
314
- if signals.empty?
315
- keyboard_quit
316
- else
317
- sig = signals.shift
318
- pid = wait_thread.pid
319
- pid = -pid if /mswin32|mingw32/ !~ RUBY_PLATFORM
320
- message("Send #{sig} to #{pid}")
321
- Process.kill(sig, pid)
314
+ if received_keyboard_quit?
315
+ if signals.empty?
316
+ keyboard_quit
317
+ else
318
+ sig = signals.shift
319
+ pid = wait_thread.pid
320
+ pid = -pid if /mswin32|mingw32/ !~ RUBY_PLATFORM
321
+ message("Send #{sig} to #{pid}")
322
+ Process.kill(sig, pid)
323
+ end
322
324
  end
323
325
  end
324
326
  end
325
- end
326
- status = wait_thread.value
327
- pid = status.pid
328
- if status.exited?
329
- code = status.exitstatus
330
- message("Process #{pid} exited with status code #{code}")
331
- elsif status.signaled?
332
- signame = Signal.signame(status.termsig)
333
- message("Process #{pid} was killed by #{signame}")
327
+ status = wait_thread.value
328
+ pid = status.pid
329
+ if status.exited?
330
+ code = status.exitstatus
331
+ message("Process #{pid} exited with status code #{code}")
332
+ elsif status.signaled?
333
+ signame = Signal.signame(status.termsig)
334
+ message("Process #{pid} was killed by #{signame}")
335
+ end
334
336
  end
335
337
  end
336
338
  ensure
@@ -307,7 +307,7 @@ module Textbringer
307
307
  when "x"
308
308
  prev_candidate
309
309
  nil
310
- when "\C-m", "\r", "\n"
310
+ when "\r", "\n"
311
311
  confirm_selecting
312
312
  nil
313
313
  else
@@ -188,7 +188,6 @@ module Textbringer
188
188
  doc: "Delete files flagged for deletion.") do
189
189
  files = collect_flagged_files
190
190
  return if files.empty?
191
- list = files.map { |f| " #{f}" }.join("\n")
192
191
  if yes_or_no?("Delete these files?")
193
192
  files.each do |name|
194
193
  next if name == "." || name == ".."
@@ -22,18 +22,13 @@ module Textbringer
22
22
  @prism_version = nil
23
23
  @prism_tokens = nil
24
24
  @prism_ast = nil
25
- @prism_method_call_locs = nil
25
+ @prism_method_name_locs = nil
26
26
  @literal_levels = nil
27
27
  @literal_levels_version = nil
28
28
  end
29
29
 
30
30
  def forward_definition(n = number_prefix_arg || 1)
31
- ensure_prism_tokens
32
- tokens = @prism_tokens.filter_map { |token, _state|
33
- type = token.type
34
- next if type == :EOF
35
- [token.location.start_line, type]
36
- }
31
+ tokens = filter_prism_tokens_line_and_type
37
32
  @buffer.forward_line
38
33
  n.times do |i|
39
34
  tokens = tokens.drop_while { |l, type|
@@ -54,12 +49,7 @@ module Textbringer
54
49
  end
55
50
 
56
51
  def backward_definition(n = number_prefix_arg || 1)
57
- ensure_prism_tokens
58
- tokens = @prism_tokens.filter_map { |token, _state|
59
- type = token.type
60
- next if type == :EOF
61
- [token.location.start_line, type]
62
- }.reverse
52
+ tokens = filter_prism_tokens_line_and_type.reverse
63
53
  @buffer.beginning_of_line
64
54
  n.times do |i|
65
55
  tokens = tokens.drop_while { |l, type|
@@ -120,12 +110,11 @@ module Textbringer
120
110
  def highlight(ctx)
121
111
  ensure_prism_tokens
122
112
  return unless @prism_tokens
123
- ensure_method_call_locs
113
+ ensure_method_name_locs
124
114
  base_pos = ctx.buffer.point_min
125
115
  hl_start = ctx.highlight_start
126
116
  hl_end = ctx.highlight_end
127
117
  in_symbol = false
128
- after_def = false
129
118
  after_class_or_module = false
130
119
  @prism_tokens.each do |token_info|
131
120
  token = token_info[0]
@@ -139,26 +128,18 @@ module Textbringer
139
128
  face_name = PRISM_TOKEN_FACES[type]
140
129
  if in_symbol
141
130
  face_name = :string if face_name.nil? || face_name == :constant ||
142
- face_name == :operator
143
- elsif after_def
144
- face_name = :function_name if type == :IDENTIFIER ||
145
- type == :CONSTANT || type == :METHOD_NAME ||
146
- PRISM_TOKEN_FACES[type] == :operator
131
+ face_name == :keyword || face_name == :operator
132
+ elsif @prism_method_name_locs.key?(offset)
133
+ face_name = :function_name
147
134
  elsif face_name == :constant &&
148
135
  (after_class_or_module || token.location.slice.match?(/\p{Lower}/))
149
136
  face_name = :type
150
- elsif @prism_method_call_locs.key?(offset)
151
- face_name = :function_name
152
137
  end
153
138
  if face_name && (face = Face[face_name])
154
139
  ctx.highlight(pos, pos_end, face)
155
140
  end
156
141
  end
157
142
  in_symbol = type == :SYMBOL_BEGIN
158
- after_def = type == :KEYWORD_DEF ||
159
- (after_def && (type == :KEYWORD_SELF || type == :DOT ||
160
- type == :NEWLINE || type == :IGNORED_NEWLINE ||
161
- type == :COMMENT))
162
143
  after_class_or_module = (type == :KEYWORD_CLASS || type == :KEYWORD_MODULE) ||
163
144
  (after_class_or_module && !(type == :NEWLINE || type == :SEMICOLON))
164
145
  end
@@ -199,6 +180,9 @@ module Textbringer
199
180
  # Strings and string-like
200
181
  STRING_BEGIN: :string, STRING_CONTENT: :string, STRING_END: :string,
201
182
  SYMBOL_BEGIN: :string, REGEXP_BEGIN: :string, REGEXP_END: :string,
183
+ PERCENT_LOWER_I: :string, PERCENT_UPPER_I: :string,
184
+ PERCENT_LOWER_W: :string, PERCENT_UPPER_W: :string,
185
+ PERCENT_LOWER_X: :string,
202
186
  HEREDOC_START: :string, HEREDOC_END: :string,
203
187
  LABEL: :property,
204
188
 
@@ -273,6 +257,8 @@ module Textbringer
273
257
  EQUAL_GREATER
274
258
  ].to_set
275
259
 
260
+ OPERATORS = %i(!= !~ =~ == === <=> > >= < <= & | ^ >> << - + % / * ** -@ +@ ~ ! [] []=)
261
+
276
262
  BLOCK_END = {
277
263
  EMBEXPR_BEGIN: :EMBEXPR_END,
278
264
  BRACE_LEFT: :BRACE_RIGHT,
@@ -489,6 +475,15 @@ module Textbringer
489
475
  @literal_levels[i][1] > 0
490
476
  end
491
477
 
478
+ def filter_prism_tokens_line_and_type
479
+ ensure_prism_tokens
480
+ @prism_tokens.filter_map { |token, _state|
481
+ type = token.type
482
+ next if type == :EOF
483
+ [token.location.start_line, type]
484
+ }
485
+ end
486
+
492
487
  def ensure_prism_tokens
493
488
  return if @prism_version == @buffer.version
494
489
  source = @buffer.to_s
@@ -499,27 +494,40 @@ module Textbringer
499
494
  @prism_ast = nil
500
495
  @prism_tokens = []
501
496
  end
502
- @prism_method_call_locs = nil
497
+ @prism_method_name_locs = nil
503
498
  @prism_version = @buffer.version
504
499
  @literal_levels_version = nil
505
500
  end
506
501
 
507
- def ensure_method_call_locs
508
- return if @prism_method_call_locs
509
- @prism_method_call_locs = {}
502
+ def ensure_method_name_locs
503
+ return if @prism_method_name_locs
504
+ @prism_method_name_locs = {}
510
505
  return unless @prism_ast
511
- collect_method_call_locs(@prism_ast)
506
+ collect_method_name_locs(@prism_ast)
512
507
  end
513
508
 
514
- def collect_method_call_locs(node)
515
- if node.is_a?(Prism::CallNode) && node.message_loc
516
- name_str = node.name.to_s
517
- unless name_str.match?(/\A[^a-zA-Z_]/) || name_str.end_with?("@")
518
- loc = node.message_loc
519
- @prism_method_call_locs[loc.start_offset] = true
520
- end
509
+ def collect_method_name_locs(node)
510
+ if node.type == :def_node
511
+ @prism_method_name_locs[node.name_loc.start_offset] = true
512
+ elsif node.type == :alias_method_node
513
+ add_alias_method_name_locs(node.new_name)
514
+ add_alias_method_name_locs(node.old_name)
515
+ elsif (node.type == :call_node &&
516
+ !(node.call_operator_loc.nil? && OPERATORS.include?(node.name)) && # exclude operators
517
+ !((node.call_operator_loc.nil? || node.call_operator_loc.slice == "::") && # exclude constants
518
+ /\A\p{Upper}/.match?(node.name))) ||
519
+ node.type == :call_operator_write_node ||
520
+ node.type == :call_and_write_node ||
521
+ node.type == :call_or_write_node
522
+ @prism_method_name_locs[node.message_loc.start_offset] = true
523
+ end
524
+ node.compact_child_nodes.each { |child| collect_method_name_locs(child) }
525
+ end
526
+
527
+ def add_alias_method_name_locs(node)
528
+ if node.type == :symbol_node && node.opening_loc.nil?
529
+ @prism_method_name_locs[node.value_loc.start_offset] = true
521
530
  end
522
- node.compact_child_nodes.each { |child| collect_method_call_locs(child) }
523
531
  end
524
532
 
525
533
  def ensure_literal_levels
@@ -2,70 +2,71 @@
2
2
  # Based on https://github.com/catppuccin/nvim
3
3
  #
4
4
  # Dark variant: Mocha Light variant: Latte
5
+ # GUI hex values from the official palette definitions.
5
6
 
6
7
  Textbringer::Theme.define "catppuccin" do |t|
7
8
  t.palette :dark do |p|
8
9
  # Catppuccin Mocha base tones
9
- p.color :text, hex: "#d7d7ff", ansi: "white"
10
- p.color :subtext1, hex: "#afafd7", ansi: "white"
11
- p.color :subtext0, hex: "#afafd7", ansi: "white"
12
- p.color :overlay2, hex: "#8787af", ansi: "white"
13
- p.color :overlay1, hex: "#8787af", ansi: "white"
14
- p.color :overlay0, hex: "#767676", ansi: "brightblack"
15
- p.color :surface2, hex: "#626262", ansi: "brightblack"
16
- p.color :surface1, hex: "#4e4e4e", ansi: "brightblack"
17
- p.color :surface0, hex: "#3a3a3a", ansi: "brightblack"
18
- p.color :base, hex: "#262626", ansi: "black"
19
- p.color :mantle, hex: "#1c1c1c", ansi: "black"
20
- p.color :crust, hex: "#121212", ansi: "black"
10
+ p.color :text, hex: "#cdd6f4", ansi: "white"
11
+ p.color :subtext1, hex: "#bac2de", ansi: "white"
12
+ p.color :subtext0, hex: "#a6adc8", ansi: "white"
13
+ p.color :overlay2, hex: "#9399b2", ansi: "white"
14
+ p.color :overlay1, hex: "#7f849c", ansi: "brightblack"
15
+ p.color :overlay0, hex: "#6c7086", ansi: "brightblack"
16
+ p.color :surface2, hex: "#585b70", ansi: "brightblack"
17
+ p.color :surface1, hex: "#45475a", ansi: "brightblack"
18
+ p.color :surface0, hex: "#313244", ansi: "brightblack"
19
+ p.color :base, hex: "#1e1e2e", ansi: "black"
20
+ p.color :mantle, hex: "#181825", ansi: "black"
21
+ p.color :crust, hex: "#11111b", ansi: "black"
21
22
 
22
23
  # Catppuccin Mocha accent colors
23
- p.color :red, hex: "#ff87af", ansi: "red"
24
- p.color :maroon, hex: "#d7afaf", ansi: "red"
25
- p.color :peach, hex: "#ffaf87", ansi: "yellow"
26
- p.color :yellow, hex: "#ffd7af", ansi: "yellow"
27
- p.color :green, hex: "#afd7af", ansi: "green"
28
- p.color :teal, hex: "#87d7d7", ansi: "cyan"
29
- p.color :sky, hex: "#87d7d7", ansi: "cyan"
30
- p.color :sapphire, hex: "#87d7ff", ansi: "cyan"
31
- p.color :blue, hex: "#87afff", ansi: "blue"
32
- p.color :lavender, hex: "#afafff", ansi: "blue"
33
- p.color :mauve, hex: "#d7afff", ansi: "magenta"
34
- p.color :pink, hex: "#ffafd7", ansi: "magenta"
35
- p.color :flamingo, hex: "#ffd7d7", ansi: "red"
36
- p.color :rosewater, hex: "#ffd7d7", ansi: "red"
24
+ p.color :red, hex: "#f38ba8", ansi: "red"
25
+ p.color :maroon, hex: "#eba0ac", ansi: "red"
26
+ p.color :peach, hex: "#fab387", ansi: "yellow"
27
+ p.color :yellow, hex: "#f9e2af", ansi: "yellow"
28
+ p.color :green, hex: "#a6e3a1", ansi: "green"
29
+ p.color :teal, hex: "#94e2d5", ansi: "cyan"
30
+ p.color :sky, hex: "#89dceb", ansi: "cyan"
31
+ p.color :sapphire, hex: "#74c7ec", ansi: "cyan"
32
+ p.color :blue, hex: "#89b4fa", ansi: "blue"
33
+ p.color :lavender, hex: "#b4befe", ansi: "blue"
34
+ p.color :mauve, hex: "#cba6f7", ansi: "magenta"
35
+ p.color :pink, hex: "#f5c2e7", ansi: "magenta"
36
+ p.color :flamingo, hex: "#f2cdcd", ansi: "red"
37
+ p.color :rosewater, hex: "#f5e0dc", ansi: "red"
37
38
  end
38
39
 
39
40
  t.palette :light do |p|
40
41
  # Catppuccin Latte base tones
41
- p.color :text, hex: "#585858", ansi: "black"
42
- p.color :subtext1, hex: "#5f5f87", ansi: "black"
43
- p.color :subtext0, hex: "#767676", ansi: "brightblack"
44
- p.color :overlay2, hex: "#878787", ansi: "brightblack"
45
- p.color :overlay1, hex: "#949494", ansi: "white"
46
- p.color :overlay0, hex: "#a8a8a8", ansi: "white"
47
- p.color :surface2, hex: "#b2b2b2", ansi: "white"
48
- p.color :surface1, hex: "#c6c6c6", ansi: "white"
49
- p.color :surface0, hex: "#d0d0d0", ansi: "white"
50
- p.color :base, hex: "#eeeeee", ansi: "white"
51
- p.color :mantle, hex: "#eeeeee", ansi: "white"
52
- p.color :crust, hex: "#e4e4e4", ansi: "white"
42
+ p.color :text, hex: "#4c4f69", ansi: "black"
43
+ p.color :subtext1, hex: "#5c5f77", ansi: "black"
44
+ p.color :subtext0, hex: "#6c6f85", ansi: "brightblack"
45
+ p.color :overlay2, hex: "#7c7f93", ansi: "brightblack"
46
+ p.color :overlay1, hex: "#8c8fa1", ansi: "white"
47
+ p.color :overlay0, hex: "#9ca0b0", ansi: "white"
48
+ p.color :surface2, hex: "#acb0be", ansi: "white"
49
+ p.color :surface1, hex: "#bcc0cc", ansi: "white"
50
+ p.color :surface0, hex: "#ccd0da", ansi: "white"
51
+ p.color :base, hex: "#eff1f5", ansi: "white"
52
+ p.color :mantle, hex: "#e6e9ef", ansi: "white"
53
+ p.color :crust, hex: "#dce0e8", ansi: "white"
53
54
 
54
55
  # Catppuccin Latte accent colors
55
- p.color :red, hex: "#d7005f", ansi: "red"
56
- p.color :maroon, hex: "#d75f5f", ansi: "red"
57
- p.color :peach, hex: "#ff5f00", ansi: "red"
58
- p.color :yellow, hex: "#d78700", ansi: "yellow"
59
- p.color :green, hex: "#5faf00", ansi: "green"
60
- p.color :teal, hex: "#008787", ansi: "cyan"
61
- p.color :sky, hex: "#00afd7", ansi: "cyan"
62
- p.color :sapphire, hex: "#00afaf", ansi: "cyan"
63
- p.color :blue, hex: "#005fff", ansi: "blue"
64
- p.color :lavender, hex: "#5f87ff", ansi: "blue"
65
- p.color :mauve, hex: "#875fff", ansi: "magenta"
66
- p.color :pink, hex: "#d787d7", ansi: "magenta"
67
- p.color :flamingo, hex: "#d78787", ansi: "red"
68
- p.color :rosewater, hex: "#d78787", ansi: "red"
56
+ p.color :red, hex: "#d20f39", ansi: "red"
57
+ p.color :maroon, hex: "#e64553", ansi: "red"
58
+ p.color :peach, hex: "#fe640b", ansi: "red"
59
+ p.color :yellow, hex: "#df8e1d", ansi: "yellow"
60
+ p.color :green, hex: "#40a02b", ansi: "green"
61
+ p.color :teal, hex: "#179299", ansi: "cyan"
62
+ p.color :sky, hex: "#04a5e5", ansi: "cyan"
63
+ p.color :sapphire, hex: "#209fb5", ansi: "cyan"
64
+ p.color :blue, hex: "#1e66f5", ansi: "blue"
65
+ p.color :lavender, hex: "#7287fd", ansi: "blue"
66
+ p.color :mauve, hex: "#8839ef", ansi: "magenta"
67
+ p.color :pink, hex: "#ea76cb", ansi: "magenta"
68
+ p.color :flamingo, hex: "#dd7878", ansi: "red"
69
+ p.color :rosewater, hex: "#dc8a78", ansi: "red"
69
70
  end
70
71
 
71
72
  t.default_colors foreground: :text, background: :base
@@ -2,34 +2,31 @@
2
2
  # Based on https://github.com/cormacrelf/vim-colors-github
3
3
  # Inspired by GitHub's syntax highlighting as of 2018.
4
4
  #
5
- # Light palette: cterm values from source (accurate).
6
- # Dark palette: GUI hex values — dark-mode cterm values in source are unreliable
7
- # (e.g. dcolors.blue has cterm=167 which maps to red, overlay has cterm=123
8
- # which maps to bright cyan).
5
+ # GUI hex values from the source's guifg/guibg definitions.
9
6
 
10
7
  Textbringer::Theme.define "github" do |t|
11
8
  t.palette :light do |p|
12
9
  # Backgrounds / foreground
13
- p.color :bg, hex: "#ffffff", ansi: "white" # 231 Normal bg
14
- p.color :bg1, hex: "#eeeeee", ansi: "white" # 255 overlay/gutter/panels
15
- p.color :vis, hex: "#afd7ff", ansi: "blue" # 153 Visual selection bg (blue2)
16
- p.color :search, hex: "#ffffd7", ansi: "yellow" # 230 Search bg (yellow)
17
- p.color :fg, hex: "#262626", ansi: "black" # 235 Normal fg (base0)
18
- p.color :comment, hex: "#767676", ansi: "brightblack" # 243 Comment (base2)
19
- p.color :line_nr, hex: "#bcbcbc", ansi: "white" # 250 LineNr fg (base4)
10
+ p.color :bg, hex: "#ffffff", ansi: "white" # Normal guibg
11
+ p.color :bg1, hex: "#f6f8fa", ansi: "white" # overlay/gutter (grey2)
12
+ p.color :vis, hex: "#e4effb", ansi: "blue" # Visual guibg (blue2)
13
+ p.color :search, hex: "#ffffc5", ansi: "yellow" # Search guibg
14
+ p.color :fg, hex: "#24292e", ansi: "black" # Normal guifg (base0)
15
+ p.color :comment, hex: "#6a737d", ansi: "brightblack" # Comment guifg (base2)
16
+ p.color :line_nr, hex: "#babbbc", ansi: "white" # LineNr guifg (base4)
20
17
 
21
18
  # Syntax colors
22
- p.color :red, hex: "#d75f5f", ansi: "red" # 167 Statement, Type, PreProc
23
- p.color :darkred, hex: "#af0000", ansi: "red" # 124 darkred
24
- p.color :purple, hex: "#8700af", ansi: "magenta" # 91 Function, Define, Special
25
- p.color :green, hex: "#00875f", ansi: "green" # 29 html/xml tags
26
- p.color :orange, hex: "#d75f00", ansi: "yellow" # 166 orange
27
- p.color :blue, hex: "#005fd7", ansi: "blue" # 26 Identifier, Constant, Macro
28
- p.color :darkblue, hex: "#00005f", ansi: "blue" # 17 String
19
+ p.color :red, hex: "#d73a49", ansi: "red" # Statement guifg
20
+ p.color :darkred, hex: "#b31d28", ansi: "red" # darkred
21
+ p.color :purple, hex: "#6f42c1", ansi: "magenta" # Function guifg
22
+ p.color :green, hex: "#22863a", ansi: "green" # html/xml tags
23
+ p.color :orange, hex: "#e36209", ansi: "yellow" # orange
24
+ p.color :blue, hex: "#005cc5", ansi: "blue" # Identifier guifg
25
+ p.color :darkblue, hex: "#032f62", ansi: "blue" # String guifg
29
26
  end
30
27
 
31
28
  t.palette :dark do |p|
32
- # Backgrounds / foreground (GUI hex cterm values are unreliable in source)
29
+ # Backgrounds / foreground (GUI hex from dark mode definitions)
33
30
  p.color :bg, hex: "#24292e", ansi: "black" # base0 (Normal bg)
34
31
  p.color :bg1, hex: "#353a3f", ansi: "brightblack" # dcolors.overlay (panels/popups)
35
32
  p.color :vis, hex: "#354a60", ansi: "blue" # dcolors.blue2 / blues[4]
@@ -58,7 +55,7 @@ Textbringer::Theme.define "github" do |t|
58
55
  t.face :number, foreground: :blue # Number → Constant = blue
59
56
  t.face :constant, foreground: :blue # Constant = blue
60
57
  t.face :function_name, foreground: :purple # Function = purple
61
- t.face :type, foreground: :orange # Type = orange
58
+ t.face :type, foreground: :orange # Type = orange (current GitHub style; vim source used red)
62
59
  t.face :variable, foreground: :blue # Identifier = blue
63
60
  t.face :operator # no explicit color in source
64
61
  t.face :punctuation # Delimiter = fg (ghNormalNoBg)
@@ -1,50 +1,51 @@
1
1
  # Gruvbox theme for Textbringer
2
2
  # Based on https://github.com/morhetz/gruvbox
3
3
  #
4
+ # GUI hex values from the source's guifg/guibg definitions.
4
5
  # Dark: bright accent colors on warm dark background
5
- # Light: neutral accent colors on warm light background
6
+ # Light: faded accent colors on warm light background
6
7
 
7
8
  Textbringer::Theme.define "gruvbox" do |t|
8
9
  t.palette :dark do |p|
9
10
  # Base tones (dark background, light foreground)
10
- p.color :bg0, hex: "#262626", ansi: "black"
11
- p.color :bg1, hex: "#3a3a3a", ansi: "brightblack"
12
- p.color :bg2, hex: "#4e4e4e", ansi: "brightblack"
13
- p.color :bg3, hex: "#626262", ansi: "brightblack"
14
- p.color :bg4, hex: "#767676", ansi: "white"
15
- p.color :fg1, hex: "#ffd7af", ansi: "white"
16
- p.color :fg4, hex: "#949494", ansi: "white"
17
- p.color :gray, hex: "#8a8a8a", ansi: "white"
11
+ p.color :bg0, hex: "#282828", ansi: "black" # dark0
12
+ p.color :bg1, hex: "#3c3836", ansi: "brightblack" # dark1
13
+ p.color :bg2, hex: "#504945", ansi: "brightblack" # dark2
14
+ p.color :bg3, hex: "#665c54", ansi: "brightblack" # dark3
15
+ p.color :bg4, hex: "#7c6f64", ansi: "white" # dark4
16
+ p.color :fg1, hex: "#ebdbb2", ansi: "white" # light1 (Normal guifg)
17
+ p.color :fg4, hex: "#a89984", ansi: "white" # light4
18
+ p.color :gray, hex: "#928374", ansi: "white" # gray_245
18
19
 
19
20
  # Bright accent colors
20
- p.color :red, hex: "#d75f5f", ansi: "red"
21
- p.color :green, hex: "#afaf00", ansi: "green"
22
- p.color :yellow, hex: "#ffaf00", ansi: "yellow"
23
- p.color :blue, hex: "#87afaf", ansi: "blue"
24
- p.color :purple, hex: "#d787af", ansi: "magenta"
25
- p.color :aqua, hex: "#87af87", ansi: "cyan"
26
- p.color :orange, hex: "#ff8700", ansi: "yellow"
21
+ p.color :red, hex: "#fb4934", ansi: "red" # bright_red
22
+ p.color :green, hex: "#b8bb26", ansi: "green" # bright_green
23
+ p.color :yellow, hex: "#fabd2f", ansi: "yellow" # bright_yellow
24
+ p.color :blue, hex: "#83a598", ansi: "blue" # bright_blue
25
+ p.color :purple, hex: "#d3869b", ansi: "magenta" # bright_purple
26
+ p.color :aqua, hex: "#8ec07c", ansi: "cyan" # bright_aqua
27
+ p.color :orange, hex: "#fe8019", ansi: "yellow" # bright_orange
27
28
  end
28
29
 
29
30
  t.palette :light do |p|
30
31
  # Base tones (light background, dark foreground)
31
- p.color :bg0, hex: "#ffffaf", ansi: "white"
32
- p.color :bg1, hex: "#ffd7af", ansi: "white"
33
- p.color :bg2, hex: "#bcbcbc", ansi: "white"
34
- p.color :bg3, hex: "#a8a8a8", ansi: "white"
35
- p.color :bg4, hex: "#949494", ansi: "brightblack"
36
- p.color :fg1, hex: "#3a3a3a", ansi: "black"
37
- p.color :fg4, hex: "#767676", ansi: "brightblack"
38
- p.color :gray, hex: "#8a8a8a", ansi: "brightblack"
32
+ p.color :bg0, hex: "#fbf1c7", ansi: "white" # light0
33
+ p.color :bg1, hex: "#ebdbb2", ansi: "white" # light1
34
+ p.color :bg2, hex: "#d5c4a1", ansi: "white" # light2
35
+ p.color :bg3, hex: "#bdae93", ansi: "white" # light3
36
+ p.color :bg4, hex: "#a89984", ansi: "brightblack" # light4
37
+ p.color :fg1, hex: "#3c3836", ansi: "black" # dark1 (Normal guifg)
38
+ p.color :fg4, hex: "#7c6f64", ansi: "brightblack" # dark4
39
+ p.color :gray, hex: "#928374", ansi: "brightblack" # gray_244
39
40
 
40
- # Neutral accent colors
41
- p.color :red, hex: "#af0000", ansi: "red"
42
- p.color :green, hex: "#87af00", ansi: "green"
43
- p.color :yellow, hex: "#d78700", ansi: "yellow"
44
- p.color :blue, hex: "#5f8787", ansi: "blue"
45
- p.color :purple, hex: "#af5f87", ansi: "magenta"
46
- p.color :aqua, hex: "#5faf87", ansi: "cyan"
47
- p.color :orange, hex: "#d75f00", ansi: "red"
41
+ # Faded accent colors
42
+ p.color :red, hex: "#9d0006", ansi: "red" # faded_red
43
+ p.color :green, hex: "#79740e", ansi: "green" # faded_green
44
+ p.color :yellow, hex: "#b57614", ansi: "yellow" # faded_yellow
45
+ p.color :blue, hex: "#076678", ansi: "blue" # faded_blue
46
+ p.color :purple, hex: "#8f3f71", ansi: "magenta" # faded_purple
47
+ p.color :aqua, hex: "#427b58", ansi: "cyan" # faded_aqua
48
+ p.color :orange, hex: "#af3a03", ansi: "red" # faded_orange
48
49
  end
49
50
 
50
51
  t.default_colors foreground: :fg1, background: :bg0
@@ -56,7 +57,7 @@ Textbringer::Theme.define "gruvbox" do |t|
56
57
  t.face :string, foreground: :green
57
58
  t.face :number, foreground: :purple
58
59
  t.face :constant, foreground: :purple
59
- t.face :function_name, foreground: :green
60
+ t.face :function_name, foreground: :green, bold: true
60
61
  t.face :type, foreground: :yellow
61
62
  t.face :variable, foreground: :blue
62
63
  t.face :operator
@@ -2,29 +2,30 @@
2
2
  # Based on https://github.com/tomasr/molokai
3
3
  # Original Monokai theme by Wimer Hazenberg; darker variant by Hamish Stuart Macpherson
4
4
  #
5
- # Colors derived from molokai's 256-color (cterm) values.
6
- # Dark only.
5
+ # GUI hex values from the source's guifg/guibg definitions.
6
+ # Dark only (default darker variant, s:molokai_original = 0).
7
7
 
8
8
  Textbringer::Theme.define "molokai" do |t|
9
9
  t.palette :dark do |p|
10
- # Background / foreground (cterm numbers in comments)
11
- p.color :bg, hex: "#121212", ansi: "black" # 233 Normal bg
12
- p.color :bg1, hex: "#262626", ansi: "brightblack" # 235 Visual, region
13
- p.color :bg2, hex: "#303030", ansi: "brightblack" # 236 LineNr bg, floating windows
14
- p.color :fg, hex: "#d0d0d0", ansi: "white" # 252 Normal fg
15
- p.color :comment, hex: "#5f5f5f", ansi: "brightblack" # 59 Comment
16
- p.color :gray, hex: "#444444", ansi: "brightblack" # 238 StatusLine fg
17
- p.color :silver, hex: "#dadada", ansi: "white" # 253 StatusLine bg
18
- p.color :mid_gray, hex: "#6c6c6c", ansi: "brightblack" # 242 PmenuSel bg
10
+ # Background / foreground
11
+ p.color :bg, hex: "#1b1d1e", ansi: "black" # Normal guibg
12
+ p.color :bg1, hex: "#403d3d", ansi: "brightblack" # Visual guibg
13
+ p.color :bg2, hex: "#1b1d1e", ansi: "black" # floating window bg (same as bg)
14
+ p.color :fg, hex: "#f8f8f2", ansi: "white" # Normal guifg
15
+ p.color :comment, hex: "#7e8e91", ansi: "brightblack" # Comment guifg
16
+ p.color :gray, hex: "#455354", ansi: "brightblack" # StatusLine guifg
17
+ p.color :silver, hex: "#f8f8f2", ansi: "white" # StatusLine guibg = fg
18
+ p.color :mid_gray, hex: "#808080", ansi: "brightblack" # PmenuSel guibg
19
+ p.color :delim, hex: "#8f8f8f", ansi: "white" # Delimiter guifg
19
20
 
20
21
  # Accent colors
21
- p.color :pink, hex: "#d7005f", ansi: "red" # 161 Keyword, Operator
22
- p.color :green, hex: "#87ff00", ansi: "green" # 118 Function, PreProc
23
- p.color :yellow, hex: "#afaf87", ansi: "yellow" # 144 String, Character
24
- p.color :purple, hex: "#af5fff", ansi: "magenta" # 135 Number, Boolean, Constant
25
- p.color :orange, hex: "#ff8700", ansi: "yellow" # 208 Identifier, StorageClass
26
- p.color :cyan, hex: "#5fd7ff", ansi: "cyan" # 81 Type, Define, Structure
27
- p.color :search, hex: "#ffd787", ansi: "yellow" # 222 Search bg
22
+ p.color :pink, hex: "#f92672", ansi: "red" # Keyword guifg
23
+ p.color :green, hex: "#a6e22e", ansi: "green" # Function guifg
24
+ p.color :yellow, hex: "#e6db74", ansi: "yellow" # String guifg
25
+ p.color :purple, hex: "#ae81ff", ansi: "magenta" # Number guifg
26
+ p.color :orange, hex: "#fd971f", ansi: "yellow" # Identifier guifg
27
+ p.color :cyan, hex: "#66d9ef", ansi: "cyan" # Type guifg
28
+ p.color :search, hex: "#ffe792", ansi: "yellow" # Search guibg
28
29
  end
29
30
 
30
31
  t.default_colors foreground: :fg, background: :bg
@@ -40,22 +41,19 @@ Textbringer::Theme.define "molokai" do |t|
40
41
  t.face :type, foreground: :cyan
41
42
  t.face :variable, foreground: :orange
42
43
  t.face :operator, foreground: :pink
43
- t.face :punctuation
44
+ t.face :punctuation, foreground: :delim
44
45
  t.face :builtin, foreground: :cyan
45
46
  t.face :property, foreground: :orange
46
47
 
47
48
  # Basic faces
48
- # StatusLine: ctermfg=238 (#444444) on ctermbg=253 (#DADADA)
49
49
  t.face :mode_line, foreground: :gray, background: :silver
50
50
  t.face :link, foreground: :cyan, underline: true
51
51
  t.face :control
52
52
  t.face :region, background: :bg1
53
- # Search: ctermfg=0 ctermbg=222
54
53
  t.face :isearch, foreground: :bg, background: :search
55
54
  t.face :floating_window, foreground: :fg, background: :bg2
56
55
 
57
56
  # Completion faces
58
- # Pmenu: ctermfg=81 ctermbg=16; PmenuSel: ctermfg=252 ctermbg=242
59
57
  t.face :completion_popup, foreground: :cyan, background: :bg
60
58
  t.face :completion_popup_selected, foreground: :fg, background: :mid_gray
61
59
 
@@ -1,29 +1,33 @@
1
1
  # Sonokai theme for Textbringer (default style)
2
2
  # Based on https://github.com/sainnhe/sonokai
3
3
  #
4
+ # GUI hex values from the source's default style palette.
4
5
  # A dark theme only. Falls back to dark palette on light terminals.
5
6
 
6
7
  Textbringer::Theme.define "sonokai" do |t|
7
8
  t.palette :dark do |p|
8
9
  # Base tones
9
- p.color :black, hex: "#080808", ansi: "black"
10
- p.color :bg_dim, hex: "#080808", ansi: "black"
11
- p.color :bg0, hex: "#262626", ansi: "black"
12
- p.color :bg1, hex: "#303030", ansi: "brightblack"
13
- p.color :bg2, hex: "#303030", ansi: "brightblack"
14
- p.color :bg3, hex: "#3a3a3a", ansi: "brightblack"
15
- p.color :bg4, hex: "#3a3a3a", ansi: "brightblack"
16
- p.color :fg, hex: "#bcbcbc", ansi: "white"
17
- p.color :grey, hex: "#949494", ansi: "white"
18
- p.color :grey_dim, hex: "#585858", ansi: "brightblack"
10
+ p.color :black, hex: "#181819", ansi: "black"
11
+ p.color :bg_dim, hex: "#222327", ansi: "black"
12
+ p.color :bg0, hex: "#2c2e34", ansi: "black"
13
+ p.color :bg1, hex: "#33353f", ansi: "brightblack"
14
+ p.color :bg2, hex: "#363944", ansi: "brightblack"
15
+ p.color :bg3, hex: "#3b3e48", ansi: "brightblack"
16
+ p.color :bg4, hex: "#414550", ansi: "brightblack"
17
+ p.color :fg, hex: "#e2e2e3", ansi: "white"
18
+ p.color :grey, hex: "#7f8490", ansi: "white"
19
+ p.color :grey_dim, hex: "#595f6f", ansi: "brightblack"
19
20
 
20
21
  # Accent colors
21
- p.color :red, hex: "#ff5f5f", ansi: "red"
22
- p.color :orange, hex: "#ffaf5f", ansi: "yellow"
23
- p.color :yellow, hex: "#d7af5f", ansi: "yellow"
24
- p.color :green, hex: "#87af5f", ansi: "green"
25
- p.color :blue, hex: "#87afd7", ansi: "cyan"
26
- p.color :purple, hex: "#d787d7", ansi: "magenta"
22
+ p.color :red, hex: "#fc5d7c", ansi: "red"
23
+ p.color :orange, hex: "#f39660", ansi: "yellow"
24
+ p.color :yellow, hex: "#e7c664", ansi: "yellow"
25
+ p.color :green, hex: "#9ed072", ansi: "green"
26
+ p.color :blue, hex: "#76cce0", ansi: "cyan"
27
+ p.color :purple, hex: "#b39df3", ansi: "magenta"
28
+
29
+ # Filled colors for UI
30
+ p.color :filled_blue, hex: "#85d3f2", ansi: "cyan"
27
31
  end
28
32
 
29
33
  t.default_colors foreground: :fg, background: :bg0
@@ -48,12 +52,12 @@ Textbringer::Theme.define "sonokai" do |t|
48
52
  t.face :link, foreground: :blue, underline: true
49
53
  t.face :control
50
54
  t.face :region, background: :bg4
51
- t.face :isearch, foreground: :bg0, background: :green
55
+ t.face :isearch, foreground: :green, background: :bg0, reverse: true
52
56
  t.face :floating_window, foreground: :fg, background: :bg_dim
53
57
 
54
58
  # Completion faces
55
59
  t.face :completion_popup, foreground: :fg, background: :bg2
56
- t.face :completion_popup_selected, foreground: :bg0, background: :blue
60
+ t.face :completion_popup_selected, foreground: :bg0, background: :filled_blue
57
61
 
58
62
  # Dired faces
59
63
  t.face :dired_directory, foreground: :green
@@ -1,7 +1,7 @@
1
1
  # Tokyo Night theme for Textbringer
2
2
  # Based on https://github.com/folke/tokyonight.nvim
3
- # Night variant (dark only). GUI hex colors — no cterm values in source.
4
- # Computed colors derived from tokyonight's blend formulas.
3
+ # Night variant (dark only).
4
+ # GUI hex values from the source palette definitions.
5
5
 
6
6
  Textbringer::Theme.define "tokyonight" do |t|
7
7
  t.palette :dark do |p|
@@ -9,7 +9,7 @@ Textbringer::Theme.define "tokyonight" do |t|
9
9
  p.color :bg, hex: "#1a1b26", ansi: "black" # bg
10
10
  p.color :bg_dark, hex: "#16161e", ansi: "black" # bg_dark → popups, statusline
11
11
  p.color :bg_hl, hex: "#292e42", ansi: "brightblack" # bg_highlight → floating windows
12
- p.color :bg_vis, hex: "#283457", ansi: "brightblack" # bg_visual = blend(blue0, 0.4, bg)
12
+ p.color :bg_vis, hex: "#283357", ansi: "brightblack" # bg_visual = blend(blue0, 0.4, bg)
13
13
  p.color :sel_bg, hex: "#343a55", ansi: "brightblack" # PmenuSel bg = blend(fg_gutter, 0.8, bg)
14
14
  p.color :search, hex: "#3d59a1", ansi: "blue" # bg_search = blue0
15
15
  p.color :fg, hex: "#c0caf5", ansi: "white" # fg
@@ -418,6 +418,22 @@ module Textbringer
418
418
  RbConfig::CONFIG["ruby_install_name"]
419
419
  end
420
420
 
421
+ def with_clean_env(&block)
422
+ env = ENV.to_h.reject { |k, _| k.start_with?("RBENV_") }
423
+ unless Gem.win_platform?
424
+ env["PATH"] = env["PATH"].split(File::PATH_SEPARATOR).reject { |path|
425
+ /.rbenv\/(versions|libexec)/.match?(path)
426
+ }.join(File::PATH_SEPARATOR)
427
+ end
428
+ if defined?(Bundler)
429
+ Bundler.with_unbundled_env do
430
+ block.call(env)
431
+ end
432
+ else
433
+ block.call(env)
434
+ end
435
+ end
436
+
421
437
  [
422
438
  :beginning_of_buffer?,
423
439
  :end_of_buffer?,
@@ -1,3 +1,3 @@
1
1
  module Textbringer
2
- VERSION = "25"
2
+ VERSION = "26"
3
3
  end
data/screenshot.png CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: textbringer
3
3
  version: !ruby/object:Gem::Version
4
- version: '25'
4
+ version: '26'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shugo Maeda