Vim window logic, slimv

This commit is contained in:
Ian Keane 2020-02-24 20:27:04 -05:00
parent babcc9e44b
commit 515847d07e
791 changed files with 51552 additions and 86 deletions

View file

@ -0,0 +1,285 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; Paul Nathan 2013
;;;; cl-ansi-text.lisp
;;;;
;;;; Portions of this code were written by taksatou under the
;;;; cl-rainbow name.
;;;;
;;;; A library to produce ANSI escape sequences. Particularly,
;;;; produces colorized text on terminals
(defpackage :cl-ansi-text
(:use :common-lisp)
(:export
#:with-color
#:make-color-string
#:+reset-color-string+
#:*enabled*
#:black
#:red
#:green
#:yellow
#:blue
#:magenta
#:cyan
#:white))
(in-package :cl-ansi-text)
;;; !!! NOTE TO CCL USERS !!!
;;;
;;; This seems to be *required* to make this compile in CCL. The
;;; reason is that CCL expects to be able to inline on compile, but
;;; structs don't set up that infrastructure by default.
;;;
;;; At least from the thread "Compiler problem, MCL 3.9" by Arthur
;;; Cater around '96.
#+ccl(common-lisp:eval-when (:compile-toplevel :load-toplevel :execute)
(defmethod make-load-form ((obj cl-colors:rgb ) &optional env)
(make-load-form-saving-slots obj)))
(defparameter *enabled* t
"Turns on/off the colorization of functions")
(defparameter +reset-color-string+
(concatenate 'string (list (code-char 27) #\[ #\0 #\m))
"This string will reset ANSI colors")
(defvar +cl-colors+
(vector
cl-colors:+black+
cl-colors:+red+
cl-colors:+green+
cl-colors:+yellow+
cl-colors:+blue+
cl-colors:+magenta+
cl-colors:+cyan+
cl-colors:+white+)
"CL-COLORS colors")
(eval-when (:compile-toplevel :load-toplevel :execute)
(defparameter +term-colors+
(vector
:black
:red
:green
:yellow
:blue
:magenta
:cyan
:white)
"Basic colors"))
(defparameter +text-style+
'((:foreground . 30)
(:background . 40))
"One or the other. Not an ANSI effect")
(defparameter +term-effects+
'((:unset . t)
(:reset . 0)
(:bright . 1)
(:italic . 3)
(:underline . 4)
(:blink . 5)
(:inverse . 7)
(:hide . 8)
(:normal . 22)
(:framed . 51)
(:encircled . 52)
(:overlined . 53)
(:not-framed-or-circled . 54)
(:not-overlined . 55))
"ANSI terminal effects")
(defun eq-colors (a b)
"Equality for cl-colors"
;; CL-COLORS LIB!
;; eql, equal doesn't quite work for compiled cl-colors on CCL
(and
(= (cl-colors:rgb-red a)
(cl-colors:rgb-red b))
(= (cl-colors:rgb-green a)
(cl-colors:rgb-green b))
(= (cl-colors:rgb-blue a)
(cl-colors:rgb-blue b))))
(defun cl-colors-to-ansi (color)
(position color +cl-colors+ :test #'eq-colors))
(defun term-colors-to-ansi (color)
(position color +term-colors+))
;; Find-X-code is the top-level interface for code-finding
(defun find-color-code (color)
"Find the list denoting the color"
(typecase color
;; Did we get a cl-color that we know about?
(cl-colors:rgb (cl-colors-to-ansi color))
(symbol (term-colors-to-ansi color))))
(defun find-effect-code (effect)
"Returns the number for the text effect OR
t if no effect should be used OR
nil if the effect is unknown.
effect should be a member of +term-effects+"
(cdr (assoc effect +term-effects+)))
(defun find-style-code (style)
(cdr (assoc style +text-style+)))
(defun rgb-code-p (color)
(typecase color
(list t)
(integer t)))
(defun generate-control-string (code)
"General ANSI code"
(format nil "~c[~a" (code-char #o33) code))
(defun generate-color-string (code)
;; m is the action character for color
(format nil "~am" (generate-control-string code)))
(defun build-control-string (color
&optional
(effect :unset)
(style :foreground))
"Color (cl-color or term-color)
Effect
Style"
(let ((effect-code (find-effect-code effect))
(color-code (find-color-code color))
(style-code (find-style-code style)))
;; Nil here indicates an error
(assert effect-code)
(assert style-code)
;; Returns a list for inspection; next layer turns it back into a
;; string.
(concatenate
'list
;; We split between RGB and 32-color here; this preserves the
;; interface without cluttering the 32-color code up.
;;
(let ((codes nil))
(unless (eq effect-code t)
(setf codes (cons effect-code codes)))
(if (rgb-code-p color)
(setf codes (cons (rgb-color-code color style) codes))
(setf codes (cons (+ style-code color-code) codes)))
(generate-color-string (format nil "~{~A~^;~}" codes))))))
;; Public callables.
(defun make-color-string (color &key
(effect :unset)
(style :foreground)
((enabled *enabled*) *enabled*))
"Takes either a cl-color or a list denoting the ANSI colors and
returns a string sufficient to change to the given color.
Will be dynamically controlled by *enabled* unless manually specified
otherwise"
(when *enabled*
(concatenate 'string
(build-control-string color effect style))))
(defmacro with-color ((color &key
(stream t)
(effect :unset)
(style :foreground))
&body body)
"Writes out the string denoting a switch to `color`, executes body,
then writes out the string denoting a `reset`.
*enabled* dynamically controls expansion.."
`(progn
(when *enabled*
(format ,stream "~a" (make-color-string ,color
:effect ,effect
:style ,style)))
(unwind-protect
(progn
,@body)
(when *enabled*
(format ,stream "~a" +reset-color-string+)))))
(defmacro gen-color-functions (color-names-vector)
`(progn
,@(map 'list
(lambda (color)
`(defun ,(intern (symbol-name color)) (string &key
(effect :unset)
(style :foreground))
,(concatenate
'string
"Returns a string with the `" (string-downcase color)
"'string denotation preppended and the `reset' string denotation appended.
*enabled* dynamically controls the function." )
(concatenate
'string
(when *enabled*
(format nil "~a" (make-color-string ,color
:effect effect
:style style)))
string
(when *enabled*
(format nil "~a" +reset-color-string+)))))
color-names-vector)))
(gen-color-functions #.(coerce +term-colors+ 'list))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; RGB color codes for some enhanced terminals
;;; http://www.frexx.de/xterm-256-notes/
(defun rgb-to-ansi (red green blue)
(let ((ansi-domain (mapcar #'(lambda (x)
(floor (* 6 (/ x 256.0))))
(list red green blue))))
(+ 16
(* 36 (first ansi-domain))
(* 6 (second ansi-domain))
(third ansi-domain))))
(defun code-from-rgb (style red green blue)
(format nil "~d;5;~d"
(if (eql style :foreground) 38 48)
(rgb-to-ansi red green blue)))
(defgeneric rgb-color-code (color &optional style)
(:documentation
"Returns the 256-color code suitable for rendering on the Linux
extensions to xterm"))
(defmethod rgb-color-code ((color list) &optional (style :foreground))
(unless (consp color)
(error "~a must be a three-integer list" color))
(unless (and (integerp (first color))
(integerp (second color))
(integerp (second color)))
(error "~a must have three integers" color))
(code-from-rgb style
(first color)
(second color)
(third color)))
(defmethod rgb-color-code ((color integer) &optional (style :foreground))
;; Takes RGB integer ala Web integers
(code-from-rgb style
;; classic bitmask
(ash (logand color #xff0000) -16)
(ash (logand color #x00ff00) -8)
(logand color #x0000ff)))