Skip to content

Instantly share code, notes, and snippets.

@youz
Created December 5, 2011 08:39
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save youz/1432883 to your computer and use it in GitHub Desktop.
慣性スクロールっぽい何か for #xyzzy
;;; -*- mode:lisp; package:smooth -*-
;;; 慣性スクロールっぽい何か for xyzzy
;;; 設定
;; (require "smooth")
;; (global-set-key #\C-\, 'smooth:scroll-forward)
;; (global-set-key #\C-. 'smooth:scroll-backward)
(provide "smooth")
(defpackage :smooth
(:use :lisp :editor))
(in-package :smooth)
(export '(*counter-max* *counter-dec* *max-speed*
scroll-forward scroll-backward
auto-scroll-forward auto-scroll-backward
))
(defparameter *counter-max* 50)
(defparameter *counter-dec* 2)
(defparameter *max-speed* 2)
(defvar *counter* 0)
(defun start-scrolling (win dir)
(let ((com *this-command*)
(buf (window-buffer win))
(row (get-window-line))
(dec *counter-dec*))
(labels ((scroll ()
(when (and (eq *last-command* com)
(eq (selected-window) win)
(not (deleted-buffer-p buf))
(eq buf (selected-buffer)))
(let ((d (min (ceiling *counter* 10) *max-speed*)))
(unless (next-line (* dir d))
(setq *counter* 0)))
(recenter row)
(refresh-screen)
(if (> (decf *counter* dec) 2)
(start-timer (/ 1.0 *counter*) #'scroll t)
(setq *counter* 0)))))
(stop-timer #'scroll)
(setq *counter* *counter-max*
*last-command* com)
(scroll))))
(defun scroll-forward ()
(interactive)
(start-scrolling (selected-window) 1))
(defun scroll-backward ()
(interactive)
(start-scrolling (selected-window) -1))
(defun auto-scroll-forward (&optional (speed 3))
(interactive "p")
(setq speed (min (max speed 1) 5))
(let ((*counter-max* (* speed 10))
(*counter-dec* 0)
(*max-speed* speed))
(start-scrolling (selected-window) 1)))
(defun auto-scroll-backward (&optional (speed 3))
(interactive "p")
(setq speed (min (max speed 1) 5))
(let ((*counter-max* (* speed 10))
(*counter-dec* 0)
(*max-speed* speed))
(start-scrolling (selected-window) -1)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment