From fc67e9380b89d1a246cf7697fd0c60691a54c688 Mon Sep 17 00:00:00 2001 From: cxxxr Date: Sat, 30 Nov 2024 18:49:40 +0900 Subject: [PATCH 1/2] open the source code of the sbcl as read-only --- extensions/lisp-mode/connection.lisp | 1 + extensions/lisp-mode/lem-lisp-mode.asd | 3 +++ extensions/lisp-mode/read-only-sources.lisp | 14 +++++++++++ lem.asd | 3 ++- src/ext/read-only-sources.lisp | 28 +++++++++++++++++++++ 5 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 extensions/lisp-mode/read-only-sources.lisp create mode 100644 src/ext/read-only-sources.lisp diff --git a/extensions/lisp-mode/connection.lisp b/extensions/lisp-mode/connection.lisp index c9294ee77..a305e64e4 100644 --- a/extensions/lisp-mode/connection.lisp +++ b/extensions/lisp-mode/connection.lisp @@ -21,6 +21,7 @@ :connection-command :connection-process :connection-process-directory + :connection-system-file-patterns :connection-plist :self-connection-p) (:export :new-connection diff --git a/extensions/lisp-mode/lem-lisp-mode.asd b/extensions/lisp-mode/lem-lisp-mode.asd index f0172d911..b3afae9f8 100644 --- a/extensions/lisp-mode/lem-lisp-mode.asd +++ b/extensions/lisp-mode/lem-lisp-mode.asd @@ -53,6 +53,9 @@ (:file "ext/test-runner") (:file "ext/utopian") (:file "ext/highlight") + + (:file "read-only-sources") + (:file "package"))) (defsystem "lem-lisp-mode/v2" diff --git a/extensions/lisp-mode/read-only-sources.lisp b/extensions/lisp-mode/read-only-sources.lisp new file mode 100644 index 000000000..176517237 --- /dev/null +++ b/extensions/lisp-mode/read-only-sources.lisp @@ -0,0 +1,14 @@ +(uiop:define-package :lem-lisp-mode/read-only-sources + (:use :cl) + (:import-from :lem/read-only-sources + :define-read-only-source)) +(in-package :lem-lisp-mode/read-only-sources) + +(define-read-only-source sbcl-source (directory) + (alexandria:when-let (connection (lem-lisp-mode/internal:current-connection)) + (dolist (pattern (lem-lisp-mode/connection:connection-system-file-patterns connection)) + (when (pathname-match-p directory pattern) + (return t))))) + +(define-read-only-source quicklisp-dists (directory) + (search "/dists/quicklisp/software/" directory)) diff --git a/lem.asd b/lem.asd index ad1b01263..868539ad2 100644 --- a/lem.asd +++ b/lem.asd @@ -204,7 +204,8 @@ (:file "filer") (:file "deepl") (:file "themes") - (:file "detective"))) + (:file "detective") + (:file "read-only-sources"))) (:module "ui" :serial t diff --git a/src/ext/read-only-sources.lisp b/src/ext/read-only-sources.lisp new file mode 100644 index 000000000..5c3d14e5a --- /dev/null +++ b/src/ext/read-only-sources.lisp @@ -0,0 +1,28 @@ +(uiop:define-package :lem/read-only-sources + (:use :cl :lem) + (:export :define-read-only-source)) +(in-package :lem/read-only-sources) + +(define-editor-variable read-only-sources t) + +(defvar *patterns* (make-hash-table :test 'equal)) + +(defun register-pattern (name function) + (setf (gethash name *patterns*) function)) + +(defmacro define-read-only-source (name (directory) &body body) + `(register-pattern ',name (lambda (,directory) ,@body))) + +(defun read-only-source-p (directory) + (maphash (lambda (name pattern) + (declare (ignore name)) + (when (funcall pattern directory) + (return-from read-only-source-p t))) + *patterns*)) + +(defun on-switch-to-buffer (buffer) + (when (and (variable-value 'read-only-sources :default buffer) + (read-only-source-p (buffer-directory buffer))) + (setf (buffer-read-only-p buffer) t))) + +(add-hook *switch-to-buffer-hook* 'on-switch-to-buffer) From ce7d74aed216465f24c33243c9e3aec12282262b Mon Sep 17 00:00:00 2001 From: cxxxr Date: Sat, 30 Nov 2024 19:02:31 +0900 Subject: [PATCH 2/2] add export --- src/ext/read-only-sources.lisp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ext/read-only-sources.lisp b/src/ext/read-only-sources.lisp index 5c3d14e5a..a991fef16 100644 --- a/src/ext/read-only-sources.lisp +++ b/src/ext/read-only-sources.lisp @@ -1,6 +1,7 @@ (uiop:define-package :lem/read-only-sources (:use :cl :lem) - (:export :define-read-only-source)) + (:export :read-only-sources + :define-read-only-source)) (in-package :lem/read-only-sources) (define-editor-variable read-only-sources t)