Compare commits

..

3 Commits

Author SHA1 Message Date
Sebastian Moser
72a707299f ... 2026-11-02 21:53:31 +01:00
Sebastian Moser
a347145348 stuff 2026-10-22 22:18:58 +02:00
Sebastian Moser
3307802360 update AGENTS.md 2026-10-22 11:05:54 +02:00
48 changed files with 7215 additions and 296 deletions

View File

@@ -1 +1 @@
flake-profile-22-link flake-profile-28-link

View File

@@ -1 +0,0 @@
/nix/store/j6p36ni1qcnyj14ymix6x7744bbzxqpm-nix-shell-env

View File

@@ -0,0 +1 @@
/nix/store/hi26lq3gdw91m2zjx6yx0czi0k5d9w2f-nix-shell-env

2
.gitmodules vendored
View File

@@ -23,5 +23,5 @@
path = src/doom path = src/doom
url = https://github.com/doomemacs/core url = https://github.com/doomemacs/core
[submodule "src/vicinae"] [submodule "src/vicinae"]
path = src/vicinae path = parts/vicinae
url = git@github.com:ppc-social/vicinae.git url = git@github.com:ppc-social/vicinae.git

View File

@@ -8,14 +8,14 @@
"initialization_options": { "initialization_options": {
"linkedProjects": [ "linkedProjects": [
"mize/Cargo.toml", "mize/Cargo.toml",
//"forked-zed/Cargo.toml", "Cargo.toml",
], ],
"cargo": { "cargo": {
"features": [ "target-js", "target-obsidian" ] //"features": [ "target-js", "target-obsidian" ]
//"features": "all" //"features": "all"
}, },
"check": { "check": {
"features": [ "target-js", "target-obsidian" ] //"features": [ "target-js", "target-obsidian" ]
//"features": "all" //"features": "all"
}, },
} }

View File

@@ -1,12 +1,25 @@
# c2vi's dotfiles monorepo # c2vi's dotfiles monorepo
this is c2vi's dotfiles repo and also monorepo where projects of active development are kept as submodules. this is c2vi's dotfiles repo and also monorepo where projects of active development are kept as git submodules.
if you hear anything about parts refer to `mize/docs/part-system.md` for how Mize parts work. for any coding work read these two guides:
@./mize/docs/general-agent-guide.md
@./mize/USING-MIZE-FOR-AGENTS.md
also anything which adds new functionality should be made as a mize part, where possible. ## other notes
make a new one in `./parts` using the following naming schema for the folder `c2vi.vibed.<name-of-part>` or expand an existing part. (but ask the user before doing that) to modify an existing application: wrappers, config files
to create new functionality: mize parts
- if not specified otherwise create the part under `./parts/c2vi.vibed.<name-of-part>` for anything related to c2vi (the owner of these dotfiles) or `./mize/parts/vibed.<name-of-part>` for anything generally usefull to the mize project.
ask before making changes to anything which is outside of `./parts/c2vi.vibed.*`. ## the dotfile system
- most importantly my dotfile system does not install anything to any system locations. there is one symlink of the bashrc to add extra paths. all other programms are wrappers inside the dotfiles repo pointing to config files also in this repository via cmdline flags or env vars. (any new config should apply to this convention)
when developing a new part. present it's config options and methods to the human first. folders:
- ./shared ... any config files which are shared between hosts
- ./hosts/<hostname> ... host specific config files (or partial config files which are included in the shared ones)
- ./hosts/<hostname>/bin ... added to the path of a specific host
- ./bin ... added to the path on every host.
the wrappers need to include the shared config file as well as the host-specific one if it exists. In case the programm does not allow specifying two config files the wrapper should cat both of them into one file in `$TMPDIR/combined-config-of-<prg-name>` everytime the programm is run. (a good example of a wrapper is `./bin/mize`)
longer config files are split up into smaller pieces seperated by a comment like `/////////////// does this and that /////////////` grouping config sections into functional units of sorts. new functionality would get it's own section.

6243
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

11
Cargo.toml Normal file
View File

@@ -0,0 +1,11 @@
[workspace]
members = [
"parts/*",
]
exclude = [
"parts/vicinae",
]
[workspace.dependencies]
mize = { path = "./mize/core" }

View File

@@ -1,5 +1,6 @@
#!/bin/bash #!/bin/bash
# do special stuff if it is run as a daemon by runit.
if [[ -v IS_RUNIT ]]; then if [[ -v IS_RUNIT ]]; then
exec 2>$LOG_DIR/mize exec 2>$LOG_DIR/mize
exec 1>$LOG_DIR/mize exec 1>$LOG_DIR/mize
@@ -8,9 +9,24 @@ if [[ -v IS_RUNIT ]]; then
fi fi
export LD_LIBRARY_PATH=/nix/store/992h4k1s2c0ma186wyc7a3080wrh1cc6-xdotool-4.20260303.1/lib:/nix/store/rsdvlq7wb59hdiwhhvkhx2xvxdkalkzc-webkitgtk-2.52.4+abi=4.1/lib:/nix/store/90ln3xz5m2x3r0ykad4mkg9gnwgrjpzg-pango-1.57.1/lib:/nix/store/l0vl4dali2mvbpi30a8da1f71jl85myg-openssl-3.6.2/lib:/nix/store/s2bjqqzdjs4ji71qm1wwnkiy7g3afdz6-at-spi2-core-2.60.4/lib:/nix/store/fzhjg6xris850npqr92g4m4pskj88brn-atkmm-2.28.5/lib:/nix/store/4zwifnznmqsg3zl8y5yyfafwp4sws6rs-cairo-1.18.4/lib:/nix/store/rgr3i966i5wnblv62fvkid3v3lxy1ivb-gdk-pixbuf-2.44.6/lib:/nix/store/7dl2py4dnp4ffj92r1lq0i54ik1v8kzn-glib-2.88.1/lib:/nix/store/7c73fgj9w0k8qrpq3j1h8h976bk7gqsp-gtk+3-3.24.52/lib:/nix/store/49i3fhgpfffwh3xm3j58ma4z7221sqbq-harfbuzz-13.2.1/lib:/nix/store/na21ka09652cgigpv9wlw904wpq8bnvz-librsvg-2.62.1/lib:/nix/store/jc4y9v7ci45vas65kyl00pzpam3dnbfk-libsoup-3.6.6/lib:/nix/store/3kncz3fkk7sv9xc61x096jnbxvxfnx1k-libxkbcommon-1.13.1/lib:/nix/store/a4h98420m9h8c84r2igrpdd94xsrc9b6-alsa-lib-1.2.15.3/lib:/nix/store/hngmi01i8wgi25a0byrxcn4ysz5j79mw-gcc-15.2.0-lib/lib:/nix/store/xpzd2xmvqpkv1la78qkfpybkfwak27xd-libxcb-1.17.0/lib:/nix/store/6y2b9qs1npwsvcsl9m66hjarzj0yagb4-pipewire-1.6.5/lib:/nix/store/clvzgv5kqq953s4azqhkg3ddgpvgl9wc-wayland-1.25.0/lib:/nix/store/8gyg3xn9i8xdz42yhbl0d3vmmz8phcs0-bzip2-1.0.8/lib export LD_LIBRARY_PATH=/nix/store/992h4k1s2c0ma186wyc7a3080wrh1cc6-xdotool-4.20260303.1/lib:/nix/store/rsdvlq7wb59hdiwhhvkhx2xvxdkalkzc-webkitgtk-2.52.4+abi=4.1/lib:/nix/store/90ln3xz5m2x3r0ykad4mkg9gnwgrjpzg-pango-1.57.1/lib:/nix/store/l0vl4dali2mvbpi30a8da1f71jl85myg-openssl-3.6.2/lib:/nix/store/s2bjqqzdjs4ji71qm1wwnkiy7g3afdz6-at-spi2-core-2.60.4/lib:/nix/store/fzhjg6xris850npqr92g4m4pskj88brn-atkmm-2.28.5/lib:/nix/store/4zwifnznmqsg3zl8y5yyfafwp4sws6rs-cairo-1.18.4/lib:/nix/store/rgr3i966i5wnblv62fvkid3v3lxy1ivb-gdk-pixbuf-2.44.6/lib:/nix/store/7dl2py4dnp4ffj92r1lq0i54ik1v8kzn-glib-2.88.1/lib:/nix/store/7c73fgj9w0k8qrpq3j1h8h976bk7gqsp-gtk+3-3.24.52/lib:/nix/store/49i3fhgpfffwh3xm3j58ma4z7221sqbq-harfbuzz-13.2.1/lib:/nix/store/na21ka09652cgigpv9wlw904wpq8bnvz-librsvg-2.62.1/lib:/nix/store/jc4y9v7ci45vas65kyl00pzpam3dnbfk-libsoup-3.6.6/lib:/nix/store/3kncz3fkk7sv9xc61x096jnbxvxfnx1k-libxkbcommon-1.13.1/lib:/nix/store/a4h98420m9h8c84r2igrpdd94xsrc9b6-alsa-lib-1.2.15.3/lib:/nix/store/hngmi01i8wgi25a0byrxcn4ysz5j79mw-gcc-15.2.0-lib/lib:/nix/store/xpzd2xmvqpkv1la78qkfpybkfwak27xd-libxcb-1.17.0/lib:/nix/store/6y2b9qs1npwsvcsl9m66hjarzj0yagb4-pipewire-1.6.5/lib:/nix/store/clvzgv5kqq953s4azqhkg3ddgpvgl9wc-wayland-1.25.0/lib:/nix/store/8gyg3xn9i8xdz42yhbl0d3vmmz8phcs0-bzip2-1.0.8/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONFIG_DIR/mize/target/debug
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/nix/store/k7bh855izql4rli5hh0s5lsphzc0gnc2-rust-mixed/lib/rustlib/x86_64-unknown-linux-gnu/lib/
exec /home/me/work/config/mize/target/debug/mize --config $CONFIG_DIR/hosts/main/mize.toml --secrets $SECRETS_DIR/mize-secrets.toml "$@" # get some config values from mize
get_config mize.runBuild DO_BUILD
get_config mize.startDev START_DEV
get_config mize.backtrace DO_BACKTRACE
if [[ "$DO_BACKTRACE" == "true" ]] then
export RUST_BACKTRACE=1
fi
# alias sci="cargo run --manifest-path ~/work/config/mize/Cargo.toml --bin mize -- --config $CONFIG_DIR/hosts/main/mize.toml --secrets $SECRETS_DIR/mize-secrets.toml run sci" # a special dev mode which runs the current development version of the program right from the src code. (has mode to recompile as well)
# alias mr="cargo run --manifest-path ~/work/config/mize/Cargo.toml --bin mize -- --config $CONFIG_DIR/hosts/main/mize.toml --secrets $SECRETS_DIR/mize-secrets.toml run" if [[ "$START_DEV" == "true" ]] then
# alias md="cargo run --manifest-path ~/work/config/mize/Cargo.toml --bin mize -- --config $CONFIG_DIR/hosts/main/mize.toml --secrets $SECRETS_DIR/mize-secrets.toml run dev" source $MIZE_STORE/misc/build-env.sh
[[ "$DO_BUILD" == "true" ]] && cargo build --manifest-path $CONFIG_DIR/mize/Cargo.toml --workspace
[[ "$?" != "0" ]] && [[ "$DO_BUILD" == "true" ]] && echo "build failed" && exit 1
exec $MIZE_SRC/target/debug/mize --config $CONFIG_DIR/hosts/main/mize.toml --secrets $SECRETS_DIR/mize-secrets.toml "$@"
fi
# exec the main program with config file parameters
exec /home/me/mize --config $CONFIG_DIR/hosts/main/mize.toml --secrets $SECRETS_DIR/mize-secrets.toml "$@"

View File

@@ -313,11 +313,11 @@ output "HDMI-A-1" {
} }
#################### end from nwg-display #################### end from nwg-display
set $disp2 "DP-1" set $disp2 "eDP-1"
set $disp1 "eDP-1" set $disp1 "DP-1"
workspace 7 output eDP-1 workspace 7 output eDP-1
workspace 0 output HEADLESS-1 workspace 0 output eDP-1
### Input configuration ### Input configuration
input type:keyboard { input type:keyboard {
@@ -397,7 +397,7 @@ output "HDMI-A-1" {
bindsym Escape mode "default" bindsym Escape mode "default"
} }
bindsym --locked $mod+d exec wlr-randr --output eDP-1 --on bindsym --locked $mod+d exec wlr-randr --output eDP-1 --on --right-of DP-1
bindsym --locked $mod+Shift+d exec wlr-randr --output eDP-1 --off bindsym --locked $mod+Shift+d exec wlr-randr --output eDP-1 --off
bindsym $mod+Shift+Return exec $term bindsym $mod+Shift+Return exec $term
@@ -502,11 +502,15 @@ output "HDMI-A-1" {
bindsym $mod+Shift+0 move container to workspace number 10 bindsym $mod+Shift+0 move container to workspace number 10
# default display outputs for workspaces with fallback to disp1 # default display outputs for workspaces with fallback to disp1
workspace 1 output $disp2 $disp1 workspace 1 output eDP-1
workspace 6 output $disp2 $disp1 workspace 6 output eDP-1
workspace 4 output $disp2 $disp1 workspace 4 output eDP-1
workspace 8 output $disp2 $disp1 workspace 8 output eDP-1
workspace 9 output $disp2 $disp1 workspace 9 output DP-1
#assign [title="SCI display"] 3
for_window [title="SCI display"] move container to workspace 9, fullscreen enable
workspace 7 output eDP-1 workspace 7 output eDP-1
workspace 0 output eDP-1 workspace 0 output eDP-1

View File

@@ -54,6 +54,7 @@
;;; clipboard ;;; clipboard
(after! evil (after! evil
(setq interprogram-cut-function nil (setq interprogram-cut-function nil
@@ -84,6 +85,10 @@
;;; in buffer completions ;;; in buffer completions
(setq tab-always-indent 'complete) (setq tab-always-indent 'complete)
(after! corfu (after! corfu
@@ -157,6 +162,10 @@
(setq emms-source-file-default-directory "~/work/music/" (setq emms-source-file-default-directory "~/work/music/"
emms-player-list '(emms-player-mpv)) emms-player-list '(emms-player-mpv))
) )
(when (featurep 'dbusbind)
(after! emms
(require 'emms-mpris)
(emms-mpris-enable)))
;;; infrasonic ;;; infrasonic
(use-package! infrasonic) (use-package! infrasonic)
@@ -189,6 +198,32 @@
(emms-play-url url) (emms-play-url url)
) )
) )
(defun my-get-song-url ()
(interactive)
(let* (
(playlist (infrasonic-get-playlist my-subsonic-client "6ad5avelak6Lnu2yEbWwjj"))
(entries (cdr (assoc 'entry playlist)))
(candidates (list))
(urls '())
(void (dolist (song entries)
(let* (
(artist (cdr (assoc 'artist song)))
(cropped-artist (truncate-string-to-width artist 50))
(title (cdr (assoc 'title song)))
(id (cdr (assoc 'id song)))
(line (format "%-50s - %s" cropped-artist title))
(stream-url (infrasonic-get-stream-url my-subsonic-client id))
)
(add-to-list 'candidates line)
(push (cons line stream-url) urls)
)
))
(completion-result (completing-read "Select track: " candidates))
(url (cdr (assoc completion-result urls)))
)
(message url)
)
)
(defun my-load-playlist () (defun my-load-playlist ()
(interactive) (interactive)
@@ -223,82 +258,180 @@
;;; my finder
(defun my/obsidian--extra-files ()
"Return Markdown files from additional directories."
(let ((directory "~/notes/reference"))
(when (file-directory-p directory)
(directory-files-recursively
(expand-file-name directory)
"\\.md\\'"))))
(defun my/obsidian--candidate-data () ;;; the file buffer opening I used to have in zed
"Return `(DISPLAY . FILE)' candidates for the Obsidian finder." (defun my-toggle-dired-current-dir ()
(let (result) "Toggle between Dired for the current file's directory and the original file."
;; Files known to obsidian.el.
(maphash
(lambda (file metadata)
(let* ((tags (gethash 'tags metadata))
(aliases (gethash 'aliases metadata))
(title (file-name-base file))
(display
(concat
title
(when aliases
(format " [%s]" (string-join aliases ", ")))
(when tags
(format " #%s"
(string-join tags " #"))))))
(push (cons display file) result)))
obsidian-vault-cache)
;; Files in the additional directory.
(dolist (file (my/obsidian--extra-files))
(unless (assoc (file-name-base file) result)
(push (cons (file-name-base file) file) result)))
result))
(defun my-switcher ()
"Fuzzy-find all my stuff"
(interactive) (interactive)
(if (eq major-mode 'dired-mode)
;; If in Dired, cleanly kill the buffer and jump back
(quit-window t)
;; Otherwise, check if visiting a file, then open its directory
(if (buffer-file-name)
(dired (file-name-directory (buffer-file-name)))
(message "Current buffer is not visiting a file."))))
;; Make sure obsidian.el's cache is current. ;; Doom Emacs keybinding macro for Ctrl+Shift+P
;;(obsidian-update) (map! "C-S-p" #'my-toggle-dired-current-dir)
(let* ((data (my/obsidian--candidate-data))
(candidates (mapcar #'car data))
(choice
(completing-read
"things: "
candidates
nil
nil ; allow a new/non-existing note
nil
nil
nil)))
(if-let ((file (cdr (assoc choice data))))
;; Existing note.
(find-file file)
;; New note.
(let ((file ;;; open the config.el file directly instead of the whole config folder
(expand-file-name (map! :leader
(if (string-suffix-p ".md" choice) :desc "Open Doom config.el"
choice "f p" (lambda ()
(concat choice ".md")) (interactive)
(expand-file-name obsidian-inbox-directory (find-file (expand-file-name "config.el" doom-private-dir))))
obsidian-directory))))
(make-directory (file-name-directory file) t)
(find-file file)
)
) ;;; xwidget don't ask when killing a buffer
) (after! xwidget
(remove-hook 'kill-buffer-query-functions #'xwidget-kill-buffer-query-function)
) )
;;; markdown stuff
(use-package! md-mode
:mode ("\\.md\\'" . md-mode))
(after! md-mode
(define-key md-mode-map (kbd "C-h") 'md-mode-goto-heading)
)
;;; evil - use visial line for down/up
(after! evil (after! evil
(map! :gnv "C-e" #'my-switcher) (define-key evil-motion-state-map (kbd "j") 'evil-next-visual-line)
(define-key evil-motion-state-map (kbd "k") 'evil-previous-visual-line)
)
;;; workspace setup
(after! persp-mode
;; Automatically create a "main" workspace for miscellaneous tasks
(setq +workspaces-main "things")
;; Prevent emacsclient from forcing everything into a generic or new blank workspace
(setq persp-emacsclient-init-frame-behaviour-override nil)
(defun my/switch-to-project-workspace-on-client (frame)
"When an emacsclient frame is created, check if a file/folder was passed,
and automatically switch to its matching Doom project workspace."
(with-selected-frame frame
;; Only execute if a target file or directory is actually loaded
(when-let* ((target-path (or (buffer-file-name) default-directory))
;; Ask Projectile to find if this path belongs to a known project root
(project-root (projectile-project-root target-path)))
;; Instruct Doom to switch to the project's named workspace
(+workspace-switch project-root t)
;; Update Projectile's current project state for that workspace context
(setq projectile-project-root project-root))))
;; Hook this function to run every time an emacsclient connection spawns a frame
(add-hook 'after-make-frame-functions #'my/switch-to-project-workspace-on-client)
)
;;; dired
(after! dired
(define-key evil-motion-state-map (kbd "C-n") nil)
(define-key evil-normal-state-map (kbd "C-n") nil)
(define-key dired-mode-map (kbd "C-n") #'dired-create-empty-file)
)
;;; contacts
(use-package! ecard
:defer t
:config
;; Ensure CardDAV capabilities are loaded
(require 'ecard-carddav)
(require 'ecard-sync)
;; Configure your remote CardDAV repository mapping
(setq ecard-carddav-accounts
'(("oxi"
:url "https://oxi.ppc.social"
:user "c2vi"
;; ecard-carddav uses auth-source to securely look up your password/app-password
:auth auth-source)))
;; Set a path where your contacts will be saved locally as vCard files
(setq ecard-sync-local-directory (expand-file-name "~/work/app-data/ecard/")))
(after! ecard
(defun my/ecard-import-vcard-and-sync (file)
"Import a .vcf FILE, save it to the local ecard directory, and sync to CardDAV."
(interactive "fSelect vCard file to import: ")
(unless (file-exists-p file)
(user-error "File does not exist: %s" file))
;; Ensure the target directory exists
(unless (file-directory-p ecard-sync-local-directory)
(make-directory ecard-sync-local-directory t))
(message "Importing %s..." (file-name-nondirectory file))
;; 1. Read and parse the external vCard
(with-temp-buffer
(insert-file-contents file)
(let ((cards (ecard-parse-buffer)))
(if (null cards)
(message "No valid vCards found in file.")
;; 2. Write each parsed card to your local sync directory
(dolist (card cards)
;; ecard-write-card automatically names the file appropriately (often via UUID or Name)
(ecard-write-card card ecard-sync-local-directory))
(message "Successfully imported %d contact(s) locally." (length cards))
;; 3. Push the new local additions to the CardDAV server
(if (y-or-n-p "Sync newly imported contacts to CardDAV now? ")
(progn
(message "Synchronizing with CardDAV...")
(ecard-carddav-sync)
(message "Sync complete!"))
(message "Contacts imported locally. Run M-x ecard-carddav-sync later to upload.")))))))
(use-package! org-contacts
:after org
:config
;; Tell Emacs where your contacts file lives
(setq org-contacts-files '("~/work/app-data/org/contacts.org"))
;; (Optional) Add a custom Org-Capture template for quick entry
(add-to-list 'org-capture-templates
'("c" "Contact" entry (file "~/org/contacts.org")
"* %(org-contacts-template-name)\n :PROPERTIES:\n :EMAIL: %(org-contacts-template-email)\n :PHONE:\n :BIRTHDAY:\n :NOTE:\n :END:")))
;;; matrix client
(setq my/secrets-dir (getenv "SECRETS_DIR"))
(use-package! ement
:config
;; Enable session saving so you don't have to re-authenticate on every launch
(setq ement-save-sessions t)
(when (fboundp 'set-fontset-font)
(set-fontset-font t 'emoji '("Noto Color Emoji" . "iso10646-1") nil 'prepend))
(run-with-idle-timer 2 nil (lambda ()
(ement-connect :user-id "@me:matrix.c2vi.dev"
:uri-prefix "http://100.88.79.207:8000"
:password (f-read (expand-file-name "priv.matrix.pwd" my/secrets-dir)))
;; my account on ppc's matrix
(ement-connect :user-id "@c2vi:ppc.social"
:uri-prefix "https://matrix.ppc.social")
))
) )
@@ -306,12 +439,16 @@
;;; scratch ;;; scratch
(defun my/scratch () (defun my/scratch ()
(lookup-key corfu-map (kbd "C-u")) (lookup-key dired-mode-map (kbd "C-n"))
(lookup-key corfu-map (kbd "C-i")) (lookup-key corfu-map (kbd "C-i"))
(define-key corfu-map (kbd "C-i") 'my/corfu-insert-first) (define-key corfu-map (kbd "C-i") 'my/corfu-insert-first)
(emms-insert-url "https://tunes.c2vi.dev/rest/stream.view?u=c2vi&t=59248d02914f93abee797adcf0f14d6a&s=8a3988f950895ee7bd87e17651e65eb1&v=1.16.1&c=infrasonic&f=json&id=0FnN5Sb3mCItKdIiJZcG7x") (emms-insert-url "https://tunes.c2vi.dev/rest/stream.view?u=c2vi&t=59248d02914f93abee797adcf0f14d6a&s=8a3988f950895ee7bd87e17651e65eb1&v=1.16.1&c=infrasonic&f=json&id=0FnN5Sb3mCItKdIiJZcG7x")
(infrasonic-get-stream-url my-subsonic-client)
(message emms-playlist-buffer) (message emms-playlist-buffer)
(+workspace-current-name)
(selected-frame)
) )

View File

@@ -6,7 +6,8 @@
;; If there is more than one, they won't work right. ;; If there is more than one, they won't work right.
'(custom-safe-themes '(custom-safe-themes
'("0325a6b5eea7e5febae709dab35ec8648908af12cf2d2b569bedc8da0a3a81c1" '("0325a6b5eea7e5febae709dab35ec8648908af12cf2d2b569bedc8da0a3a81c1"
"aec7b55f2a13307a55517fdf08438863d694550565dee23181d2ebd973ebd6b8" default))) "aec7b55f2a13307a55517fdf08438863d694550565dee23181d2ebd973ebd6b8" default))
'(ement-e2ee-mode t))
(custom-set-faces (custom-set-faces
;; custom-set-faces was added by Custom. ;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful. ;; If you edit it by hand, you could mess it up, so be careful.

View File

@@ -150,21 +150,21 @@
;;javascript ; all(hope(abandon(ye(who(enter(here)))))) ;;javascript ; all(hope(abandon(ye(who(enter(here))))))
;;julia ; a better, faster MATLAB ;;julia ; a better, faster MATLAB
;;kotlin ; a better, slicker Java(Script) ;;kotlin ; a better, slicker Java(Script)
;;latex ; writing papers in Emacs has never been so fun latex ; writing papers in Emacs has never been so fun
;;lean ; for folks with too much to prove ;;lean ; for folks with too much to prove
;;ledger ; be audit you can be ;;ledger ; be audit you can be
;;lua ; one-based indices? one-based indices lua ; one-based indices? one-based indices
markdown ; writing docs for people to ignore (markdown +grip) ; writing docs for people to ignore
;;nim ; python + lisp at the speed of c ;;nim ; python + lisp at the speed of c
;;nix ; I hereby declare "nix geht mehr!" ;;nix ; I hereby declare "nix geht mehr!"
;;ocaml ; an objective camel ;;ocaml ; an objective camel
;;odin ; C, minus its footguns ;;odin ; C, minus its footguns
org ; organize your plain life in plain text (org +contacts) ; organize your plain life in plain text
;;php ; perl's insecure younger brother ;;php ; perl's insecure younger brother
;;plantuml ; diagrams for confusing people more ;;plantuml ; diagrams for confusing people more
;;graphviz ; diagrams for confusing yourself even more ;;graphviz ; diagrams for confusing yourself even more
;;purescript ; javascript, but functional ;;purescript ; javascript, but functional
;;python ; beautiful is better than ugly python ; beautiful is better than ugly
;;qt ; the 'cutest' gui framework ever ;;qt ; the 'cutest' gui framework ever
;;racket ; a DSL for DSLs ;;racket ; a DSL for DSLs
;;raku ; the artist formerly known as perl6 ;;raku ; the artist formerly known as perl6
@@ -180,8 +180,8 @@
;;solidity ; do you need a blockchain? No. ;;solidity ; do you need a blockchain? No.
;;swift ; who asked for emoji variables? ;;swift ; who asked for emoji variables?
;;terra ; Earth and Moon in alignment for performance. ;;terra ; Earth and Moon in alignment for performance.
;;web ; the tubes web ; the tubes
;;yaml ; JSON, but readable yaml ; JSON, but readable
;;zig ; C, but simpler ;;zig ; C, but simpler
:email :email

View File

@@ -66,3 +66,27 @@
:recipe (:host github :repo "systemfreund/supersonic.el" ) :recipe (:host github :repo "systemfreund/supersonic.el" )
:pin "8d422489ffc84cc3907232afb51349c576c26cba" :pin "8d422489ffc84cc3907232afb51349c576c26cba"
) )
(package! textui
:recipe (:host github :repo "yibie/textui")
:pin "8b3010d0f251b52dd1867c741d18bf66e405922d"
)
(package! md-mode
:recipe (:host github :repo "yibie/md-mode")
:pin "d9e7e1d83a8601a9bda2fd604f6a0881a4f9a838"
)
(package! ecard
:recipe (:host github :repo "jwiegley/ecard" :files ("*.el"))
:pin "e79cd68c49466f132142b5ce1a4eaa4fbb47fb8c"
)
(package! ement)
(package! org-contrib)
(package! org-contacts)
(package! ement-e2ee
:recipe (:host github :repo "bhwdev/ement-e2ee" :files ("*.el"))
:pin "3a2ec437814716aba8b4803ce91d4489402c41d9"
)

14
flake.lock generated
View File

@@ -2519,11 +2519,11 @@
"rust-overlay": "rust-overlay_2" "rust-overlay": "rust-overlay_2"
}, },
"locked": { "locked": {
"lastModified": 1780921813, "lastModified": 1792001584,
"narHash": "sha256-yqQ4OmdWs691nfjxKcrDrbnjeQQwlXnmLj8IG0AbWyU=", "narHash": "sha256-gRpyAAsKEsREyOa7J6WngNpmbbR4VjUB8MeFZHmXWDo=",
"ref": "refs/heads/master", "ref": "refs/heads/master",
"rev": "c57849f748ba20134f79b76e42e0c85786dd637f", "rev": "105eca862da9d8e54ad68c30d308f7c937861552",
"revCount": 203, "revCount": 212,
"type": "git", "type": "git",
"url": "https://git.ppc.social/ppc/ppc" "url": "https://git.ppc.social/ppc/ppc"
}, },
@@ -4463,11 +4463,11 @@
}, },
"nixpkgs_5": { "nixpkgs_5": {
"locked": { "locked": {
"lastModified": 1774709303, "lastModified": 1782467914,
"narHash": "sha256-D3Q07BbIA2KnTcSXIqqu9P586uWxN74zNoCH3h2ESHg=", "narHash": "sha256-pGvFkM8N0xEkIIXDe5YYfbEAvHrk4IxBrjB/x8OomhE=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "8110df5ad7abf5d4c0f6fb0f8f978390e77f9685", "rev": "e73de5be04e0eff4190a1432b946d469c794e7b4",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@@ -1,5 +1,5 @@
{ inputs, pkgs, secretsDir, config, dataDir, ... }: let { inputs, pkgs, secretsDir, config, dataDir, lib, ... }: let
in { in {
@@ -407,142 +407,4 @@ in {
}; };
############################## backups to fusu ##################################
users.users.borgs = {
uid = 2000;
isNormalUser = true;
group = "borgs";
};
users.groups.borgs = {
gid = 2000;
};
home-manager.users.borgs = { secretsDir, ... }: {
imports = [
../users/common/home.nix
];
home.file.".ssh/known_hosts".text = ''
195.201.148.94 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBuxoYAjNYi3q2SFlzoVQTePcsnmT+qFHuaiiclC+S5I
195.201.148.94 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCtDgdBTd8apRMBTweK9ZMRTdFqkU1mbKQDmyXSXbhSQAYwlgkmh1ee4TBE4nt/2b28QT5AqWOazVraqlAoSp+n7GwdsPH26lhbuF+ZVHq05X3RuJLmbhOsa6QlPzjSHiyj+Onkmj9DyXwKhhMErGcT1n2nhC4Oi007qsqcYQIB/YJ7hmMDABMzm9Bwd5Rk6xsDfz+9umvSMpwtfctpKixoVq90Fe3X6wloo5sgXpqfdP1IDFxfiaDp6nOQuOhvcA1Z67oGpW3T8CbZ5aDqA8e1vtpkl7oT3YolR+5153B/e0zOSAk8AabfkLdvrReECg2AHloH7hf9TOBVH0RVZluK+GRVJoaO2b3EspwIlThdQthiZH5/6vwDLsY6zNw6bUlKNntcNbJ5ZHc7zVv03Zlbpp6aWye0O3HR1PkaOo7pragEX9VAGj8Af2fNinSZVtd30gZlRFhLXQRAad+gC9R/5Q9X7V9BZBbWZ3J9DCP5zFoM9Y2R2YySjHX8Dmy7Jps=
195.201.148.94 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAFh44c1Efqv/g8lvjDSY6uBYevByf1fg4BhLVcfYudqrSSSwbeaPrv6B+M5psrHo6/zthciDzp4oYUG8ANVRWs=
[localhost]:49388 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFr1jHueUdsh4Bc9meR1Var4hbZKLCnZGfCSpsP0oOeS
[localhost]:49388 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDHr9ZzEzC+2s1YNfPsFqDMbZv+o4XG2tEWlAF3DzzgdDawwxSj963qR46OqefPO+yiPBR/x3tFjXtSQ96qDcum9fzuiSzB+z5+/Zhs7VWEPi9ugGTDLFpX823EQrgcVKFE4jWnGsx6Ek8C9YojKgKf5afHG+ww2jNhTPHgVTrQkqo0JzUEnfjhJ/1/WluzpiGHfIy9re5MU10f2z9Vja7M0oDZ/Je+zavA4tlQpZ3URQnCEKC2vf7DhtwYBAOuyXKMdUSaTNdeTytmDjxdhJ38q8bwTHtfLUBzyYjW012Q5d1+/g1dqInu99uN/+UjTJc/GFiqLCE0tmco1GafptnKHJLgDC93vE832G5qvxhykfUAJdNW58kbWugeQm6Rb0i1UL5ckVHurMZT9BL6E9LKV0SewozyBtnA21RKu1vsheN86N0uBLwn3v1r0H3xPL4+S1WbmpXpIoCAoyTLc2janw2Gt22W1p08tv+a+lntFVqBn5ZSpcaUxQ6wRQQAfokqDh5YUzb+Tu9Fxi483qb6bd18io3kMLDre3G4xXqlvAB386Uj8iAYivmZIPBEFDCWBVki9LzWPfQGumgYN0CqSM6Gpqk0RnyU1CNPACEGaRpE1ph4Dgl9NQzRCiw/fEUiMZy1CTkly1YCiqSpp2iMmsJw+QJjfAbehEP+Tl8NIQ==
'';
programs.ssh = {
enable = true;
matchBlocks = {
"*" = {
identityFile = "/home/borgs/backups/borgs-private";
};
ouranos = {
hostname = "195.201.148.94";
user = "root";
};
fusus = {
hostname = "localhost";
user = "server";
port = 49388;
};
ocih = {
hostname = "152.67.70.13";
user = "ubuntu";
};
};
};
};
# automatically creates the mountpoint as well!!
fileSystems."/home/borgs/backups" = {
device = "/home/files/storage/backups/servers";
options = [ "bind" ];
};
# ouranus
systemd.services.backup-ouranos-minecraft = {
enable = true;
description = "backup the /var/minecraft folder on ouranus to fusu";
unitConfig = {
Type = "simple";
};
path = with pkgs; [ curl bash socat borgbackup openssh ];
serviceConfig = {
ExecStart = "/home/borgs/backups/ouranos-minecraft.sh";
User = "borgs";
Group = "borgs";
WorkingDirectory = "/home/borgs/backups";
ExecStopPost = "/home/borgs/backups/exit-ouranos-minecraft.sh";
};
wants = [ "home-files-storage.mount" ];
};
systemd.timers.backup-ouranos-minecraft = {
wantedBy = [ "timers.target" ];
timerConfig = {
#OnBootSec = "5m";
#nUnitActiveSec = "1d";
OnCalendar = "*-*-* 04:00:00";
Persistent = "True";
Unit = "backup-ouranos-minecraft.service";
};
};
# ouranus
systemd.services.backup-fusu-server = {
enable = true;
description = "backup the ~/server folder on fusus";
unitConfig = {
Type = "simple";
};
path = with pkgs; [ curl bash socat borgbackup openssh ];
serviceConfig = {
ExecStart = "/home/borgs/backups/fusu-server.sh";
User = "borgs";
Group = "borgs";
WorkingDirectory = "/home/borgs/backups";
ExecStopPost = "/home/borgs/backups/exit-fusu-server.sh";
};
wants = [ "home-files-storage.mount" ];
};
systemd.timers.backup-fusu-server = {
wantedBy = [ "timers.target" ];
timerConfig = {
#OnBootSec = "5m";
#OnUnitActiveSec = "1d";
OnCalendar = "*-*-* 03:00:00";
Persistent = "True";
Unit = "backup-fusu-server.service";
};
};
# ocih
systemd.services.backup-ocih = {
enable = true;
description = "backup the ~/host folder on ocih";
unitConfig = {
Type = "simple";
};
path = with pkgs; [ curl bash socat borgbackup openssh ];
serviceConfig = {
ExecStart = "/home/borgs/backups/ocih.sh";
User = "borgs";
Group = "borgs";
WorkingDirectory = "/home/borgs/backups";
ExecStopPost = "/home/borgs/backups/exit-ocih.sh";
};
wants = [ "home-files-storage.mount" ];
};
systemd.timers.backup-ocih = {
wantedBy = [ "timers.target" ];
timerConfig = {
#OnBootSec = "5m";
#OnUnitActiveSec = "1d";
OnCalendar = "*-*-* 02:00:00";
Persistent = "True";
Unit = "backup-ocih.service";
};
};
} }

View File

@@ -24,10 +24,12 @@ in {
inputs.mize.nixosModules.default inputs.mize.nixosModules.default
]; ];
mize.enable = true; mize.enable = true;
mize.debugBinary = "/data/external/config/target/debug/mac-os"; mize.debugBinary = "/home/me/here/mize";
mize.debugConfigFile = "/home/me/host/mize-config.toml"; mize.debugConfigFile = "/home/me/host/mize/config.toml";
systemd.user.services.mize.environment.LOG= "trace"; systemd.user.services.mize.environment.LOG= "trace";
systemd.user.services.mize.serviceConfig.EnvironmentFile = "/home/me/host/mize/daemon.env"; systemd.user.services.mize.environment.MIZE_CONFIG_FILES = lib.mkForce "/home/me/host/mize/config.toml:/home/me/host/mize/daemon-config.toml";
programs.nix-ld.enable = true; programs.nix-ld.enable = true;
# https://nixos.wiki/wiki/OBS_Studio # https://nixos.wiki/wiki/OBS_Studio
@@ -192,7 +194,7 @@ in {
enable = true; enable = true;
systemd = true; systemd = true;
settings = { settings = {
authorized_fingerprints."f1:f2:c8:38:fd:e9:34:2f:a0:79:49:b4:ca:d6:4e:c6:31:10:42:1b:9f:ba:61:6f:41:9a:b7:ce:1a:32:47:a1" = "main"; authorized_fingerprints."35:02:e0:1c:64:de:a8:08:6a:65:d3:5a:20:ed:68:0f:c9:0a:50:bd:b7:03:4d:da:e9:c7:22:f5:79:48:0d:69" = "main";
port = 4410; port = 4410;
clients = [ clients = [
{ {

View File

@@ -6,6 +6,8 @@ export SVDIR=$CONFIG_DIR/hosts/main/services
export BASH_ENV=$CONFIG_DIR/hosts/main/bashrc export BASH_ENV=$CONFIG_DIR/hosts/main/bashrc
export HOSTNAME=main export HOSTNAME=main
export DOOMDIR="$CONFIG_DIR/doomdir" export DOOMDIR="$CONFIG_DIR/doomdir"
export MIZE_SRC=$CONFIG_DIR/mize
export MIZE_STORE=~/work/app-data/mize
mkdir -p $LOG_DIR mkdir -p $LOG_DIR
# arch path # arch path
@@ -76,6 +78,9 @@ function get_config() {
myconfig["ssh.bin"]="/bin/ssh" myconfig["ssh.bin"]="/bin/ssh"
myconfig["mize.configFile"]="$CONFIG_DIR/hosts/main/" myconfig["mize.configFile"]="$CONFIG_DIR/hosts/main/"
myconfig["mize.secretsFile"]="~/secrets/mize-config.toml" myconfig["mize.secretsFile"]="~/secrets/mize-config.toml"
myconfig["mize.startDev"]="true"
myconfig["mize.runBuild"]="false"
myconfig["mize.backtrace"]="false"
# nixos case # nixos case
if [[ "$DISTRO" == "nixos" ]]; then if [[ "$DISTRO" == "nixos" ]]; then

44
hosts/main/bin/direnv-diff Executable file
View File

@@ -0,0 +1,44 @@
#!/usr/bin/env python
import os
import subprocess
import sys
import shlex
def read_env(data):
return dict(
item.split(b"=", 1)
for item in data.split(b"\0")
if item
)
def main():
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} DIR", file=sys.stderr)
return 2
before = {
os.fsencode(k): os.fsencode(v)
for k, v in os.environ.items()
}
result = subprocess.run(
["direnv", "exec", sys.argv[1], "env", "-0"],
stdout=subprocess.PIPE,
check=True,
)
after = read_env(result.stdout)
for key, value in after.items():
if before.get(key) != value:
name = os.fsdecode(key)
val = os.fsdecode(value)
print(f"export {name}={shlex.quote(val)}")
if __name__ == "__main__":
sys.exit(main())

View File

@@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
exec emacsclient "$@" exec emacsclient -c -n "$PWD/$1"

View File

@@ -10,4 +10,4 @@ export DOOMDIR="$CONFIG_DIR/doomdir"
echo $DOOMDIR echo $DOOMDIR
echo ------------- echo -------------
exec emacs --init-directory $CONFIG_DIR/src/doom --fg-daemon "$@" exec nixGL emacs --init-directory $CONFIG_DIR/src/doom --fg-daemon "$@"

9
hosts/main/bin/xdg-open Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/bash
echo XDG-OPEN args: > ~/last-xdg-open-call
echo $@ >> ~/last-xdg-open-call
exec /usr/bin/xdg-open "$@"

View File

@@ -3,6 +3,7 @@
192.168.3.1 gw 192.168.3.1 gw
192.168.3.1 gw.c2vi.dev 192.168.3.1 gw.c2vi.dev
192.168.3.105 mac 192.168.3.105 mac
100.88.79.207 matrix.c2vi.dev
# netbird # netbird
100.88.137.49 te 100.88.137.49 te

View File

@@ -212,6 +212,21 @@ hl.monitor({
scale = 1, scale = 1,
}) })
-- toggle display
hl.bind(mod .. " + D", function()
hl.monitor({
output = "eDP-1",
disabled = false
})
end)
hl.bind(mod .. " + SHIFT + D", function()
hl.monitor({
output = "eDP-1",
disabled = true
})
end)
-- ppc ne -- ppc ne
hl.bind("F12", hl.dsp.exec_cmd("mize run sci ne")) hl.bind("F12", hl.dsp.exec_cmd("mize run sci ne"))
hl.bind("F11", hl.dsp.exec_cmd("mize run sci ne -b")) hl.bind("F11", hl.dsp.exec_cmd("mize run sci ne -b"))

View File

@@ -3,8 +3,14 @@ data_dir = "/home/me/work/app-data/mize/misc"
store = "/home/me/work/app-data/mize" store = "/home/me/work/app-data/mize"
spacetime.url = "100.88.46.87:8005" spacetime.url = "100.88.46.87:8005"
namespace = "priv.c2vi.dev" namespace = "priv.c2vi.dev"
log.level = "debug"
enable = [ "cli", "auth", "sci.timetrack", "sci", "c2vi", "spacetime", "dev" ] part_path = "/home/me/work/config/mize/target/debug/"
mize.src = "/home/me/work/config/mize"
parts = [ "cli", "auth.client", "dev", "mme" ]
#parts = [ "cli", "dev", "mme" ]
#parts = [ "cli", "auth", "spacetime", "sci", "c2vi", "dev" ]
enable = [ "cli", "auth", "spacetime", "sci", "c2vi", "dev", "sci.timetrack" ]
timetrack.dailyNotesPath = "/home/me/work/things/nico/daily" timetrack.dailyNotesPath = "/home/me/work/things/nico/daily"

View File

@@ -1 +1 @@
1158 1095

View File

@@ -1 +1 @@
1159 1093

View File

@@ -1 +1 @@
1160 1094

View File

@@ -27,7 +27,7 @@ pacstrap -K /cachy base base-devel vim nix less direnv nvim
pacstrap -K /cachy wayland firefox alacritty dms-shell git cmake paru pacstrap -K /cachy wayland firefox alacritty dms-shell git cmake paru
pacstrap -K /cachy freerdp remmina pacstrap -K /cachy freerdp remmina
pacstrap -K /cachy brightnessctl playerctl nm-connection-editor ttf-hack zenity prismlauncher docker inetutils freerdp pacstrap -K /cachy brightnessctl playerctl nm-connection-editor ttf-hack zenity prismlauncher docker inetutils freerdp noto-fonts-emoji
``` ```
## chroot ## chroot

2
mize

Submodule mize updated: a7db7da9d2...6eedb1826a

View File

@@ -190,7 +190,7 @@ cb() {
# rech # rech
function rech(){ function rech(){
python3 -c "print($@)" python3 -c "from math import *; print($@)"
} }

View File

@@ -48,6 +48,7 @@
- 8008 vikunja todo (task.ppc.social) - 8008 vikunja todo (task.ppc.social)
- 8009 oxi-cloud - 8009 oxi-cloud
- 8010 ppc-site - 8010 ppc-site
- 8011 ppc-site
## hosting container ips (on the interface br-proxy) ## hosting container ips (on the interface br-proxy)
- fusu 192.168.1.2 - fusu 192.168.1.2
@@ -481,6 +482,7 @@ in {
{ name = "c2vi-tunes"; domain = "tunes.c2vi.dev"; host = "fasu"; port = 8001; middlewares = [ "oidc-c2vi-navidrome" ]; } { name = "c2vi-tunes"; domain = "tunes.c2vi.dev"; host = "fasu"; port = 8001; middlewares = [ "oidc-c2vi-navidrome" ]; }
{ name = "c2vi-lidarr"; domain = "lidarr.c2vi.dev"; host = "fasu"; port = 8000; middlewares = [ "oidc-c2vi-lidarr" ]; } { name = "c2vi-lidarr"; domain = "lidarr.c2vi.dev"; host = "fasu"; port = 8000; middlewares = [ "oidc-c2vi-lidarr" ]; }
{ name = "c2vi-spot"; domain = "spot.c2vi.dev"; host = "fasu"; port = 8006; middlewares = [ "oidc-c2vi-lidarr" ]; } { name = "c2vi-spot"; domain = "spot.c2vi.dev"; host = "fasu"; port = 8006; middlewares = [ "oidc-c2vi-lidarr" ]; }
{ name = "llm"; domain = "llm.ppc.social"; host = "ppc-hosting"; port = 8011; }
#{ name = "spacetime"; domain = "spacetime.ppc.social"; host = "ppc-hosting"; port = 8005; extraRouterConfig = { #{ name = "spacetime"; domain = "spacetime.ppc.social"; host = "ppc-hosting"; port = 8005; extraRouterConfig = {
# rule = "Host(`spacetime.ppc.social`) && PathPrefix(`/v1/database`)"; # rule = "Host(`spacetime.ppc.social`) && PathPrefix(`/v1/database`)";

View File

@@ -41,48 +41,21 @@
in { in {
imports = [
inputs.arion.nixosModules.arion
];
environment.systemPackages = [ environment.systemPackages = [
(createArionServiceManager "backup" "") #(createArionServiceManager "backup" "")
pkgs.arion pkgs.arion
# Do install the docker CLI to talk to podman. # Do install the docker CLI to talk to podman.
# Not needed when virtualisation.docker.enable = true; # Not needed when virtualisation.docker.enable = true;
pkgs.docker-client #pkgs.docker-client
# add all the service managers # add all the service managers
]; ];
# Arion works with Docker, but for NixOS-based containers, you need Podman # Arion works with Docker, but for NixOS-based containers, you need Podman
# since NixOS 21.05. # since NixOS 21.05.
virtualisation.docker.enable = false; virtualisation.docker.enable = true;
virtualisation.podman.enable = true;
virtualisation.podman.dockerSocket.enable = true;
# https://github.com/containers/netavark/issues/274#issuecomment-4215665765
virtualisation.containers.containersConf.settings = {
network = {
network_backend = "netavark";
firewall_driver = "none";
};
};
users.extraUsers.me.extraGroups = ["podman"]; users.extraUsers.me.extraGroups = ["docker"];
users.extraUsers.server.extraGroups = ["podman"];
virtualisation.arion = {
backend = "podman-socket";
};
virtualisation.arion.projects.backup.serviceName = "backup";
virtualisation.arion.projects.backup.settings.services = backupContainers [
{ name = "c2vi"; port = 8001; }
{ name = "mom"; port = 8002; }
{ name = "dad"; port = 8003; }
{ name = "brother"; port = 8004; }
];
} }

18
parts/c2vi/Cargo.toml Normal file
View File

@@ -0,0 +1,18 @@
[package]
name = "mize-part-c2vi"
version = "0.1.0"
edition = "2024"
[lib]
name = "mize_part_c2vi"
path = "./src/mpart.rs"
crate-type = ["cdylib", "rlib"]
[features]
default = ["desktop"]
desktop = ["dep:dioxus"]
[dependencies]
mize = { workspace = true }
cmd_lib = "2.0.1"
dioxus = { version = "0.7", optional = true, features = ["desktop"] }

View File

@@ -0,0 +1,11 @@
[package]
name = "mize-generated-c2vi"
version = "0.1.0"
edition = "2024"
[lib]
name = "mize_generated_c2vi"
path = "src/lib.rs"
[dependencies]
mize = { workspace = true }

View File

@@ -0,0 +1,92 @@
// AUTO-GENERATED by mize dev gen -- do not edit manually
use mize::prelude::*;
use mize::config::MizeFun;
pub struct CliPart {
id: MizeId
}
impl MizePart for CliPart {
fn id(&self) -> MizeResult<MizeId> {
Ok(self.id.clone())
}
}
impl CliPart {
pub fn get(name: &str) -> MizeResult<CliPart> {
let mut mize = get_global_mize()?;
let part = mize.get_part(name)?;
Ok(CliPart { id: part.id()? })
}
pub fn set_command(&self, arg0: &str) -> MizeResult<()> {
let mut args = ItemData::new();
args.set_path("0", arg0.into_item_data())?;
dyn_call(self.id.clone(), "set_command", args)?;
Ok(())
}
pub fn subcommand(&self, arg0: Command, arg1: MizeFun) -> MizeResult<()> {
let mut args = ItemData::new();
let mut __arg0 = ItemData::new();
__arg0.set_path("_native", arg0.native_num)?;
args.set_path("0", __arg0)?;
args.set_path("1", ItemData::fun(arg1)?)?;
dyn_call(self.id.clone(), "subcommand", args)?;
Ok(())
}
pub fn run(&self, arg0: Vec<String>) -> MizeResult<()> {
let mut args = ItemData::new();
args.set_path("0", arg0.into_item_data())?;
dyn_call(self.id.clone(), "run", args)?;
Ok(())
}
pub fn opt_state(&self) -> MizeResult<ItemData> {
get_config(&format!("{}/state", self.id.dot()))
}
}
// native type: Command (clap::Command)
pub struct Command {
pub native_num: u32
}
impl FromItemData for Command {
fn from_itemdata(data: ItemData) -> MizeResult<Self> {
Ok(Command { native_num: data.get_path("_native")?.value_u32()? })
}
}
impl Command {
pub fn new(arg0: &str) -> MizeResult<Command> {
let mut args = ItemData::new();
args.set_path("0", arg0.into_item_data())?;
let mut mize = get_global_mize()?;
let id = mize.id_new_dots("cli.Command")?;
let data = dyn_call(id, "new", args)?;
let native_num: u32 = data.get_path("_native")?.value_u32()?;
Ok(Command { native_num })
}
}
// native type: ArgMatches (clap::ArgMatches)
pub struct ArgMatches {
pub native_num: u32
}
impl FromItemData for ArgMatches {
fn from_itemdata(data: ItemData) -> MizeResult<Self> {
Ok(ArgMatches { native_num: data.get_path("_native")?.value_u32()? })
}
}
impl ArgMatches {
}
// part id string: cli

2
parts/c2vi/part Normal file
View File

@@ -0,0 +1,2 @@
id = "c2vi"
gen = [ "cli" ]

37
parts/c2vi/src/dash.rs Normal file
View File

@@ -0,0 +1,37 @@
#[cfg(feature = "desktop")]
use dioxus::prelude::*;
#[cfg(feature = "desktop")]
pub fn launch_c2vi_dashboard() {
unsafe {
std::env::remove_var("WAYLAND_DISPLAY");
std::env::set_var("DISPLAY", ":0");
}
use dioxus::desktop::{Config, WindowBuilder};
dioxus::LaunchBuilder::new()
.with_cfg(
Config::new().with_window(
WindowBuilder::new()
.with_decorations(false)
.with_title("SCI display"),
),
)
.launch(c2vi_dash_main);
}
#[cfg(feature = "desktop")]
fn c2vi_dash_main() -> Element {
// spacetime SDK not wired yet — show a clear failure state until then
let current = use_signal(|| "spacetime SDK not wired yet".to_string());
let next = use_signal(|| "".to_string());
rsx! {
div {
style: "text-align: center; padding: 2rem; font-size: 120px;",
p { "{current}" }
p {
style: "font-size: 50px; color: grey; opacity: 0.7;",
"{next}"
}
}
}
}

159
parts/c2vi/src/deploy.rs Normal file
View File

@@ -0,0 +1,159 @@
use crate::generated::ArgMatches;
use cmd_lib::run_cmd as sh;
use mize::prelude::*;
fn cfg_str(key: &str) -> MizeResult<String> {
get_global_mize()?.get_config(key)?.value_string()
}
fn cfg_str_or(key: &str, default: &str) -> String {
get_global_mize()
.ok()
.and_then(|mut m| m.get_config(key).ok())
.and_then(|v| v.value_string().ok())
.unwrap_or_else(|| default.to_owned())
}
pub fn remote_deploy(_matches: ArgMatches, hostname: &str) -> MizeResult<()> {
let config_src = cfg_str("c2vi.config_src")?;
let rsync_excludes = cfg_str("c2vi.rsync_excludes")?;
let remote_src_dir = cfg_str(&format!("c2vi.deploy.{hostname}.remote_dir"))?;
let mize_store_dir = cfg_str(&format!("c2vi.deploy.{hostname}.mize_store_dir"))?;
let rclone_flag = cfg_str_or(&format!("c2vi.deploy.{hostname}.rsync_chown"), "");
let bin = cfg_str_or("c2vi.deploy.bin", "mize");
let do_mize_restart = false;
unsafe {
std::env::set_var("SRC", &config_src);
std::env::set_var("HOSTNAME", hostname);
}
sh!(echo cmd: rsync -r -u -v -a --delete --perms $rclone_flag --include=".git/" --include=".git/**" --exclude="target" --mkpath $rsync_excludes $config_src/ $hostname:$remote_src_dir)?;
sh!(rsync -r -u -v -a --delete --perms $rclone_flag --include=".git/" --include=".git/**" --exclude="target" --mkpath $rsync_excludes $config_src/ $hostname:$remote_src_dir)?;
let ssh_cmd = format!(
r#"
if ! tmux has-session -t mize-deploy 2>/dev/null; then
echo "Created new tmux session...."
tmux new-session -d -s mize-deploy "nix develop git+file://{remote_src_dir}/mize#buildShell --max-jobs 1"
else
echo "using existing session..."
fi
tmux send-keys -t mize-deploy "DO_MIZE_RESTART={do_mize_restart}" Enter
tmux send-keys -t mize-deploy "cargo build --manifest-path {remote_src_dir}/mize/Cargo.toml --bin {bin}" Enter
tmux send-keys -t mize-deploy 'BUILD_SUCCESS=$?' Enter
tmux send-keys -t mize-deploy '[[ "$BUILD_SUCCESS" == "0" ]] && echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" > {mize_store_dir}/daemon.env' Enter
tmux send-keys -t mize-deploy '[[ "$BUILD_SUCCESS" == "0" ]] && echo "MIZE_CONFIG_FILES={mize_store_dir}/config.toml" >> {mize_store_dir}/daemon.env' Enter
tmux send-keys -t mize-deploy '[[ "$BUILD_SUCCESS" == "0" ]] && [[ "$HOSTNAME" == "nico" ]] && echo "PATH=/root/work/path-extra:$PATH" >> {mize_store_dir}/daemon.env' Enter
tmux send-keys -t mize-deploy '[[ "$BUILD_SUCCESS" == "0" ]] && [[ "$DO_MIZE_RESTART" == "true" ]] && systemctl --user restart mize' Enter
"#
);
sh!(ssh $hostname $ssh_cmd)?;
Ok(())
}
pub fn new_deploy(_matches: ArgMatches, hostname: &str) -> MizeResult<()> {
let config_src = cfg_str("c2vi.config_src")?;
let path = cfg_str(&format!("c2vi.deploy.{hostname}.mize_bin_dir"))?;
let is_release = hostname == "mac";
let ld_lib_path = std::env::var("LD_LIBRARY_PATH").unwrap_or_default();
unsafe {
std::env::set_var("SRC", &config_src);
}
if is_release {
sh!(echo cmd: cargo build --manifest-path $config_src/mize/Cargo.toml --bin mize --release)?;
sh!(cargo build --manifest-path $config_src/mize/Cargo.toml --bin mize --release)?;
sh!(echo cmd: patchelf --set-rpath $ld_lib_path $config_src/mize/target/release/mize)?;
let _ = sh!(patchelf --set-rpath $ld_lib_path $config_src/mize/target/release/mize);
sh!(echo cmd: scp $config_src/mize/target/release/mize $hostname:$path)?;
sh!(scp $config_src/mize/target/release/mize $hostname:$path)?;
} else {
sh!(echo cmd: cargo build --manifest-path $config_src/mize/Cargo.toml --bin mize)?;
sh!(cargo build --manifest-path $config_src/mize/Cargo.toml --bin mize)?;
sh!(echo cmd: patchelf --set-rpath $ld_lib_path $config_src/mize/target/debug/mize)?;
let _ = sh!(patchelf --set-rpath $ld_lib_path $config_src/mize/target/debug/mize);
sh!(echo cmd: scp $config_src/mize/target/debug/mize $hostname:$path)?;
sh!(scp $config_src/mize/target/debug/mize $hostname:$path)?;
}
Ok(())
}
pub fn deploy_spacetime(_: ArgMatches) -> MizeResult<()> {
let mize_src = cfg_str("c2vi.mize_src")?;
let module_path = cfg_str_or(
"c2vi.deploy.spacetime.module_path",
&format!("{mize_src}/marts/spacetime"),
);
let config_src = cfg_str("c2vi.config_src")?;
unsafe {
std::env::set_var("SRC", &config_src);
}
let cmd = format!(
r#"
if ! tmux has-session -t mize-deploy 2>/dev/null; then
echo "Created new tmux session...."
systemd-run --user --scope --description="mize deploy tmux session" tmux new-session -d -s mize-deploy "nix develop git+file://$SRC/mize --impure"
else
echo "using existing session..."
fi
tmux send-keys -t mize-deploy "spacetime publish -p {module_path} --yes mize" Enter
"#
);
sh!(/bin/sh -c "$cmd")?;
Ok(())
}
pub fn obsidian_deploy(_: ArgMatches) -> MizeResult<()> {
let config_src = cfg_str("c2vi.config_src")?;
let plugin_dir = cfg_str("c2vi.deploy.obsidian.plugin_dir")?;
unsafe {
std::env::set_var("SRC", &config_src);
}
let cmd = format!(
r#"
if ! tmux has-session -t mize-deploy 2>/dev/null; then
echo "Created new tmux session...."
systemd-run --user --scope --description="mize deploy tmux session" tmux new-session -d -s mize-deploy "nix develop git+file://$SRC/mize --impure"
else
echo "using existing session..."
fi
tmux send-keys -t mize-deploy "deno run --config {config_src}/mize/apps/obsidian-plugin/deno.json build" Enter
tmux send-keys -t mize-deploy "cp -r {config_src}/mize/apps/obsidian-plugin/dist/* {plugin_dir}/" Enter
"#
);
sh!(/bin/sh -c "$cmd")?;
Ok(())
}
pub fn main_deploy(_: ArgMatches) -> MizeResult<()> {
let config_src = cfg_str("c2vi.config_src")?;
let daemon_env = cfg_str("c2vi.deploy.main.daemon_env")?;
unsafe {
std::env::set_var("SRC", &config_src);
}
let cmd = format!(
r#"
if ! tmux has-session -t mize-deploy 2>/dev/null; then
systemd-run --user --scope --description="mize deploy tmux session" tmux new-session -d -s mize-deploy "nix develop git+file://$SRC/mize#buildShell"
else
echo "using existing session..."
fi
tmux send-keys -t mize-deploy "cargo build --manifest-path $SRC/mize/Cargo.toml --bin mize" Enter
tmux send-keys -t mize-deploy 'echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" > {daemon_env}' Enter
tmux send-keys -t mize-deploy "systemctl --user restart mize" Enter
"#
);
sh!(/bin/sh -c "$cmd")?;
Ok(())
}

View File

@@ -0,0 +1,74 @@
use mize::prelude::*;
pub struct CliPart {
id: MizeId,
}
impl MizePart for CliPart {
fn id(&self) -> MizeResult<MizeId> {
Ok(self.id.clone())
}
}
impl CliPart {
pub fn get(name: &str) -> MizeResult<CliPart> {
let mut mize = get_global_mize()?;
let part = mize.get_part(name)?;
Ok(CliPart { id: part.id()? })
}
pub fn set_command(&self, name: &str) -> MizeResult<()> {
let mut args = ItemData::new();
args.set_path("0", name.into_item_data())?;
dyn_call(self.id.clone(), "set_command", args)?;
Ok(())
}
pub fn subcommand<T: Fn(ArgMatches) -> MizeResult<()> + Send + Sync + 'static>(
&self,
subcmd: Command,
action: T,
) -> MizeResult<()> {
let mut subcmd_arg = ItemData::new();
subcmd_arg.set_path("_native", subcmd.native_id)?;
let action_arg = ItemData::fun(Box::new(move |args: ItemData| {
let matches = args.clone().get_path("0")?.native_take_from::<ArgMatches>()?;
action(matches)?;
Ok(ItemData::new())
}))?;
let mut args = ItemData::new();
args.set_path("0", subcmd_arg)?;
args.set_path("1", action_arg)?;
dyn_call(self.id.clone(), "subcommand", args)?;
Ok(())
}
}
pub struct Command {
native_id: u32,
}
pub struct ArgMatches {
#[allow(dead_code)]
native_id: u32,
}
impl FromItemData for ArgMatches {
fn from_itemdata(data: ItemData) -> MizeResult<Self> {
Ok(ArgMatches {
native_id: data.get_path("_native")?.value_u32()?,
})
}
}
impl Command {
pub fn new(name: &str) -> MizeResult<Command> {
let mut args = ItemData::new();
args.set_path("0", name.into_item_data())?;
let mut mize = get_global_mize()?;
let id = mize.id_new_dots("cli.Command")?;
let data = dyn_call(id, "new", args)?;
let native_id: u32 = data.get_path("_native")?.native_take()?;
Ok(Command { native_id })
}
}

152
parts/c2vi/src/mpart.rs Normal file
View File

@@ -0,0 +1,152 @@
mod dash;
mod deploy;
mod generated;
use generated::{CliPart, Command};
use mize::prelude::*;
fn ensure_default(rel: &str, default: ItemData) -> MizeResult<()> {
let mut mize = get_global_mize()?;
let cur = mize
.cur_eval_part()?
.ok_or_else(|| mize_err!("no cur_eval_part"))?;
let full = format!("{}.{}", cur.dot(), rel);
if mize.get_config(&full).is_ok() {
return Ok(());
}
let segs: Vec<&str> = rel.split('.').filter(|s| !s.is_empty()).collect();
let last = *segs.last().ok_or_else(|| mize_err!("empty opt path"))?;
let mut parent = cur.clone();
for seg in &segs[..segs.len() - 1] {
parent = parent.join(seg)?;
}
let original = Some(cur);
mize.set_cur_eval_part(Some(parent))?;
opt(last).default_val(default);
mize.set_cur_eval_part(original)?;
Ok(())
}
fn declare_deploy_defaults() -> MizeResult<()> {
ensure_default("mize_src", "/home/me/work/config/mize".into_item_data())?;
ensure_default("config_src", "/home/me/work/config".into_item_data())?;
ensure_default(
"rsync_excludes",
"--exclude=node_modules --exclude=target --exclude=mize_config.toml --exclude=rust_dist --exclude=deno_dist --exclude=dist --exclude=result --exclude=pkg --exclude /src --exclude obsidian-brat --exclude forked-zed".into_item_data(),
)?;
ensure_default("dash.enable", false.into_item_data())?;
ensure_default("deploy.bin", "mize".into_item_data())?;
ensure_default("deploy.te.remote_dir", "/home/me/here/config".into_item_data())?;
ensure_default("deploy.te.mize_store_dir", "/home/me/host/mize".into_item_data())?;
ensure_default("deploy.te.rsync_chown", "".into_item_data())?;
ensure_default("deploy.mac.remote_dir", "/data/external/config".into_item_data())?;
ensure_default("deploy.mac.mize_store_dir", "/home/me/host/mize".into_item_data())?;
ensure_default("deploy.mac.rsync_chown", "".into_item_data())?;
ensure_default("deploy.mac.mize_bin_dir", "/home/me/here/mize".into_item_data())?;
ensure_default(
"deploy.files.remote_dir",
"/home/files/here/config".into_item_data(),
)?;
ensure_default(
"deploy.files.mize_store_dir",
"/home/files/storage/files/mize".into_item_data(),
)?;
ensure_default("deploy.files.rsync_chown", "".into_item_data())?;
ensure_default(
"deploy.ppc-hosting.remote_dir",
"/root/host/c2vi-config".into_item_data(),
)?;
ensure_default(
"deploy.ppc-hosting.mize_store_dir",
"/root/host/mize".into_item_data(),
)?;
ensure_default(
"deploy.ppc-hosting.rsync_chown",
"--chown=root:root".into_item_data(),
)?;
ensure_default(
"deploy.nico.remote_dir",
"/root/work/config-c2vi".into_item_data(),
)?;
ensure_default(
"deploy.nico.mize_store_dir",
"/root/work/app-data/mize".into_item_data(),
)?;
ensure_default(
"deploy.nico.rsync_chown",
"--chown=root:root".into_item_data(),
)?;
ensure_default(
"deploy.main.daemon_env",
"/home/me/work/app-data/mize/daemon.env".into_item_data(),
)?;
ensure_default(
"deploy.obsidian.plugin_dir",
"/home/me/work/things/.obsidian/plugins/mize".into_item_data(),
)?;
ensure_default(
"deploy.spacetime.module_path",
"/home/me/work/config/mize/marts/spacetime".into_item_data(),
)?;
Ok(())
}
#[unsafe(no_mangle)]
pub extern "C" fn part_c2vi() -> MizeResult<()> {
declare_deploy_defaults()?;
let cli = CliPart::get("cli")?;
cli.set_command("dev")?;
cli.subcommand(Command::new("deploy-lush")?, |m| deploy::remote_deploy(m, "te"))?;
cli.subcommand(Command::new("dlu")?, |m| deploy::remote_deploy(m, "te"))?;
cli.subcommand(Command::new("deploy-mac")?, |m| deploy::new_deploy(m, "mac"))?;
cli.subcommand(Command::new("dmc")?, |m| deploy::new_deploy(m, "mac"))?;
cli.subcommand(Command::new("deploy-files")?, |m| {
deploy::remote_deploy(m, "files")
})?;
cli.subcommand(Command::new("dfi")?, |m| deploy::remote_deploy(m, "files"))?;
cli.subcommand(Command::new("deploy-ppc")?, |m| {
deploy::remote_deploy(m, "ppc-hosting")
})?;
cli.subcommand(Command::new("dpp")?, |m| {
deploy::remote_deploy(m, "ppc-hosting")
})?;
cli.subcommand(Command::new("deploy-nico")?, |m| {
deploy::remote_deploy(m, "nico")
})?;
cli.subcommand(Command::new("dni")?, |m| deploy::remote_deploy(m, "nico"))?;
cli.subcommand(Command::new("deploy-main")?, deploy::main_deploy)?;
cli.subcommand(Command::new("dma")?, deploy::main_deploy)?;
cli.subcommand(Command::new("deploy-obsidian")?, deploy::obsidian_deploy)?;
cli.subcommand(Command::new("do")?, deploy::obsidian_deploy)?;
cli.subcommand(Command::new("deploy-spacetime")?, deploy::deploy_spacetime)?;
cli.subcommand(Command::new("dsp")?, deploy::deploy_spacetime)?;
#[cfg(feature = "desktop")]
{
let enable = get_global_mize()?
.get_config("c2vi.dash.enable")
.ok()
.and_then(|v| v.value_bool().ok())
.unwrap_or(false);
if enable {
dash::launch_c2vi_dashboard();
}
}
Ok(())
}

View File

@@ -18,6 +18,11 @@ in rec {
src = /home/me/work/config/gitignore/runc; src = /home/me/work/config/gitignore/runc;
}); });
myEmacs = pkgsUnstable.emacs-pgtk.override {
withXwidgets = true;
};
qtrs = pkgs.stdenv.mkDerivation { qtrs = pkgs.stdenv.mkDerivation {
name = "qt rust bindings"; name = "qt rust bindings";

View File

@@ -108,13 +108,13 @@
}, },
}, },
{ {
"context": "((os != macos && Editor) && edit_prediction_conflict)", "context": "((os != macos && Editor) && (edit_prediction && (showing_completions || in_leading_whitespace)))",
"bindings": { "bindings": {
//"ctrl-l": "editor::AcceptEditPrediction" //"ctrl-l": "editor::AcceptEditPrediction"
}, },
}, },
{ {
"context": "((os != macos && Editor) && edit_prediction_conflict)", "context": "((os != macos && Editor) && (edit_prediction && (showing_completions || in_leading_whitespace)))",
"bindings": { "bindings": {
"ctrl-i": "editor::AcceptEditPrediction", "ctrl-i": "editor::AcceptEditPrediction",
}, },

View File

@@ -285,13 +285,14 @@
"rust-analyzer": { "rust-analyzer": {
"initialization_options": { "initialization_options": {
"cargo": { "cargo": {
"features": "all" "features": "all",
"targetDir": "zed-target"
}, },
"check": { "check": {
"features": "all" "features": "all"
}, },
"rust": { "rust": {
"analyzerTargetDir": true "analyzerTargetDir": "target/analyzer"
} }
} }
}, },