From d3206fec16824190ac9816441290f703a407f1a7 Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Sun, 17 Aug 2025 18:51:30 +0100 Subject: [PATCH 1/2] early version of replace_string_function --- femto.primitives.c | 1 + header.h | 3 +++ lisp/dired.lsp | 22 +++++++++++++--- replace.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 4 deletions(-) diff --git a/femto.primitives.c b/femto.primitives.c index 0d4f800..9699f6a 100644 --- a/femto.primitives.c +++ b/femto.primitives.c @@ -43,6 +43,7 @@ DEFINE_EDITOR_FUNC(split_window) DEFINE_EDITOR_FUNC(other_window) DEFINE_EDITOR_FUNC(execute_key) +extern int replace_string_function(char *, char*, int); extern int set_key(char *, char *); extern int getinput(char *, char *, int, int); extern char *get_char(void); diff --git a/header.h b/header.h index 8ab53e3..b258679 100644 --- a/header.h +++ b/header.h @@ -441,6 +441,7 @@ extern void execute_key(); extern void make_key(char *, char *); extern void setup_keys(); + /* functions in main.c */ extern int main(int argc, char **); extern void debug(char *format, ...); @@ -453,6 +454,8 @@ extern void gui(); /* The GUI loop used in interactive mode */ /* functions in replace.c */ extern void query_replace(void); extern void replace_string(buffer_t *, char *, char *, int, int); +extern int replace_string_function(char *, char *, int); + /* functions in search.c */ extern point_t search_backwards(char *); diff --git a/lisp/dired.lsp b/lisp/dired.lsp index c950030..10121d8 100644 --- a/lisp/dired.lsp +++ b/lisp/dired.lsp @@ -15,15 +15,20 @@ ;; ;; ;; -;; (load "path/dired.lsp") ;; to load +;; +;; (load "./lisp/dired.lsp") ;; when testing locally or developing +;; ;; (dired) ;; to call ;; ;; (require 'femto) +;; +;; these contain the state of dired and need to be global ;; (setq dired-dir "") +(setq dired-fspec "") (setq dired-ls-cmd "ls -la ") (setq dired-buffer "*dired*") (setq de-obuf "*scratch*") @@ -36,7 +41,7 @@ (setq de-is-dir nil) (setq de-is-link nil) (setq de-ops 0) -(setq de-max-ops 300) +(setq de-max-ops 3000) (setq de-debug nil) (defun dired () @@ -45,7 +50,7 @@ (delete-other-windows) (setq de-obuf (get-buffer-name)) (kill-buffer dired-buffer) - (shell-command (string.append dired-ls-cmd dired-dir)) + (shell-command (concat dired-ls-cmd dired-dir "/" dired-fspec)) (rename-buffer dired-buffer) (beginning-of-buffer) (set-mark) @@ -98,7 +103,7 @@ (setq de-ops (+ de-ops 1)) (cond ((< de-ops de-max-ops) - (message "dired menu: f,x") + (message "dired menu: s,f,x") (update-display) (setq de-key (get-key)) (cond @@ -124,12 +129,21 @@ (t (de-open-file))) (kill-buffer dired-buffer) (setq de-ops (+ de-max-ops 1))) + ((memq k '("s")) + (de-set-fspec) + (dired)) (t (log-debug (concat "command key=" k "\n"))))) (defun de-open-file() (find-file (concat dired-dir "/" de-name))) +;; +;; set the filter specification for the files (eg *.c) +;; +(defun de-set-fspec() + (setq dired-fspec (prompt "Enter file filter specification: " dired-fspec))) + (defun de-open-dir() (dired-debug de-name) (cond diff --git a/replace.c b/replace.c index 67f90bb..31e835a 100644 --- a/replace.c +++ b/replace.c @@ -84,6 +84,68 @@ void query_replace(void) msg("%d substitutions", numsub); } + +/* + +replace_string_function() + +Non interactive version for calling through lisp +Will replace search string from current point in buffer +to end of buffer + +rcount = number of replacements allowed, 0 means do all + +*/ + +int replace_string_function(char *s, char *r, int rcount) +{ + point_t o_point = curbp->b_point; + point_t l_point = -1; + point_t found; + int slen, rlen; /* length of search and replace strings */ + int numsub = 0; /* number of substitutions */ + + strcpy(searchtext, s); + strcpy(replace, r); + + slen = strlen(searchtext); + rlen = strlen(replace); + + /* + We should do some searious sanity checks here + to avoid potentiall infinite loops etc + */ + + /* scan through the file, from point */ + numsub = 0; + while(TRUE) { + + // have we done the allowed number of replacements ? + // rcount of 0 means do all + if (rcount > 0 && numsub >= rcount) + break; + + found = search_forward(searchtext); + + /* if not found set the point to the last point of replacement, or where we started */ + if (found == -1) { + curbp->b_point = (l_point == -1 ? o_point : l_point); + break; + } + + curbp->b_point = found; + /* search_forward places point at end of search, move to start of search */ + curbp->b_point -= slen; + + l_point = curbp->b_point; /* save last point */ + replace_string(curbp, searchtext, replace, slen, rlen); + numsub++; + } + + return numsub; +} + + void replace_string(buffer_t *bp, char *s, char *r, int slen, int rlen) { /* From ee30ac5fc12616036e450e458d3a2553c4269e48 Mon Sep 17 00:00:00 2001 From: Hugh Barney Date: Mon, 18 Aug 2025 21:51:49 +0100 Subject: [PATCH 2/2] added questions.txt --- misc/questions.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 misc/questions.txt diff --git a/misc/questions.txt b/misc/questions.txt new file mode 100644 index 0000000..8d7cf4c --- /dev/null +++ b/misc/questions.txt @@ -0,0 +1,15 @@ + +what are .sht files ? + + + +/usr/share/femto/femto.rc -> startup + +startup + loads the extension files + set the config keys + load the local config from ~/HOME/.config/femto.rc + +core.lsp - not in the share directory +-- assume loaded by the standalone lisp programme +