| @@ -24,9 +24,11 @@ | |||||
| ;; download library from web | ;; download library from web | ||||
| (defun fetch-library (url &optional byte-compile-p force-download-p) | (defun fetch-library (url &optional byte-compile-p force-download-p) | ||||
| "If library does not exist, download it from URL and locate it in | |||||
| \"~/emacs.d/lisp/\". Return nil if library unfound and failed to download, | |||||
| otherwise the path where the library installed." | |||||
| "Download a library from URL and locate it in \"~/emacs.d/lisp/\". | |||||
| Return nil if library unfound and failed to download, | |||||
| otherwise the path where the library installed. | |||||
| If BYTE-COMPILE-P is t byte compile the file after downloading. | |||||
| If FORCE-DOWNLOAD-P it t ignore exisiting library and always download." | |||||
| (let* ((dir (expand-file-name (concat user-emacs-directory "lisp/"))) | (let* ((dir (expand-file-name (concat user-emacs-directory "lisp/"))) | ||||
| (lib (file-name-sans-extension (file-name-nondirectory url))) | (lib (file-name-sans-extension (file-name-nondirectory url))) | ||||
| (lpath (concat dir lib ".el")) | (lpath (concat dir lib ".el")) | ||||
| @@ -2327,4 +2329,104 @@ this is test, does not rename files." | |||||
| ;; (my-real-function-subr-p 'my-real-function-subr-p) | ;; (my-real-function-subr-p 'my-real-function-subr-p) | ||||
| (define-derived-mode isdcv-mode fundamental-mode | |||||
| "iSDCV" | |||||
| "Major mode for incremental sdcv buffer." | |||||
| (set (make-local-variable 'font-lock-function) | |||||
| 'ignore)) | |||||
| (defvar isdcv-sdcv-command "sdcv -n '%s'" | |||||
| "Command of sdcv.") | |||||
| (defvar isdcv-buffer nil | |||||
| "Pointer to incremental sdcv buffer.") | |||||
| (defvar isdcv--timer nil | |||||
| "Idle timer object for isdcv.") | |||||
| (defun isdcv--timer-add () | |||||
| "Entry idle timer for isdcv." | |||||
| (and (eq isdcv-buffer | |||||
| (current-buffer)) | |||||
| ;; do not duplicate timer | |||||
| (not isdcv--timer) | |||||
| (setq isdcv--timer (run-with-idle-timer 1 | |||||
| t | |||||
| 'isdcv--timer-function)))) | |||||
| (defun isdcv--timer-remove () | |||||
| "Remove idle timer for isdcv." | |||||
| ;; remote only when killing buffer is isdcv buffer | |||||
| (and (eq isdcv-buffer | |||||
| (current-buffer)) | |||||
| isdcv--timer | |||||
| (cancel-timer isdcv--timer))) | |||||
| (defvar isdcv-current-prompt-point nil | |||||
| "Point of beginning of current prompt.") | |||||
| (make-variable-buffer-local 'isdcv--current-prompt-point) | |||||
| (defun isdcv-bol () | |||||
| "Return point to bol ignoring prompt." | |||||
| (point-at-bol)) | |||||
| (defun isdcv--get-output-start () | |||||
| "Return point where outputs should be inserted. | |||||
| This function insert newline if required." | |||||
| (when isdcv-current-prompt-point | |||||
| (save-excursion | |||||
| (goto-char isdcv-current-prompt-point) | |||||
| (forward-line 1) | |||||
| (when (eq (line-number-at-pos) | |||||
| (line-number-at-pos isdcv-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))) | |||||
| (and input | |||||
| outpoint | |||||
| isdcv-sdcv-command | |||||
| (save-excursion | |||||
| (goto-char outpoint) | |||||
| (delete-region (point) | |||||
| (point-max)) | |||||
| (call-process-shell-command (format isdcv-sdcv-command | |||||
| input) | |||||
| nil | |||||
| t | |||||
| t))))) | |||||
| (defun isdcv--get-input () | |||||
| "Get current input for isdcv buffer. | |||||
| Return nil if current position is not on prompt line." | |||||
| (and (eq isdcv-buffer | |||||
| (current-buffer)) | |||||
| (eq (line-number-at-pos) | |||||
| (line-number-at-pos isdcv-current-prompt-point)) | |||||
| (buffer-substring-no-properties (isdcv-bol) | |||||
| (point-at-eol)))) | |||||
| (defun isdcv-open () | |||||
| "Open isdcv buffer." | |||||
| (interactive) | |||||
| (if isdcv-buffer | |||||
| (pop-to-buffer isdcv-buffer) | |||||
| (with-current-buffer (setq isdcv-buffer | |||||
| (get-buffer-create "*isdcv*")) | |||||
| (isdcv-mode) | |||||
| (font-lock-mode t) | |||||
| (setq isdcv-current-prompt-point | |||||
| (point)) | |||||
| (forward-line -1) | |||||
| (isdcv--timer-add) | |||||
| (add-hook 'kill-buffer-hook | |||||
| 'isdcv--timer-remove) | |||||
| ) | |||||
| (pop-to-buffer isdcv-buffer))) | |||||
| ;;; emacs.el ends here | ;;; emacs.el ends here | ||||