textbringer 0.2.2 → 0.2.3

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
  SHA1:
3
- metadata.gz: df46cdf2ec8419a33fbfd4e23f41272bd4204ba2
4
- data.tar.gz: 47179c38f72119aa5c4b96f01c80d28f10660531
3
+ metadata.gz: e327730f3f4d3b64bf57ce835400f4a44475c600
4
+ data.tar.gz: 3b9adf68d12de90e5d6106e4aa2f9e4cfd0a5599
5
5
  SHA512:
6
- metadata.gz: b39cb72604f03c738a02b37fcc7c8d74bef47590ddde2293e6207f7be1147572395b760a02bcc74537872de3152967f447bcfb03b1fb83f447c274eff0322371
7
- data.tar.gz: 864a8f20870885c9fb7c2252779cbe269f08ed34b1650b06233172fb69eac9fcdf76da5b6292150db4940ba7ce14b3f308b89c78084be811fd0f255553e8c720
6
+ metadata.gz: aef52effa70699fbc3a32d80354027caf1d606ecb31331c8adfb83a5649e66a444244c73985206249046da68c2c00cf0c753ffcb974e4ff157418d7a188c9a82
7
+ data.tar.gz: 65cfd1a1cdf62888061a3b40e0e9b7620b56374927c4e2844efba890707b567badfa5586205bc1d07cc3b596c5e31e058fb7a78bc1aed3503ce0f792431f5a33
data/CHANGES.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## 0.2.3
2
+
3
+ * Add the on_modified callback to Buffer.
4
+ * Use Gem.find_latest_files to find plugins.
5
+ * Turn off synatx highlighting when the buffer is binary.
6
+ * Add define_local_command.
7
+
1
8
  ## 0.2.2
2
9
 
3
10
  * Rename read_char to read_event and add read_char as a new method.
data/appveyor.yml CHANGED
@@ -4,7 +4,8 @@ install:
4
4
  - SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
5
5
  - gem install bundler --no-document
6
6
  - bundle install
7
- - ps: Invoke-WebRequest -Uri http://curl.haxx.se/ca/cacert.pem -OutFile C:\projects\textbringer\cacert.pem
7
+ - ps: '[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12'
8
+ - ps: Invoke-WebRequest -Uri https://curl.haxx.se/ca/cacert.pem -OutFile C:\projects\textbringer\cacert.pem
8
9
  build: off
9
10
  test_script:
10
11
  - rake
data/lib/textbringer.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "textbringer/version"
2
4
  require_relative "textbringer/config"
3
5
  require_relative "textbringer/errors"
@@ -12,7 +12,6 @@ module Textbringer
12
12
  attr_accessor :mode, :keymap
13
13
  attr_reader :name, :file_name, :file_encoding, :file_format, :point, :marks
14
14
  attr_reader :current_line, :current_column, :visible_mark
15
- attr_writer :modified
16
15
 
17
16
  GAP_SIZE = 256
18
17
  UNDO_LIMIT = 1000
@@ -226,6 +225,7 @@ module Textbringer
226
225
  @match_offsets = []
227
226
  @visible_mark = nil
228
227
  @read_only = read_only
228
+ @on_modified_callbacks = []
229
229
  end
230
230
 
231
231
  def inspect
@@ -307,10 +307,21 @@ module Textbringer
307
307
  @@current == self
308
308
  end
309
309
 
310
+ def modified=(modified)
311
+ @modified = modified
312
+ if @composite_edit_level == 0 && modified
313
+ fire_on_modified_callbacks
314
+ end
315
+ end
316
+
310
317
  def modified?
311
318
  @modified
312
319
  end
313
320
 
321
+ def on_modified(&callback)
322
+ @on_modified_callbacks.push(callback)
323
+ end
324
+
314
325
  def [](name)
315
326
  if @attributes.key?(name)
316
327
  @attributes[name]
@@ -527,7 +538,7 @@ module Textbringer
527
538
  push_undo(InsertAction.new(self, pos, s))
528
539
  end
529
540
  end
530
- @modified = true
541
+ self.modified = true
531
542
  @goal_column = nil
532
543
  self
533
544
  end
@@ -569,7 +580,7 @@ module Textbringer
569
580
  end
570
581
  end
571
582
  push_undo(DeleteAction.new(self, s, s, str))
572
- @modified = true
583
+ self.modified = true
573
584
  elsif n < 0
574
585
  str = substring(pos, s)
575
586
  update_line_and_column(@point, pos)
@@ -584,7 +595,7 @@ module Textbringer
584
595
  end
585
596
  @point = @gap_start = pos
586
597
  push_undo(DeleteAction.new(self, s, pos, str))
587
- @modified = true
598
+ self.modified = true
588
599
  end
589
600
  @goal_column = nil
590
601
  end
@@ -906,7 +917,7 @@ module Textbringer
906
917
  end
907
918
  end
908
919
  push_undo(DeleteAction.new(self, old_pos, s, str))
909
- @modified = true
920
+ self.modified = true
910
921
  end
911
922
  end
912
923
 
@@ -920,7 +931,7 @@ module Textbringer
920
931
  @current_line = 1
921
932
  @current_column = 1
922
933
  @goal_column = nil
923
- @modified = true
934
+ self.modified = true
924
935
  @undo_stack.clear
925
936
  @redo_stack.clear
926
937
  end
@@ -1202,6 +1213,7 @@ module Textbringer
1202
1213
  @composite_edit_actions.clear
1203
1214
  end
1204
1215
  end
1216
+ fire_on_modified_callbacks
1205
1217
  end
1206
1218
 
1207
1219
  def apply_mode(mode_class)
@@ -1490,6 +1502,12 @@ module Textbringer
1490
1502
  raise ReadOnlyError, "Buffer is read only: #{self.inspect}"
1491
1503
  end
1492
1504
  end
1505
+
1506
+ def fire_on_modified_callbacks
1507
+ @on_modified_callbacks.each do |callback|
1508
+ callback.call(self)
1509
+ end
1510
+ end
1493
1511
  end
1494
1512
 
1495
1513
  class Mark
@@ -16,7 +16,7 @@ module Textbringer
16
16
 
17
17
  define_command(:suspend_textbringer) do
18
18
  Curses.close_screen
19
- Process.kill(:STOP, $$)
19
+ Process.kill(:STOP, 0)
20
20
  end
21
21
 
22
22
  define_command(:execute_command) do
@@ -115,6 +115,9 @@ module Textbringer
115
115
  end
116
116
 
117
117
  def read_event
118
+ if executing_keyboard_macro?
119
+ return @executing_keyboard_macro.shift
120
+ end
118
121
  event = read_event_nonblock
119
122
  if event
120
123
  return event
@@ -253,7 +256,7 @@ module Textbringer
253
256
  def read_event_with_keyboard_macro(read_event_method)
254
257
  if !executing_keyboard_macro?
255
258
  c = call_read_event_method(read_event_method)
256
- if @recording_keyboard_macro
259
+ if c && @recording_keyboard_macro
257
260
  @recording_keyboard_macro.push(c)
258
261
  end
259
262
  c
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "curses"
4
-
5
3
  module Textbringer
6
4
  class Keymap
7
5
  include Enumerable
@@ -20,13 +20,13 @@ module Textbringer
20
20
  attr_reader :syntax_table
21
21
  end
22
22
 
23
- def self.define_generic_command(name)
23
+ def self.define_generic_command(name, **options)
24
24
  command_name = (name.to_s + "_command").intern
25
- define_command(command_name) do |*args|
25
+ define_command(command_name, **options) do |*args|
26
26
  begin
27
27
  Buffer.current.mode.send(name, *args)
28
28
  rescue NoMethodError => e
29
- if e.receiver == Buffer.current.mode && e.name == name
29
+ if (e.receiver rescue nil) == Buffer.current.mode && e.name == name
30
30
  raise EditorError,
31
31
  "#{command_name} is not supported in the current mode"
32
32
  else
@@ -36,6 +36,12 @@ module Textbringer
36
36
  end
37
37
  end
38
38
 
39
+ def self.define_local_command(name, **options, &block)
40
+ define_generic_command(name, **options)
41
+ define_method(name, &block)
42
+ name
43
+ end
44
+
39
45
  def self.define_syntax(face_name, re)
40
46
  @syntax_table[face_name] = re
41
47
  end
@@ -74,12 +74,17 @@ module Textbringer
74
74
 
75
75
  def indent_region(s = @buffer.mark, e = @buffer.point)
76
76
  s, e = Buffer.region_boundaries(s, e)
77
- @buffer.save_excursion do
78
- @buffer.goto_char(s)
79
- while @buffer.point < e
80
- indent_line
81
- @buffer.forward_line
77
+ end_mark = @buffer.new_mark(e)
78
+ begin
79
+ @buffer.save_excursion do
80
+ @buffer.goto_char(s)
81
+ until @buffer.end_of_buffer? || @buffer.point_after_mark?(end_mark)
82
+ indent_line
83
+ @buffer.forward_line
84
+ end
82
85
  end
86
+ ensure
87
+ end_mark.delete
83
88
  end
84
89
  end
85
90
 
@@ -9,15 +9,8 @@ module Textbringer
9
9
  @directory = File.expand_path("~/.textbringer/plugins")
10
10
 
11
11
  def self.load_plugins
12
- files = Gem.find_files("textbringer_plugin.rb").group_by { |file|
13
- file.slice(/([^\/]+)-[\w.]+\/lib\/textbringer_plugin\.rb\z/, 1)
14
- }.map { |gem, versions|
15
- versions.sort_by { |version|
16
- v = version.slice(/[^\/]+-([\w.]+)\/lib\/textbringer_plugin\.rb\z/,
17
- 1)
18
- Gem::Version.create(v)
19
- }.last
20
- } + Dir.glob(File.join(directory, "*/**/textbringer_plugin.rb"))
12
+ files = Gem.find_latest_files("textbringer_plugin.rb", false) +
13
+ Dir.glob(File.join(directory, "*/**/textbringer_plugin.rb"))
21
14
  files.each do |file|
22
15
  load(file)
23
16
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Textbringer
2
- VERSION = "0.2.2"
4
+ VERSION = "0.2.3"
3
5
  end
@@ -2,45 +2,8 @@
2
2
 
3
3
  require "curses"
4
4
  require "unicode/display_width"
5
- require "fiddle/import"
6
5
 
7
6
  module Textbringer
8
- # These features should be provided by curses.gem.
9
- module PDCurses
10
- KEY_OFFSET = 0xec00
11
- ALT_0 = KEY_OFFSET + 0x97
12
- ALT_9 = KEY_OFFSET + 0xa0
13
- ALT_A = KEY_OFFSET + 0xa1
14
- ALT_Z = KEY_OFFSET + 0xba
15
- ALT_NUMBER_BASE = ALT_0 - ?0.ord
16
- ALT_ALPHA_BASE = ALT_A - ?a.ord
17
-
18
- KEY_MODIFIER_SHIFT = 1
19
- KEY_MODIFIER_CONTROL = 2
20
- KEY_MODIFIER_ALT = 4
21
- KEY_MODIFIER_NUMLOCK = 8
22
-
23
- @dll_loaded = false
24
-
25
- class << self
26
- attr_writer :dll_loaded
27
-
28
- def dll_loaded?
29
- @dll_loaded
30
- end
31
- end
32
-
33
- begin
34
- extend Fiddle::Importer
35
- dlload "pdcurses.dll"
36
- extern "unsigned long PDC_get_key_modifiers(void)"
37
- extern "int PDC_save_key_modifiers(unsigned char)"
38
- extern "int PDC_return_key_modifiers(unsigned char)"
39
- @dll_loaded = true
40
- rescue Fiddle::DLError
41
- end
42
- end
43
-
44
7
  class Window
45
8
  KEY_NAMES = {}
46
9
  Curses.constants.grep(/\AKEY_/).each do |name|
@@ -48,6 +11,12 @@ module Textbringer
48
11
  name.slice(/\AKEY_(.*)/, 1).downcase.intern
49
12
  end
50
13
 
14
+ HAVE_GET_KEY_MODIFIERS = defined?(Curses.get_key_modifiers)
15
+ if HAVE_GET_KEY_MODIFIERS
16
+ ALT_NUMBER_BASE = Curses::ALT_0 - ?0.ord
17
+ ALT_ALPHA_BASE = Curses::ALT_A - ?a.ord
18
+ end
19
+
51
20
  @@started = false
52
21
  @@list = []
53
22
  @@current = nil
@@ -325,12 +294,12 @@ module Textbringer
325
294
  def read_event
326
295
  key = get_char
327
296
  if key.is_a?(Integer)
328
- if PDCurses.dll_loaded?
329
- if PDCurses::ALT_0 <= key && key <= PDCurses::ALT_9
330
- @key_buffer.push((key - PDCurses::ALT_NUMBER_BASE).chr)
297
+ if HAVE_GET_KEY_MODIFIERS
298
+ if Curses::ALT_0 <= key && key <= Curses::ALT_9
299
+ @key_buffer.push((key - ALT_NUMBER_BASE).chr)
331
300
  return "\e"
332
- elsif PDCurses::ALT_A <= key && key <= PDCurses::ALT_Z
333
- @key_buffer.push((key - PDCurses::ALT_ALPHA_BASE).chr)
301
+ elsif Curses::ALT_A <= key && key <= Curses::ALT_Z
302
+ @key_buffer.push((key - ALT_ALPHA_BASE).chr)
334
303
  return "\e"
335
304
  end
336
305
  end
@@ -384,7 +353,7 @@ module Textbringer
384
353
  def highlight
385
354
  @highlight_on = {}
386
355
  @highlight_off = {}
387
- return if !@@has_colors || !CONFIG[:syntax_highlight]
356
+ return if !@@has_colors || !CONFIG[:syntax_highlight] || @buffer.binary?
388
357
  syntax_table = @buffer.mode.syntax_table
389
358
  return if syntax_table.empty?
390
359
  if @buffer.bytesize < CONFIG[:highlight_buffer_size_limit]
@@ -780,7 +749,7 @@ module Textbringer
780
749
 
781
750
  def get_char
782
751
  if @key_buffer.empty?
783
- PDCurses.PDC_save_key_modifiers(1) if PDCurses.dll_loaded?
752
+ Curses.save_key_modifiers(true) if HAVE_GET_KEY_MODIFIERS
784
753
  begin
785
754
  need_retry = false
786
755
  if @raw_key_buffer.empty?
@@ -788,13 +757,13 @@ module Textbringer
788
757
  else
789
758
  key = @raw_key_buffer.shift
790
759
  end
791
- if PDCurses.dll_loaded?
792
- mods = PDCurses.PDC_get_key_modifiers
760
+ if HAVE_GET_KEY_MODIFIERS
761
+ mods = Curses.get_key_modifiers
793
762
  if key.is_a?(String) && key.ascii_only?
794
- if (mods & PDCurses::KEY_MODIFIER_CONTROL) != 0
763
+ if (mods & Curses::PDC_KEY_MODIFIER_CONTROL) != 0
795
764
  key = key == ?? ? "\x7f" : (key.ord & 0x9f).chr
796
765
  end
797
- if (mods & PDCurses::KEY_MODIFIER_ALT) != 0
766
+ if (mods & Curses::PDC_KEY_MODIFIER_ALT) != 0
798
767
  if key == "\0"
799
768
  # Alt + `, Alt + < etc. return NUL, so ignore it.
800
769
  need_retry = true
data/textbringer.gemspec CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.required_ruby_version = '>= 2.3'
23
23
 
24
- spec.add_runtime_dependency "curses", "~> 1.2"
24
+ spec.add_runtime_dependency "curses", ">= 1.2.2"
25
25
  spec.add_runtime_dependency "unicode-display_width", "~> 1.1"
26
26
  spec.add_runtime_dependency "clipboard", "~> 1.1"
27
27
  spec.add_runtime_dependency "fiddley", ">= 0.0.5"
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: textbringer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shugo Maeda
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-04-21 00:00:00.000000000 Z
11
+ date: 2017-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.2'
19
+ version: 1.2.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.2'
26
+ version: 1.2.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: unicode-display_width
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -257,7 +257,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
257
257
  version: '0'
258
258
  requirements: []
259
259
  rubyforge_project:
260
- rubygems_version: 2.6.11
260
+ rubygems_version: 2.6.12
261
261
  signing_key:
262
262
  specification_version: 4
263
263
  summary: An Emacs-like text editor