From ebbd08d9da9811b4a448f7a4d93fc13ac90bd352 Mon Sep 17 00:00:00 2001 From: cage Date: Sun, 6 Feb 2022 10:43:57 +0100 Subject: [PATCH] - [kami] added 'file-explorer-mark-by-regexp'. --- etc/init.lisp | 2 ++ src/package.lisp | 1 + src/ui-goodies.lisp | 30 ++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/etc/init.lisp b/etc/init.lisp index 54e7f8d..6d5f07d 100644 --- a/etc/init.lisp +++ b/etc/init.lisp @@ -620,6 +620,8 @@ (define-key "m" #'file-explorer-mark-entry *filesystem-explorer-keymap*) +(define-key "M-m" #'file-explorer-mark-by-regexp *filesystem-explorer-keymap*) + (define-key "up" #'file-explorer-go-up *filesystem-explorer-keymap*) (define-key "down" #'file-explorer-go-down *filesystem-explorer-keymap*) diff --git a/src/package.lisp b/src/package.lisp index 9a5a732..666711b 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -2829,6 +2829,7 @@ :file-explorer-go-up :file-explorer-search :file-explorer-mark-entry + :file-explorer-mark-by-regexp :file-explorer-delete-tree :file-explorer-delete-marked :file-explorer-scroll-begin diff --git a/src/ui-goodies.lisp b/src/ui-goodies.lisp index 5435e82..fdc6322 100644 --- a/src/ui-goodies.lisp +++ b/src/ui-goodies.lisp @@ -2679,6 +2679,36 @@ Note: existing file will be overwritten." (fstree:mark-node win path) (file-explorer-go-down)))) +(defun %mark-by-regexp (scanner) + (when-let* ((win *filesystem-explorer-window*) + (count 0)) + (line-oriented-window:loop-rows + (win row + when (cl-ppcre:scan scanner + (fstree:tree-path (line-oriented-window:fields row))) do) + (let ((path (fstree:tree-path (line-oriented-window:fields row)))) + (fstree:mark-node win path) + (incf count))) + count)) + +(defun file-explorer-mark-by-regexp () + (when-let* ((win *filesystem-explorer-window*)) + (labels ((on-input-complete (regexp) + (let ((scanner (ignore-errors (create-scanner regexp + :case-insensitive-mode nil)))) + (if (null scanner) + (error-message (format nil (_"Invalid regular expression ~a") regexp)) + (with-enqueued-process () + (let ((count (%mark-by-regexp scanner))) + (windows:win-clear win) + (windows:draw win) + (info-message (format nil (n_ "Marked ~a item" + "Marked ~a items" + count) + count)))))))) + (ask-string-input #'on-input-complete + :prompt (format nil (_ "Mark items matching: ")))))) + (defun file-explorer-delete-tree () (when-let* ((win *filesystem-explorer-window*) (fields (line-oriented-window:selected-row-fields win))