textbringer 0.2.5 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +9 -0
- data/README.md +9 -1
- data/lib/textbringer.rb +1 -0
- data/lib/textbringer/buffer.rb +4 -3
- data/lib/textbringer/commands/buffers.rb +8 -0
- data/lib/textbringer/commands/files.rb +6 -4
- data/lib/textbringer/commands/fill.rb +120 -0
- data/lib/textbringer/config.rb +2 -1
- data/lib/textbringer/keymap.rb +2 -0
- data/lib/textbringer/plugin.rb +5 -1
- data/lib/textbringer/utils.rb +9 -1
- data/lib/textbringer/version.rb +1 -1
- data/screenshot.png +0 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a7999df616ed4ffd10a360bdf4f05981ca689e5
|
4
|
+
data.tar.gz: ec1adb45ac78222f521317d019a2c6f34d2bdbf3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a42aebf208fc3570b68f068909665e185958c77d0f038cc60bc6d4e470b373245d56290712cc8e13065fce2c16eb02094b8f36bcbd5710ef7ee7423bc9019080
|
7
|
+
data.tar.gz: 974172125b75ae24a3156303988697d4cec95c9d1c1db61a3825cf66edbf522ffbcd774f9ef0d708edcd52e7a82ed68461a8d0b560ff2bc4bbbe441e208ee576
|
data/CHANGES.md
CHANGED
data/README.md
CHANGED
@@ -9,6 +9,10 @@
|
|
9
9
|
Textbringer is a member of a demon race that takes on the form of an Emacs-like
|
10
10
|
text editor.
|
11
11
|
|
12
|
+
## Screenshot
|
13
|
+
|
14
|
+
![Screenshot](screenshot.png)
|
15
|
+
|
12
16
|
## Demo
|
13
17
|
|
14
18
|
* FizzBuzz: https://asciinema.org/a/103357
|
@@ -37,7 +41,11 @@ Install ncursesw before installing curses.gem, on which textbringer depends.
|
|
37
41
|
|
38
42
|
$ textbringer
|
39
43
|
|
40
|
-
You can quit the editor by
|
44
|
+
You can quit the editor by `Ctrl-x Ctrl-c`.
|
45
|
+
|
46
|
+
Many commands and key bindings are similar to [Emacs](https://www.gnu.org/software/emacs/).
|
47
|
+
|
48
|
+
Type `F1 b` or `Alt+x describe_bindings RET` to see key bindings.
|
41
49
|
|
42
50
|
## Configuration
|
43
51
|
|
data/lib/textbringer.rb
CHANGED
@@ -22,6 +22,7 @@ require_relative "textbringer/commands/ctags"
|
|
22
22
|
require_relative "textbringer/commands/clipboard"
|
23
23
|
require_relative "textbringer/commands/register"
|
24
24
|
require_relative "textbringer/commands/keyboard_macro"
|
25
|
+
require_relative "textbringer/commands/fill"
|
25
26
|
require_relative "textbringer/commands/help"
|
26
27
|
require_relative "textbringer/mode"
|
27
28
|
require_relative "textbringer/modes/fundamental_mode"
|
data/lib/textbringer/buffer.rb
CHANGED
@@ -931,10 +931,11 @@ module Textbringer
|
|
931
931
|
end
|
932
932
|
end
|
933
933
|
|
934
|
-
def replace(
|
934
|
+
def replace(str, start: point_min, end: point_max)
|
935
935
|
composite_edit do
|
936
|
-
delete_region(
|
937
|
-
|
936
|
+
delete_region(start, binding.local_variable_get(:end))
|
937
|
+
goto_char(start)
|
938
|
+
insert(str)
|
938
939
|
end
|
939
940
|
end
|
940
941
|
|
@@ -119,6 +119,14 @@ module Textbringer
|
|
119
119
|
Buffer.current.newline
|
120
120
|
end
|
121
121
|
|
122
|
+
define_command(:open_line,
|
123
|
+
doc: "Insert a newline leaving point before it.") do
|
124
|
+
buffer = Buffer.current
|
125
|
+
buffer.save_excursion do
|
126
|
+
buffer.newline
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
122
130
|
define_command(:delete_region,
|
123
131
|
doc: "Delete the region without copying.") do
|
124
132
|
Buffer.current.delete_region
|
@@ -63,7 +63,7 @@ module Textbringer
|
|
63
63
|
using the specified encoding.
|
64
64
|
If the specified encoding is not valid, fall back to ASCII-8BIT.
|
65
65
|
EOD
|
66
|
-
|encoding =
|
66
|
+
|encoding = read_encoding("File encoding: ")|
|
67
67
|
unless yes_or_no?("Revert buffer from file?")
|
68
68
|
message("Cancelled")
|
69
69
|
next
|
@@ -104,8 +104,8 @@ module Textbringer
|
|
104
104
|
|
105
105
|
define_command(:set_buffer_file_encoding,
|
106
106
|
doc: "Set the file encoding of the current buffer.") do
|
107
|
-
|enc =
|
108
|
-
|
107
|
+
|enc = read_encoding("File encoding: ",
|
108
|
+
default: Buffer.current.file_encoding.name)|
|
109
109
|
Buffer.current.file_encoding = enc
|
110
110
|
end
|
111
111
|
|
@@ -121,7 +121,9 @@ module Textbringer
|
|
121
121
|
end
|
122
122
|
|
123
123
|
define_command(:chdir, doc: "Change the current working directory.") do
|
124
|
-
|dir_name = read_file_name("Change directory: "
|
124
|
+
|dir_name = read_file_name("Change directory: ",
|
125
|
+
default: Buffer.current.file_name &&
|
126
|
+
File.dirname(Buffer.current.file_name))|
|
125
127
|
Dir.chdir(dir_name)
|
126
128
|
end
|
127
129
|
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Textbringer
|
4
|
+
module FillExtension
|
5
|
+
refine Buffer do
|
6
|
+
def fill_region(s = Buffer.current.point, e = Buffer.current.mark)
|
7
|
+
s, e = Buffer.region_boundaries(s, e)
|
8
|
+
save_excursion do
|
9
|
+
str = substring(s, e)
|
10
|
+
goto_char(s)
|
11
|
+
pos = point
|
12
|
+
beginning_of_line
|
13
|
+
column = Buffer.display_width(substring(point, pos))
|
14
|
+
replace(fill_string(str, column), start: s, end: e)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def fill_paragraph
|
19
|
+
beginning_of_line
|
20
|
+
while !beginning_of_buffer? &&
|
21
|
+
!looking_at?(/^[ \t]*$/)
|
22
|
+
backward_line
|
23
|
+
end
|
24
|
+
while looking_at?(/^[ \t]*$/)
|
25
|
+
forward_line
|
26
|
+
end
|
27
|
+
s = point
|
28
|
+
begin
|
29
|
+
forward_line
|
30
|
+
end while !end_of_buffer? && !looking_at?(/^[ \t]*$/)
|
31
|
+
if beginning_of_line?
|
32
|
+
backward_char
|
33
|
+
end
|
34
|
+
fill_region(s, point)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def fill_string(str, column)
|
40
|
+
input = StringIO.new(str)
|
41
|
+
output = String.new
|
42
|
+
fill_column = CONFIG[:fill_column]
|
43
|
+
prev_c = nil
|
44
|
+
while c = input.getc
|
45
|
+
if c == "\n"
|
46
|
+
if column < fill_column && !input.eof?
|
47
|
+
if /(?=[\u{0000}-\u{00FF}])[[:graph:]]/ =~ prev_c
|
48
|
+
column = insert_space_between_words(input, output, column)
|
49
|
+
end
|
50
|
+
next
|
51
|
+
end
|
52
|
+
column = insert_newline(output)
|
53
|
+
else
|
54
|
+
w = Buffer.display_width(c)
|
55
|
+
if column + w > fill_column || column >= fill_column
|
56
|
+
if /\w/ =~ prev_c && /\w/ =~ c
|
57
|
+
column = insert_newline_before_word(output, column)
|
58
|
+
else
|
59
|
+
column = insert_newline(output)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
column = insert_char(output, column, c, w)
|
63
|
+
end
|
64
|
+
prev_c = c
|
65
|
+
end
|
66
|
+
output
|
67
|
+
end
|
68
|
+
|
69
|
+
def insert_space_between_words(input, output, column)
|
70
|
+
c = input.getc
|
71
|
+
input.ungetc(c)
|
72
|
+
if /(?=[\u{0000}-\u{00FF}])[[:graph:]]/ =~ c
|
73
|
+
output << " "
|
74
|
+
column + 1
|
75
|
+
else
|
76
|
+
column
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def insert_newline_before_word(output, column)
|
81
|
+
if output.sub!(/(?:([^\w \t\n])|(\w)[ \t]+)(\w*)\z/, "\\1\\2\n")
|
82
|
+
output << $3
|
83
|
+
Buffer.display_width($3)
|
84
|
+
else
|
85
|
+
column
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def insert_newline(output)
|
90
|
+
output.sub!(/[ \t]\z/, "")
|
91
|
+
output << "\n"
|
92
|
+
0
|
93
|
+
end
|
94
|
+
|
95
|
+
def insert_char(output, column, c, w)
|
96
|
+
if column == 0 && /[ \t]/ =~ c
|
97
|
+
column
|
98
|
+
else
|
99
|
+
output << c
|
100
|
+
column + w
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
module Commands
|
107
|
+
using FillExtension
|
108
|
+
|
109
|
+
define_command(:fill_region,
|
110
|
+
doc: "Fill paragraph.") do
|
111
|
+
|s = Buffer.current.point, e = Buffer.current.mark|
|
112
|
+
Buffer.current.fill_region(s, e)
|
113
|
+
end
|
114
|
+
|
115
|
+
define_command(:fill_paragraph,
|
116
|
+
doc: "Fill paragraph.") do
|
117
|
+
Buffer.current.fill_paragraph
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
data/lib/textbringer/config.rb
CHANGED
data/lib/textbringer/keymap.rb
CHANGED
@@ -135,6 +135,7 @@ module Textbringer
|
|
135
135
|
GLOBAL_MAP.define_key("\C-t", :transpose_chars)
|
136
136
|
GLOBAL_MAP.define_key("\C-j", :newline)
|
137
137
|
GLOBAL_MAP.define_key("\C-m", :newline)
|
138
|
+
GLOBAL_MAP.define_key("\C-o", :open_line)
|
138
139
|
GLOBAL_MAP.define_key("\em", :back_to_indentation)
|
139
140
|
GLOBAL_MAP.define_key("\e^", :delete_indentation)
|
140
141
|
GLOBAL_MAP.define_key("\C-l", :recenter)
|
@@ -180,6 +181,7 @@ module Textbringer
|
|
180
181
|
GLOBAL_MAP.define_key("\C-x)", :end_keyboard_macro)
|
181
182
|
GLOBAL_MAP.define_key("\C-xe", :end_and_call_keyboard_macro)
|
182
183
|
GLOBAL_MAP.define_key(:f4, :end_or_call_keyboard_macro)
|
184
|
+
GLOBAL_MAP.define_key("\eq", :fill_paragraph)
|
183
185
|
GLOBAL_MAP.define_key([:f1, "b"], :describe_bindings)
|
184
186
|
GLOBAL_MAP.define_key([:f1, "f"], :describe_command)
|
185
187
|
GLOBAL_MAP.define_key([:f1, "k"], :describe_key)
|
data/lib/textbringer/plugin.rb
CHANGED
@@ -12,7 +12,11 @@ module Textbringer
|
|
12
12
|
files = Gem.find_latest_files("textbringer_plugin.rb", false) +
|
13
13
|
Dir.glob(File.join(directory, "*/**/textbringer_plugin.rb"))
|
14
14
|
files.each do |file|
|
15
|
-
|
15
|
+
begin
|
16
|
+
load(file)
|
17
|
+
rescue Exception => e
|
18
|
+
show_exception(e)
|
19
|
+
end
|
16
20
|
end
|
17
21
|
end
|
18
22
|
end
|
data/lib/textbringer/utils.rb
CHANGED
@@ -194,7 +194,8 @@ module Textbringer
|
|
194
194
|
end
|
195
195
|
}
|
196
196
|
}
|
197
|
-
file = read_from_minibuffer(prompt, completion_proc: f,
|
197
|
+
file = read_from_minibuffer(prompt, completion_proc: f,
|
198
|
+
initial_value: default)
|
198
199
|
File.expand_path(file)
|
199
200
|
end
|
200
201
|
|
@@ -214,6 +215,13 @@ module Textbringer
|
|
214
215
|
read_from_minibuffer(prompt, completion_proc: f)
|
215
216
|
end
|
216
217
|
|
218
|
+
def read_encoding(prompt, **opts)
|
219
|
+
f = ->(s) {
|
220
|
+
complete_for_minibuffer(s.upcase, Encoding.list.map(&:name))
|
221
|
+
}
|
222
|
+
read_from_minibuffer(prompt, completion_proc: f, **opts)
|
223
|
+
end
|
224
|
+
|
217
225
|
def yes_or_no?(prompt)
|
218
226
|
loop {
|
219
227
|
s = read_from_minibuffer(prompt + " (yes or no) ")
|
data/lib/textbringer/version.rb
CHANGED
data/screenshot.png
ADDED
Binary file
|
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.
|
4
|
+
version: 0.2.6
|
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-
|
11
|
+
date: 2017-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: curses
|
@@ -209,6 +209,7 @@ files:
|
|
209
209
|
- lib/textbringer/commands/ctags.rb
|
210
210
|
- lib/textbringer/commands/dabbrev.rb
|
211
211
|
- lib/textbringer/commands/files.rb
|
212
|
+
- lib/textbringer/commands/fill.rb
|
212
213
|
- lib/textbringer/commands/help.rb
|
213
214
|
- lib/textbringer/commands/isearch.rb
|
214
215
|
- lib/textbringer/commands/keyboard_macro.rb
|
@@ -236,6 +237,7 @@ files:
|
|
236
237
|
- lib/textbringer/utils.rb
|
237
238
|
- lib/textbringer/version.rb
|
238
239
|
- lib/textbringer/window.rb
|
240
|
+
- screenshot.png
|
239
241
|
- textbringer.gemspec
|
240
242
|
homepage: https://github.com/shugo/textbringer
|
241
243
|
licenses:
|