;; -*- mode: emacs-lisp; lexical-binding: t -*-
;; This file is loaded by Spacemacs at startup.
;; It must be stored in your home directory.

(defun dotspacemacs/layers ()
  "Layer configuration:
This function should only modify configuration layer settings."
  (setq-default
   ;; Base distribution to use. This is a layer contained in the directory
   ;; `+distribution'. For now available distributions are `spacemacs-base'
   ;; or `spacemacs'. (default 'spacemacs)
   dotspacemacs-distribution 'spacemacs

   ;; Lazy installation of layers (i.e. layers are installed only when a file
   ;; with a supported type is opened). Possible values are `all', `unused'
   ;; and `nil'. `unused' will lazy install only unused layers (i.e. layers
   ;; not listed in variable `dotspacemacs-configuration-layers'), `all' will
   ;; lazy install any layer that support lazy installation even the layers
   ;; listed in `dotspacemacs-configuration-layers'. `nil' disable the lazy
   ;; installation feature and you have to explicitly list a layer in the
   ;; variable `dotspacemacs-configuration-layers' to install it.
   ;; (default 'unused)
   dotspacemacs-enable-lazy-installation 'unused

   ;; If non-nil then Spacemacs will ask for confirmation before installing
   ;; a layer lazily. (default t)
   dotspacemacs-ask-for-lazy-installation t

   ;; List of additional paths where to look for configuration layers.
   ;; Paths must have a trailing slash (i.e. "~/.mycontribs/")
   dotspacemacs-configuration-layer-path '()

   ;; List of configuration layers to load.
   dotspacemacs-configuration-layers
   '(windows-scripts
     swift
     multiple-cursors ;; https://www.spacemacs.org/layers/+misc/multiple-cursors/README.html#key-bindings
     (aider :variables
            aidermacs-default-chat-mode 'architect
            aidermacs-default-model "oca/gpt5"
            aidermacs-backend 'vterm ;; Highly recommended for Spacemacs/Mac users over comint
            aidermacs-program "/opt/homebrew/bin/ocaider"
            aidermacs-extra-args '("--watch-files")
            )

     shell
     yaml
     notmuch
     themes-megapack
     nginx
     toml
     html
     (python :variables
             python-backend 'lsp
             python-lsp-server 'pyright
             )
     javascript
     pandoc
     ;; ----------------------------------------------------------------
     ;; Example of useful layers you may want to use right away.
     ;; Uncomment some layer names and press `SPC f e R' (Vim style) or
     ;; `M-m f e R' (Emacs style) to install them.
     ;; ----------------------------------------------------------------
     (auto-completion :variables
                      auto-completion-enable-snippets-in-popup t
                      auto-completion-enable-help-tooltip t
                      auto-completion-use-company-box t
                      auto-completion-enable-sort-by-usage t)
     ;; better-defaults
     emacs-lisp
     git
     helm
     lsp
     markdown
     (org :variables
          org-enable-bootstrap-support t
          org-enable-jira-support t
          jiralib-url "https://jira.oci.oraclecorp.com"
          jiralib-target-api-version 2
          ;; org-enable-roam-support t
          ;; org-enable-roam-ui t
          ;; org-roam-completion-everywhere t
          ;; this does not work weel with my current font
          ;; org-enable-modern-support t
          )
     ;; (shell :variables
     ;;        shell-default-height 30
     ;;        shell-default-position 'bottom)
     (spell-checking :variables spell-checking-enable-by-default nil)
     syntax-checking
     ;; version-control
     treemacs
     (docker    :variables docker-dockerfile-backend 'lsp)
     (terraform :variables terraform-backend 'lsp)
     (conda :variables
            conda-anaconda-home "/opt/homebrew/Caskroom/miniconda/base")
     )


   ;; List of additional packages that will be installed without being wrapped
   ;; in a layer (generally the packages are installed only and should still be
   ;; loaded using load/require/use-package in the user-config section below in
   ;; this file). If you need some configuration for these packages, then
   ;; consider creating a layer. You can also put the configuration in
   ;; `dotspacemacs/user-config'. To use a local version of a package, use the
   ;; `:location' property: '(your-package :location "~/path/to/your-package/")
   ;; Also include the dependencies as they will not be resolved automatically.

   ;; as ofr Oct2024, MS Outlook does not support getting selected message via AppleScript
   ;; more here: https://forum.keyboardmaestro.com/t/new-outlook-applescript/31296
   dotspacemacs-additional-packages '(
                                      org-mac-link
                                      org-alert
                                      org-msg
                                      ai-code
                                        ;org-caldav
                                        ;org-protocol
                                      )

   ;; A list of packages that cannot be updated.
   dotspacemacs-frozen-packages '()

   ;; A list of packages that will not be installed and loaded.
   dotspacemacs-excluded-packages '()

   ;; Defines the behaviour of Spacemacs when installing packages.
   ;; Possible values are `used-only', `used-but-keep-unused' and `all'.
   ;; `used-only' installs only explicitly used packages and deletes any unused
   ;; packages as well as their unused dependencies. `used-but-keep-unused'
   ;; installs only the used packages but won't delete unused ones. `all'
   ;; installs *all* packages supported by Spacemacs and never uninstalls them.
   ;; (default is `used-only')
   dotspacemacs-install-packages 'used-only))

(defun dotspacemacs/init ()
  "Initialization:
This function is called at the very beginning of Spacemacs startup,
before layer configuration.
It should only modify the values of Spacemacs settings."
  ;; This setq-default sexp is an exhaustive list of all the supported
  ;; spacemacs settings.
  (setq-default
   ;; If non-nil then enable support for the portable dumper. You'll need to
   ;; compile Emacs 27 from source following the instructions in file
   ;; EXPERIMENTAL.org at to root of the git repository.
   ;;
   ;; WARNING: pdumper does not work with Native Compilation, so it's disabled
   ;; regardless of the following setting when native compilation is in effect.
   ;;
   ;; (default nil)
   dotspacemacs-enable-emacs-pdumper nil

   ;; Name of executable file pointing to emacs 27+. This executable must be
   ;; in your PATH.
   ;; (default "emacs")
   dotspacemacs-emacs-pdumper-executable-file "emacs"

   ;; Name of the Spacemacs dump file. This is the file will be created by the
   ;; portable dumper in the cache directory under dumps sub-directory.
   ;; To load it when starting Emacs add the parameter `--dump-file'
   ;; when invoking Emacs 27.1 executable on the command line, for instance:
   ;;   ./emacs --dump-file=$HOME/.emacs.d/.cache/dumps/spacemacs-27.1.pdmp
   ;; (default (format "spacemacs-%s.pdmp" emacs-version))
   dotspacemacs-emacs-dumper-dump-file (format "spacemacs-%s.pdmp" emacs-version)

   ;; Maximum allowed time in seconds to contact an ELPA repository.
   ;; (default 5)
   dotspacemacs-elpa-timeout 5

   ;; Set `gc-cons-threshold' and `gc-cons-percentage' when startup finishes.
   ;; This is an advanced option and should not be changed unless you suspect
   ;; performance issues due to garbage collection operations.
   ;; (default '(100000000 0.1))
   dotspacemacs-gc-cons '(100000000 0.1)

   ;; Set `read-process-output-max' when startup finishes.
   ;; This defines how much data is read from a foreign process.
   ;; Setting this >= 1 MB should increase performance for lsp servers
   ;; in emacs 27.
   ;; (default (* 1024 1024))
   dotspacemacs-read-process-output-max (* 1024 1024)

   ;; If non-nil then Spacelpa repository is the primary source to install
   ;; a locked version of packages. If nil then Spacemacs will install the
   ;; latest version of packages from MELPA. Spacelpa is currently in
   ;; experimental state please use only for testing purposes.
   ;; (default nil)
   dotspacemacs-use-spacelpa nil

   ;; If non-nil then verify the signature for downloaded Spacelpa archives.
   ;; (default t)
   dotspacemacs-verify-spacelpa-archives t

   ;; If non-nil then spacemacs will check for updates at startup
   ;; when the current branch is not `develop'. Note that checking for
   ;; new versions works via git commands, thus it calls GitHub services
   ;; whenever you start Emacs. (default nil)
   dotspacemacs-check-for-update nil

   ;; If non-nil, a form that evaluates to a package directory. For example, to
   ;; use different package directories for different Emacs versions, set this
   ;; to `emacs-version'. (default 'emacs-version)
   dotspacemacs-elpa-subdirectory 'emacs-version

   ;; One of `vim', `emacs' or `hybrid'.
   ;; `hybrid' is like `vim' except that `insert state' is replaced by the
   ;; `hybrid state' with `emacs' key bindings. The value can also be a list
   ;; with `:variables' keyword (similar to layers). Check the editing styles
   ;; section of the documentation for details on available variables.
   ;; (default 'vim)
   dotspacemacs-editing-style 'vim

   ;; If non-nil show the version string in the Spacemacs buffer. It will
   ;; appear as (spacemacs version)@(emacs version)
   ;; (default t)
   dotspacemacs-startup-buffer-show-version t

   ;; Specify the startup banner. Default value is `official', it displays
   ;; the official spacemacs logo. An integer value is the index of text
   ;; banner, `random' chooses a random text banner in `core/banners'
   ;; directory. A string value must be a path to an image format supported
   ;; by your Emacs build.
   ;; If the value is nil then no banner is displayed. (default 'official)
   dotspacemacs-startup-banner 'official

   ;; Scale factor controls the scaling (size) of the startup banner. Default
   ;; value is `auto' for scaling the logo automatically to fit all buffer
   ;; contents, to a maximum of the full image height and a minimum of 3 line
   ;; heights. If set to a number (int or float) it is used as a constant
   ;; scaling factor for the default logo size.
   dotspacemacs-startup-banner-scale 'auto

   ;; List of items to show in startup buffer or an association list of
   ;; the form `(list-type . list-size)`. If nil then it is disabled.
   ;; Possible values for list-type are:
   ;; `recents' `recents-by-project' `bookmarks' `projects' `agenda' `todos'.
   ;; List sizes may be nil, in which case
   ;; `spacemacs-buffer-startup-lists-length' takes effect.
   ;; The exceptional case is `recents-by-project', where list-type must be a
   ;; pair of numbers, e.g. `(recents-by-project . (7 .  5))', where the first
   ;; number is the project limit and the second the limit on the recent files
   ;; within a project.
   dotspacemacs-startup-lists '((recents . 5)
                                (projects . 7))

   ;; True if the home buffer should respond to resize events. (default t)
   dotspacemacs-startup-buffer-responsive t

   ;; Show numbers before the startup list lines. (default t)
   dotspacemacs-show-startup-list-numbers t

   ;; The minimum delay in seconds between number key presses. (default 0.4)
   dotspacemacs-startup-buffer-multi-digit-delay 0.4

   ;; If non-nil, show file icons for entries and headings on Spacemacs home buffer.
   ;; This has no effect in terminal or if "all-the-icons" package or the font
   ;; is not installed. (default nil)
   dotspacemacs-startup-buffer-show-icons nil

   ;; Default major mode for a new empty buffer. Possible values are mode
   ;; names such as `text-mode'; and `nil' to use Fundamental mode.
   ;; (default `text-mode')
   dotspacemacs-new-empty-buffer-major-mode 'text-mode

   ;; Default major mode of the scratch buffer (default `text-mode')
   dotspacemacs-scratch-mode 'text-mode

   ;; If non-nil, *scratch* buffer will be persistent. Things you write down in
   ;; *scratch* buffer will be saved and restored automatically.
   dotspacemacs-scratch-buffer-persistent nil

   ;; If non-nil, `kill-buffer' on *scratch* buffer
   ;; will bury it instead of killing.
   dotspacemacs-scratch-buffer-unkillable nil

   ;; Initial message in the scratch buffer, such as "Welcome to Spacemacs!"
   ;; (default nil)
   dotspacemacs-initial-scratch-message nil

   ;; List of themes, the first of the list is loaded when spacemacs starts.
   ;; Press `SPC T n' to cycle to the next theme in the list (works great
   ;; with 2 themes variants, one dark and one light)
   dotspacemacs-themes '(
                         spacemacs-dark
                         doom-solarized-dark
                         spacemacs-light
                         doom-solarized-dark-high-contrast-theme
                         )

   ;; Set the theme for the Spaceline. Supported themes are `spacemacs',
   ;; `all-the-icons', `custom', `doom', `vim-powerline' and `vanilla'. The
   ;; first three are spaceline themes. `doom' is the doom-emacs mode-line.
   ;; `vanilla' is default Emacs mode-line. `custom' is a user defined themes,
   ;; refer to the DOCUMENTATION.org for more info on how to create your own
   ;; spaceline theme. Value can be a symbol or list with additional properties.
   ;; (default '(spacemacs :separator wave :separator-scale 1.5))
   dotspacemacs-mode-line-theme '(spacemacs :separator wave :separator-scale 1.5)

   ;; If non-nil the cursor color matches the state color in GUI Emacs.
   ;; (default t)
   dotspacemacs-colorize-cursor-according-to-state t

   ;; Default font or prioritized list of fonts. This setting has no effect when
   ;; running Emacs in terminal. The font set here will be used for default and
   ;; fixed-pitch faces. The `:size' can be specified as
   ;; a non-negative integer (pixel size), or a floating-point (point size).
   ;; Point size is recommended, because it's device independent. (default 10.0)
   ;; commented out on 30.7.2025 - seems not to have effect
   ;; dotspacemacs-default-font '("Source Code Pro for Powerline"
   ;;                             :height 180
   ;;                             :weight normal
   ;;                             :width normal)

   ;; The leader key (default "SPC")
   dotspacemacs-leader-key "SPC"

   ;; The key used for Emacs commands `M-x' (after pressing on the leader key).
   ;; (default "SPC")
   dotspacemacs-emacs-command-key "SPC"

   ;; The key used for Vim Ex commands (default ":")
   dotspacemacs-ex-command-key ":"

   ;; The leader key accessible in `emacs state' and `insert state'
   ;; (default "M-m")
   dotspacemacs-emacs-leader-key "M-m"

   ;; Major mode leader key is a shortcut key which is the equivalent of
   ;; pressing `<leader> m`. Set it to `nil` to disable it. (default ",")
   dotspacemacs-major-mode-leader-key ","

   ;; Major mode leader key accessible in `emacs state' and `insert state'.
   ;; (default "C-M-m" for terminal mode, "<M-return>" for GUI mode).
   ;; Thus M-RET should work as leader key in both GUI and terminal modes.
   ;; C-M-m also should work in terminal mode, but not in GUI mode.
   dotspacemacs-major-mode-emacs-leader-key (if window-system "<M-return>" "C-M-m")

   ;; These variables control whether separate commands are bound in the GUI to
   ;; the key pairs `C-i', `TAB' and `C-m', `RET'.
   ;; Setting it to a non-nil value, allows for separate commands under `C-i'
   ;; and TAB or `C-m' and `RET'.
   ;; In the terminal, these pairs are generally indistinguishable, so this only
   ;; works in the GUI. (default nil)
   dotspacemacs-distinguish-gui-tab nil

   ;; Name of the default layout (default "Default")
   dotspacemacs-default-layout-name "Default"

   ;; If non-nil the default layout name is displayed in the mode-line.
   ;; (default nil)
   dotspacemacs-display-default-layout nil

   ;; If non-nil then the last auto saved layouts are resumed automatically upon
   ;; start. (default nil)
   dotspacemacs-auto-resume-layouts t

   ;; If non-nil, auto-generate layout name when creating new layouts. Only has
   ;; effect when using the "jump to layout by number" commands. (default nil)
   dotspacemacs-auto-generate-layout-names nil

   ;; Size (in MB) above which spacemacs will prompt to open the large file
   ;; literally to avoid performance issues. Opening a file literally means that
   ;; no major mode or minor modes are active. (default is 1)
   dotspacemacs-large-file-size 1

   ;; Location where to auto-save files. Possible values are `original' to
   ;; auto-save the file in-place, `cache' to auto-save the file to another
   ;; file stored in the cache directory and `nil' to disable auto-saving.
   ;; (default 'cache)
   dotspacemacs-auto-save-file-location 'cache

   ;; Maximum number of rollback slots to keep in the cache. (default 5)
   dotspacemacs-max-rollback-slots 5

   ;; If non-nil, the paste transient-state is enabled. While enabled, after you
   ;; paste something, pressing `C-j' and `C-k' several times cycles through the
   ;; elements in the `kill-ring'. (default nil)
   dotspacemacs-enable-paste-transient-state nil

   ;; Which-key delay in seconds. The which-key buffer is the popup listing
   ;; the commands bound to the current keystroke sequence. (default 0.4)
   dotspacemacs-which-key-delay 0.4

   ;; Which-key frame position. Possible values are `right', `bottom' and
   ;; `right-then-bottom'. right-then-bottom tries to display the frame to the
   ;; right; if there is insufficient space it displays it at the bottom.
   ;; It is also possible to use a posframe with the following cons cell
   ;; `(posframe . position)' where position can be one of `center',
   ;; `top-center', `bottom-center', `top-left-corner', `top-right-corner',
   ;; `top-right-corner', `bottom-left-corner' or `bottom-right-corner'
   ;; (default 'bottom)
   dotspacemacs-which-key-position 'bottom

   ;; Control where `switch-to-buffer' displays the buffer. If nil,
   ;; `switch-to-buffer' displays the buffer in the current window even if
   ;; another same-purpose window is available. If non-nil, `switch-to-buffer'
   ;; displays the buffer in a same-purpose window even if the buffer can be
   ;; displayed in the current window. (default nil)
   dotspacemacs-switch-to-buffer-prefers-purpose nil

   ;; Whether side windows (such as those created by treemacs or neotree)
   ;; are kept or minimized by `spacemacs/toggle-maximize-window' (SPC w m).
   ;; (default t)
   dotspacemacs-maximize-window-keep-side-windows t

   ;; If non-nil a progress bar is displayed when spacemacs is loading. This
   ;; may increase the boot time on some systems and emacs builds, set it to
   ;; nil to boost the loading time. (default t)
   dotspacemacs-loading-progress-bar t

   ;; If non-nil the frame is fullscreen when Emacs starts up. (default nil)
   ;; (Emacs 24.4+ only)
   dotspacemacs-fullscreen-at-startup nil

   ;; If non-nil `spacemacs/toggle-fullscreen' will not use native fullscreen.
   ;; Use to disable fullscreen animations in OSX. (default nil)
   dotspacemacs-fullscreen-use-non-native nil

   ;; If non-nil the frame is maximized when Emacs starts up.
   ;; Takes effect only if `dotspacemacs-fullscreen-at-startup' is nil.
   ;; (default t) (Emacs 24.4+ only)
   dotspacemacs-maximized-at-startup t

   ;; If non-nil the frame is undecorated when Emacs starts up. Combine this
   ;; variable with `dotspacemacs-maximized-at-startup' to obtain fullscreen
   ;; without external boxes. Also disables the internal border. (default nil)
   dotspacemacs-undecorated-at-startup nil

   ;; A value from the range (0..100), in increasing opacity, which describes
   ;; the transparency level of a frame when it's active or selected.
   ;; Transparency can be toggled through `toggle-transparency'. (default 90)
   dotspacemacs-active-transparency 90

   ;; A value from the range (0..100), in increasing opacity, which describes
   ;; the transparency level of a frame when it's inactive or deselected.
   ;; Transparency can be toggled through `toggle-transparency'. (default 90)
   dotspacemacs-inactive-transparency 90

   ;; A value from the range (0..100), in increasing opacity, which describes the
   ;; transparency level of a frame background when it's active or selected. Transparency
   ;; can be toggled through `toggle-background-transparency'. (default 90)
   dotspacemacs-background-transparency 90

   ;; If non-nil show the titles of transient states. (default t)
   dotspacemacs-show-transient-state-title t

   ;; If non-nil show the color guide hint for transient state keys. (default t)
   dotspacemacs-show-transient-state-color-guide t

   ;; If non-nil unicode symbols are displayed in the mode line.
   ;; If you use Emacs as a daemon and wants unicode characters only in GUI set
   ;; the value to quoted `display-graphic-p'. (default t)
   dotspacemacs-mode-line-unicode-symbols t

   ;; If non-nil smooth scrolling (native-scrolling) is enabled. Smooth
   ;; scrolling overrides the default behavior of Emacs which recenters point
   ;; when it reaches the top or bottom of the screen. (default t)
   dotspacemacs-smooth-scrolling t

   ;; Show the scroll bar while scrolling. The auto hide time can be configured
   ;; by setting this variable to a number. (default t)
   dotspacemacs-scroll-bar-while-scrolling t

   ;; Control line numbers activation.
   ;; If set to `t', `relative' or `visual' then line numbers are enabled in all
   ;; `prog-mode' and `text-mode' derivatives. If set to `relative', line
   ;; numbers are relative. If set to `visual', line numbers are also relative,
   ;; but only visual lines are counted. For example, folded lines will not be
   ;; counted and wrapped lines are counted as multiple lines.
   ;; This variable can also be set to a property list for finer control:
   ;; '(:relative nil
   ;;   :visual nil
   ;;   :disabled-for-modes dired-mode
   ;;                       doc-view-mode
   ;;                       markdown-mode
   ;;                       org-mode
   ;;                       pdf-view-mode
   ;;                       text-mode
   ;;   :size-limit-kb 1000)
   ;; When used in a plist, `visual' takes precedence over `relative'.
   ;; (default nil)
   dotspacemacs-line-numbers nil

   ;; Code folding method. Possible values are `evil', `origami' and `vimish'.
   ;; (default 'evil)
   dotspacemacs-folding-method 'evil

   ;; If non-nil and `dotspacemacs-activate-smartparens-mode' is also non-nil,
   ;; `smartparens-strict-mode' will be enabled in programming modes.
   ;; (default nil)
   dotspacemacs-smartparens-strict-mode nil

   ;; If non-nil smartparens-mode will be enabled in programming modes.
   ;; (default t)
   dotspacemacs-activate-smartparens-mode t

   ;; If non-nil pressing the closing parenthesis `)' key in insert mode passes
   ;; over any automatically added closing parenthesis, bracket, quote, etc...
   ;; This can be temporary disabled by pressing `C-q' before `)'. (default nil)
   dotspacemacs-smart-closing-parenthesis nil

   ;; Select a scope to highlight delimiters. Possible values are `any',
   ;; `current', `all' or `nil'. Default is `all' (highlight any scope and
   ;; emphasis the current one). (default 'all)
   dotspacemacs-highlight-delimiters 'all

   ;; If non-nil, start an Emacs server if one is not already running.
   ;; (default nil)
   dotspacemacs-enable-server nil

   ;; Set the emacs server socket location.
   ;; If nil, uses whatever the Emacs default is, otherwise a directory path
   ;; like \"~/.emacs.d/server\". It has no effect if
   ;; `dotspacemacs-enable-server' is nil.
   ;; (default nil)
   dotspacemacs-server-socket-dir nil

   ;; If non-nil, advise quit functions to keep server open when quitting.
   ;; (default nil)
   dotspacemacs-persistent-server t

   ;; List of search tool executable names. Spacemacs uses the first installed
   ;; tool of the list. Supported tools are `rg', `ag', `pt', `ack' and `grep'.
   ;; (default '("rg" "ag" "pt" "ack" "grep"))
   dotspacemacs-search-tools '("rg" "ag" "ack" "grep")

   ;; The backend used for undo/redo functionality. Possible values are
   ;; `undo-fu', `undo-redo' and `undo-tree' see also `evil-undo-system'.
   ;; Note that saved undo history does not get transferred when changing
   ;; your undo system. The default is currently `undo-fu' as `undo-tree'
   ;; is not maintained anymore and `undo-redo' is very basic."
   dotspacemacs-undo-system 'undo-fu

   ;; Format specification for setting the frame title.
   ;; %a - the `abbreviated-file-name', or `buffer-name'
   ;; %t - `projectile-project-name'
   ;; %I - `invocation-name'
   ;; %S - `system-name'
   ;; %U - contents of $USER
   ;; %b - buffer name
   ;; %f - visited file name
   ;; %F - frame name
   ;; %s - process status
   ;; %p - percent of buffer above top of window, or Top, Bot or All
   ;; %P - percent of buffer above bottom of window, perhaps plus Top, or Bot or All
   ;; %m - mode name
   ;; %n - Narrow if appropriate
   ;; %z - mnemonics of buffer, terminal, and keyboard coding systems
   ;; %Z - like %z, but including the end-of-line format
   ;; If nil then Spacemacs uses default `frame-title-format' to avoid
   ;; performance issues, instead of calculating the frame title by
   ;; `spacemacs/title-prepare' all the time.
   ;; (default "%I@%S")
   dotspacemacs-frame-title-format "%I@%S"

   ;; Format specification for setting the icon title format
   ;; (default nil - same as frame-title-format)
   dotspacemacs-icon-title-format nil

   ;; Color highlight trailing whitespace in all prog-mode and text-mode derived
   ;; modes such as c++-mode, python-mode, emacs-lisp, html-mode, rst-mode etc.
   ;; (default t)
   dotspacemacs-show-trailing-whitespace t

   ;; Delete whitespace while saving buffer. Possible values are `all'
   ;; to aggressively delete empty line and long sequences of whitespace,
   ;; `trailing' to delete only the whitespace at end of lines, `changed' to
   ;; delete only whitespace for changed lines or `nil' to disable cleanup.
   ;; The variable `global-spacemacs-whitespace-cleanup-modes' controls
   ;; which major modes have whitespace cleanup enabled or disabled
   ;; by default.
   ;; (default nil)
   dotspacemacs-whitespace-cleanup nil

   ;; If non-nil activate `clean-aindent-mode' which tries to correct
   ;; virtual indentation of simple modes. This can interfere with mode specific
   ;; indent handling like has been reported for `go-mode'.
   ;; If it does deactivate it here.
   ;; (default t)
   dotspacemacs-use-clean-aindent-mode t

   ;; Accept SPC as y for prompts if non-nil. (default nil)
   dotspacemacs-use-SPC-as-y nil

   ;; If non-nil shift your number row to match the entered keyboard layout
   ;; (only in insert state). Currently supported keyboard layouts are:
   ;; `qwerty-us', `qwertz-de' and `querty-ca-fr'.
   ;; New layouts can be added in `spacemacs-editing' layer.
   ;; (default nil)
   dotspacemacs-swap-number-row nil

   ;; Either nil or a number of seconds. If non-nil zone out after the specified
   ;; number of seconds. (default nil)
   dotspacemacs-zone-out-when-idle nil

   ;; Run `spacemacs/prettify-org-buffer' when
   ;; visiting README.org files of Spacemacs.
   ;; (default nil)
   dotspacemacs-pretty-docs nil

   ;; If nil the home buffer shows the full path of agenda items
   ;; and todos. If non-nil only the file name is shown.
   dotspacemacs-home-shorten-agenda-source nil

   ;; If non-nil then byte-compile some of Spacemacs files.
   dotspacemacs-byte-compile nil))

(defun dotspacemacs/user-env ()
  "Environment variables setup.
This function defines the environment variables for your Emacs session. By
default it calls `spacemacs/load-spacemacs-env' which loads the environment
variables declared in `~/.spacemacs.env' or `~/.spacemacs.d/.spacemacs.env'.
See the header of this file for more information."
  (spacemacs/load-spacemacs-env)
  )

(defun dotspacemacs/user-init ()
  "Initialization for user code:
This function is called immediately after `dotspacemacs/init', before layer
configuration.
It is mostly for variables that should be set before packages are loaded.
If you are unsure, try setting them in `dotspacemacs/user-config' first."
  ;; (add-to-list 'load-path "/Users/jetpac/Documents/emacs/tramp-mirror/tramp/lisp")

  )


(defun dotspacemacs/user-load ()
  "Library to load while dumping.
This function is called only while dumping Spacemacs configuration. You can
`require' or `load' the libraries of your choice that will be included in the
dump."
  )


(defun dotspacemacs/user-config ()
  "Configuration for user code:
This function is called at the very end of Spacemacs startup, after layer
configuration.
Put your configuration code here, except for variables that should be set
before packages are loaded."


  ;; codex config
  (use-package ai-code
    ;; :straight (:host github :repo "tninja/ai-code-interface.el") ;; if you want to use straight to install, no need to have MELPA setting above
    :config
    ;; use codex as backend, other options are 'claude-code, 'gemini, 'github-copilot-cli, 'opencode, 'grok, 'cursor, 'kiro, 'codebuddy, 'aider, 'claude-code-ide, 'claude-code-el
    (ai-code-set-backend 'codex)
    ;; Enable global keybinding for the main menu
    ;; (global-set-key (kbd "C-c a") #'ai-code-menu)
    (spacemacs/set-leader-keys "oi" 'ai-code-menu)
    ;; Optional: Use eat if you prefer, by default it is vterm
    ;; (setq ai-code-backends-infra-terminal-backend 'eat) ;; the way to config all native supported CLI. for external backend such as claude-code-ide.el and claude-code.el, please check their config
    ;; Optional: Enable @ file completion in comments and AI sessions
    (ai-code-prompt-filepath-completion-mode 1)
    ;; Optional: Ask AI to run test after code changes, for a tighter build-test loop
    (setq ai-code-auto-test-type 'test-after-change)
    ;; Optional: In AI session buffers, SPC in Evil normal state triggers the prompt-enter UI
    (with-eval-after-load 'evil (ai-code-backends-infra-evil-setup))
    ;; Optional: Turn on auto-revert buffer, so that the AI code change automatically appears in the buffer
    (global-auto-revert-mode 1)
    (setq auto-revert-interval 1) ;; set to 1 second for faster update
    ;; (global-set-key (kbd "C-c a C") #'ai-code-toggle-filepath-completion)
    ;; Optional: Set up Magit integration for AI commands in Magit popups
    (with-eval-after-load 'magit
      (ai-code-magit-setup-transients)))

  ;; email config
  ;; the saved command is a work-around for not working address completion
  (setq notmuch-show-logo nil
        notmuch-search-oldest-first nil          ;; new email on top
        notmuch-column-control 1.0               ;; just one columnt for searches
        notmuch-hello-insert-recent-searches nil ;; don't display recent searches in notmuch-helo
        ;; notmuch-address-command "/Users/jetpac/bin/notmuch-address"

        ;; these are default
        ;; notmuch-hello-sections '(notmuch-hello-insert-header notmuch-hello-insert-saved-searches
        ;;                                                      notmuch-hello-insert-search
        ;;                                                      notmuch-hello-insert-recent-searches
        ;;                                                      notmuch-hello-insert-alltags
        ;;                                                      notmuch-hello-insert-footer)
        )

  ;; (add-hook 'org-msg-edit-mode-hook #'notmuch-address-mode)
  (setq notmuch-saved-searches
        '((:name "📥 Inbox" :query "tag:inbox AND tag:unread" :key "i")
          (:name "To me Unread" :query "tag:me AND tag:unread")
          )
        )

  ;; snippet for direct sending (doesn't work when off VPN)
  ;; (setq send-mail-function 'smtpmail-send-it
  ;;       smtpmail-smtp-server "internal-mail-router.oracle.com"
  ;;       smtpmail-smtp-service 25
  ;;       smtpmail-stream-type nil
  ;;       user-mail-address "petr.nyc@oracle.com"
  ;;       user-full-name "Petr Nyc")

  ;; Use local sendmail (Postfix)
  (setq send-mail-function 'sendmail-send-it
        message-send-mail-function 'sendmail-send-it
        sendmail-program "/usr/sbin/sendmail"
        mail-specify-envelope-from t
        mail-envelope-from 'header
        user-mail-address "petr.nyc@oracle.com"
        user-full-name "Petr Nyc"
        )

  (setq notmuch-fcc-dirs "exchange/Sent")

  (use-package org-msg
    :after notmuch
    :config
    (setq mail-user-agent 'notmuch-user-agent)
    (setq org-msg-options "html-postamble:nil H:5 num:nil ^:{} toc:nil author:nil email:nil \\n:t"
          org-msg-startup "hidestars indent inlineimages"
          ;; org-msg-greeting-fmt "\nHi *%s*,\n\n"
          org-msg-greeting-name-limit 3
          org-msg-default-alternatives '((new		. (text html))
                                         (reply-to-html	. (text html))
                                         (reply-to-text	. (text)))
          ;;           org-msg-signature "
          ;; Regards,
          ;; #+begin_signature
          ;; Petr
          ;; #+end_signature
          ;; \\\\
          ;; "
          )

    ;; a test for 'nicer' emails
    ;; (setq org-msg-enforce-css
    ;;       '((img (("max-width" . "100%")))
    ;;         (body (("font-family" . "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif")
    ;;                ("font-size" . "14px")
    ;;                ("line-height" . "1.6")
    ;;                ("color" . "#333")))
    ;;         (h1 (("font-size" . "20px")
    ;;              ("font-weight" . "bold")
    ;;              ("margin-top" . "1em")
    ;;              ("margin-bottom" . "0.5em")
    ;;              ("color" . "#1a1a1a")))
    ;;         (h2 (("font-size" . "18px")
    ;;              ("font-weight" . "bold")
    ;;              ("margin-top" . "1em")
    ;;              ("margin-bottom" . "0.5em")
    ;;              ("color" . "#222")))
    ;;         (h3 (("font-size" . "16px")
    ;;              ("font-weight" . "bold")
    ;;              ("margin-top" . "1em")
    ;;              ("margin-bottom" . "0.5em")
    ;;              ("color" . "#333")))
    ;;         (a (("color" . "#0066cc")
    ;;             ("text-decoration" . "none")
    ;;             ("border-bottom" . "1px solid #0066cc")))
    ;;         (blockquote (("border-left" . "3px solid #ccc")
    ;;                      ("margin" . "10px 0 10px 15px")
    ;;                      ("padding-left" . "10px")
    ;;                      ("font-style" . "italic")
    ;;                      ("color" . "#555")))
    ;;         (pre (("background-color" . "#f6f8fa")
    ;;               ("border" . "1px solid #e1e4e8")
    ;;               ("border-radius" . "4px")
    ;;               ("padding" . "10px")
    ;;               ("overflow" . "auto")
    ;;               ("font-family" . "'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace")
    ;;               ("font-size" . "13px")))
    ;;         (code (("background-color" . "#f6f8fa")
    ;;                ("padding" . "2px 4px")
    ;;                ("border-radius" . "3px")
    ;;                ("font-family" . "monospace")
    ;;                ("font-size" . "85%")))
    ;;         ;; ("pre .todo" (("color" . "#6a737d")
    ;;         ;;               ("font-style" . "italic")
    ;;         ;;               ("background-color" . "transparent")))
    ;;         ;; ("pre .done" (("color" . "#6a737d")
    ;;         ;;               ("font-style" . "italic")
    ;;         ;;               ("background-color" . "transparent")))
    ;;         ;; ("pre .comment" (("color" . "#000000")
    ;;         ;;                  ("font-style" . "italic")
    ;;         ;;                  ("background-color" . "#fffff")))
    ;;         ;; ("pre .comment-delimiter" (("color" . "#000000")
    ;;         ;;                            ("font-style" . "italic")
    ;;         ;;                            ("background-color" . "#ffffff" )))
    ;;         ;; (".font-lock-comment-face" (("color" . "#000000")
    ;;         ;;                             ("font-style" . "italic")
    ;;         ;;                             ("background-color" . "#ffffff")))
    ;;         ;; (".font-lock-comment-delimiter-face" (("color" . "#000000")
    ;;         ;;                                       ("font-style" . "italic")
    ;;         ;;                                       ("background-color" . "#ffffff")))
    ;;         (table (("border-collapse" . "collapse")
    ;;                 ("width" . "100%")
    ;;                 ("margin" . "1em 0")))
    ;;         (th (("background-color" . "#f6f8fa")
    ;;              ("border" . "1px solid #dfe2e5")
    ;;              ("padding" . "6px 13px")
    ;;              ("font-weight" . "bold")))
    ;;         (td (("border" . "1px solid #dfe2e5")
    ;;              ("padding" . "6px 13px")))))



    (org-msg-mode)
    )

  ;; (with-eval-after-load 'org-msg
  ;; )


  ;; / email config


  ;; LSP config

  ;; General LSP tuning - defaults
  ;; (setq lsp-idle-delay 0.5)
  ;; (setq lsp-log-io nil)
  ;; (setq gc-cons-threshold 100000000)
  ;; (setq read-process-output-max (* 1024 1024)) ;; 1MB

  ;; Use flycheck for diagnostics (Spacemacs default)
  ;; (setq lsp-diagnostics-provider :flycheck)

  ;; Reduce file watcher overhead (important for Terraform repos)
  ;; (setq lsp-file-watch-threshold 5000)

  ;; for python, install ruff and pylsp:
  ;; Python CONFIG
  ;; brew install ruff pylsp pyright basedpyright
  ;; 1. Use Basedpyright instead of standard Pyright
  (setq lsp-pyright-langserver-command "basedpyright")

  ;; 2. Enable Ruff support (requires ruff to be in your PATH)
  ;; This tells lsp-mode to use the Ruff server for linting/formatting
  (setq lsp-pylsp-plugins-ruff-enabled t)

  ;; Spacemacs already uses deferred loading, but this ensures it
  ;; (setq lsp-auto-configure t) ;; this is already default
  ;; /Python CONFIG


  ;; enable lsp mode for shells, needs to be deferred
  ;; otherwise it locks up emacs startup
  (add-hook 'sh-mode-hook #'lsp-deferred)

  ;; Chain mode-specific checkers (Hadolint, TFLint) to run after LSP.
  ;; We use `lsp-managed-mode-hook` to ensure the `lsp` checker is fully
  ;; defined before modifying its chain, preventing "lsp is not a valid
  ;; syntax checker" errors during startup.
  (defun jp/lsp-flycheck-chaining ()
    "Chain specific checkers to LSP based on the current mode."
    (cond
     ;; Dockerfile: LSP -> Hadolint
     ((derived-mode-p 'dockerfile-mode)
      (flycheck-add-next-checker 'lsp 'dockerfile-hadolint))

     ;; Terraform: LSP -> TFLint
     ((derived-mode-p 'terraform-mode)
      (flycheck-add-next-checker 'lsp 'terraform-tflint))))

  ;; Run this whenever LSP starts managing a buffer
  (add-hook 'lsp-managed-mode-hook #'jp/lsp-flycheck-chaining)

  ;; / LSP config

  ;; jira config

  ;; (defun my-jira-bearer-token ()
  ;;   "Return the Authorization header for Jira Bearer token."
  ;;   (cons "Authorization"
  ;;         (concat "Bearer " "<token>")))
  ;; (with-eval-after-load 'jiralib
  ;;   (setq jiralib-token (my-jira-bearer-token)))

  (with-eval-after-load 'jiralib
    (setq jiralib-token (cons "Authorization"
                              (concat "Bearer " (auth-source-pick-first-password
                                                 :host "jira.oci.oraclecorp.com")))
          ))

  ;; // jira config

  ;; gnupg config
  (setq epa-pinentry-mode 'loopback)
  ;; /gnupg config

  ;; setting gui font for gui only
  (defun my/set-gui-font ()
    (when (display-graphic-p)
      (set-frame-font "MesloLGS Nerd Font-18" t t)))
  ;;  (set-frame-font "Source Code Pro for Powerline-18" t t)))

  (add-hook 'after-make-frame-functions
            (lambda (frame)
              (select-frame frame)
              (my/set-gui-font)))

  ;; Also apply font immediately if current frame is GUI
  (my/set-gui-font)

  ;; end of setting gui font

  ;; (require 'tramp)

  ;; for 24bit colors to work (and extra themes), use TERM=xterm-24bit
  ;; as described at https://github.com/syl20bnr/spacemacs/wiki/Terminal

  ;; for pandoc to work
  (add-to-list 'exec-path "/opt/homebrew/bin")
  (setenv "PATH" (concat "/opt/homebrew/bin:" (getenv "PATH")))

  ;; Proxy toggle function
  (setq http_proxy "http://www-proxy.uk.oracle.com:80")
  (defun toggle-proxy ()
    "Toggle proxy settings for Emacs."
    (interactive)
    (if (and (boundp 'url-proxy-services) url-proxy-services)
        (progn
          (setq url-proxy-services nil)
          (message "Proxy disabled"))
      (setq url-proxy-services
            `(("no_proxy" . "localhost")
              ("http" . ,http_proxy)
              ("https" . ,http_proxy)))
      (message ( concat "Proxy enabled: " http_proxy)))
    )

  ;; Bind proxy toggle function to a key
  (spacemacs/set-leader-keys "ot" 'toggle-proxy)

  ;; Bind ai for aidermacs
  ;; (spacemacs/set-leader-keys "ai" 'aidermacs-transient-menu)

  ;; idea from chatgpt
  (defun jp/set-dotfiles-environment ()
    "Set environment variables for the dotfiles repository."
    (interactive)
    (setenv "GIT_DIR" (expand-file-name "~/.cfg/"))
    (setenv "GIT_WORK_TREE" (expand-file-name "~"))
    (message "Dotfiles environment set."))

  (defun jp/unset-dotfiles-environment ()
    "Unset environment variables for the dotfiles repository."
    (interactive)
    (setenv "GIT_DIR" nil)
    (setenv "GIT_WORK_TREE" nil)
    (message "Dotfiles environment unset."))

  (global-set-key (kbd "<f9> s") 'jp/set-dotfiles-environment)
  (global-set-key (kbd "<f9> u") 'jp/unset-dotfiles-environment)


  (defun jp/set-scm-git()
    (interactive)
    (setq magit-git-executable "/usr/local/bin/scm-git"))

  ;; for scm-git
  (defun jp/unset-scm-git()
    (interactive)
    (setq magit-git-executable "/usr/bin/git"))

  (global-set-key (kbd "<f9> 1") 'jp/set-scm-git)
  (global-set-key (kbd "<f9> 2") 'jp/unset-scm-git)


  (defun magit-status-dotfiles ()
    "Open Magit with the dotfiles Git configuration."
    (interactive)
    (let ((default-directory (expand-file-name "~/")))
      (jp/set-dotfiles-environment)
      (magit-status)
      ;; (jp/unset-dotfiles-environment)
      ))

  (with-eval-after-load 'org
    ;; test from https://superuser.com/questions/452649/org-mode-to-markdown-converter
    (require 'ox-md nil t)



    ;; org mode should not use tabs
    ;; work-around for 'tab width in org files must be 8, not 2. please adjust your tab-width settings for org mode'

    (defun jp/org-mode-tab-setup ()
      ;; Don't use real TAB characters in Org
      (setq-local indent-tabs-mode nil)
      ;; But keep tab-width at 8 so Org's parser is happy
      (setq-local tab-width 8))

    (add-hook 'org-mode-hook #'jp/org-mode-tab-setup)

    ;; end of tabs work-around



    (setq org-directory "~/Documents/org")
    (setq org-default-notes-file "~/Documents/org/inbox.org")

    (setq org-duration-format 'h:mm)

    ;; ;; ================================================================================
    ;; ;; config for org-caldav for my nextcloud installation
    ;; ;; not working to my satisfaction yet - only configured for not used files
    ;; ;; inspiration from https://www.reddit.com/r/orgmode/comments/8rl8ep/making_orgcaldav_useable/
    ;; ;; doc: https://github.com/dengste/org-caldav

    ;; ;; URL of the caldav server
    ;; (setq org-caldav-url "https://next.cloud.jetpac.org/remote.php/dav/calendars/jetpac")

    ;; (setq org-caldav-calendars
    ;;       '((:calendar-id "personal"
    ;;                       :files ("~/Documents/org/synced_calendar.org")
    ;;                       ;; :inbox ("~/Documents/org/caldav/from-calendar.org")
    ;;                       ;; :sync-direction ('org->cal)
    ;;                       ))
    ;;       )

    ;; ;; config
    ;; (setq org-icalendar-alarm-time 1)
    ;; ;; This makes sure to-do items as a category can show up on the calendar
    ;; (setq org-icalendar-include-todo t)
    ;; ;; This ensures all org "deadlines" show up, and show up as due dates
    ;; (setq org-icalendar-use-deadline '(event-if-todo event-if-not-todo todo-due))
    ;; ;; This ensures "scheduled" org items show up, and show up as start times
    ;; (setq org-icalendar-use-scheduled '(todo-start event-if-todo event-if-not-todo))

    ;; (setq org-caldav-backup-file "~/Documents/org/caldav/org-caldav-backup.org")
    ;; (setq org-caldav-save-directory "~/Documents/org/caldav/")

    ;; ;; ;; calendar ID on server
    ;; ;; (setq org-caldav-calendar-id "personal")

    ;; ;; ;; Org filename where new entries from calendar stored
    ;; (setq org-caldav-inbox "~/Documents/org/caldav/from-calendar.org")

    ;; ;; ;; Additional Org files to check for calendar events

    ;; ;; ;; this line breaks the sync!
    ;; ;; (setq org-caldav-files ("~/Documents/org/caldav/todo.org"))
    ;; ;; ;; (setq org-caldav-files nil)

    ;; ;; ;; Usually a good idea to set the timezone manually
    ;; ;; (setq org-icalendar-timezone "Europe/Prague")

    ;; ;; ;; sync from org to cal only
    ;; ;; (setq org-caldav-sync-direction "org->cal")
    ;; ;; ;; (setq org-caldav-sync-direction "twoway")
    ;; ;; ================================================================================


    ;; Define the custum capture templates
    (setq org-capture-templates
          '(("t" "Todo [inbox] clock_in clock_resume " entry (file+headline org-default-notes-file "Tasks")
             "* TODO %?\n%u\n%a\n" :clock-in t :clock-resume t)
            ("m" "Meeting [diary] " entry (file+headline org-default-notes-file "Meetings")
             "* MEETING %? :Meeting:\n%t" :clock-in t :clock-resume t)
            ("d" "Diary [diary] " entry (file+datetree "~/org/diary.org")
             "* %?\n%U\n" :clock-in t :clock-resume t)
            ("i" "Inbox [inbox]" entry (file+headline org-default-notes-file "Capture")
             "* %?\n  Captured: %U\n%i\n  %a" :empty-lines 1)
            ;; ("i" "Idea [inbox] " entry (file org-default-notes-file)
            ;; "* %? :IDEA: \n%t" :clock-in t :clock-resume t)
            ("n" "Next Task" entry (file+headline org-default-notes-file "Tasks")
             "** NEXT %? \nDEADLINE: %t") ))

                                        ; original
                                        ;   (setq org-agenda-files '("~/Documents/org/inbox.org"
                                        ;                            "~/Documents/org/projects.org"
                                        ;                            "~/Documents/org/someday.org"
                                        ;                            "~/Documents/org/calendar.org"))

                                        ; testing freeze
    (setq org-agenda-files '("~/Documents/org/inbox.org"
                             "~/Documents/org/projects.org"
                             "~/Documents/org/work/oracle.org"
                             "~/Documents/org/someday.org"
                             "~/Documents/org/calendar.org"
                             ))




    (setq org-refile-targets '(("/Users/jetpac/Documents/org/projects.org" :maxlevel . 3)
                               ("/Users/jetpac/Documents/org/inbox.org" :maxlevel . 3)
                               ("/Users/jetpac/Documents/org/work/oracle.org" :maxlevel . 4)
                               ("/Users/jetpac/Documents/org/someday.org" :maxlevel . 3)
                               ("/Users/jetpac/Documents/org/inbox.org" :maxlevel . 3)
                               ("/Users/jetpac/Documents/org/calendar.org" :maxlevel . 2)))

    ;; Don't include a footer with my contact and publishing information at the bottom of every exported HTML document.
    (setq org-html-postamble nil)

    ;; inspiration from https://emacs.stackexchange.com/questions/33179/how-to-fix-columns-of-org-agenda-clock-report
    (setq org-agenda-clockreport-parameter-plist
          (quote (:link t :maxlevel 7 :fileskip0 t :compact t :narrow 80 :formula % :match "-home")))

    (setq org-agenda-custom-commands
          '(
            ("g" "Get Things Done (GTD)"
             ((agenda ""
                      (
                       ;; (org-agenda-skip-function
                       ;;  '(org-agenda-skip-entry-if 'deadline))
                       (org-deadline-warning-days 0)
                       (org-agenda-time-grid)
                       )
                      )
              (todo "NEXT"
                    (
                     ;; (org-agenda-skip-function
                     ;;  '(org-agenda-skip-entry-if 'deadline))
                     (org-agenda-prefix-format "  %i %-12:c [%-4e] ")
                     (org-agenda-overriding-header "Tasks\n")))
              (agenda "dead"
                      ((org-agenda-entry-types '(:deadline))
                       ;;(org-agenda-format-date "")
                       (org-deadline-warning-days 7)
                       (org-agenda-skip-function
                        '(org-agenda-skip-entry-if 'notregexp "\\* NEXT"))
                       (org-agenda-overriding-header "Deadlines\n")))
              (tags-todo "inbox"
                         ((org-agenda-prefix-format "  %?-12t% s")
                          (org-agenda-overriding-header "Inbox\n")))
              (tags "CLOSED>=\"<today>\""
                    ((org-agenda-overriding-header "Completed today\n")))))
            )
          )

    (setq org-todo-keywords
          '((sequence "TODO(t)" "NEXT(n)" "WAIT(w)" "RUNNING(r)" "|" "DONE(d)" "CANCELLED(c)" )))

    (setq org-clock-out-remove-zero-time-clocks t)
    ) ;; with-eval-after-load 'org

  (with-eval-after-load 'markdown-mode
    (define-key markdown-mode-map (kbd "C-c x") 'my/markdown-toggle-checkbox))

  (setq calendar-week-start-day 1) ;; calendar start on Monday

  ;; org-alert configuration
  ;; https://github.com/jwiegley/alert
  ;; https://www.youtube.com/watch?v=wKTKmE1wLyw
  (use-package org-alert
    :config
    ;; (setq alert-default-style 'notifier)  ;; Use terminal-notifier for macOS notifications
    (setq alert-default-style 'osx-notifier)  ;; Use terminal-notifier for macOS notifications
    (setq org-alert-notify-cutoff 10      ;; Notify 10 minutes before the deadline
          org-alert-notification-title "Org Alert Reminder!"
          )
    (org-alert-enable))

  (defun my/markdown-toggle-checkbox ()
    "Toggle checkbox in markdown list at point."
    (interactive)
    (save-excursion
      (beginning-of-line)
      (when (looking-at "\\s-*[-*]\\s-+\\[\\([ xX]\\)\\]")
        (replace-match
         (if (string= (match-string 1) " ")
             "x" " ") nil nil nil 1))))

  ;; (setq warning-minimum-level :error)


  ;; 28.4. - terminal clipboard integration
  ;; (when (and (not (display-graphic-p))
  ;;            (eq system-type 'darwin))
  ;;   (defun copy-to-mac-clipboard (text &optional push)
  ;;     (let ((process-connection-type nil))
  ;;       (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
  ;;         (process-send-string proc text)
  ;;         (process-send-eof proc))))

  ;;   (defun paste-from-mac-clipboard ()
  ;;     (shell-command-to-string "pbpaste"))

  ;;   (setq interprogram-cut-function 'copy-to-mac-clipboard)
  ;;   (setq interprogram-paste-function 'paste-from-mac-clipboard))

  ;; terminal clipboard that should also work on remote systems
  (defun my/set-clipboard-integration ()
    (cond
     ;; macOS in terminal (non-GUI mode) – use pbcopy/pbpaste
     ((and (eq system-type 'darwin)
           (not (display-graphic-p)))
      (defun copy-to-mac-clipboard (text &optional push)
        (let ((process-connection-type nil))
          (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
            (process-send-string proc text)
            (process-send-eof proc))))
      (defun paste-from-mac-clipboard ()
        (shell-command-to-string "pbpaste"))
      (setq interprogram-cut-function 'copy-to-mac-clipboard)
      (setq interprogram-paste-function 'paste-from-mac-clipboard))

     ;; All other non-GUI modes (e.g., tmux, remote SSH) – use OSC 52
     ((not (display-graphic-p))
      (defun copy-to-osc52 (text &optional push)
        (let ((osc52 (concat "\e]52;c;" (base64-encode-string text t) "\a")))
          (send-string-to-terminal osc52)))
      (setq interprogram-cut-function 'copy-to-osc52)
      ;; paste not supported with OSC 52, leave interprogram-paste-function nil
      (message "Using OSC 52 for clipboard integration"))))

  (my/set-clipboard-integration)

  ;; set gls as ls on mac/unix, keep ls on linux
  (cond
   ;; macOS
   ((eq system-type 'darwin)
    (when (executable-find "gls")
      (setq insert-directory-program (executable-find "gls"))))

   ;; Linux (GNU ls is the default `ls`)
   ((or (eq system-type 'gnu/linux)
        (eq system-type 'linux))
    (setq insert-directory-program (executable-find "ls")))

   ;; Solaris / other Unixes
   ((or (eq system-type 'usg-unix-v)
        (eq system-type 'berkeley-unix)
        (eq system-type 'unix))
    (if (executable-find "gls")
        (setq insert-directory-program (executable-find "gls"))
      (setq insert-directory-program (executable-find "ls")))))


  ;; org config based on https://doc.norang.ca/org-mode.html
  ;; punching in/out and other mods

  (global-set-key (kbd "<f9> i") 'bh/punch-in)
  (global-set-key (kbd "<f9> o") 'bh/punch-out)
  (global-set-key (kbd "<f9> h") 'bh/hide-other)
  (global-set-key (kbd "<f11>") 'org-clock-goto)

  (defun bh/hide-other ()
    (interactive)
    (save-excursion
      (org-back-to-heading 'invisible-ok)
      (hide-other)
      (org-cycle)
      (org-cycle)
      (org-cycle)))

  ;; Resume clocking task when emacs is restarted
  (org-clock-persistence-insinuate)
  ;; Save the running clock and all clock history when exiting Emacs, load it on startup
  (setq org-clock-persist t)
  ;; Include current clocking task in clock reports
  (setq org-clock-report-include-clocking-task t)

  (setq bh/keep-clock-running nil)
  (defvar bh/organization-task-id "4d2f34b0-92dd-11f0-9319-bdd95275e5c9")

  (defun bh/find-project-task ()
    "Move point to the parent (project) task if any"
    (save-restriction
      (widen)
      (let ((parent-task (save-excursion (org-back-to-heading 'invisible-ok) (point))))
        (while (org-up-heading-safe)
          (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
            (setq parent-task (point))))
        (goto-char parent-task)
        parent-task)))

  (defun bh/punch-in (arg)
    "Start continuous clocking and set the default task to the
    selected task.  If no task is selected set the Organization task
    as the default task."
    (interactive "p")
    (setq bh/keep-clock-running t)
    (if (equal major-mode 'org-agenda-mode)
        ;;
        ;; We're in the agenda
        ;;
        (let* ((marker (org-get-at-bol 'org-hd-marker))
               (tags (org-with-point-at marker (org-get-tags-at))))
          (if (and (eq arg 4) tags)
              (org-agenda-clock-in '(16))
            (bh/clock-in-organization-task-as-default)))
      ;;
      ;; We are not in the agenda
      ;;
      (save-restriction
        (widen)
                                        ; Find the tags on the current task
        (if (and (equal major-mode 'org-mode) (not (org-before-first-heading-p)) (eq arg 4))
            (org-clock-in '(16))
          (bh/clock-in-organization-task-as-default)))))

  (defun bh/punch-out ()
    (interactive)
    (setq bh/keep-clock-running nil)
    (when (org-clock-is-active)
      (org-clock-out))
    (org-agenda-remove-restriction-lock))

  (defun bh/clock-in-default-task ()
    (save-excursion
      (org-with-point-at org-clock-default-task
        (org-clock-in))))

  (defun bh/clock-in-parent-task ()
    "Move point to the parent (project) task if any and clock in"
    (let ((parent-task))
      (save-excursion
        (save-restriction
          (widen)
          (while (and (not parent-task) (org-up-heading-safe))
            (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
              (setq parent-task (point))))
          (if parent-task
              (org-with-point-at parent-task
                (org-clock-in))
            (when bh/keep-clock-running
              (bh/clock-in-default-task)))))))

  (defun bh/clock-in-organization-task-as-default ()
    (interactive)
    (org-with-point-at (org-id-find bh/organization-task-id 'marker)
      (org-clock-in '(16))))

  (defun bh/clock-out-maybe ()
    (when (and bh/keep-clock-running
               (not org-clock-clocking-in)
               (marker-buffer org-clock-default-task)
               (not org-clock-resolving-clocks-due-to-idleness))
      (bh/clock-in-parent-task)))

  (add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append)

  ) ;; user-config


;; Do not write anything past this comment. This is where Emacs will
;; auto-generate custom variable definitions.
(defun dotspacemacs/emacs-custom-settings ()
  "Emacs custom settings.
This is an auto-generated function, do not modify its content directly, use
Emacs customize menu instead.
This function is called at the very end of Spacemacs initialization."
  (custom-set-variables
   ;; custom-set-variables was added by Custom.
   ;; If you edit it by hand, you could mess it up, so be careful.
   ;; Your init file should contain only one such instance.
   ;; If there is more than one, they won't work right.
   ;; '(custom-enabled-themes '(doom-solarized-dark))
   '(custom-safe-themes
     '("d97ac0baa0b67be4f7523795621ea5096939a47e8b46378f79e78846e0e4ad3d"
       "21d2bf8d4d1df4859ff94422b5e41f6f2eeff14dd12f01428fa3cb4cb50ea0fb"
       "7fea145741b3ca719ae45e6533ad1f49b2a43bf199d9afaee5b6135fd9e6f9b8"
       "810691bd221e4639d5ef736b1bd930a7fb32a7c6043a5634e04f86edea973f6d"
       "a0ac98a1bde5d6336295fd350155a4aac1d63c53c1b3773062271074d16ebeb5"
       "bbb13492a15c3258f29c21d251da1e62f1abb8bbd492386a673dcfab474186af"
       "7fd8b914e340283c189980cd1883dbdef67080ad1a3a9cc3df864ca53bdc89cf" default))
   '(dired-listing-switches "-alh")
   '(ibuffer-saved-filter-groups nil)
   '(ibuffer-saved-filters
     '(("dired-mode" (mode . dired-mode))
       ("programming"
        (or (derived-mode . prog-mode) (mode . ess-mode) (mode . compilation-mode)))
       ("text document" (and (derived-mode . text-mode) (not (starred-name))))
       ("TeX"
        (or (derived-mode . tex-mode) (mode . latex-mode) (mode . context-mode)
            (mode . ams-tex-mode) (mode . bibtex-mode)))
       ("web"
        (or (derived-mode . sgml-mode) (derived-mode . css-base-mode)
            (derived-mode . js-base-mode) (derived-mode . typescript-ts-base-mode)
            (mode . js2-mode) (derived-mode . haml-mode) (mode . sass-mode)))
       ("gnus"
        (or (mode . message-mode) (mode . mail-mode) (mode . gnus-group-mode)
            (mode . gnus-summary-mode) (mode . gnus-article-mode)))))
   '(notmuch-archive-tags '("-inbox" "-unread" "+archive" "-flagged"))
   '(notmuch-column-control 1.0)
   '(notmuch-hello-sections
     '(notmuch-hello-insert-header notmuch-hello-insert-saved-searches
                                   (notmuch-hello-insert-searches "Important"
                                                                  (("General"
                                                                    . "not (tag:solaris or tag:oci)")
                                                                   ("Solaris"
                                                                    . "tag:solaris")
                                                                   ("OCI"
                                                                    . "tag:oci"))
                                                                  :filter
                                                                  "date:1/1/2026.. and (tag:important and tag:action)"
                                                                  :show-empty-searches
                                                                  t)
                                   (notmuch-hello-insert-searches
                                    "Secure Desktop Focused"
                                    (("OSD unread" . "tag:osd")
                                     ("Deployment Tickets"
                                      . "tag:deployment-ticket")
                                     ("PRs to go through" . "tag:PRs")
                                     ("Brownbag" . "tag:brownbag")
                                     ("Ocean Incidents / Alarms"
                                      . "tag:ocean-incident or tag:alarm")
                                     ("Announcements (PSA etc)"
                                      . "tag:announcement")
                                     ("Deployment Calendar events"
                                      . "tag:calendar")
                                     ("SGD" . "tag:sgd"))
                                    :filter
                                    "tag:osd and date:12/1/2025.. and (tag:unread or tag:important or tag:action)"
                                    :show-empty-searches nil)
                                   (notmuch-hello-insert-searches
                                    "Solaris Focused"
                                    (("Solaris"
                                      . "tag:solaris and not (tag:akidr or tag:s11u4-sru or tag:trunk or tag:cluster or tag:s11u3-sru or tag:RE or tag:mrspatmore or tag:IPS)")
                                     ("Solaris/All Solaris logs"
                                      . "tag:solaris or tag:pughlog")
                                     ("Solaris/RE"
                                      . "tag:RE and not  (tag:logs or tag:pughlog)")
                                     ("Solaris/mrspatmore" . "tag:mrspatmore")
                                     ("Solaris/Cluster"
                                      . "tag:cluster and not  (tag:logs or tag:pughlog)")
                                     ("Solaris/AK IDRs"
                                      . "tag:akidr and not  (tag:logs or tag:pughlog)")
                                     ("Solaris/AK IDRs/logs"
                                      . "tag:akidr and (tag:logs or tag:pushlog")
                                     ("Solaris/S11.4-SRU"
                                      . "tag:s11u4-sru and not (tag:on or tag:userland)")
                                     ("Solaris/S11.4-SRU/ON"
                                      . "tag:s11u4-sru and tag:on and not (tag:logs or tag:pushlog or tag:webrti)")
                                     ("Solaris/S11.4-SRU/ON/logs"
                                      . "tag:s11u4-sru and tag:on and (tag:logs or tag:pushlog) and not tag:webrti")
                                     ("Solaris/S11.4-SRU/ON/WebRTI"
                                      . "tag:s11u4-sru and tag:on and tag:webrti")
                                     ("Solaris/S11.4-SRU/Userland"
                                      . "tag:s11u4-sru and tag:userland and not (tag:logs or tag:pushlog) and not tag:webrti")
                                     ("Solaris/S11.4-SRU/Userland/logs"
                                      . "tag:s11u4-sru and tag:userland and (tag:logs or tag:pushlog)")
                                     ("Solaris/S11.4-SRU/Userland/WebRTI"
                                      . "tag:s11u4-sru and tag:userland and tag:webrti")
                                     ("Solaris/Trunk"
                                      . "tag:trunk and not (tag:logs or tag:webrti or tag:pushlog or tag:jenkins)")
                                     ("Solaris/Trunk/Logs"
                                      . "tag:trunk and (tag:logs or tag:pushlog or tag:jenkins)")
                                     ("Solaris/Trunk/WebRTI/ON"
                                      . "tag:trunk and tag:on and tag:webrti")
                                     ("Solaris/Trunk/WebRTI/Userland"
                                      . "tag:trunk and tag:userland and tag:webrti")
                                     ("Solaris/S11.3-SRU" . "tag:s11u3-sru")
                                     ("Solaris/GKAP" . "tag:gkap")
                                     ("Solaris/IPS" . "tag:IPS"))
                                    :filter
                                    "date:1/1/2026.. and (is:unread or is:important or is:action) "
                                    :filter-count
                                    "date:1/1/2026.. and (is:unread or is:important or is:action)")
                                   (notmuch-hello-insert-searches "Solaris All"
                                                                  (("Solaris"
                                                                    . "tag:solaris and not (tag:akidr or tag:s11u4-sru or tag:trunk or tag:cluster or tag:s11u3-sru or tag:RE or tag:mrspatmore or tag:IPS)")
                                                                   ("Solaris/All Solaris logs"
                                                                    . "tag:solaris or tag:pughlog")
                                                                   ("Solaris/RE"
                                                                    . "tag:RE and not  (tag:logs or tag:pughlog)")
                                                                   ("Solaris/Cluster"
                                                                    . "tag:cluster and not  (tag:logs or tag:pughlog)")
                                                                   ("Solaris/AK IDRs"
                                                                    . "tag:akidr and not  (tag:logs or tag:pughlog)")
                                                                   ("Solaris/AK IDRs/logs"
                                                                    . "tag:akidr and (tag:logs or tag:pushlog")
                                                                   ("Solaris/S11.4-SRU"
                                                                    . "tag:s11u4-sru and not (tag:on or tag:userland)")
                                                                   ("Solaris/S11.4-SRU/ON"
                                                                    . "tag:s11u4-sru and tag:on and not (tag:logs or tag:pushlog or tag:webrti)")
                                                                   ("Solaris/S11.4-SRU/ON/logs"
                                                                    . "tag:s11u4-sru and tag:on and (tag:logs or tag:pushlog) and not tag:webrti")
                                                                   ("Solaris/S11.4-SRU/ON/WebRTI"
                                                                    . "tag:s11u4-sru and tag:on and tag:webrti")
                                                                   ("Solaris/S11.4-SRU/Userland"
                                                                    . "tag:s11u4-sru and tag:userland and not (tag:logs or tag:pushlog) and not tag:webrti")
                                                                   ("Solaris/S11.4-SRU/Userland/logs"
                                                                    . "tag:s11u4-sru and tag:userland and (tag:logs or tag:pushlog)")
                                                                   ("Solaris/S11.4-SRU/Userland/WebRTI"
                                                                    . "tag:s11u4-sru and tag:userland and tag:webrti")
                                                                   ("Solaris/Trunk"
                                                                    . "tag:trunk and not (tag:logs or tag:webrti or tag:pushlog or tag:jenkins)")
                                                                   ("Solaris/Trunk/Logs"
                                                                    . "tag:trunk and (tag:logs or tag:pushlog or tag:jenkins)")
                                                                   ("Solaris/Trunk/WebRTI/ON"
                                                                    . "tag:trunk and tag:on and tag:webrti")
                                                                   ("Solaris/Trunk/WebRTI/Userland"
                                                                    . "tag:trunk and tag:userland and tag:webrti")
                                                                   ("Solaris/S11.3-SRU"
                                                                    . "tag:s11u3-sru")
                                                                   ("Solaris/GKAP"
                                                                    . "tag:gkap")
                                                                   ("Solaris/IPS"
                                                                    . "tag:IPS"))
                                                                  :filter
                                                                  "date:1/1/2026.."
                                                                  :show-empty-searches
                                                                  t)
                                   notmuch-hello-insert-inbox
                                   notmuch-hello-insert-footer))
   '(notmuch-saved-searches
     '((:name "📥 Inbox" :query "tag:inbox AND tag:unread" :key [105])
       (:name "To me Unread" :query "tag:me AND tag:unread" :key [109])))
   '(notmuch-search-oldest-first nil)
   '(org-hide-leading-stars t)
   '(package-selected-packages
     '(a ace-jump-helm-line ace-link afternoon-theme aggressive-indent ai-code
         aidermacs aio alect-themes alert all-the-icons ample-theme
         ample-zen-theme anaconda-mode anti-zenburn-theme apropospriate-theme
         auto-compile auto-highlight-symbol auto-yasnippet autothemer
         badwolf-theme birds-of-paradise-plus-theme blacken bmx-mode
         bubbleberry-theme bui busybee-theme centered-cursor-mode
         cherry-blossom-theme chocolate-theme clean-aindent-mode closql
         clues-theme code-cells code-review color-theme-sanityinc-solarized
         color-theme-sanityinc-tomorrow column-enforce-mode company
         company-anaconda company-box company-quickhelp company-shell
         company-statistics company-terraform company-web concurrent cond-let
         conda ctable cyberpunk-theme cython-mode dakrone-theme dap-mode
         darkmine-theme darkokai-theme darktooth-theme deferred define-word
         devdocs diminish dired-quick-sort disable-mouse django-theme docker
         dockerfile-mode doom-themes dotenv-mode dracula-theme drag-stuff
         dumb-jump eat edit-indirect editorconfig ef-themes elisp-def elisp-demos
         elisp-slime-nav emacsql emmet-mode emojify emr epc esh-help
         eshell-prompt-extras eshell-z espresso-theme eval-sexp-fu evil-anzu
         evil-args evil-cleverparens evil-collection evil-easymotion evil-escape
         evil-evilified-state evil-exchange evil-goggles evil-iedit-state
         evil-indent-plus evil-lion evil-lisp-state evil-matchit evil-mc
         evil-nerd-commenter evil-numbers evil-org evil-surround evil-textobj-line
         evil-tutor evil-unimpaired evil-visual-mark-mode evil-visualstar
         exotica-theme expand-region eyebrowse eziam-themes fancy-battery
         farmhouse-themes fish-mode flatland-theme flatui-theme flx-ido flycheck
         forge frame-local gandalf-theme ggtags gh-md ghub git-link git-messenger
         git-modes git-timemachine gitignore-templates gntp gnuplot golden-ratio
         google-translate gotham-theme grandshell-theme groovy-imports groovy-mode
         gruber-darker-theme gruvbox-theme haml-mode hc-zenburn-theme hcl-mode
         helm helm-ag helm-c-yasnippet helm-comint helm-company helm-css-scss
         helm-descbinds helm-git-grep helm-ls-git helm-lsp helm-make
         helm-mode-manager helm-notmuch helm-org helm-org-rifle helm-projectile
         helm-purpose helm-pydoc helm-swoop helm-themes helm-xref hemisu-theme
         heroku-theme hide-comnt hierarchy highlight-indentation highlight-numbers
         highlight-parentheses hl-todo holy-mode htmlize hungry-delete hybrid-mode
         impatient-mode importmagic indent-guide info+ inkpot-theme insert-shebang
         inspector ir-black-theme jazz-theme jbeans-theme js-doc js2-mode
         js2-refactor json-mode json-navigator json-reformat json-snatcher
         kaolin-themes light-soap-theme link-hint live-py-mode livid-mode
         load-env-vars log4e lorem-ipsum lsp-docker lsp-mode lsp-origami
         lsp-pyright lsp-treemacs lsp-ui lush-theme macrostep madhat2r-theme magit
         magit-section markdown-mode markdown-toc material-theme minimal-theme
         modus-themes moe-theme molokai-theme monochrome-theme monokai-theme
         multi-line multi-term multi-vterm multiple-cursors mustang-theme nameless
         naquadah-theme nginx-mode noctilux-theme nodejs-repl nose notmuch
         npm-mode obsidian-theme occidental-theme ol-notmuch oldlace-theme
         omtose-phellack-themes open-junk-file org-alert org-caldav
         org-category-capture org-cliplink org-contrib org-download org-jira
         org-mac-link org-mime org-msg org-pomodoro org-present
         org-project-capture org-projectile org-rich-yank org-superstar
         organic-green-theme orgit orgit-forge origami overseer ox-jira ox-twbs
         pandoc-mode paradox password-generator pcache pcre2el
         phoenix-dark-mono-theme phoenix-dark-pink-theme pip-requirements pipenv
         pippel planet-theme poetry popwin pos-tip powershell prettier-js
         professional-theme pug-mode purple-haze-theme py-isort pydoc pyenv-mode
         pylookup pytest pythonic pyvenv quickrun railscasts-theme
         rainbow-delimiters rebecca-theme request restart-emacs reverse-theme
         sass-mode scss-mode seti-theme shell-pop shfmt simple-httpd skewer-mode
         slim-mode smeargle smyx-theme soft-charcoal-theme soft-morning-theme
         soft-stone-theme solarized-theme soothe-theme space-doc spacegray-theme
         spaceline spacemacs-purpose-popwin spacemacs-whitespace-cleanup
         sphinx-doc string-edit-at-point string-inflection subatomic-theme
         subatomic256-theme sublime-themes sunny-day-theme symbol-overlay symon
         tablist tagedit tango-2-theme tango-plus-theme tangotango-theme tao-theme
         term-cursor terminal-here tern terraform-mode toc-org toml-mode
         toxi-theme transient treemacs-evil treemacs-icons-dired treemacs-magit
         treemacs-persp treemacs-projectile treepy twilight-anti-bright-theme
         twilight-bright-theme twilight-theme ujelly-theme underwater-theme
         undo-fu undo-fu-session vi-tilde-fringe volatile-highlights vterm vundo
         web-beautify web-completion-data web-mode which-key white-sand-theme
         winum with-editor writeroom-mode ws-butler yaml yaml-mode yapfify
         yasnippet yasnippet-snippets zen-and-art-theme zenburn-theme
         zonokai-emacs)))
  (custom-set-faces
   ;; custom-set-faces was added by Custom.
   ;; If you edit it by hand, you could mess it up, so be careful.
   ;; Your init file should contain only one such instance.
   ;; If there is more than one, they won't work right.
   '(default ((t (:background nil)))))
  )
