diff --git a/emacs.el b/emacs.el index 17266ac..8f4e0fa 100644 --- a/emacs.el +++ b/emacs.el @@ -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