textbringer 0.2.0 → 0.2.1

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: bb6561f5d595d683562f67d0553ef75b556b99b9
4
- data.tar.gz: 9f7caf1348f813c52dd69654625e15dcd267e55e
3
+ metadata.gz: 906c3f715935cd762c39a92b8d92a9a7021179b4
4
+ data.tar.gz: 5ba42d51b5af2086d2e9a839e07d4960f2f2f270
5
5
  SHA512:
6
- metadata.gz: 21644b91f2a282c768345186da700628d221f4b177f5b8184d203029d8c0daa0e6b25ff82b93b1432f424e55fe81c144495c980dd56191113f24106c8ba92051
7
- data.tar.gz: fb3bf64d60ba016956c87e3dc040aa3de4bcb12f78aa30362e15a015aa355c988c1cf67a635cea327775651ed0c81a251e922754c1f4cd9d07add6f3f5228528
6
+ metadata.gz: 2fd110a1970b6d0237c36365f8d1ff7eac130e881d5adcb7f0c0a4132bc5cdece78208397c87de0808c24c5538fea5ae492431b75b3220a132eb60b47736c42b
7
+ data.tar.gz: e80b7040d0bcd2c7af8f166545f31f9c5573488fd8e5ad2c0d3d1ab838d2afcc9ed7bb7af44567e1806439e23ec9664c0280cd6b87f449f5830641386a4300a4
data/CHANGES.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.2.1
2
+
3
+ * Add revert_buffer and revert_buffer_with_encoding.
4
+ * Fixes for an ncurses issue on macOS that unget_wch() doesn't work with
5
+ multibyte characters.
6
+
1
7
  ## 0.2.0
2
8
 
3
9
  * Add bury_buffer and unbury_buffer.
@@ -195,29 +195,11 @@ module Textbringer
195
195
  file_encoding: CONFIG[:default_file_encoding],
196
196
  file_mtime: nil, new_file: true, undo_limit: UNDO_LIMIT,
197
197
  read_only: false)
198
- case s.encoding
199
- when Encoding::UTF_8, Encoding::ASCII_8BIT
200
- @contents = s.frozen? ? s.dup : s
201
- else
202
- @contents = s.encode(Encoding::UTF_8)
203
- end
204
- @contents.force_encoding(Encoding::ASCII_8BIT)
198
+ set_contents(s, file_encoding)
205
199
  @name = name
206
200
  @file_name = file_name
207
201
  self.file_encoding = file_encoding
208
202
  @file_mtime = file_mtime
209
- case @contents
210
- when /(?<!\r)\n/
211
- @file_format = :unix
212
- when /\r(?!\n)/
213
- @file_format = :mac
214
- @contents.gsub!(/\r/, "\n")
215
- when /\r\n/
216
- @file_format = :dos
217
- @contents.gsub!(/\r/, "")
218
- else
219
- @file_format = CONFIG[:default_file_format]
220
- end
221
203
  @new_file = new_file
222
204
  @undo_limit = undo_limit
223
205
  @point = 0
@@ -346,21 +328,33 @@ module Textbringer
346
328
  end
347
329
 
348
330
  def self.open(file_name, name: File.basename(file_name))
349
- s, mtime = File.open(file_name,
331
+ buffer = Buffer.new(name: name,
332
+ file_name: file_name, new_file: false)
333
+ buffer.revert
334
+ buffer.read_only = !File.writable?(file_name)
335
+ buffer
336
+ end
337
+
338
+ def revert(enc = nil)
339
+ if @file_name.nil?
340
+ raise EditorError, "Buffer has no file name"
341
+ end
342
+ clear
343
+ s, mtime = File.open(@file_name,
350
344
  external_encoding: Encoding::ASCII_8BIT,
351
345
  binmode: true) { |f|
352
346
  f.flock(File::LOCK_SH)
353
347
  [f.read, f.mtime]
354
348
  }
355
- enc = @@detect_encoding_proc.call(s) || Encoding::ASCII_8BIT
349
+ enc ||= @@detect_encoding_proc.call(s) || Encoding::ASCII_8BIT
356
350
  s.force_encoding(enc)
357
351
  unless s.valid_encoding?
358
352
  enc = Encoding::ASCII_8BIT
359
353
  s.force_encoding(enc)
360
354
  end
361
- Buffer.new(s, name: name,
362
- file_name: file_name, file_encoding: enc, file_mtime: mtime,
363
- new_file: false, read_only: !File.writable?(file_name))
355
+ set_contents(s, enc)
356
+ @file_mtime = mtime
357
+ @modified = false
364
358
  end
365
359
 
366
360
  def save(file_name = @file_name)
@@ -1300,6 +1294,29 @@ module Textbringer
1300
1294
 
1301
1295
  private
1302
1296
 
1297
+ def set_contents(s, enc)
1298
+ case s.encoding
1299
+ when Encoding::UTF_8, Encoding::ASCII_8BIT
1300
+ @contents = s.frozen? ? s.dup : s
1301
+ else
1302
+ @contents = s.encode(Encoding::UTF_8)
1303
+ end
1304
+ @contents.force_encoding(Encoding::ASCII_8BIT)
1305
+ self.file_encoding = enc
1306
+ case @contents
1307
+ when /(?<!\r)\n/
1308
+ @file_format = :unix
1309
+ when /\r(?!\n)/
1310
+ @file_format = :mac
1311
+ @contents.gsub!(/\r/, "\n")
1312
+ when /\r\n/
1313
+ @file_format = :dos
1314
+ @contents.gsub!(/\r/, "")
1315
+ else
1316
+ @file_format = CONFIG[:default_file_format]
1317
+ end
1318
+ end
1319
+
1303
1320
  def adjust_gap(min_size = 0, pos = @point)
1304
1321
  if @gap_start < pos
1305
1322
  len = user_to_gap(pos) - @gap_end
@@ -48,6 +48,29 @@ module Textbringer
48
48
  end
49
49
  end
50
50
 
51
+ define_command(:revert_buffer, doc: <<~EOD) do
52
+ Revert the contents of the current buffer from the file on disk.
53
+ EOD
54
+ unless yes_or_no?("Revert buffer from file?")
55
+ message("Cancelled")
56
+ next
57
+ end
58
+ Buffer.current.revert
59
+ end
60
+
61
+ define_command(:revert_buffer_with_encoding, doc: <<~EOD) do
62
+ Revert the contents of the current buffer from the file on disk
63
+ using the specified encoding.
64
+ If the specified encoding is not valid, fall back to ASCII-8BIT.
65
+ EOD
66
+ |encoding = read_from_minibuffer("File encoding: ")|
67
+ unless yes_or_no?("Revert buffer from file?")
68
+ message("Cancelled")
69
+ next
70
+ end
71
+ Buffer.current.revert(encoding)
72
+ end
73
+
51
74
  define_command(:save_buffer, doc: "Save the current buffer to a file.") do
52
75
  if Buffer.current.file_name.nil?
53
76
  Buffer.current.file_name = read_file_name("File to save in: ")
@@ -158,6 +158,7 @@ module Textbringer
158
158
  GLOBAL_MAP.define_key("\C-xk", :kill_buffer)
159
159
  GLOBAL_MAP.define_key("\C-x\C-mf", :set_buffer_file_encoding)
160
160
  GLOBAL_MAP.define_key("\C-x\C-mn", :set_buffer_file_format)
161
+ GLOBAL_MAP.define_key("\C-x\C-mr", :revert_buffer_with_encoding)
161
162
  GLOBAL_MAP.define_key("\e.", :find_tag)
162
163
  GLOBAL_MAP.define_key("\ex", :execute_command)
163
164
  GLOBAL_MAP.define_key("\e:", :eval_expression)
@@ -1,3 +1,3 @@
1
1
  module Textbringer
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -261,6 +261,7 @@ module Textbringer
261
261
  @bottom_of_window = nil
262
262
  @point_mark = nil
263
263
  @deleted = false
264
+ @raw_key_buffer = []
264
265
  @key_buffer = []
265
266
  end
266
267
 
@@ -349,14 +350,14 @@ module Textbringer
349
350
  end
350
351
 
351
352
  def wait_input(msecs)
352
- unless @key_buffer.empty?
353
- return @key_buffer.first
353
+ if !@raw_key_buffer.empty? || !@key_buffer.empty?
354
+ return @raw_key_buffer.first || @key_buffer.first
354
355
  end
355
356
  @window.timeout = msecs
356
357
  begin
357
358
  c = @window.get_char
358
359
  if c
359
- Curses.unget_char(c)
360
+ @raw_key_buffer.push(c)
360
361
  end
361
362
  c
362
363
  ensure
@@ -365,14 +366,14 @@ module Textbringer
365
366
  end
366
367
 
367
368
  def has_input?
368
- unless @key_buffer.empty?
369
+ if !@raw_key_buffer.empty? || !@key_buffer.empty?
369
370
  return true
370
371
  end
371
372
  @window.nodelay = true
372
373
  begin
373
374
  c = @window.get_char
374
375
  if c
375
- Curses.unget_char(c)
376
+ @raw_key_buffer.push(c)
376
377
  end
377
378
  !c.nil?
378
379
  ensure
@@ -782,7 +783,11 @@ module Textbringer
782
783
  PDCurses.PDC_save_key_modifiers(1) if PDCurses.dll_loaded?
783
784
  begin
784
785
  need_retry = false
785
- key = @window.get_char
786
+ if @raw_key_buffer.empty?
787
+ key = @window.get_char
788
+ else
789
+ key = @raw_key_buffer.shift
790
+ end
786
791
  if PDCurses.dll_loaded?
787
792
  mods = PDCurses.PDC_get_key_modifiers
788
793
  if key.is_a?(String) && key.ascii_only?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: textbringer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
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-03-17 00:00:00.000000000 Z
11
+ date: 2017-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -286,7 +286,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
286
286
  version: '0'
287
287
  requirements: []
288
288
  rubyforge_project:
289
- rubygems_version: 2.6.10
289
+ rubygems_version: 2.6.11
290
290
  signing_key:
291
291
  specification_version: 4
292
292
  summary: An Emacs-like text editor