textbringer 1.2.0 → 1.3.0

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: f26fbba03cd3a598394d22f7edee8521b01c0ff0492c41fff8b2ede22dfbc321
4
- data.tar.gz: 2eb497b690e8a3c36a724a68675daeae0ca29936bd42a5ac367abf5b8408e751
3
+ metadata.gz: 5e9f67d3a60acc75b16f9f5ede7d7670068590b2331aa905b73d9fe09676e305
4
+ data.tar.gz: 388e2c7cdecee2292ea17167810944f1ccfc2f7ed0dfb48db9732e31c71b5818
5
5
  SHA512:
6
- metadata.gz: 4d39ca69665b6383083bab06f724d961c9d88c41d50ac23c1abc44c15ec9d4440b6d9fff304c49d96b150d9c2145382d466f5449707a5d6c350247bc2726d08f
7
- data.tar.gz: e6baed2d72e9af279bded9ece8671dabb8cdddce1230b4fe308eb7c20fd875d6c0ebd5e98eb8f0ad75d450642c221bcd1c1481a194267b739ee47c4ebabd8fd1
6
+ metadata.gz: f8973ef2ee4f24b829ebb505229ca45ee48a7f2d5fa21f20afb5bfce4c0b9df5333cbb5614ba1a48dcc1633e286edc2199d68b7fab347d090be94e43d376d205
7
+ data.tar.gz: e5847cd0e51bd26a8b4d38a5682ff9347d5886022e62b11a6e1b294dc78df455718e9be5319098050709545a98b75b41775db618562dd2bdee72a3e65baf91bd
data/CHANGES.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 1.3.0
2
+
3
+ * Kernel#print etc. inserts the given string into the current buffer now.
4
+ * Add find_source.
5
+ * Add describe_class and describe_method.
6
+ * Support completion for eval_expression
7
+ * Fix digraph indentation in C mode.
8
+
1
9
  ## 1.2.0
2
10
 
3
11
  * Drop Ruby 2.6 support.
data/README.ja.md ADDED
@@ -0,0 +1,103 @@
1
+ # ![Textbringer](logo/logo.png)
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/textbringer.svg)](https://badge.fury.io/rb/textbringer)
4
+ [![ubuntu](https://github.com/shugo/textbringer/workflows/ubuntu/badge.svg)](https://github.com/shugo/textbringer/actions?query=workflow%3Aubuntu)
5
+ [![windows](https://github.com/shugo/textbringer/workflows/windows/badge.svg)](https://github.com/shugo/textbringer/actions?query=workflow%3Awindows)
6
+ [![macos](https://github.com/shugo/textbringer/workflows/macos/badge.svg)](https://github.com/shugo/textbringer/actions?query=workflow%3Amacos)
7
+
8
+ TextbringerはRubyで実装されたEmacsライクなテキストエディタです。
9
+ Lispの代りにRubyで拡張することができます。
10
+
11
+ ## スクリーンショット
12
+
13
+ ![Screenshot](screenshot.png)
14
+
15
+ ## デモ
16
+
17
+ * FizzBuzz: https://asciinema.org/a/103357
18
+ * Rubyプログラミング: https://asciinema.org/a/100156
19
+ * 日本語テキストの編集: https://asciinema.org/a/100166
20
+
21
+ ## インストール
22
+
23
+ $ gem install textbringer
24
+
25
+ マルチバイト文字を使用するためにはncurseswが必要です。
26
+ Textbringerが依存するcurses.gemをインストールする前に、ncurseswをインストールしておいてください。
27
+
28
+ $ sudo apt-get install libncursesw5-dev
29
+ $ gem install curses
30
+
31
+ ## 使い方
32
+
33
+ $ txtb
34
+
35
+ `Ctrl-x Ctrl-c` で終了できます。 
36
+
37
+ 多くのコマンドとキーバインディングは[Emacs](https://www.gnu.org/software/emacs/)に似ています。
38
+
39
+ キーバインディングを確認するには、 `F1 b` または `Alt+x describe_bindings RET` とタイプしてください。
40
+
41
+ ## 設定
42
+
43
+ ### メタキー
44
+
45
+ 端末エミュレータでメタキーを使用するためには、以下のような設定が必要です。
46
+
47
+ #### xterm
48
+
49
+ ~/.Xresourcesに以下の行を追加してください。
50
+
51
+ XTerm*metaSendsEscape: true
52
+
53
+ #### mlterm
54
+
55
+ ~/.mlterm/mainに以下の行を追加してください。
56
+
57
+ mod_meta_key = alt
58
+ mod_meta_mode = esc
59
+
60
+ ### 東アジアの曖昧な文字幅
61
+
62
+ [曖昧な文字](http://unicode.org/reports/tr11/#Ambiguous)を全角扱いするには、以下の設定を~/.textbringer.rbに記述してください。
63
+
64
+ CONFIG[:east_asian_ambiguous_width] = 2
65
+
66
+ ncurseswはwcwidth(3)を使用するため、LD_PRELOADハックやlocale charmapの修正が必要かもしれません。
67
+
68
+ * https://github.com/fumiyas/wcwidth-cjk
69
+ * https://github.com/hamano/locale-eaw
70
+
71
+ xterm、 mlterm、screenにはそれぞれ独自の設定項目があります。
72
+
73
+ #### xterm
74
+
75
+ ~/.Xresourcesに以下の設定を追加してください。
76
+
77
+ xterm*utf8: 1
78
+ xterm*locale: true
79
+ xterm*cjkWidth: true
80
+
81
+ #### mlterm
82
+
83
+ ~/.mlterm/mainに以下の設定を追加してください。
84
+
85
+ col_size_of_width_a = 2
86
+
87
+ #### screen
88
+
89
+ ~/.screenrcに以下の設定を追加してください。
90
+
91
+ cjkwidth on
92
+
93
+ ## プラグイン
94
+
95
+ * [Mournmamil](https://github.com/shugo/mournmail): 電子メールクライアント
96
+ * [MedicineShield](https://github.com/shugo/medicine_shield): Mastodonクライアント
97
+ * [textbringer-presentation](https://github.com/shugo/textbringer-presentation): プレゼンテーションツール
98
+ * [textbringer-ghost_text](https://github.com/shugo/textbringer-ghost_text): [GhostText](https://github.com/fregante/GhostText)プラグイン
99
+
100
+ ## ライセンス
101
+
102
+ [MIT License](http://opensource.org/licenses/MIT)の下でオープンソースとして利用可能です。
103
+
data/README.md CHANGED
@@ -5,8 +5,10 @@
5
5
  [![windows](https://github.com/shugo/textbringer/workflows/windows/badge.svg)](https://github.com/shugo/textbringer/actions?query=workflow%3Awindows)
6
6
  [![macos](https://github.com/shugo/textbringer/workflows/macos/badge.svg)](https://github.com/shugo/textbringer/actions?query=workflow%3Amacos)
7
7
 
8
- Textbringer is a member of a demon race that takes on the form of an Emacs-like
9
- text editor.
8
+ * [日本語版](README.ja.md)
9
+
10
+ Textbringer is an Emacs-like text editor written in Ruby.
11
+ It is extensible by Ruby instead of Lisp.
10
12
 
11
13
  ## Screenshot
12
14
 
@@ -93,6 +95,13 @@ Add the following line to ~/.screenrc.
93
95
 
94
96
  cjkwidth on
95
97
 
98
+ ## Plugins
99
+
100
+ * [Mournmamil](https://github.com/shugo/mournmail): a mail user agent
101
+ * [MedicineShield](https://github.com/shugo/medicine_shield): a Mastodon client
102
+ * [textbringer-presentation](https://github.com/shugo/textbringer-presentation): a presentation tool
103
+ * [textbringer-ghost_text](https://github.com/shugo/textbringer-ghost_text): a [GhostText](https://github.com/fregante/GhostText) plugin
104
+
96
105
  ## Development
97
106
 
98
107
  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.
data/exe/txtb CHANGED
@@ -26,6 +26,7 @@ end
26
26
  Controller.current = Controller.new
27
27
  begin
28
28
  Window.start do
29
+ $stdout = DefaultOutput.new
29
30
  begin
30
31
  load_user_config("~/.textbringer/init.rb")
31
32
  Plugin.load_plugins
@@ -143,5 +143,20 @@ module Textbringer
143
143
  File.dirname(Buffer.current.file_name))|
144
144
  FileUtils.mkdir_p(dir_name)
145
145
  end
146
+
147
+ define_command(:find_source, doc: "Open the source file.") do
148
+ |obj = read_object("Object or Class: ")|
149
+ klass = obj.is_a?(Module) ? obj : obj.class
150
+ method_name = klass.instance_methods(false).first
151
+ if method_name.nil?
152
+ raise EditorError, "Source not found"
153
+ end
154
+ method = klass.instance_method(method_name)
155
+ file_name = method.source_location.first
156
+ if !File.exist?(file_name)
157
+ raise EditorError, "Source not found"
158
+ end
159
+ find_file(method.source_location.first)
160
+ end
146
161
  end
147
162
  end
@@ -1,3 +1,6 @@
1
+ $".push("readline.rb")
2
+ require "rdoc/ri/driver"
3
+
1
4
  module Textbringer
2
5
  module Commands
3
6
  HELP_RING = Ring.new
@@ -102,6 +105,44 @@ module Textbringer
102
105
  push_help_command([:describe_key, key])
103
106
  end
104
107
 
108
+ define_command(:describe_class,
109
+ doc: "Display the documentation of the class.") do
110
+ |name = read_expression("Describe class: ")|
111
+ show_help do |help|
112
+ old_stdout = $stdout
113
+ $stdout = StringIO.new
114
+ begin
115
+ rdoc = RDoc::RI::Driver.new(use_stdout: true,
116
+ formatter: RDoc::Markup::ToRdoc,
117
+ interactive: false)
118
+ rdoc.display_class(name)
119
+ help.insert($stdout.string)
120
+ ensure
121
+ $stdout = old_stdout
122
+ end
123
+ end
124
+ push_help_command([:describe_class, name])
125
+ end
126
+
127
+ define_command(:describe_method,
128
+ doc: "Display the documentation of the method.") do
129
+ |name = read_expression("Describe method: ")|
130
+ show_help do |help|
131
+ old_stdout = $stdout
132
+ $stdout = StringIO.new
133
+ begin
134
+ rdoc = RDoc::RI::Driver.new(use_stdout: true,
135
+ formatter: RDoc::Markup::ToRdoc,
136
+ interactive: false)
137
+ rdoc.display_method(name)
138
+ help.insert($stdout.string)
139
+ ensure
140
+ $stdout = old_stdout
141
+ end
142
+ end
143
+ push_help_command([:describe_method, name])
144
+ end
145
+
105
146
  define_command(:help_go_back, doc: "Go back to the previous help.") do
106
147
  if !HELP_RING.empty?
107
148
  HELP_RING.rotate(1)
@@ -32,7 +32,7 @@ module Textbringer
32
32
  end
33
33
 
34
34
  define_command(:eval_expression) do
35
- |s = read_from_minibuffer("Eval: ")|
35
+ |s = read_expression("Eval: ")|
36
36
  result = eval(s, TOPLEVEL_BINDING, "(eval_expression)", 1)
37
37
  message(result.inspect)
38
38
  result
@@ -0,0 +1,18 @@
1
+ require "stringio"
2
+
3
+ module Textbringer
4
+ class DefaultOutput
5
+ def write(*args)
6
+ Buffer.current.insert(args.join)
7
+ end
8
+
9
+ def flush
10
+ end
11
+
12
+ def method_missing(mid, ...)
13
+ buffer = StringIO.new
14
+ buffer.send(mid, ...)
15
+ write(buffer.string)
16
+ end
17
+ end
18
+ end
@@ -210,6 +210,8 @@ module Textbringer
210
210
  GLOBAL_MAP.define_key([:f1, "b"], :describe_bindings)
211
211
  GLOBAL_MAP.define_key([:f1, "f"], :describe_command)
212
212
  GLOBAL_MAP.define_key([:f1, "k"], :describe_key)
213
+ GLOBAL_MAP.define_key([:f1, "c"], :describe_class)
214
+ GLOBAL_MAP.define_key([:f1, "m"], :describe_method)
213
215
  GLOBAL_MAP.define_key("\C-x#", :server_edit_done)
214
216
  GLOBAL_MAP.define_key("\C-\\", :toggle_input_method)
215
217
  GLOBAL_MAP.handle_undefined_key do |key|
@@ -1,6 +1,6 @@
1
1
  module Textbringer
2
2
  CONFIG[:c_indent_level] = 4
3
- CONFIG[:c_indent_tabs_mode] = true
3
+ CONFIG[:c_indent_tabs_mode] = false
4
4
  CONFIG[:c_continued_statement_offset] = 4
5
5
  CONFIG[:c_case_label_offset] = -4
6
6
  CONFIG[:c_label_offset] = -2
@@ -187,7 +187,7 @@ module Textbringer
187
187
  if text.empty?
188
188
  raise EditorError, "Empty token: (#{line},#{column}) #{$~.inspect}"
189
189
  end
190
- tokens.push([[line, column], token_name, text])
190
+ tokens.push([[line, column], token_name, CANONICAL_PUNCTUATORS[text]])
191
191
  lf_count = text.count("\n")
192
192
  if lf_count > 0
193
193
  line += lf_count
@@ -1,4 +1,6 @@
1
1
  require "rbconfig"
2
+ require "irb"
3
+ require "irb/completion"
2
4
 
3
5
  module Textbringer
4
6
  module Utils
@@ -323,6 +325,18 @@ module Textbringer
323
325
  end
324
326
  end
325
327
 
328
+ def read_expression(prompt = "Expression: ")
329
+ f = ->(s) {
330
+ IRB::InputCompletor.retrieve_completion_data(s, bind: TOPLEVEL_BINDING).compact
331
+ }
332
+ read_from_minibuffer(prompt, completion_proc: f)
333
+ end
334
+
335
+ def read_object(prompt = "Object: ")
336
+ s = read_expression(prompt)
337
+ eval(s)
338
+ end
339
+
326
340
  HOOKS = Hash.new { |h, k| h[k] = [] }
327
341
 
328
342
  def add_hook(name, func = nil, &block)
@@ -1,3 +1,3 @@
1
1
  module Textbringer
2
- VERSION = "1.2.0"
2
+ VERSION = "1.3.0"
3
3
  end
data/lib/textbringer.rb CHANGED
@@ -38,3 +38,4 @@ require_relative "textbringer/input_methods/t_code_input_method"
38
38
  require_relative "textbringer/input_methods/hiragana_input_method"
39
39
  require_relative "textbringer/plugin"
40
40
  require_relative "textbringer/controller"
41
+ require_relative "textbringer/default_output"
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: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shugo Maeda
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-24 00:00:00.000000000 Z
11
+ date: 2022-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -184,6 +184,7 @@ files:
184
184
  - CHANGES.md
185
185
  - Gemfile
186
186
  - LICENSE.txt
187
+ - README.ja.md
187
188
  - README.md
188
189
  - Rakefile
189
190
  - bin/console
@@ -212,6 +213,7 @@ files:
212
213
  - lib/textbringer/commands/windows.rb
213
214
  - lib/textbringer/config.rb
214
215
  - lib/textbringer/controller.rb
216
+ - lib/textbringer/default_output.rb
215
217
  - lib/textbringer/errors.rb
216
218
  - lib/textbringer/face.rb
217
219
  - lib/textbringer/faces/basic.rb