mhc 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/bin/mhc +66 -3
- data/emacs/Cask +1 -1
- data/emacs/mhc-date.el +1 -1
- data/emacs/mhc-day.el +1 -1
- data/emacs/mhc-db.el +57 -38
- data/emacs/mhc-draft.el +36 -22
- data/emacs/mhc-face.el +1 -1
- data/emacs/mhc-header.el +20 -1
- data/emacs/mhc-minibuf.el +12 -7
- data/emacs/mhc-parse.el +1 -1
- data/emacs/mhc-process.el +26 -9
- data/emacs/mhc-ps.el +1 -1
- data/emacs/mhc-schedule.el +5 -2
- data/emacs/mhc-summary.el +31 -12
- data/emacs/mhc-vars.el +15 -2
- data/emacs/mhc.el +50 -24
- data/lib/mhc.rb +3 -1
- data/lib/mhc/builder.rb +5 -1
- data/lib/mhc/calendar.rb +5 -1
- data/lib/mhc/command/cache.rb +5 -4
- data/lib/mhc/converter.rb +3 -2
- data/lib/mhc/datastore.rb +52 -13
- data/lib/mhc/date_enumerator.rb +2 -2
- data/lib/mhc/event.rb +42 -21
- data/lib/mhc/formatter.rb +17 -312
- data/lib/mhc/formatter/base.rb +125 -0
- data/lib/mhc/formatter/emacs.rb +47 -0
- data/lib/mhc/formatter/howm.rb +35 -0
- data/lib/mhc/formatter/icalendar.rb +17 -0
- data/lib/mhc/formatter/json.rb +27 -0
- data/lib/mhc/formatter/mail.rb +20 -0
- data/lib/mhc/formatter/org_table.rb +24 -0
- data/lib/mhc/formatter/symbolic_expression.rb +42 -0
- data/lib/mhc/formatter/text.rb +29 -0
- data/lib/mhc/occurrence.rb +27 -5
- data/lib/mhc/occurrence_enumerator.rb +1 -1
- data/lib/mhc/property_value.rb +6 -0
- data/lib/mhc/property_value/date.rb +23 -14
- data/lib/mhc/property_value/date_time.rb +19 -0
- data/lib/mhc/property_value/integer.rb +5 -1
- data/lib/mhc/property_value/list.rb +7 -6
- data/lib/mhc/property_value/period.rb +3 -1
- data/lib/mhc/property_value/range.rb +1 -1
- data/lib/mhc/property_value/time.rb +8 -1
- data/lib/mhc/version.rb +1 -1
- data/spec/mhc_spec.rb +83 -0
- metadata +13 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 537f2bfe5826a0763c8c41fa53f6a035de6a796c7f515990b5cda8017b01e4ab
|
4
|
+
data.tar.gz: c264417ac39a7b1cdbf037378e2d67540861a48caeab5945a58adad350a24b00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 172010da102859b39e05ad9ba54f28c4faf8327e4a0c8cc30bed00599f1e8ba37bc36a7f752e24e959395066e3b32413f1b044f67cf00b4209dde455f79f783d
|
7
|
+
data.tar.gz: 0e6be200e4cd65828aba8a5e0216f3e641b3b351f430fe02de21cdd194248b66406fd859d97b82e0c590256687c7bf678091e49ec4b6da61e6b5f5f1ba981846
|
data/bin/mhc
CHANGED
@@ -110,9 +110,32 @@ class MhcCLI < Thor
|
|
110
110
|
named_option :repository
|
111
111
|
|
112
112
|
def cache
|
113
|
-
Mhc::Command::Cache.new(
|
113
|
+
Mhc::Command::Cache.new(builder.datastore)
|
114
114
|
end
|
115
115
|
|
116
|
+
# Command: todo
|
117
|
+
desc "todo", "List Todo entries in MHC calendar"
|
118
|
+
|
119
|
+
named_option :repository
|
120
|
+
method_option :show_all, :desc => "Include all finished tasks."
|
121
|
+
|
122
|
+
def todo
|
123
|
+
calendar.tasks.each do |task|
|
124
|
+
if task.recurring?
|
125
|
+
# Yearly: today - 90days .. today + 365d - 90days ?
|
126
|
+
# Weekly: today - 7days .. today + 7days
|
127
|
+
search_range = Mhc::PropertyValue::Date.parse_range("today+365d")
|
128
|
+
# search_range = nil
|
129
|
+
else
|
130
|
+
search_range = nil
|
131
|
+
end
|
132
|
+
next if task.in_category?("done") && !options[:show_all]
|
133
|
+
occurrence = task.occurrences(range: search_range).first
|
134
|
+
deadline = occurrence.dtstart
|
135
|
+
puts format("%s %s", deadline.strftime("%Y/%m/%d %a"), task.subject)
|
136
|
+
end
|
137
|
+
end # todo
|
138
|
+
|
116
139
|
################################################################
|
117
140
|
# Command: completions
|
118
141
|
################################################################
|
@@ -185,7 +208,7 @@ class MhcCLI < Thor
|
|
185
208
|
def scan(range)
|
186
209
|
begin
|
187
210
|
Mhc::Command::Scan.new(calendar, range, **symbolize_keys(options))
|
188
|
-
rescue Mhc::PropertyValue::ParseError, Mhc::
|
211
|
+
rescue Mhc::PropertyValue::ParseError, Mhc::Formatter::NameError, Mhc::Query::ParseError => e
|
189
212
|
STDERR.print "Error: " + e.message + "\n"
|
190
213
|
end
|
191
214
|
return self
|
@@ -236,6 +259,40 @@ class MhcCLI < Thor
|
|
236
259
|
return self
|
237
260
|
end
|
238
261
|
|
262
|
+
################################################################
|
263
|
+
# Command: validate
|
264
|
+
################################################################
|
265
|
+
desc "validate FILE", "Validate event FILE"
|
266
|
+
|
267
|
+
named_option :format
|
268
|
+
|
269
|
+
def validate(file)
|
270
|
+
full_path = File.expand_path(file)
|
271
|
+
|
272
|
+
unless File.exist?(full_path)
|
273
|
+
puts Mhc::Converter::Emacs.new.to_emacs("No such file #{file}.")
|
274
|
+
return 1
|
275
|
+
end
|
276
|
+
|
277
|
+
errors = Mhc::Event.validate(File.open(full_path) {|f| f.read})
|
278
|
+
|
279
|
+
string = ""
|
280
|
+
exit_on_error do
|
281
|
+
errors.each do |err, key|
|
282
|
+
string += "#{err.to_s.capitalize}"
|
283
|
+
string += " in X-SC-#{key.capitalize}" if key
|
284
|
+
string += ".\n"
|
285
|
+
end
|
286
|
+
end
|
287
|
+
if errors.empty?
|
288
|
+
puts Mhc::Converter::Emacs.new.to_emacs("OK")
|
289
|
+
return 0
|
290
|
+
end
|
291
|
+
|
292
|
+
puts Mhc::Converter::Emacs.new.to_emacs(string)
|
293
|
+
return 1
|
294
|
+
end
|
295
|
+
|
239
296
|
################################################################
|
240
297
|
# add some hooks to Thor
|
241
298
|
|
@@ -312,4 +369,10 @@ class MhcCLI < Thor
|
|
312
369
|
end
|
313
370
|
end
|
314
371
|
|
315
|
-
|
372
|
+
result = MhcCLI.start(ARGV)
|
373
|
+
|
374
|
+
if result.is_a?(Numeric)
|
375
|
+
exit result
|
376
|
+
else
|
377
|
+
exit 0
|
378
|
+
end
|
data/emacs/Cask
CHANGED
data/emacs/mhc-date.el
CHANGED
data/emacs/mhc-day.el
CHANGED
data/emacs/mhc-db.el
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
;;;
|
1
|
+
;;; mhc-db.el --- Database Interface to MHC.
|
2
2
|
|
3
3
|
;; Author: Yoshinari Nomura <nom@quickhack.net>,
|
4
4
|
;; TSUCHIYA Masatoshi <tsuchiya@namazu.org>
|
@@ -18,18 +18,38 @@
|
|
18
18
|
(require 'mhc-process)
|
19
19
|
(require 'mhc-schedule)
|
20
20
|
|
21
|
-
(defun mhc-db-scan (
|
21
|
+
(defun mhc-db-scan (begin-date end-date &optional nosort category search)
|
22
|
+
"Scan MHC database from BEGIN-DATE to END-DATE.
|
23
|
+
If optional NOSORT is non-nil, returned value is not sort.
|
24
|
+
If optional CATEGORY is non-nil, returned value is clipped by category.
|
25
|
+
If optional SEARCH is non-nil returned value is clipped by search string."
|
22
26
|
(mhc-process-send-command
|
23
27
|
(format "scan --format=emacs %04d%02d%02d-%04d%02d%02d%s%s"
|
24
|
-
(mhc-date-yy
|
25
|
-
(mhc-date-mm
|
26
|
-
(mhc-date-dd
|
27
|
-
(mhc-date-yy
|
28
|
-
(mhc-date-mm
|
29
|
-
(mhc-date-dd
|
28
|
+
(mhc-date-yy begin-date)
|
29
|
+
(mhc-date-mm begin-date)
|
30
|
+
(mhc-date-dd begin-date)
|
31
|
+
(mhc-date-yy end-date)
|
32
|
+
(mhc-date-mm end-date)
|
33
|
+
(mhc-date-dd end-date)
|
30
34
|
(if category (format " --category=%s" category) "")
|
31
35
|
(if search (format " --search='%s'" search) ""))))
|
32
36
|
|
37
|
+
(defun mhc-db-scan-flat (begin-date end-date &optional nosort category search)
|
38
|
+
"Scan MHC database from BEGIN-DATE to END-DATE.
|
39
|
+
Unlike `mhc-db-scan`, returned value is not grouped by date.
|
40
|
+
For example:
|
41
|
+
((date . mhc-schedule) (date . mhc-schedule) ...)
|
42
|
+
If optional NOSORT is non-nil, returned value is not sort.
|
43
|
+
If optional CATEGORY is non-nil, returned value is clipped by category.
|
44
|
+
If optional SEARCH is non-nil returned value is clipped by search string."
|
45
|
+
(let ((dayinfo-list (mhc-db-scan begin-date end-date nosort category search)))
|
46
|
+
(apply 'append
|
47
|
+
(mapcar (lambda (dayinfo)
|
48
|
+
(let ((date (mhc-day-date dayinfo))
|
49
|
+
(schedules (mhc-day-schedules dayinfo)))
|
50
|
+
(mapcar (lambda (sch) (cons date sch)) schedules)))
|
51
|
+
dayinfo-list))))
|
52
|
+
|
33
53
|
(defun mhc-db-search (&rest query)
|
34
54
|
(let ((b (mhc-date-new 1970 1 1))
|
35
55
|
(e (mhc-date-yy+ (mhc-date-now) 10)))
|
@@ -60,32 +80,33 @@
|
|
60
80
|
nosort
|
61
81
|
category)))
|
62
82
|
|
63
|
-
(defun mhc-db-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
(
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
83
|
+
(defun mhc-db-record-path-from-buffer (buffer)
|
84
|
+
"Return file path in MHC spool bound to BUFFER.
|
85
|
+
File path is taken from X-SC-Record-Id field."
|
86
|
+
(with-current-buffer buffer
|
87
|
+
(let ((spool-directory (file-name-as-directory
|
88
|
+
(expand-file-name
|
89
|
+
"spool" (mhc-config-base-directory))))
|
90
|
+
(record-id (mhc-draft-record-id)))
|
91
|
+
(expand-file-name (concat record-id ".mhc") spool-directory))))
|
92
|
+
|
93
|
+
(defun mhc-db-add-record-from-buffer (buffer &optional allow-overwrite)
|
94
|
+
"Add current mhc-draft BUFFER to MHC db.
|
95
|
+
If optional ALLOW-OVERWRITE is non-nil, do not ask overwrite."
|
96
|
+
(let* ((path (mhc-db-record-path-from-buffer buffer))
|
97
|
+
(directory (file-name-directory path))
|
98
|
+
(overwriting (file-exists-p path)))
|
99
|
+
(if (or (not overwriting)
|
100
|
+
allow-overwrite
|
101
|
+
(y-or-n-p (format "Overwrite existing %s? " path)))
|
102
|
+
(with-current-buffer buffer
|
103
|
+
(mhc-draft-increment-sequence)
|
104
|
+
(mhc-draft-translate)
|
105
|
+
(mhc-file-make-directory directory)
|
106
|
+
(mhc-write-region-as-coding-system
|
107
|
+
mhc-default-coding-system
|
108
|
+
(point-min) (point-max) path nil 'nomsg)
|
109
|
+
(set-buffer-modified-p nil)
|
89
110
|
(mhc-misc-touch-directory directory)
|
90
111
|
t))))
|
91
112
|
|
@@ -118,9 +139,7 @@
|
|
118
139
|
(mhc-schedule-condition schedule))))
|
119
140
|
" "))))
|
120
141
|
(mhc-record-set-name record (mhc-record-name original-record))
|
121
|
-
(mhc-db-add-record-from-buffer
|
122
|
-
|
123
|
-
|
142
|
+
(mhc-db-add-record-from-buffer (current-buffer) t)))))
|
124
143
|
|
125
144
|
(provide 'mhc-db)
|
126
145
|
|
@@ -155,4 +174,4 @@
|
|
155
174
|
;; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
156
175
|
;; OF THE POSSIBILITY OF SUCH DAMAGE.
|
157
176
|
|
158
|
-
;;; mhc-db.el ends here
|
177
|
+
;;; mhc-db.el ends here
|
data/emacs/mhc-draft.el
CHANGED
@@ -17,14 +17,10 @@
|
|
17
17
|
|
18
18
|
(defconst mhc-draft-buffer-name "*mhc draft*")
|
19
19
|
|
20
|
-
(defcustom mhc-draft-
|
21
|
-
'("
|
22
|
-
"
|
23
|
-
|
24
|
-
"X-Dispatcher:" "X-Filter:" "X-Gnus-Mail-Source:" "X-Mailer:" "X-Received:"
|
25
|
-
"X-Sender:" "X-Seqno:" "X-Spam-Flag:" "X-Spam-Probability:" "X-UIDL:"
|
26
|
-
"Xref:")
|
27
|
-
"*These headers are removed when article is imported."
|
20
|
+
(defcustom mhc-draft-import-header-list
|
21
|
+
'("Subject:" "From:" "To:" "Cc:" "Date:" "Message-Id:"
|
22
|
+
"X-GM-THRID:" "X-GM-MSGID:" "X-GM-LABELS:")
|
23
|
+
"*These headers are used when article is imported."
|
28
24
|
:group 'mhc
|
29
25
|
:type '(repeat string))
|
30
26
|
|
@@ -199,7 +195,7 @@ If optional argument NO-CONFIRM is non-nil, kill without confirmation."
|
|
199
195
|
(defun mhc-draft-delete-garbage-headers ()
|
200
196
|
(mhc-header-narrowing
|
201
197
|
(mhc-header-delete-header
|
202
|
-
(concat "^\\(" (mhc-regexp-opt mhc-draft-
|
198
|
+
(concat "^\\(" (mhc-regexp-opt mhc-draft-import-header-list) "\\)")
|
203
199
|
'regexp)))
|
204
200
|
|
205
201
|
(defun mhc-draft-setup-headers (&optional headers-values)
|
@@ -217,22 +213,40 @@ HEADERS-VALUES is a list of cons-cell like: ((header-name . value) ...)."
|
|
217
213
|
(mhc-header-put-value xsc ""))))
|
218
214
|
xsc-headers))))
|
219
215
|
|
216
|
+
(defun mhc-draft-record-id ()
|
217
|
+
"Get X-SC-Record-Id header value in draft buffer."
|
218
|
+
(mhc-header-narrowing
|
219
|
+
(mhc-header-get-value "x-sc-record-id")))
|
220
|
+
|
221
|
+
(defun mhc-draft-validate-buffer (&optional buffer)
|
222
|
+
"Validate mhc draft BUFFER.
|
223
|
+
If BUFFER is omitted, current buffer will be validated."
|
224
|
+
(interactive)
|
225
|
+
(let ((validation (mhc-process-send-command-with-buffer
|
226
|
+
"validate --format=emacs"
|
227
|
+
(or buffer (current-buffer)))))
|
228
|
+
(if (and (stringp validation)
|
229
|
+
(string-match "^OK" validation))
|
230
|
+
(message "Validation passed.")
|
231
|
+
;; \\' means end of string (not end of each line)
|
232
|
+
(error "ERROR: %s" (replace-regexp-in-string "[.\r\n]+\\'" "" validation)))))
|
233
|
+
|
220
234
|
(defun mhc-draft-finish ()
|
221
235
|
"Add current draft as a schedule."
|
222
236
|
(interactive)
|
223
|
-
(
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
(
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
237
|
+
(mhc-draft-validate-buffer)
|
238
|
+
(mhc-calendar-input-exit)
|
239
|
+
(if (mhc-db-add-record-from-buffer
|
240
|
+
(current-buffer)
|
241
|
+
(not (called-interactively-p 'interactive)))
|
242
|
+
(progn
|
243
|
+
(kill-buffer (current-buffer))
|
244
|
+
(mhc-window-pop)
|
245
|
+
(or (and (mhc-summary-buffer-p)
|
246
|
+
(mhc-rescan-month mhc-default-hide-private-schedules))
|
247
|
+
(and (mhc-calendar-p) (mhc-calendar-rescan)))
|
248
|
+
(run-hooks 'mhc-draft-finish-hook)
|
249
|
+
(message "Successfully registered."))))
|
236
250
|
|
237
251
|
(provide 'mhc-draft)
|
238
252
|
|
data/emacs/mhc-face.el
CHANGED
@@ -68,7 +68,7 @@ refer to mhc-calendar-hnf-face-alist-internal.")
|
|
68
68
|
(1 font-lock-type-face)
|
69
69
|
(2 font-lock-comment-face)
|
70
70
|
(3 font-lock-builtin-face))
|
71
|
-
("\\(X-SC-\\(Subject\\|Location\\|Day\\|Time\\|Category\\|Priority\\|Recurrence-Tag\\|Mission-Tag
|
71
|
+
("\\(X-SC-\\(Subject\\|Location\\|Day\\|Time\\|Category\\|Priority\\|Recurrence-Tag\\|Mission-Tag\\|Cond\\|Duration\\|Alarm\\|Record-Id\\|Sequence\\):\\)"
|
72
72
|
(1 font-lock-keyword-face))
|
73
73
|
("\\(\\[End of message\\]\\)"
|
74
74
|
(1 mhc-message-face-eof-marker))
|
data/emacs/mhc-header.el
CHANGED
@@ -63,6 +63,25 @@
|
|
63
63
|
(memq (following-char) '(? ?\t)))))
|
64
64
|
|
65
65
|
|
66
|
+
(defun mhc-header-distill-header (header &optional regexp)
|
67
|
+
"Remove all headers except X-SC-* and HEADER.
|
68
|
+
If REGEXP is non-nil, HEADER is a regular expression."
|
69
|
+
(save-excursion
|
70
|
+
(let ((case-fold-search t)
|
71
|
+
(header-top)
|
72
|
+
(header-name)
|
73
|
+
(all-regexp "^[^:]+:")
|
74
|
+
(use-regexp (if regexp header (concat "^" (regexp-quote header) ":")))
|
75
|
+
(xsc-regexp (concat "^\\(" (mhc-regexp-opt (mhc-header-list)) "\\)")))
|
76
|
+
(goto-char (point-min))
|
77
|
+
(while (re-search-forward all-regexp nil t)
|
78
|
+
(setq header-top (match-beginning 0)
|
79
|
+
header-name (match-string 0))
|
80
|
+
(mhc-header-goto-end)
|
81
|
+
(unless (or (string-match use-regexp header-name)
|
82
|
+
(string-match xsc-regexp header-name))
|
83
|
+
(delete-region header-top (point)))))))
|
84
|
+
|
66
85
|
(defun mhc-header-delete-header (header &optional regexp) "\
|
67
86
|
Remove HEADER in the narrowed buffer.
|
68
87
|
If REGEXP, HEADER is a regular expression."
|
@@ -177,4 +196,4 @@ If REGEXP, HEADER is a regular expression."
|
|
177
196
|
;; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
178
197
|
;; OF THE POSSIBILITY OF SUCH DAMAGE.
|
179
198
|
|
180
|
-
;;; mhc-header.el ends here
|
199
|
+
;;; mhc-header.el ends here
|
data/emacs/mhc-minibuf.el
CHANGED
@@ -189,7 +189,7 @@
|
|
189
189
|
(if (not (pos-visible-in-window-p b))
|
190
190
|
(recenter))
|
191
191
|
(if (not non-minibuf)
|
192
|
-
(
|
192
|
+
(select-window (minibuffer-window)))
|
193
193
|
;; in minibuffer
|
194
194
|
(if non-minibuf
|
195
195
|
()
|
@@ -254,12 +254,17 @@
|
|
254
254
|
(mhc-date-format default
|
255
255
|
"%04d/%02d/%02d" yy mm dd))
|
256
256
|
((listp default)
|
257
|
-
(
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
257
|
+
(let ((sep " ") (datelist default))
|
258
|
+
(if (null (cdr (last default)))
|
259
|
+
()
|
260
|
+
(setq sep "-")
|
261
|
+
(setq datelist (list (car default) (cdr default))))
|
262
|
+
(mapconcat
|
263
|
+
(lambda (date)
|
264
|
+
(mhc-date-format date
|
265
|
+
"%04d/%02d/%02d" yy mm dd))
|
266
|
+
datelist
|
267
|
+
sep)))
|
263
268
|
(t
|
264
269
|
nil)))
|
265
270
|
(current-buffer)
|
data/emacs/mhc-parse.el
CHANGED
data/emacs/mhc-process.el
CHANGED
@@ -1,34 +1,51 @@
|
|
1
|
-
(
|
1
|
+
(require 'mhc-vars)
|
2
2
|
|
3
|
-
(
|
3
|
+
(defvar mhc-process nil)
|
4
4
|
|
5
5
|
(defun mhc-process-send-command (command)
|
6
6
|
(unless (and (processp mhc-process)
|
7
7
|
(eq (process-status mhc-process) 'run))
|
8
8
|
(mhc-start-process))
|
9
|
-
(message "COMMAND: %s" command)
|
10
9
|
(with-current-buffer (process-buffer mhc-process)
|
11
10
|
(delete-region (point-min) (point-max))
|
12
11
|
(process-send-string mhc-process (concat command "\n"))
|
13
12
|
(let ((i 1))
|
14
13
|
(while (not (and (> (point-max) 1)
|
15
14
|
(eq (char-after (1- (point-max))) ?\n)))
|
16
|
-
(message (format "Waiting mhc process...%d" i))
|
15
|
+
(if (< 2 i) (message (format "Waiting mhc process...%d" i)))
|
17
16
|
(setq i (1+ i))
|
18
17
|
(accept-process-output mhc-process 0.5)))
|
19
18
|
(read (buffer-substring (point-min) (1- (point-max))))))
|
20
19
|
|
20
|
+
(defun mhc-process-send-command-with-buffer (command buffer)
|
21
|
+
"Send COMMAND to mhc process with BUFFER via temporal file."
|
22
|
+
(let ((temp-file (make-temp-file "mhc")))
|
23
|
+
(unwind-protect
|
24
|
+
(with-current-buffer buffer
|
25
|
+
(mhc-write-region-as-coding-system
|
26
|
+
mhc-default-coding-system
|
27
|
+
(point-min)
|
28
|
+
(point-max)
|
29
|
+
temp-file
|
30
|
+
nil 'nomsg)
|
31
|
+
(mhc-process-send-command
|
32
|
+
(format "%s %s" command temp-file)))
|
33
|
+
(delete-file temp-file))))
|
34
|
+
|
21
35
|
(defun mhc-start-process ()
|
22
36
|
(interactive)
|
23
37
|
(let ((process-connection-type nil)) ;; use PIPE not tty
|
24
38
|
(if (and (processp mhc-process)
|
25
39
|
(eq (process-status mhc-process) 'run))
|
26
40
|
(kill-process mhc-process))
|
27
|
-
(setq mhc-process
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
41
|
+
(setq mhc-process
|
42
|
+
(apply 'start-process
|
43
|
+
(delq nil `("mhc"
|
44
|
+
,(get-buffer-create " *mhc-scan-process*")
|
45
|
+
,mhc-ruby-program-name
|
46
|
+
,mhc-program-name
|
47
|
+
"server"))))
|
48
|
+
(set-process-coding-system mhc-process 'utf-8 'utf-8)
|
32
49
|
(set-process-query-on-exit-flag mhc-process nil)
|
33
50
|
mhc-process))
|
34
51
|
|