| @@ -2340,150 +2340,177 @@ this is test, does not rename files." | |||||
| ;; TODO: enter on prompt to wait for output of command | ;; 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.") | "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.") | "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))) | (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)) | map)) | ||||
| (define-derived-mode isdcv-mode fundamental-mode | |||||
| "iSDCV" | |||||
| (define-derived-mode ilookup-mode fundamental-mode | |||||
| "iLookUp" | |||||
| "Major mode for incremental sdcv buffer." | "Major mode for incremental sdcv buffer." | ||||
| (set (make-local-variable 'font-lock-function) | (set (make-local-variable 'font-lock-function) | ||||
| 'ignore)) | 'ignore)) | ||||
| (defun isdcv-enter () | |||||
| "Enter function for `isdcv-mode'. | |||||
| (defun ilookup-enter () | |||||
| "Enter function for `ilookup-mode'. | |||||
| Freeze current input and show next prompt." | Freeze current input and show next prompt." | ||||
| (interactive) | (interactive) | ||||
| (goto-char (point-max)) | (goto-char (point-max)) | ||||
| (unless (eq (point) | (unless (eq (point) | ||||
| (point-at-bol)) | (point-at-bol)) | ||||
| (newline)) | (newline)) | ||||
| (setq isdcv-current-prompt-point | |||||
| (setq ilookup-current-prompt-point | |||||
| (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) | (interactive) | ||||
| (delete-region (isdcv-bol) | |||||
| (delete-region (ilookup-bol) | |||||
| (point))) | (point))) | ||||
| (defun isdcv-goto-bol () | |||||
| "Go to isdcv bol." | |||||
| (defun ilookup-goto-bol () | |||||
| "Go to ilookup bol." | |||||
| (interactive) | (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.") | "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.") | "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)) | (current-buffer)) | ||||
| ;; do not duplicate timer | ;; 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 | 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)) | (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." | "Return point to bol ignoring prompt." | ||||
| (save-excursion | (save-excursion | ||||
| (beginning-of-line) | (beginning-of-line) | ||||
| (or (search-forward isdcv-prompt | |||||
| (or (search-forward ilookup-prompt | |||||
| (point-at-eol) | (point-at-eol) | ||||
| t) | t) | ||||
| (point)))) | (point)))) | ||||
| (defun isdcv--get-output-start () | |||||
| (defun ilookup--get-output-start () | |||||
| "Return point where outputs should be inserted. | "Return point where outputs should be inserted. | ||||
| This function insert newline if required." | This function insert newline if required." | ||||
| (when isdcv-current-prompt-point | |||||
| (when ilookup-current-prompt-point | |||||
| (save-excursion | (save-excursion | ||||
| (goto-char isdcv-current-prompt-point) | |||||
| (goto-char ilookup-current-prompt-point) | |||||
| (forward-line 1) | (forward-line 1) | ||||
| (when (eq (line-number-at-pos) | (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) | (end-of-line) | ||||
| (newline)) | (newline)) | ||||
| (point-at-bol)))) | (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 | (and input | ||||
| ;; do not query same word twice | ;; do not query same word twice | ||||
| (not (eq isdcv--last-input | |||||
| (not (eq ilookup--last-input | |||||
| input)) | input)) | ||||
| outpoint | 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." | Return nil if current position is not on prompt line." | ||||
| (and (eq isdcv-buffer | |||||
| (and (eq ilookup-buffer | |||||
| (current-buffer)) | (current-buffer)) | ||||
| (eq (line-number-at-pos) | (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)))) | (point-at-eol)))) | ||||
| (defun isdcv-open () | |||||
| "Open isdcv buffer." | |||||
| (defun ilookup-open () | |||||
| "Open ilookup buffer." | |||||
| (interactive) | (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) | (font-lock-mode t) | ||||
| (isdcv-enter) | |||||
| (isdcv--timer-add) | |||||
| (ilookup-enter) | |||||
| (ilookup--timer-add) | |||||
| (add-hook 'kill-buffer-hook | (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 | ;;; emacs.el ends here | ||||