|
|
@@ -2340,150 +2340,177 @@ this is test, does not rename files." |
|
|
|
|
|
|
|
;; TODO: enter on prompt to wait for output of command |
|
|
|
|
|
|
|
(defvar isdcv-prompt "> " |
|
|
|
"Prompt string for isdcv input.") |
|
|
|
(defvar ilookup-prompt ">>> " |
|
|
|
"Prompt string for ilookup input.") |
|
|
|
|
|
|
|
(defvar isdcv-interval 0.5 |
|
|
|
(defvar ilookup-interval 0.5 |
|
|
|
"Time in second to show sdcv result for current input.") |
|
|
|
|
|
|
|
(defvar isdcv-current-prompt-point nil |
|
|
|
(defvar ilookup-current-prompt-point nil |
|
|
|
"Point of beginning of current prompt.") |
|
|
|
(make-variable-buffer-local 'isdcv-current-prompt-point) |
|
|
|
(make-variable-buffer-local 'ilookup-current-prompt-point) |
|
|
|
|
|
|
|
(defvar isdcv-mode-map |
|
|
|
(defvar ilookup-mode-map |
|
|
|
(let ((map (make-sparse-keymap))) |
|
|
|
(define-key map (kbd "C-m") 'isdcv-enter) |
|
|
|
(define-key map (kbd "C-u") 'isdcv-kill-input) |
|
|
|
(define-key map (kbd "C-a") 'isdcv-goto-bol) |
|
|
|
(define-key map (kbd "C-m") 'ilookup-enter) |
|
|
|
(define-key map (kbd "C-u") 'ilookup-kill-input) |
|
|
|
(define-key map (kbd "C-a") 'ilookup-goto-bol) |
|
|
|
map)) |
|
|
|
|
|
|
|
(define-derived-mode isdcv-mode fundamental-mode |
|
|
|
"iSDCV" |
|
|
|
(define-derived-mode ilookup-mode fundamental-mode |
|
|
|
"iLookUp" |
|
|
|
"Major mode for incremental sdcv buffer." |
|
|
|
(set (make-local-variable 'font-lock-function) |
|
|
|
'ignore)) |
|
|
|
|
|
|
|
(defun isdcv-enter () |
|
|
|
"Enter function for `isdcv-mode'. |
|
|
|
(defun ilookup-enter () |
|
|
|
"Enter function for `ilookup-mode'. |
|
|
|
Freeze current input and show next prompt." |
|
|
|
(interactive) |
|
|
|
(goto-char (point-max)) |
|
|
|
(unless (eq (point) |
|
|
|
(point-at-bol)) |
|
|
|
(newline)) |
|
|
|
(setq isdcv-current-prompt-point |
|
|
|
(setq ilookup-current-prompt-point |
|
|
|
(point)) |
|
|
|
(insert isdcv-prompt)) |
|
|
|
(insert ilookup-prompt)) |
|
|
|
|
|
|
|
(defun isdcv-kill-input () |
|
|
|
"Delete `isdcv-bol' to current point." |
|
|
|
(defun ilookup-kill-input () |
|
|
|
"Delete `ilookup-bol' to current point." |
|
|
|
(interactive) |
|
|
|
(delete-region (isdcv-bol) |
|
|
|
(delete-region (ilookup-bol) |
|
|
|
(point))) |
|
|
|
|
|
|
|
(defun isdcv-goto-bol () |
|
|
|
"Go to isdcv bol." |
|
|
|
(defun ilookup-goto-bol () |
|
|
|
"Go to ilookup bol." |
|
|
|
(interactive) |
|
|
|
(goto-char (isdcv-bol))) |
|
|
|
(goto-char (ilookup-bol))) |
|
|
|
|
|
|
|
(defvar isdcv-sdcv-command "sdcv -n '%s'" |
|
|
|
(defvar ilookup-sdcv-command "sdcv -n '%s'" |
|
|
|
"Command of sdcv.") |
|
|
|
(setq isdcv-sdcv-command "sdcv -n -u jmdict-en-ja '%s'") |
|
|
|
(setq ilookup-sdcv-command "sdcv -n -u jmdict-en-ja '%s'") |
|
|
|
|
|
|
|
(defvar isdcv-buffer nil |
|
|
|
"Pointer to incremental sdcv buffer.") |
|
|
|
(defvar ilookup-buffer nil |
|
|
|
"Pointer to ilookup buffer.") |
|
|
|
|
|
|
|
(defvar isdcv--timer nil |
|
|
|
"Idle timer object for isdcv.") |
|
|
|
(defvar ilookup--timer nil |
|
|
|
"Idle timer object for ilookup.") |
|
|
|
|
|
|
|
(defvar isdcv--last-input nil |
|
|
|
(defvar ilookup--last-input nil |
|
|
|
"Last input queryed.") |
|
|
|
|
|
|
|
(defun isdcv--timer-add () |
|
|
|
"Entry idle timer for isdcv." |
|
|
|
(and (eq isdcv-buffer |
|
|
|
(defvar ilookup-default "sdcv" |
|
|
|
"Default command for ilookup. |
|
|
|
This value should be a key of `ilookup-alist'.") |
|
|
|
|
|
|
|
(defvar ilookup-alist |
|
|
|
'( |
|
|
|
("sdcv" . (lambda (word) |
|
|
|
(shell-command-to-string (format "sdcv -n '%s'" |
|
|
|
word)))) |
|
|
|
) |
|
|
|
"Alist of ilookup functions. |
|
|
|
Each element should be in the form of (NAME . FUNCTION). |
|
|
|
FUNCTION must accept one argument as word to search and return the string of |
|
|
|
result for that word.") |
|
|
|
|
|
|
|
(defun ilookup--timer-add () |
|
|
|
"Entry idle timer for ilookup." |
|
|
|
(and (eq ilookup-buffer |
|
|
|
(current-buffer)) |
|
|
|
;; do not duplicate timer |
|
|
|
(not isdcv--timer) |
|
|
|
(setq isdcv--timer (run-with-idle-timer isdcv-interval |
|
|
|
(not ilookup--timer) |
|
|
|
(setq ilookup--timer (run-with-idle-timer ilookup-interval |
|
|
|
t |
|
|
|
'isdcv--timer-function)))) |
|
|
|
'ilookup--timer-function)))) |
|
|
|
|
|
|
|
(defun isdcv--timer-remove () |
|
|
|
"Remove idle timer for isdcv." |
|
|
|
;; remote only when killing buffer is isdcv buffer |
|
|
|
(and (eq isdcv-buffer |
|
|
|
(defun ilookup--timer-remove () |
|
|
|
"Remove idle timer for ilookup." |
|
|
|
;; remote only when killing buffer is ilookup buffer |
|
|
|
(and (eq ilookup-buffer |
|
|
|
(current-buffer)) |
|
|
|
isdcv--timer |
|
|
|
(cancel-timer isdcv--timer))) |
|
|
|
ilookup--timer |
|
|
|
(cancel-timer ilookup--timer))) |
|
|
|
|
|
|
|
(defun isdcv-bol () |
|
|
|
(defun ilookup-bol () |
|
|
|
"Return point to bol ignoring prompt." |
|
|
|
(save-excursion |
|
|
|
(beginning-of-line) |
|
|
|
(or (search-forward isdcv-prompt |
|
|
|
(or (search-forward ilookup-prompt |
|
|
|
(point-at-eol) |
|
|
|
t) |
|
|
|
(point)))) |
|
|
|
|
|
|
|
(defun isdcv--get-output-start () |
|
|
|
(defun ilookup--get-output-start () |
|
|
|
"Return point where outputs should be inserted. |
|
|
|
This function insert newline if required." |
|
|
|
(when isdcv-current-prompt-point |
|
|
|
(when ilookup-current-prompt-point |
|
|
|
(save-excursion |
|
|
|
(goto-char isdcv-current-prompt-point) |
|
|
|
(goto-char ilookup-current-prompt-point) |
|
|
|
(forward-line 1) |
|
|
|
(when (eq (line-number-at-pos) |
|
|
|
(line-number-at-pos isdcv-current-prompt-point)) |
|
|
|
(line-number-at-pos ilookup-current-prompt-point)) |
|
|
|
(end-of-line) |
|
|
|
(newline)) |
|
|
|
(point-at-bol)))) |
|
|
|
|
|
|
|
(defun isdcv--timer-function () |
|
|
|
"Get entry for current isdcv input." |
|
|
|
(let ((input (isdcv--get-input)) |
|
|
|
(outpoint (isdcv--get-output-start))) |
|
|
|
(defun ilookup--timer-function () |
|
|
|
"Get entry for current ilookup input." |
|
|
|
(let ((input (ilookup--get-input)) |
|
|
|
(outpoint (ilookup--get-output-start))) |
|
|
|
(and input |
|
|
|
;; do not query same word twice |
|
|
|
(not (eq isdcv--last-input |
|
|
|
(not (eq ilookup--last-input |
|
|
|
input)) |
|
|
|
outpoint |
|
|
|
isdcv-sdcv-command |
|
|
|
(save-excursion |
|
|
|
(goto-char outpoint) |
|
|
|
(delete-region (point) |
|
|
|
(point-max)) |
|
|
|
(setq isdcv--last-input input) |
|
|
|
(call-process-shell-command (format isdcv-sdcv-command |
|
|
|
input) |
|
|
|
nil |
|
|
|
t |
|
|
|
t))))) |
|
|
|
|
|
|
|
(defun isdcv--get-input () |
|
|
|
"Get current input for isdcv buffer. |
|
|
|
(let* ((inputl (split-string input |
|
|
|
":")) |
|
|
|
(fname (if (eq (length inputl) |
|
|
|
2) |
|
|
|
(car inputl) |
|
|
|
ilookup-default)) |
|
|
|
(func (cdr (assoc fname |
|
|
|
ilookup-alist))) |
|
|
|
(word (if (eq (length inputl) |
|
|
|
2) |
|
|
|
(nth 1 |
|
|
|
inputl) |
|
|
|
(car inputl)))) |
|
|
|
(save-excursion |
|
|
|
(goto-char outpoint) |
|
|
|
(delete-region (point) |
|
|
|
(point-max)) |
|
|
|
(setq ilookup--last-input input) |
|
|
|
(insert (if func |
|
|
|
(funcall func |
|
|
|
word) |
|
|
|
(format "No func found for `%s'" |
|
|
|
fname)))))))) |
|
|
|
|
|
|
|
(defun ilookup--get-input () |
|
|
|
"Get current input for ilookup buffer. |
|
|
|
Return nil if current position is not on prompt line." |
|
|
|
(and (eq isdcv-buffer |
|
|
|
(and (eq ilookup-buffer |
|
|
|
(current-buffer)) |
|
|
|
(eq (line-number-at-pos) |
|
|
|
(line-number-at-pos isdcv-current-prompt-point)) |
|
|
|
(buffer-substring-no-properties (isdcv-bol) |
|
|
|
(line-number-at-pos ilookup-current-prompt-point)) |
|
|
|
(buffer-substring-no-properties (ilookup-bol) |
|
|
|
(point-at-eol)))) |
|
|
|
|
|
|
|
(defun isdcv-open () |
|
|
|
"Open isdcv buffer." |
|
|
|
(defun ilookup-open () |
|
|
|
"Open ilookup buffer." |
|
|
|
(interactive) |
|
|
|
(if isdcv-buffer |
|
|
|
(pop-to-buffer isdcv-buffer) |
|
|
|
(with-current-buffer (setq isdcv-buffer |
|
|
|
(get-buffer-create "*isdcv*")) |
|
|
|
(isdcv-mode) |
|
|
|
(if ilookup-buffer |
|
|
|
(pop-to-buffer ilookup-buffer) |
|
|
|
(with-current-buffer (setq ilookup-buffer |
|
|
|
(get-buffer-create "*ilookup*")) |
|
|
|
(ilookup-mode) |
|
|
|
(font-lock-mode t) |
|
|
|
(isdcv-enter) |
|
|
|
(isdcv--timer-add) |
|
|
|
(ilookup-enter) |
|
|
|
(ilookup--timer-add) |
|
|
|
(add-hook 'kill-buffer-hook |
|
|
|
'isdcv--timer-remove) |
|
|
|
'ilookup--timer-remove) |
|
|
|
) |
|
|
|
(pop-to-buffer isdcv-buffer))) |
|
|
|
(pop-to-buffer ilookup-buffer))) |
|
|
|
|
|
|
|
;;; emacs.el ends here |