diff --git a/aerc/.config/aerc/accounts.conf b/aerc/.config/aerc/accounts.conf new file mode 100644 index 0000000..cd28767 --- /dev/null +++ b/aerc/.config/aerc/accounts.conf @@ -0,0 +1,22 @@ +[phil@liphlink.xyz] +source = imaps://phil%40liphlink.xyz:Fqi5UAyr46e69fG@mail-server.lynx-piano.ts.net:993 +outgoing = smtp://phil%40liphlink.xyz:Fqi5UAyr46e69fG@mail-server.lynx-piano.ts.net:587 +default = INBOX +from = Phil +copy-to = Sent +archive = Archive +postpone = Drafts +folders-sort = INBOX,Draftr,Sent,Archive,Spam,Trash +aliases = pw@liphlink.xyz,p.waibel@liphlink.xyz,philipp.waibel@liphlink.xyz + + +[spam@liphlink.xyz] + source = imaps://spam%40liphlink.xyz:ANZ6JJPBiB7k1c7k@mail-server.lynx-piano.ts.net:993 + outgoing = smtp://spam%40liphlink.xyz:ANZ6JJPBiB7k1c7k@mail-server.lynx-piano.ts.net:587 + default = INBOX + from = Liph + copy-to = Sent + archive = Archive + postpone = Drafts + folders-sort = INBOX,Drafts,Sent,Archive,Spam,Trash + aliases = blue@liphlink.xyz,red@liphlink.xyz diff --git a/aerc/.config/aerc/aerc.conf b/aerc/.config/aerc/aerc.conf new file mode 100644 index 0000000..b01beb7 --- /dev/null +++ b/aerc/.config/aerc/aerc.conf @@ -0,0 +1,890 @@ +# +# aerc main configuration + +[general] +# Used as a default path for save operations if no other path is specified. +# ~ is expanded to the current user home dir. +# +#default-save-path= + +# If set to "gpg", aerc will use system gpg binary and keystore for all crypto +# operations. If set to "internal", the internal openpgp keyring will be used. +# If set to "auto", the system gpg will be preferred unless the internal +# keyring already exists, in which case the latter will be used. +# +# Default: auto +#pgp-provider=auto + +# By default, the file permissions of accounts.conf must be restrictive and +# only allow reading by the file owner (0600). Set this option to true to +# ignore this permission check. Use this with care as it may expose your +# credentials. +# +# Default: false +unsafe-accounts-conf=false +index-format=notmuch://~/.local/share/mail +# Output log messages to specified file. A path starting with ~/ is expanded to +# the user home dir. When redirecting aerc's output to a file using > shell +# redirection, this setting is ignored and log messages are printed to stdout. +# +#log-file= + +# Only log messages above the specified level to log-file. Supported levels +# are: trace, debug, info, warn and error. When redirecting aerc's output to +# a file using > shell redirection, this setting is ignored and the log level +# is forced to trace. +# +# Default: info +#log-level=info + +# Disable IPC entirely. Don't run commands (including mailto:... and mbox:...) +# in an existing aerc instance, and don't start an IPC server to allow +# subsequent aerc instances to run commands in the current one. +# +# Default: false +#disable-ipc=false + +# Don't run mailto:... commands over IPC; start a new aerc instance with the +# composer instead. +# +# Default: false +#disable-ipc-mailto=false +# +# Don't run mbox:... commands over IPC; start a new aerc instance with the mbox +# file instead. +# +# Default: false +#disable-ipc-mbox=false + +# Set the $TERM environment variable used for the embedded terminal. +# +# Default: xterm-256color +#term=xterm-256color + +# Display OSC8 strings in the embedded terminal +# +# Default: false +#enable-osc8=false + +# Default shell command to use for :menu. This will be executed with sh -c and +# will run in an popover dialog. +# +# Any occurrence of %f will be replaced by a temporary file path where the +# command is expected to write output lines to be consumed by :menu. Otherwise, +# the lines will be read from the command's standard output. +# +# Examples: +# default-menu-cmd=fzf +# default-menu-cmd=fzf --multi +# default-menu-cmd=dmenu -l 20 +# default-menu-cmd=ranger --choosefiles=%f +# +#default-menu-cmd= + +[ui] +# +# Describes the format for each row in a mailbox view. This is a comma +# separated list of column names with an optional align and width suffix. After +# the column name, one of the '<' (left), ':' (center) or '>' (right) alignment +# characters can be added (by default, left) followed by an optional width +# specifier. The width is either an integer representing a fixed number of +# characters, or a percentage between 1% and 99% representing a fraction of the +# terminal width. It can also be one of the '*' (auto) or '=' (fit) special +# width specifiers. Auto width columns will be equally attributed the remaining +# terminal width. Fit width columns take the width of their contents. If no +# width specifier is set, '*' is used by default. +# +# Default: flags:4,name<20%,subject,date>= +#index-columns=flags:4,name<20%,subject,date>= +border-char-vertical="│" +border-char-horizontal="─" +styleset-name=catppuccin-mocha + +# +# Each name in index-columns must have a corresponding column-$name setting. +# All column-$name settings accept golang text/template syntax. See +# aerc-templates(7) for available template attributes and functions. +# +# Here are some examples to show the To field instead of the From field for +# an email (modifying column-name): +# +# 1. a generic one +# column-name={{ .Peer | names | join ", " }} +# 2. based upon the selected folder +# column-name={{if match .Folder "^(Gesendet|Sent)$"}}{{index (.To | names) 0}}{{else}}{{index (.From | names) 0}}{{end}} +# +# Default settings +#column-flags={{.Flags | join ""}} +#column-name={{index (.From | names) 0}} +#column-subject={{.ThreadPrefix}}{{.Subject}} +#column-date={{.DateAutoFormat .Date.Local}} + +# +# String separator inserted between columns. When the column width specifier is +# an exact number of characters, the separator is added to it (i.e. the exact +# width will be fully available for the column contents). +# +# Default: " " +#column-separator=" " + +# +# See time.Time#Format at https://godoc.org/time#Time.Format +# +# Default: 2006 Jan 02 +#timestamp-format=2006 Jan 02 + +# +# Index-only time format for messages that were received/sent today. +# If this is empty, timestamp-format is used instead. +# +# Default: 15:04 +#this-day-time-format=15:04 + +# +# Index-only time format for messages that were received/sent within the last +# 7 days. If this is empty, timestamp-format is used instead. +# +# Default: Jan 02 +#this-week-time-format=Jan 02 + +# +# Index-only time format for messages that were received/sent this year. +# If this is empty, timestamp-format is used instead. +# +#Default: Jan 02 +#this-year-time-format=Jan 02 + +# +# Overrides timestamp-format for the message view. +# +# Default: 2006 Jan 02, 15:04 GMT-0700 +#message-view-timestamp-format=2006 Jan 02, 15:04 GMT-0700 + +# +# If set, overrides timestamp-format in the message view for messages +# that were received/sent today. +# +#message-view-this-day-time-format= + +# If set, overrides timestamp-format in the message view for messages +# that were received/sent within the last 7 days. +# +#message-view-this-week-time-format= + +# +# If set, overrides *timestamp-format* in the message view for messages +# that were received/sent this year. +# +#message-view-this-year-time-format= + +# +# Width of the sidebar, including the border. +# +# Default: 22 +sidebar-width=22 + +# +# Default split layout for message list tabs. The syntax is: +# +# [] +# +# is optional and defaults to horizontal. It can take one +# of the following values: h, horiz, horizontal, v, vert, vertical. +# +# is a positive integer representing the size (in terminal cells) +# of the message list window. +# +#message-list-split= + +# +# Message to display when viewing an empty folder. +# +# Default: (no messages) +#empty-message=(no messages) + +# Message to display when no folders exists or are all filtered +# +# Default: (no folders) +#empty-dirlist=(no folders) +# +# Value to set {{.Subject}} template to when subject is empty. +# +# Default: (no subject) +#empty-subject=(no subject) + +# Enable mouse events in the ui, e.g. clicking and scrolling with the mousewheel +# +# Default: false +mouse-enabled=false + +# +# Ring the bell when new messages are received +# +# Default: true +#new-message-bell=true + +# +# Template to use for Account tab titles +# +# Default: {{.Account}} +#tab-title-account={{.Account}} + +# +# Template to use for Composer tab titles +# +# Default: {{if .To}}to:{{index (.To | shortmboxes) 0}} {{end}}{{.SubjectBase}} +#tab-title-composer={{if .To}}to:{{index (.To | shortmboxes) 0}} {{end}}{{.SubjectBase}} + +# +# Template to use for Message Viewer tab titles +# +# Default: {{.Subject}} +#tab-title-viewer={{.Subject}} + + +# Marker to show before a pinned tab's name. +# +# Default: ` +#pinned-tab-marker='`' + +# Template for the left side of the directory list. +# See aerc-templates(7) for all available fields and functions. +# +# Default: {{.Folder}} +#dirlist-left={{.Folder}} + +# Template for the right side of the directory list. +# See aerc-templates(7) for all available fields and functions. +# +# Default: {{if .Unread}}{{humanReadable .Unread}}{{end}} +#dirlist-right={{if .Unread}}{{humanReadable .Unread}}{{end}} + +# Delay after which the messages are actually listed when entering a directory. +# This avoids loading messages when skipping over folders and makes the UI more +# responsive. If you do not want that, set it to 0s. +# +# Default: 200ms +#dirlist-delay=200ms + +# Display the directory list as a foldable tree that allows to collapse and +# expand the folders. +# +# Default: false +#dirlist-tree=false + +# If dirlist-tree is enabled, set level at which folders are collapsed by +# default. Set to 0 to disable. +# +# Default: 0 +#dirlist-collapse=0 + +# List of space-separated criteria to sort the messages by, see *sort* +# command in *aerc*(1) for reference. Prefixing a criterion with "-r " +# reverses that criterion. +# +# Example: "from -r date" +# +sort = -r date + +# Moves to next message when the current message is deleted +# +# Default: true +#next-message-on-delete=true + +# Automatically set the "seen" flag when a message is opened in the message +# viewer. +# +# Default: true +#auto-mark-read=true + +# The directories where the stylesets are stored. It takes a colon-separated +# list of directories. If this is unset or if a styleset cannot be found, the +# following paths will be used as a fallback in that order: +# +# ${XDG_CONFIG_HOME:-~/.config}/aerc/stylesets +# ${XDG_DATA_HOME:-~/.local/share}/aerc/stylesets +# /usr/local/share/aerc/stylesets +# /usr/share/aerc/stylesets +# +#stylesets-dirs= + +# Uncomment to use box-drawing characters for vertical and horizontal borders. +# +# Default: "│" and "─" +#border-char-vertical="│" +#border-char-horizontal="─" + +# Sets the styleset to use for the aerc ui elements. +# +# Default: default +#styleset-name=default + +# Activates fuzzy search in commands and their arguments: the typed string is +# searched in the command or option in any position, and need not be +# consecutive characters in the command or option. +# +# Default: false +#fuzzy-complete=false + +# How long to wait after the last input before auto-completion is triggered. +# +# Default: 250ms +#completion-delay=250ms + +# The minimum required characters to allow auto-completion to be triggered after +# completion-delay. +# +# Setting this to "manual" disables automatic completion, leaving only the +# manually triggered completion with the $complete key (see aerc-binds(5) for +# more details). +# +# Default: 1 +#completion-min-chars=1 + +# +# Global switch for completion popovers +# +# Default: true +#completion-popovers=true + +# Uncomment to use UTF-8 symbols to indicate PGP status of messages +# +# Default: ASCII +#icon-unencrypted= +#icon-encrypted=✔ +#icon-signed=✔ +#icon-signed-encrypted=✔ +#icon-unknown=✘ +#icon-invalid=⚠ + +# Reverses the order of the message list. By default, the message list is +# ordered with the newest (highest UID) message on top. Reversing the order +# will put the oldest (lowest UID) message on top. This can be useful in cases +# where the backend does not support sorting. +# +# Default: false +#reverse-msglist-order = false + +# Reverse display of the message threads. Default order is the initial +# message is on the top with all the replies being displayed below. The +# reverse option will put the initial message at the bottom with the +# replies on top. +# +# Default: false +#reverse-thread-order=false + +# Positions the cursor on the last message in the message list (at the +# bottom of the view) when opening a new folder. +# +# Default: false +#select-last-message=false + +# Sort the thread siblings according to the sort criteria for the messages. If +# sort-thread-siblings is false, the thread siblings will be sorted based on +# the message UID in ascending order. This option is only applicable for +# client-side threading with a backend that enables sorting. Note that there's +# a performance impact when sorting is activated. +# +# Default: false +#sort-thread-siblings=false + +# Set the scroll offset in number of lines from the top and bottom of the +# message list. +# +# Default: 0 +#msglist-scroll-offset = 0 + +# +# Enable a threaded view of messages. If this is not supported by the backend +# (IMAP server or notmuch), threads will be built by the client. +# +# Default: false +#threading-enabled=false + +# Force client-side thread building +# +# Default: false +#force-client-threads=false + +# If no References nor In-Reply-To headers can be matched to build client side +# threads, fallback to similar subjects. +# +# Default: false +#threading-by-subject=false + +# Show thread context enables messages which do not match the current query (or +# belong to the current mailbox) to be shown for context. These messages can be +# styled separately using "msglist_thread_context" in a styleset. This feature +# is not supported by all backends +# +# Default: false +#show-thread-context=false + +# Debounce client-side thread building +# +# Default: 50ms +#client-threads-delay=50ms + +# +# Thread prefix customization: + +# +# Customize the thread prefix appearance by selecting the arrow head. +# +# Default: ">" +#thread-prefix-tip = ">" + +# +# Customize the thread prefix appearance by selecting the arrow indentation. +# +# Default: " " +#thread-prefix-indent = " " + +# +# Customize the thread prefix appearance by selecting the vertical extension of +# the arrow. +# +# Default: "│" +#thread-prefix-stem = "│" + +# +# Customize the thread prefix appearance by selecting the horizontal extension +# of the arrow. +# +# Default: "" +#thread-prefix-limb = "" + +# +# Customize the thread prefix appearance by selecting the folded thread +# indicator. +# +# Default: "+" +#thread-prefix-folded = "+" + +# +# Customize the thread prefix appearance by selecting the unfolded thread +# indicator. +# +# Default: "" +#thread-prefix-unfolded = "" + +# +# Customize the thread prefix appearance by selecting the first child connector. +# +# Default: "" +#thread-prefix-first-child = "" + +# +# Customize the thread prefix appearance by selecting the connector used if +# the message has siblings. +# +# Default: "├─" +#thread-prefix-has-siblings = "├─" + +# +# Customize the thread prefix appearance by selecting the connector used if the +# message has no parents and no children. +# +# Default: "" +#thread-prefix-lone = "" + +# +# Customize the thread prefix appearance by selecting the connector used if the +# message has no parents and has children. +# +# Default: "" +#thread-prefix-orphan = "" + +# +# Customize the thread prefix appearance by selecting the connector for the last +# sibling. +# +# Default: "└─" +#thread-prefix-last-sibling = "└─" + +# +# Customize the reversed thread prefix appearance by selecting the connector for +# the last sibling. +# +# Default: "┌─" +#thread-prefix-last-sibling-reverse = "┌─" + +# +# Customize the thread prefix appearance by selecting the connector for dummy +# thread. +# +# Default: "┬─" +#thread-prefix-dummy = "┬─" + +# +# Customize the reversed thread prefix appearance by selecting the connector for +# dummy thread. +# +# Default: "┴─" +#thread-prefix-dummy-reverse = "┴─" + +# +# Customize the reversed thread prefix appearance by selecting the first child +# connector. +# +# Default: "" +#thread-prefix-first-child-reverse = "" + +# +# Customize the reversed thread prefix appearance by selecting the connector +# used if the message has no parents and has children. +# +# Default: "" +#thread-prefix-orphan-reverse = "" + +[statusline] +# +# Describes the format for the status line. This is a comma separated list of +# column names with an optional align and width suffix. See [ui].index-columns +# for more details. To completely mute the status line except for push +# notifications, explicitly set status-columns to an empty string. +# +# Default: left<*,center:=,right>* +#status-columns=left<*,center:=,right>* + +# +# Each name in status-columns must have a corresponding column-$name setting. +# All column-$name settings accept golang text/template syntax. See +# aerc-templates(7) for available template attributes and functions. +# +# Default settings +#column-left=[{{.Account}}] {{.StatusInfo}} +#column-center={{.PendingKeys}} +#column-right={{.TrayInfo}} | {{cwd}} + +# +# String separator inserted between columns. +# See [ui].column-separator for more details. +# +#column-separator=" " + +# Specifies the separator between grouped statusline elements. +# +# Default: " | " +#separator=" | " + +# Defines the mode for displaying the status elements. +# Options: text, icon +# +# Default: text +#display-mode=text + +[viewer] +# pager=less -Rc +pager=cat +html-unsafe-images=false +html-filter=dante +image/*=chafa -f kitty -s ${width}x${height} +text/html=dante +application/pdf=zathura +video/*=mpv +header-layout=From,To,Subject,Date + + +#w3m -dump -T text/html -o display_link_number=1 +# +# Specifies the pager to use when displaying emails. Note that some filters +# may add ANSI codes to add color to rendered emails, so you may want to use a +# pager which supports ANSI codes. +# +# Default: less -Rc + +# +# If an email offers several versions (multipart), you can configure which +# mimetype to prefer. For example, this can be used to prefer plaintext over +# html emails. +# +# Default: text/plain,text/html +#alternatives=text/plain,text/html + +# +# Default setting to determine whether to show full headers or only parsed +# ones in message viewer. +# +# Default: false +#show-headers=false + +# +# Layout of headers when viewing a message. To display multiple headers in the +# same row, separate them with a pipe, e.g. "From|To". Rows will be hidden if +# none of their specified headers are present in the message. +# +# Default: From|To,Cc|Bcc,Date,Subject +#header-layout=From|To,Cc|Bcc,Date,Subject + +# Whether to always show the mimetype of an email, even when it is just a single part +# +# Default: false +#always-show-mime=false + +# Define the maximum height of the mimetype switcher before a scrollbar is used. +# The height of the mimetype switcher is restricted to half of the display +# height. If the provided value for the height is zero, the number of parts will +# be used as the height of the type switcher. +# +# Default: 0 +#max-mime-height = 0 + +# Parses and extracts http links when viewing a message. Links can then be +# accessed with the open-link command. +# +# Default: true +#parse-http-links=true + +[compose] +editor=nvim # or your preferred editor +address-book-cmd=abook --mutt-query '%s' +# Specifies the command to run the editor with. It will be shown in an embedded +# terminal, though it may also launch a graphical window if the environment +# supports it. Defaults to $EDITOR, or vi. +#editor= + +# +# When set, aerc will create and read .eml files for composing that have +# non-standard \n linebreaks. This is only relevant if the used editor does not +# support CRLF linebreaks. +# +#lf-editor=false + +# +# Default header fields to display when composing a message. To display +# multiple headers in the same row, separate them with a pipe, e.g. "To|From". +# +# Default: To|From,Subject +#header-layout=To|From,Subject + +# +# Edit headers into the text editor instead than separate fields. +# +# When this is true, address-book-cmd is not supported and address completion +# is left to the editor itself. Also, displaying multiple headers on the same +# line is not possible. +# +# Default: false +edit-headers=true + +# +# Sets focus to the email body when the composer window opens. +# +# Default: false +#focus-body=false + +# +# Specifies the command to be used to tab-complete email addresses. Any +# occurrence of "%s" in the address-book-cmd will be replaced with what the +# user has typed so far. +# +# The command must output the completions to standard output, one completion +# per line. Each line must be tab-delimited, with an email address occurring as +# the first field. Only the email address field is required. The second field, +# if present, will be treated as the contact name. Additional fields are +# ignored. +# +# This parameter can also be set per account in accounts.conf. +#address-book-cmd= + +# Specifies the command to be used to select attachments. Any occurrence of +# '%s' in the file-picker-cmd will be replaced with the argument +# to :attach -m . Any occurrence of '%f' will be replaced by the +# location of a temporary file, from which aerc will read the selected files. +# +# If '%f' is not present, the command must output the selected files to +# standard output, one file per line. If it is present, then aerc does not +# capture the standard output and instead reads the files from the temporary +# file which should have the same format. +#file-picker-cmd= + +# +# Allow to address yourself when replying +# +# Default: true +#reply-to-self=true + +# Warn before sending an email with an empty subject. +# +# Default: false +#empty-subject-warning=false + +# +# Warn before sending an email that matches the specified regexp but does not +# have any attachments. Leave empty to disable this feature. +# +# Uses Go's regexp syntax, documented at https://golang.org/s/re2syntax. The +# "(?im)" flags are set by default (case-insensitive and multi-line). +# +# Example: +# no-attachment-warning=^[^>]*attach(ed|ment) +# +#no-attachment-warning= + +# +# When set, aerc will generate "format=flowed" bodies with a content type of +# "text/plain; format=flowed" as described in RFC3676. This format is easier to +# handle for some mailing software, and generally just looks like ordinary +# text. To actually make use of this format's features, you'll need support in +# your editor. +# +#format-flowed=false + +[multipart-converters] +# +# Converters allow to generate multipart/alternative messages by converting the +# main text/plain part into any other MIME type. Only exact MIME types are +# accepted. The commands are invoked with sh -c and are expected to output +# valid UTF-8 text. +# +# Example (obviously, this requires that you write your main text/plain body +# using the markdown syntax): +#text/html=pandoc -f markdown -t html --standalone + +[filters] +# +text/plain=sed 's/^$//' + +# Filters allow you to pipe an email body through a shell command to render +# certain emails differently, e.g. highlighting them with ANSI escape codes. +# +# The commands are invoked with sh -c. The following folders are prepended to +# the system $PATH to allow referencing filters from their name only: +# +# ${XDG_CONFIG_HOME:-~/.config}/aerc/filters +# ~/.local/libexec/aerc/filters +# ${XDG_DATA_HOME:-~/.local/share}/aerc/filters +# $PREFIX/libexec/aerc/filters +# $PREFIX/share/aerc/filters +# /usr/libexec/aerc/filters +# /usr/share/aerc/filters +# +# If you want to run a program in your default $PATH which has the same name +# as a builtin filter (e.g. /usr/bin/colorize), use its absolute path. +# +# The following variables are defined in the filter command environment: +# +# AERC_MIME_TYPE the part MIME type/subtype +# AERC_FORMAT the part content type format= parameter +# AERC_FILENAME the attachment filename (if any) +# AERC_SUBJECT the message Subject header value +# AERC_FROM the message From header value +# +# The first filter which matches the email's mimetype will be used, so order +# them from most to least specific. +# +# You can also match on non-mimetypes, by prefixing with the header to match +# against (non-case-sensitive) and a comma, e.g. subject,text will match a +# subject which contains "text". Use header,~regex to match against a regex. +# +text/plain=colorize +text/calendar=calendar +message/delivery-status=colorize +message/rfc822=colorize +#text/html=pandoc -f html -t plain | colorize +text/html=! html +text/html=! w3m -T text/html -I UTF-8 +#text/*=bat -fP --file-name="$AERC_FILENAME" +#application/x-sh=bat -fP -l sh +#image/*=catimg -w $(tput cols) - +#subject,~Git(hub|lab)=lolcat -f +#from,thatguywhodoesnothardwraphismessages=wrap -w 100 | colorize + +# This special filter is only used to post-process email headers when +# [viewer].show-headers=true +# By default, headers are piped directly into the pager. +# +.headers=colorize + +[openers] +# +# Openers allow you to specify the command to use for the :open and :open-link +# actions on a per-MIME-type basis. The :open-link URL scheme is used to +# determine the MIME type as follows: x-scheme-handler/. +# +# {} is expanded as the temporary filename or URL to be opened with proper +# shell quoting. If it is not encountered in the command, the filename/URL will +# be appended to the end of the command. The command will then be executed with +# `sh -c`. +# +# Like [filters], openers support basic shell globbing. The first opener which +# matches the part's MIME type (or URL scheme handler MIME type) will be used, +# so order them from most to least specific. +# +# Examples: +# x-scheme-handler/irc=hexchat +# x-scheme-handler/http*=printf '%s' {} | wl-copy +# text/html=surf -dfgms +# text/plain=gvim {} +125 +# message/rfc822=thunderbird + +[hooks] +# text/html=librewolf +x-scheme-handler/http=librewolf +x-scheme-handler/https=librewolf + +# +# Hooks are triggered whenever the associated event occurs. + +# +# Executed when a new email arrives in the selected folder +#mail-received=notify-send "[$AERC_ACCOUNT/$AERC_FOLDER] New mail from $AERC_FROM_NAME" "$AERC_SUBJECT" + +# +# Executed when mail is deleted from a folder +#mail-deleted=mbsync "$AERC_ACCOUNT:$AERC_FOLDER" & + +# +# Executed when aerc adds mail to a folder +#mail-added=mbsync "$AERC_ACCOUNT:$AERC_FOLDER" & + +# +# Executed when aerc starts +#aerc-startup=aerc :terminal calcurse && aerc :next-tab + +# +# Executed when aerc shuts down. +#aerc-shutdown= + +# +# Executed when notmuch tags are modified. +#tag-modified= + +# +# Executed when flags are changed on a message. +#flag-changed=mbsync "$AERC_ACCOUNT:$AERC_FOLDER" & + +[templates] +# Templates are used to populate email bodies automatically. + +### +new-message=new-msg +quoted-reply=reply-quoted + + +# The directories where the templates are stored. It takes a colon-separated +# list of directories. If this is unset or if a template cannot be found, the +# following paths will be used as a fallback in that order: +# +# ${XDG_CONFIG_HOME:-~/.config}/aerc/templates +# ${XDG_DATA_HOME:-~/.local/share}/aerc/templates +# /usr/local/share/aerc/templates +# /usr/share/aerc/templates +# +template-dirs=${XDG_CONFIG_HOME:-~/.config}/aerc/templates + +# The default template to be used for new messages. +# +# default: new_message +#new-message=new_message + +# The default template to be used for quoted replies. +# +# default: quoted_reply +#quoted-reply=quoted_reply + +# The default template to be used for forward as body. +# +# default: forward_as_body +#forwards=forward_as_body diff --git a/aerc/.config/aerc/binds.conf b/aerc/.config/aerc/binds.conf new file mode 100644 index 0000000..a501508 --- /dev/null +++ b/aerc/.config/aerc/binds.conf @@ -0,0 +1,236 @@ +# Binds are of the form = +# To use '=' in a key sequence, substitute it with "Eq": "" +# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit + = :prev-tab + = :prev-tab + = :next-tab + = :next-tab +\[t = :prev-tab +\]t = :next-tab + = :term +? = :help keys + = :prompt 'Quit?' quit + = :prompt 'Quit?' quit + = :suspend + +[messages] +# Switch between Adresses +,1 = :change-tab phil@liphlink.xyz +,2 = :change-tab spam@liphlink.xyz + +# Delete = move to Trash (syncs with ProtonMail) +d = :move Trash + +#d = :move Trash +D = :delete + +# Archive +a = :archive flat + +# Quick folder navigation +,i = :cf Inbox +,u = :cf Unread +,n = :cf Newsletters +,f = :cf Finance +,s = :cf Shopping +,t = :cf Travel +,d = :cf Development +,x = :cf Spam +,tr = :cf Trash +,a = :cf All Mail + +o1 = :compose -H "From: Liph \" +o2 = :compose -H "From: Liph \" +o3 = :compose -H "From: Liph \" +o4 = :compose -H "From: Philipp Waibel \" +o5 = :compose -H "From: P.Waibel \" + +# Delete and sync +#d = :modify-labels +trash -inbox:archive flat +#d = :modify-labels +deleted -inbox +#d = :modify-labels +deleted -inbox +#d = :move Trash:exec mbsync -a && notmuch new +# Permanently delete (Shift+D) +#D = :prompt 'Really delete?' :move Trash + +#B = :compose -H "From: waibel ph.waibel@proton.me" +# for url handling + +j = :next + = :next + = :next 50% + = :next 100% + = :next 100% + +k = :prev + = :prev + = :prev 50% + = :prev 100% + = :prev 100% +g = :select 0 +G = :select -1 + +J = :next-folder + = :next-folder +K = :prev-folder + = :prev-folder +H = :collapse-folder + = :collapse-folder +L = :expand-folder + = :expand-folder + +v = :mark -t + = :mark -t:next +V = :mark -v + +T = :toggle-threads +zc = :fold +zo = :unfold +za = :fold -t +zM = :fold -a +zR = :unfold -a + = :fold -t + +zz = :align center +zt = :align top +zb = :align bottom + + = :view +#d = :choose -o y 'Really delete this message' delete-message +#D = :delete +a = :archive flat +A = :unmark -a:mark -T:archive flat + +C = :compose +m = :compose + +b = :bounce + +rr = :reply -a +rq = :reply -aq +Rr = :reply +Rq = :reply -q + +c = :cf +$ = :term +! = :term +| = :pipe + +/ = :search +\ = :filter +n = :next-result +N = :prev-result + = :clear + +s = :split +S = :vsplit + +pl = :patch list +pa = :patch apply +pd = :patch drop +pb = :patch rebase +pt = :patch term +ps = :patch switch + +[messages:folder=Drafts] + = :recall + +[view] + +,l = :pipe urlscan + +/ = :toggle-key-passthrough/ +q = :close +O = :open +o = :open +S = :save +| = :pipe +D = :delete +A = :archive flat + + = :open-link + +f = :forward +rr = :reply -a +rq = :reply -aq +Rr = :reply +Rq = :reply -q + +H = :toggle-headers + = :prev-part + = :prev-part + = :next-part + = :next-part +J = :next + = :next +K = :prev + = :prev + +[view::passthrough] +$noinherit = true +$ex = + = :toggle-key-passthrough + +[compose] +# Keybindings used when the embedded terminal is not selected in the compose +# view +$noinherit = true +$ex = +$complete = + = :prev-field + = :prev-field + = :next-field + = :next-field + = :switch-account -p + = :switch-account -p + = :switch-account -n + = :switch-account -n + = :next-field + = :prev-field + = :prev-tab + = :prev-tab + = :next-tab + = :next-tab + +[compose::editor] +# Keybindings used when the embedded terminal is selected in the compose view +$noinherit = true +$ex = + = :prev-field + = :prev-field + = :next-field + = :next-field + = :prev-tab + = :prev-tab + = :next-tab + = :next-tab + + +# Insert signatures with Ctrl+s + number +1 = :exec cat /home/liph/.config/aerc/sigs/formal.txt +2 = :read ~/.config/aerc/sigs/formal_eng.txt +3 = :read ~/.config/aerc/sigs/liph.txt +4 = :read ~/.config/aerc/sigs/phil.txt + +[compose::review] +# Keybindings used when reviewing a message to be sent +# Inline comments are used as descriptions on the review screen +y = :send # Send +n = :abort # Abort (discard message, no confirmation) +s = :sign # Toggle signing +x = :encrypt # Toggle encryption to all recipients +v = :preview # Preview message +p = :postpone # Postpone +q = :choose -o d discard abort -o p postpone postpone # Abort or postpone +e = :edit # Edit (body and headers) +a = :attach # Add attachment +d = :detach # Remove attachment + +[terminal] +$noinherit = true +$ex = + + = :prev-tab + = :next-tab + = :prev-tab + = :next-tab diff --git a/aerc/.config/aerc/notmuch-queries.conf b/aerc/.config/aerc/notmuch-queries.conf new file mode 100644 index 0000000..da7141b --- /dev/null +++ b/aerc/.config/aerc/notmuch-queries.conf @@ -0,0 +1,12 @@ +Inbox=tag:inbox AND NOT tag:spam +Unread=tag:unread AND NOT tag:spam +Newsletters=tag:newsletter +Shopping=tag:shopping +Finance=tag:finance +Travel=tag:travel +Development=tag:dev +Spam=tag:spam +Sent=tag:sent +Trash=tag:deleted OR folder:Trash +Archive=tag:archive +All Mail=* diff --git a/aerc/.config/aerc/scripts/move-trash.sh b/aerc/.config/aerc/scripts/move-trash.sh new file mode 100755 index 0000000..e8269b3 --- /dev/null +++ b/aerc/.config/aerc/scripts/move-trash.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Get the current message's notmuch ID from aerc's environment +# We'll use notmuch to find and move the file + +maildir="$HOME/.local/share/mail" + +# Find files for messages in current thread that aren't already in Trash +notmuch search --output=files thread:{} 2>/dev/null | while read filepath; do + # Skip if already in Trash + if [[ "$filepath" == *"/Trash/"* ]]; then + continue + fi + + if [[ -f "$filepath" ]]; then + filename=$(basename "$filepath") + mkdir -p "$maildir/Trash/cur" + mv "$filepath" "$maildir/Trash/cur/$filename" + fi +done + +# Re-index +notmuch new >/dev/null 2>&1 diff --git a/aerc/.config/aerc/scripts/new-sync.sh b/aerc/.config/aerc/scripts/new-sync.sh new file mode 100755 index 0000000..9f0d2d8 --- /dev/null +++ b/aerc/.config/aerc/scripts/new-sync.sh @@ -0,0 +1,35 @@ +#!/bin/sh +MBSYNC=$(pgrep mbsync) +NOTMUCH=$(pgrep notmuch) +if [ -n "$MBSYNC" -o -n "$NOTMUCH" ]; then + echo "Already running one instance of mbsync or notmuch. Exiting..." + exit 0 +fi + +maildir="$HOME/.local/share/mail" + +echo "Moving messages tagged as *deleted* to Trash" +notmuch search --format=text0 --output=files tag:deleted | while IFS= read -r -d '' filepath; do + # Skip if already in Trash + case "$filepath" in + */Trash/*) + continue + ;; + esac + + # Move to Trash if file exists + if [ -f "$filepath" ]; then + filename=$(basename "$filepath") + mkdir -p "$maildir/Trash/cur" + mv -v "$filepath" "$maildir/Trash/cur/$filename" + fi +done + +mbsync -Va +notmuch new +PYTHONWARNINGS="ignore::UserWarning" afew --tag --new + +# Auto-tag and cleanup +notmuch tag +sent -- folder:Sent and not tag:sent +notmuch tag +trash -- folder:Trash and not tag:trash +notmuch tag -deleted -- folder:Trash diff --git a/aerc/.config/aerc/scripts/new-sync_1.sh b/aerc/.config/aerc/scripts/new-sync_1.sh new file mode 100755 index 0000000..c8b1ab4 --- /dev/null +++ b/aerc/.config/aerc/scripts/new-sync_1.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +MBSYNC=$(pgrep mbsync) +NOTMUCH=$(pgrep notmuch) + +if [ -n "$MBSYNC" -o -n "$NOTMUCH" ]; then + echo "Already running one instance of mbsync or notmuch. Exiting..." + exit 0 +fi + +echo "Deleting messages tagged as *deleted*" +notmuch search --format=text0 --output=files tag:deleted | xargs -0 --no-run-if-empty rm -v + +mbsync -Va +notmuch new diff --git a/aerc/.config/aerc/scripts/sig-picker.sh b/aerc/.config/aerc/scripts/sig-picker.sh new file mode 100755 index 0000000..c7e47e5 --- /dev/null +++ b/aerc/.config/aerc/scripts/sig-picker.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +read input + +case "$input" in + "liiph@proton.me") + cat ~/.config/aerc/sigs/liph.txt + ;; + "liiph@protonmail.com") + cat ~/.config/aerc/sigs/liph.txt + ;; + "liiph@pm.me") + cat ~/.config/aerc/sigs/liph.txt + ;; + "ph.waibel@proton.me") + cat ~/.config/aerc/sigs/formal.txt + ;; + "ph.waibel@pm.me") + cat ~/.config/aerc/sigs/phil.txt + ;; + *) + # Default signature if no match + cat ~/.config/aerc/sigs/default.txt + ;; +esac diff --git a/aerc/.config/aerc/scripts/sync-mail.sh b/aerc/.config/aerc/scripts/sync-mail.sh new file mode 100755 index 0000000..157150a --- /dev/null +++ b/aerc/.config/aerc/scripts/sync-mail.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# Sync mail from ProtonMail Bridge (suppress CLOSE error) +echo "Syncing mail from ProtonMail..." +mbsync -a 2>&1 | grep -v "CLOSE" + +# Index new mail (this automatically runs post-new hook) +echo "Indexing new messages..." +notmuch new + +# Move all deleted messages to Trash folder +echo "Cleaning up deleted messages..." +DELETED_COUNT=0 +notmuch search --output=files tag:deleted 2>/dev/null | while read filepath; do + if [ -f "$filepath" ]; then + TRASH_DIR="$HOME/.local/share/mail/Trash/cur" + mkdir -p "$TRASH_DIR" + + FILENAME=$(basename "$filepath") + mv "$filepath" "$TRASH_DIR/$FILENAME" + ((DELETED_COUNT++)) + fi +done + +# Update notmuch after moving files +if [ $DELETED_COUNT -gt 0 ]; then + echo "Moved $DELETED_COUNT message(s) to Trash" + notmuch new --no-hooks >/dev/null 2>&1 +fi + +# Sync moved messages back to ProtonMail +echo "Syncing changes to ProtonMail..." +mbsync -a 2>&1 | grep -v "CLOSE" >/dev/null + +# Notify if new mail +NEW=$(notmuch count tag:unread) +if [ $NEW -gt 0 ]; then + notify-send "📬 Mail" "$NEW unread message(s)" +fi + +echo "Sync complete: $(date)" diff --git a/aerc/.config/aerc/scripts/trash-message.sh b/aerc/.config/aerc/scripts/trash-message.sh new file mode 100755 index 0000000..8970239 --- /dev/null +++ b/aerc/.config/aerc/scripts/trash-message.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# Save the piped message to temp file +TEMP_MSG=$(mktemp) +cat > "$TEMP_MSG" + +# Extract Message-ID more robustly +MESSAGE_ID=$(grep -i "^Message-ID:" "$TEMP_MSG" | head -1 | sed 's/^[Mm]essage-[Ii][Dd]: *//; s/^$//' | tr -d '\r\n ') + +# Cleanup temp file +rm "$TEMP_MSG" + +if [ -z "$MESSAGE_ID" ]; then + notify-send "Error" "Could not find Message-ID" + exit 1 +fi + +# Get file path from notmuch +FILEPATH=$(notmuch search --output=files "id:$MESSAGE_ID" 2>/dev/null | head -1) + +if [ -z "$FILEPATH" ] || [ ! -f "$FILEPATH" ]; then + # Try alternative search + FILEPATH=$(notmuch search --output=files --exclude=false "*" 2>/dev/null | xargs grep -l "Message-ID.*$MESSAGE_ID" 2>/dev/null | head -1) +fi + +if [ -z "$FILEPATH" ] || [ ! -f "$FILEPATH" ]; then + notify-send "Error" "File not found for Message-ID: $MESSAGE_ID" + exit 1 +fi + +# Move to Trash folder +TRASH_DIR="$HOME/.local/share/mail/Trash/cur" +mkdir -p "$TRASH_DIR" + +FILENAME=$(basename "$FILEPATH") +mv "$FILEPATH" "$TRASH_DIR/$FILENAME" + +# Update notmuch database +notmuch new --no-hooks >/dev/null 2>&1 + +# Tag as deleted +notmuch tag +deleted +trash -inbox -unread -- "id:$MESSAGE_ID" >/dev/null 2>&1 + +# Trigger sync in background +(sleep 2 && mbsync -a 2>&1 | grep -v CLOSE >/dev/null) & + +notify-send "📧 Aerc" "Moved to Trash" diff --git a/aerc/.config/aerc/sigs/formal.txt b/aerc/.config/aerc/sigs/formal.txt new file mode 100644 index 0000000..a702d87 --- /dev/null +++ b/aerc/.config/aerc/sigs/formal.txt @@ -0,0 +1,3 @@ +-- +freundliche Grüsse +Philipp Waibel diff --git a/aerc/.config/aerc/sigs/formal_eng.txt b/aerc/.config/aerc/sigs/formal_eng.txt new file mode 100644 index 0000000..0493eb9 --- /dev/null +++ b/aerc/.config/aerc/sigs/formal_eng.txt @@ -0,0 +1,3 @@ +-- +kind regards +Philipp Waibel diff --git a/aerc/.config/aerc/sigs/liph.txt b/aerc/.config/aerc/sigs/liph.txt new file mode 100644 index 0000000..62661b4 --- /dev/null +++ b/aerc/.config/aerc/sigs/liph.txt @@ -0,0 +1,3 @@ +-- +thanks +Phil diff --git a/aerc/.config/aerc/sigs/phil.txt b/aerc/.config/aerc/sigs/phil.txt new file mode 100644 index 0000000..8d6cae1 --- /dev/null +++ b/aerc/.config/aerc/sigs/phil.txt @@ -0,0 +1,3 @@ +-- +besten Dank im Voraus +Philipp Waibel diff --git a/aerc/.config/aerc/stylesets/catppuccin-mocha b/aerc/.config/aerc/stylesets/catppuccin-mocha new file mode 100644 index 0000000..bf41e50 --- /dev/null +++ b/aerc/.config/aerc/stylesets/catppuccin-mocha @@ -0,0 +1,51 @@ +*.default=true +*.normal=true + +default.fg=#cdd6f4 + +error.fg=#f38ba8 +warning.fg=#fab387 +success.fg=#a6e3a1 + +tab.fg=#6c7086 +tab.bg=#181825 +tab.selected.fg=#cdd6f4 +tab.selected.bg=#1e1e2e +tab.selected.bold=true + +border.fg=#11111b +border.bold=true + +msglist_unread.bold=true +msglist_flagged.fg=#f9e2af +msglist_flagged.bold=true +msglist_result.fg=#89b4fa +msglist_result.bold=true +msglist_*.selected.bold=true +msglist_*.selected.bg=#313244 + +dirlist_*.selected.bold=true +dirlist_*.selected.bg=#313244 + +statusline_default.fg=#9399b2 +statusline_default.bg=#313244 +statusline_error.bold=true +statusline_success.bold=true + +selector_focused.bg=#313244 + +completion_default.selected.bg=#313244 + +[viewer] +url.fg=#89b4fa +url.underline=true +header.bold=true +signature.dim=true +diff_meta.bold=true +diff_chunk.fg=#89b4fa +diff_chunk_func.fg=#89b4fa +diff_chunk_func.bold=true +diff_add.fg=#a6e3a1 +diff_del.fg=#f38ba8 +quote_*.fg=#6c7086 +quote_1.fg=#9399b2 diff --git a/aerc/.config/aerc/templates/new-msg b/aerc/.config/aerc/templates/new-msg new file mode 100644 index 0000000..e241aba --- /dev/null +++ b/aerc/.config/aerc/templates/new-msg @@ -0,0 +1,6 @@ +X-Mailer: aerc {{version}} + +{{if .From}} +{{exec `~/.config/aerc/scripts/sig-picker.sh` (index .From 0).Address}} +{{else}} +{{end}} diff --git a/aerc/.config/aerc/templates/reply-quoted b/aerc/.config/aerc/templates/reply-quoted new file mode 100644 index 0000000..33e38c7 --- /dev/null +++ b/aerc/.config/aerc/templates/reply-quoted @@ -0,0 +1,7 @@ +X-Mailer: aerc {{version}} + +On {{dateFormat (.OriginalDate | toLocal) "Mon Jan 2, 2006 at 3:04 PM MST"}}, {{.OriginalFrom | names | join ", "}} wrote: +{{trimSignature .OriginalText | quote}} + + +{{exec `~/.config/aerc/scripts/sig-picker.sh` (index .From 0).Address}} diff --git a/nvim/.config/nvim/lazy-lock.json b/nvim/.config/nvim/lazy-lock.json index 4b50e0e..2beef6f 100644 --- a/nvim/.config/nvim/lazy-lock.json +++ b/nvim/.config/nvim/lazy-lock.json @@ -25,7 +25,6 @@ "lazydev.nvim": { "branch": "main", "commit": "5231c62aa83c2f8dc8e7ba957aa77098cda1257d" }, "lualine.nvim": { "branch": "master", "commit": "47f91c416daef12db467145e16bed5bbfe00add8" }, "luvit-meta": { "branch": "main", "commit": "0ea4ff636c5bb559ffa78108561d0976f4de9682" }, - "markview.nvim": { "branch": "main", "commit": "0a5033326f703d99a8788e2d47753d6298195e8a" }, "mason-lspconfig.nvim": { "branch": "main", "commit": "8f1a3e6eecb638817e8999aaa16ada27cd54d867" }, "mason-tool-installer.nvim": { "branch": "main", "commit": "517ef5994ef9d6b738322664d5fdd948f0fdeb46" }, "mason.nvim": { "branch": "main", "commit": "57e5a8addb8c71fb063ee4acda466c7cf6ad2800" }, @@ -40,14 +39,17 @@ "nvim-navic": { "branch": "master", "commit": "7d914a39a1ef8f4e22c2c4381abeef7c556f5a13" }, "nvim-notify": { "branch": "master", "commit": "8701bece920b38ea289b457f902e2ad184131a5d" }, "nvim-spectre": { "branch": "master", "commit": "72f56f7585903cd7bf92c665351aa585e150af0f" }, + "nvim-surround": { "branch": "main", "commit": "1098d7b3c34adcfa7feb3289ee434529abd4afd1" }, "nvim-tmux-navigation": { "branch": "main", "commit": "4898c98702954439233fdaf764c39636681e2861" }, "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, + "nvim-treesitter-textobjects": { "branch": "master", "commit": "5ca4aaa6efdcc59be46b95a3e876300cfead05ef" }, "nvim-ts-context-commentstring": { "branch": "main", "commit": "1b212c2eee76d787bbea6aa5e92a2b534e7b4f8f" }, "nvim-web-devicons": { "branch": "master", "commit": "6788013bb9cb784e606ada44206b0e755e4323d7" }, "obsidian.nvim": { "branch": "main", "commit": "ae1f76a75c7ce36866e1d9342a8f6f5b9c2caf9b" }, "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, "portal.nvim": { "branch": "main", "commit": "77d9d53fec945bfa407d5fd7120f1b4f117450ed" }, "rainbow-delimiters.nvim": { "branch": "master", "commit": "8aafe2cbd89cd4090f573a98cab6b20366576fde" }, + "render-markdown.nvim": { "branch": "main", "commit": "07d088bf8bdadd159eb807b90eaee86a4778383f" }, "telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" }, "telescope.nvim": { "branch": "master", "commit": "e709d31454ee6e6157f0537f861f797bd44c0bad" }, "trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" }, diff --git a/nvim/.config/nvim/lua/plugins.inactive/markdown_1.lua b/nvim/.config/nvim/lua/plugins.inactive/markdown_1.lua new file mode 100644 index 0000000..a8c67b4 --- /dev/null +++ b/nvim/.config/nvim/lua/plugins.inactive/markdown_1.lua @@ -0,0 +1,123 @@ +return { + { + "OXY2DEV/markview.nvim", + lazy = false, + ft = "markdown", + dependencies = { + "nvim-treesitter/nvim-treesitter", + "nvim-tree/nvim-web-devicons", + }, + config = function() + local presets = require("markview.presets") + + require("markview").setup({ + modes = { "n", "no", "c" }, + hybrid_modes = { "n" }, + + callbacks = { + on_enable = function(_, win) + vim.wo[win].conceallevel = 2 + vim.wo[win].concealcursor = "" + end, + }, + + markdown = { + headings = presets.headings.glow, + + code_blocks = { + enable = true, + style = "language", + position = "overlay", + min_width = 60, + pad_amount = 2, + hl = "MarkviewCode", + }, + + block_quotes = { + enable = true, + default = { + border = "▋", + border_hl = "MarkviewBlockQuoteBorder", + }, + }, + + tables = { + enable = true, + parts = { + top = { "╭", "─", "┬", "─", "╮" }, + header = { "├", "─", "┼", "─", "┤" }, + separator = { "├", "─", "┼", "─", "┤" }, + row = { "│", " ", "│", " ", "│" }, + bottom = { "╰", "─", "┴", "─", "╯" }, + }, + use_virt_lines = true, + }, + + list_items = { + enable = true, + indent_size = 2, + shift_width = 2, + }, + }, + + markdown_inline = { + enable = true, + + checkboxes = { + enable = true, + checked = { + text = "✓", + hl = "MarkviewCheckboxChecked", + }, + unchecked = { + text = "☐", + hl = "MarkviewCheckboxUnchecked", + }, + custom = { + { + match_string = "!", + text = "!", + hl = "MarkviewCheckboxImportant", + }, + { + match_string = "-", + text = "◐", + hl = "MarkviewCheckboxPending", + }, + { + match_string = "~", + text = "≈", + hl = "MarkviewCheckboxProgress", + }, + }, + }, + }, + }) + + -- Force override colors AFTER markview sets them up + vim.api.nvim_create_autocmd("FileType", { + pattern = "markdown", + callback = function() + vim.schedule(function() + vim.api.nvim_set_hl(0, "MarkviewCheckboxChecked", { fg = "#f9e2af", force = true }) + vim.api.nvim_set_hl(0, "MarkviewCheckboxUnchecked", { fg = "#f9e2af", force = true }) + vim.api.nvim_set_hl(0, "MarkviewCheckboxImportant", { fg = "#f9e2af", bold = true, force = true }) + vim.api.nvim_set_hl(0, "MarkviewCheckboxPending", { fg = "#f9e2af", force = true }) + vim.api.nvim_set_hl(0, "MarkviewCheckboxProgress", { fg = "#f9e2af", force = true }) + end) + end, + }) + + -- Checkbox extras + require("markview.extras.checkboxes").setup({ + default = "X", + remove_markers = false, + exit = true, + }) + + -- Keymaps + vim.keymap.set("n", "mt", "Markview toggle", { desc = "Toggle Markview" }) + vim.keymap.set("n", "ch", "Checkboxes toggle", { desc = "Toggle checkbox" }) + end, + }, +} diff --git a/nvim/.config/nvim/lua/plugins/markdown.lua b/nvim/.config/nvim/lua/plugins/markdown.lua deleted file mode 100644 index d0034cc..0000000 --- a/nvim/.config/nvim/lua/plugins/markdown.lua +++ /dev/null @@ -1,225 +0,0 @@ -return { - { - "OXY2DEV/markview.nvim", - lazy = false, - ft = "markdown", - dependencies = { - "nvim-treesitter/nvim-treesitter", - "nvim-tree/nvim-web-devicons", - }, - config = function() - local presets = require("markview.presets") - - require("markview").setup({ - modes = { "n", "no", "c" }, - hybrid_modes = { "n" }, - - callbacks = { - on_enable = function(_, win) - vim.wo[win].conceallevel = 2 - vim.wo[win].concealcursor = "" - end, - }, - - -- Glow headings preset - headings = presets.headings.glow, - - -- Code blocks configuration - code_blocks = { - enable = true, - style = "language", - position = "overlay", - min_width = 60, - pad_amount = 2, - pad_char = " ", - - language_names = { - { "py", "python" }, - { "cpp", "C++" }, - { "js", "javascript" }, - { "ts", "typescript" }, - { "sh", "bash" }, - }, - - hl = "MarkviewCode", - sign = true, - sign_hl = "MarkviewCodeSign", - }, - - -- Block quotes configuration - block_quotes = { - enable = true, - default = { - border = "▋", - border_hl = "MarkviewBlockQuoteBorder", - }, - - callouts = { - { - match_string = "NOTE", - callout_preview = "󰋽 Note", - callout_preview_hl = "MarkviewBlockQuoteNote", - border = "▋", - border_hl = "MarkviewBlockQuoteNote", - }, - { - match_string = "TIP", - callout_preview = "󰌶 Tip", - callout_preview_hl = "MarkviewBlockQuoteTip", - border = "▋", - border_hl = "MarkviewBlockQuoteTip", - }, - { - match_string = "IMPORTANT", - callout_preview = " Important", - callout_preview_hl = "MarkviewBlockQuoteImportant", - border = "▋", - border_hl = "MarkviewBlockQuoteImportant", - }, - { - match_string = "WARNING", - callout_preview = " Warning", - callout_preview_hl = "MarkviewBlockQuoteWarn", - border = "▋", - border_hl = "MarkviewBlockQuoteWarn", - }, - { - match_string = "CAUTION", - callout_preview = " Caution", - callout_preview_hl = "MarkviewBlockQuoteError", - border = "▋", - border_hl = "MarkviewBlockQuoteError", - }, - }, - }, - - -- Checkboxes configuration - checkboxes = { - enable = true, - checked = { - text = "✓", - hl = "MarkviewCheckboxChecked", - scope_hl = nil, - }, - unchecked = { - text = "☐", - hl = "MarkviewCheckboxUnchecked", - scope_hl = nil, - }, - custom = { - { - match_string = "!", - text = "!", - hl = "MarkviewCheckboxImportant", - scope_hl = nil, - }, - { - match_string = "-", - text = "◐", - hl = "MarkviewCheckboxPending", - scope_hl = nil, - }, - { - match_string = "~", - text = "≈", - hl = "MarkviewCheckboxProgress", - scope_hl = nil, - }, - }, - }, - - -- Tables with rounded borders - tables = { - enable = true, - - parts = { - top = { "╭", "─", "┬", "─", "╮" }, - header = { "├", "─", "┼", "─", "┤" }, - separator = { "├", "─", "┼", "─", "┤" }, - row = { "│", " ", "│", " ", "│" }, - bottom = { "╰", "─", "┴", "─", "╯" }, - - overlap = { "┼" }, - }, - - hl = { - "MarkviewTableHeader", - "MarkviewTableBorder", - "MarkviewTableBorder", - "MarkviewTableBorder", - "MarkviewTableBorder", - }, - - use_virt_lines = true, - }, - - -- List items - list_items = { - enable = true, - indent_size = 2, - shift_width = 2, - - marker_minus = { - add_padding = true, - text = "•", - hl = "MarkviewListItemMinus", - }, - marker_plus = { - add_padding = true, - text = "•", - hl = "MarkviewListItemPlus", - }, - marker_star = { - add_padding = true, - text = "•", - hl = "MarkviewListItemStar", - }, - }, - }) - - -- Catppuccin Mocha colors - vim.cmd([[ - " Code blocks - Catppuccin Mocha - highlight MarkviewCode guibg=#181825 - highlight MarkviewCodeSign guifg=#89b4fa - - " Block quotes - Catppuccin Mocha - highlight MarkviewBlockQuoteBorder guifg=#6c7086 - highlight MarkviewBlockQuoteNote guifg=#89b4fa - highlight MarkviewBlockQuoteTip guifg=#a6e3a1 - highlight MarkviewBlockQuoteImportant guifg=#cba6f7 - highlight MarkviewBlockQuoteWarn guifg=#fab387 - highlight MarkviewBlockQuoteError guifg=#f38ba8 - - " Checkboxes - Catppuccin Mocha - highlight MarkviewCheckboxChecked guifg=#a6e3a1 - highlight MarkviewCheckboxUnchecked guifg=#6c7086 - highlight MarkviewCheckboxImportant guifg=#f38ba8 gui=bold - highlight MarkviewCheckboxPending guifg=#fab387 - highlight MarkviewCheckboxProgress guifg=#89b4fa - - " List items - Catppuccin Mocha - highlight MarkviewListItemMinus guifg=#89b4fa - highlight MarkviewListItemPlus guifg=#a6e3a1 - highlight MarkviewListItemStar guifg=#cba6f7 - - " Tables - Catppuccin Mocha - highlight MarkviewTableHeader guifg=#cba6f7 gui=bold - highlight MarkviewTableBorder guifg=#6c7086 - ]]) - - -- Setup checkbox toggle extras - require("markview.extras.checkboxes").setup({ - default = "X", - remove_markers = false, - exit = true, - default_marker = "-", - default_state = "X", - }) - - -- Keymaps - vim.keymap.set("n", "mt", "Markview toggle", { desc = "Toggle Markview" }) - vim.keymap.set("n", "ch", "Checkboxes toggle", { desc = "Toggle checkbox" }) - end, - }, -} diff --git a/nvim/.config/nvim/lua/plugins/nvim-surround.lua b/nvim/.config/nvim/lua/plugins/nvim-surround.lua new file mode 100644 index 0000000..1e380cc --- /dev/null +++ b/nvim/.config/nvim/lua/plugins/nvim-surround.lua @@ -0,0 +1,227 @@ +-- nvim-surround configuration with autopairs, treesitter, and comment integration +-- Place this in ~/.config/nvim/lua/plugins/nvim-surround.lua (for lazy.nvim) + +return { + -- nvim-surround: manipulate surroundings + { + "kylechui/nvim-surround", + version = "*", + event = "VeryLazy", + dependencies = { + "nvim-treesitter/nvim-treesitter", + "nvim-treesitter/nvim-treesitter-textobjects", + }, + config = function() + require("nvim-surround").setup({ + keymaps = { + insert = "s", + insert_line = "S", + normal = "ys", + normal_cur = "yss", + normal_line = "yS", + normal_cur_line = "ySS", + visual = "S", + visual_line = "gS", + delete = "ds", + change = "cs", + change_line = "cS", + }, + + -- Custom surrounds + surrounds = { + -- Function call surround + ["f"] = { + add = function() + local result = require("nvim-surround.config").get_input("Enter function name: ") + if result then + return { { result .. "(" }, { ")" } } + end + end, + find = function() + return require("nvim-surround.config").get_selection({ motion = "a(" }) + end, + delete = "^([^(]+%()().-(%))()$", + change = { + target = "^([^(]+%()().-(%))()$", + replacement = function() + local result = require("nvim-surround.config").get_input("Enter function name: ") + if result then + return { { result .. "(" }, { ")" } } + end + end, + }, + }, + + -- Markdown code block + ["c"] = { + add = function() + local lang = require("nvim-surround.config").get_input("Enter language: ") + return { { "```" .. (lang or "") }, { "```" } } + end, + }, + + -- HTML/JSX tag with class + ["C"] = { + add = function() + local class = require("nvim-surround.config").get_input("Enter class name: ") + if class then + return { { '
' }, { "
" } } + end + end, + }, + + -- Template literal (JavaScript/TypeScript) + ["`"] = { + add = { "`", "`" }, + find = "`.-`", + delete = "^(`)().-(`)()$", + }, + }, + + -- Use treesitter for better text object detection + move_cursor = "begin", + indent_lines = function(start, stop) + local b = vim.bo + -- Only indent if the buffer is not a special filetype + if b.ft ~= "help" and b.ft ~= "man" and b.ft ~= "qf" then + vim.cmd(string.format("silent normal! %dG=%dG", start, stop)) + end + end, + }) + end, + }, + + -- nvim-autopairs: auto-close brackets with integration + { + "windwp/nvim-autopairs", + event = "InsertEnter", + dependencies = { "hrsh7th/nvim-cmp" }, + config = function() + local npairs = require("nvim-autopairs") + local Rule = require("nvim-autopairs.rule") + local cond = require("nvim-autopairs.conds") + + npairs.setup({ + check_ts = true, -- Use treesitter + ts_config = { + lua = { "string", "source" }, + javascript = { "string", "template_string" }, + java = false, + }, + disable_filetype = { "TelescopePrompt", "spectre_panel" }, + fast_wrap = { + map = "", + chars = { "{", "[", "(", '"', "'" }, + pattern = string.gsub([[ [%'%"%)%>%]%)%}%,] ]], "%s+", ""), + offset = 0, + end_key = "$", + keys = "qwertyuiopzxcvbnmasdfghjkl", + check_comma = true, + highlight = "PmenuSel", + highlight_grey = "LineNr", + }, + enable_moveright = true, + enable_afterquote = true, + enable_check_bracket_line = true, + enable_bracket_in_quote = true, + enable_abbr = false, + break_undo = true, + map_cr = true, + map_bs = true, + map_c_h = false, + map_c_w = false, + }) + + -- Add spacing inside pairs + local brackets = { { "(", ")" }, { "[", "]" }, { "{", "}" } } + npairs.add_rules({ + Rule(" ", " "):with_pair(function(opts) + local pair = opts.line:sub(opts.col - 1, opts.col) + return vim.tbl_contains({ + brackets[1][1] .. brackets[1][2], + brackets[2][1] .. brackets[2][2], + brackets[3][1] .. brackets[3][2], + }, pair) + end), + }) + + for _, bracket in pairs(brackets) do + npairs.add_rules({ + Rule(bracket[1] .. " ", " " .. bracket[2]) + :with_pair(function() + return false + end) + :with_move(function(opts) + return opts.prev_char:match(".%" .. bracket[2]) ~= nil + end) + :use_key(bracket[2]), + }) + end + + -- Add arrow function for JavaScript/TypeScript + npairs.add_rules({ + Rule("%(.*%)%s*=>$", " { }", { "typescript", "typescriptreact", "javascript", "javascriptreact" }) + :use_regex(true) + :set_end_pair_length(2), + }) + + -- Integration with nvim-cmp + local cmp_autopairs = require("nvim-autopairs.completion.cmp") + local cmp = require("cmp") + cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done()) + end, + }, + + -- Comment.nvim: smart commenting with treesitter + { + "numToStr/Comment.nvim", + event = { "BufReadPre", "BufNewFile" }, + dependencies = { + "nvim-treesitter/nvim-treesitter", + "JoosepAlviste/nvim-ts-context-commentstring", -- For better JSX/TSX comments + }, + config = function() + require("Comment").setup({ + -- Use treesitter for comment detection + pre_hook = require("ts_context_commentstring.integrations.comment_nvim").create_pre_hook(), + + padding = true, + sticky = true, + ignore = "^$", -- Ignore empty lines + + -- LHS of toggle mappings in NORMAL mode + toggler = { + line = "gcc", -- Line-comment toggle + block = "gbc", -- Block-comment toggle + }, + + -- LHS of operator-pending mappings in NORMAL and VISUAL mode + opleader = { + line = "gc", -- Line-comment keymap + block = "gb", -- Block-comment keymap + }, + + -- LHS of extra mappings + extra = { + above = "gcO", -- Add comment on the line above + below = "gco", -- Add comment on the line below + eol = "gcA", -- Add comment at the end of line + }, + + mappings = { + basic = true, + extra = true, + }, + }) + end, + }, + + -- nvim-ts-context-commentstring: JSX/TSX comment support + { + "JoosepAlviste/nvim-ts-context-commentstring", + lazy = true, + opts = { + enable_autocmd = false, -- Disable auto commands, Comment.nvim handles it + }, + }, +} diff --git a/nvim/.config/nvim/lua/plugins/render-markdown.lua b/nvim/.config/nvim/lua/plugins/render-markdown.lua new file mode 100644 index 0000000..f87d8f5 --- /dev/null +++ b/nvim/.config/nvim/lua/plugins/render-markdown.lua @@ -0,0 +1,172 @@ +return { + { + "MeanderingProgrammer/render-markdown.nvim", + dependencies = { + "nvim-treesitter/nvim-treesitter", + "nvim-tree/nvim-web-devicons", + }, + ft = { "markdown" }, + opts = { + -- File types to enable rendering + file_types = { "markdown" }, + + -- Code block configuration + code = { + -- Show language name and icon + enabled = true, + -- Position: 'left', 'right', 'language' + sign = true, + -- Style for code blocks + style = "full", + -- Position of language name (left or right) + position = "left", + -- Disable if you don't want the background + disable_background = false, + -- Width of code block + width = "full", + -- Language icon on the right + right_pad = 1, + left_pad = 1, + -- Border around code blocks + border = "thin", + -- Highlight for the language label + highlight = "RenderMarkdownCode", + highlight_inline = "RenderMarkdownCodeInline", + }, + + -- Heading configuration + heading = { + enabled = true, + sign = true, + icons = { "󰲡 ", "󰲣 ", "󰲥 ", "󰲧 ", "󰲩 ", "󰲫 " }, + backgrounds = { + "RenderMarkdownH1Bg", + "RenderMarkdownH2Bg", + "RenderMarkdownH3Bg", + "RenderMarkdownH4Bg", + "RenderMarkdownH5Bg", + "RenderMarkdownH6Bg", + }, + foregrounds = { + "RenderMarkdownH1", + "RenderMarkdownH2", + "RenderMarkdownH3", + "RenderMarkdownH4", + "RenderMarkdownH5", + "RenderMarkdownH6", + }, + }, + + -- Checkbox configuration + checkbox = { + enabled = true, + render_modes = false, + bullet = false, + left_pad = 0, + right_pad = 1, + unchecked = { + icon = "󰄱 ", + highlight = "RenderMarkdownUnchecked", + scope_highlight = nil, + }, + checked = { + icon = "󰱒 ", + highlight = "RenderMarkdownChecked", + scope_highlight = nil, + }, + -- Custom checkbox states + custom = { + urgent = { + raw = "[!]", + rendered = "󰀦 ", + highlight = "RenderMarkdownUrgent", + }, + }, + }, + + -- Block Quotes + quote = { + enabled = true, + render_modes = false, + icon = "▋", + repeat_linebreak = false, + highlight = { + "RenderMarkdownQuote1", + "RenderMarkdownQuote2", + "RenderMarkdownQuote3", + "RenderMarkdownQuote4", + "RenderMarkdownQuote5", + "RenderMarkdownQuote6", + }, + }, + -- Table configuration + pipe_table = { + enabled = true, + style = "full", + cell = "padded", + border = { + "┌", + "┬", + "┐", + "├", + "┼", + "┤", + "└", + "┴", + "┘", + "│", + "─", + }, + }, + config = function(_, opts) + require("render-markdown").setup(opts) + + -- Function to apply colors + local function apply_colors() + local colors = { + -- Heading colors (gradient from red to blue) + h1 = { fg = "#ff6b6b", bg = "#3d1f1f" }, + h2 = { fg = "#ffa07a", bg = "#3d2a1f" }, + h3 = { fg = "#ffd700", bg = "#3d3d1f" }, + h4 = { fg = "#98fb98", bg = "#1f3d1f" }, + h5 = { fg = "#87ceeb", bg = "#1f2a3d" }, + h6 = { fg = "#dda0dd", bg = "#2a1f3d" }, + + -- Code block colors + code = { bg = "#1e1e2e" }, + + -- Checkbox colors + checked = { fg = "#a6e3a1" }, + unchecked = { fg = "#6c7086" }, + urgent = { fg = "#f38ba8" }, + } + + -- Apply heading colors + for i = 1, 6 do + local h = "h" .. i + vim.api.nvim_set_hl(0, "RenderMarkdownH" .. i, { fg = colors[h].fg, bold = true }) + vim.api.nvim_set_hl(0, "RenderMarkdownH" .. i .. "Bg", { bg = colors[h].bg }) + end + + -- Apply code block colors + vim.api.nvim_set_hl(0, "RenderMarkdownCode", { bg = colors.code.bg }) + vim.api.nvim_set_hl(0, "RenderMarkdownCodeInline", { bg = colors.code.bg }) + + -- Apply checkbox colors with force + vim.api.nvim_set_hl(0, "RenderMarkdownChecked", { fg = colors.checked.fg, default = false }) + vim.api.nvim_set_hl(0, "RenderMarkdownUnchecked", { fg = colors.unchecked.fg, default = false }) + vim.api.nvim_set_hl(0, "RenderMarkdownUrgent", { fg = colors.urgent.fg, bold = true, default = false }) + end + + -- Apply colors immediately + apply_colors() + + -- Re-apply colors after colorscheme changes + vim.api.nvim_create_autocmd("ColorScheme", { + pattern = "*", + callback = apply_colors, + }) + end, + }, + }, +} diff --git a/nvim/.config/nvim/lua/plugins/treesitter.lua b/nvim/.config/nvim/lua/plugins/treesitter.lua index 10ab0c8..30b318e 100644 --- a/nvim/.config/nvim/lua/plugins/treesitter.lua +++ b/nvim/.config/nvim/lua/plugins/treesitter.lua @@ -6,14 +6,33 @@ return { local config = require("nvim-treesitter.configs") config.setup({ ensure_installed = { - "bash", -- For bash code blocks - "html", -- For HTML code blocks - "sql", -- For SQL code blocks - "dockerfile", -- For Docker code blocks + "markdown", + "markdown_inline", + -- Your code block languages + "python", + "java", + "sql", + "bash", + "html", + -- Other languages you use + "lua", + "vim", }, + + -- Auto install missing parsers auto_install = true, - highlight = { enable = true }, - indent = { enable = true }, + + -- Enable syntax highlighting + highlight = { + enable = true, + -- Optional: disable markdown highlighting if render-markdown handles it + -- disable = { 'markdown' }, + }, + + -- Enable indentation + indent = { + enable = true, + }, }) end, }, diff --git a/yazi/.config/yazi/bookmark b/yazi/.config/yazi/bookmark index 2c5d9e4..f6c9cb4 100644 --- a/yazi/.config/yazi/bookmark +++ b/yazi/.config/yazi/bookmark @@ -14,5 +14,4 @@ hdd1 /mnt/hdd1/ 1 flash1 /mnt/flash1/ 8 Downloads /home/liph/Downloads/ D dotfiles /home/liph/dotfiles/ d -Desktop /home/liph/Desktop/ d .config /home/liph/.config/ c diff --git a/zshrc/.aliases.zsh b/zshrc/.aliases.zsh index 684f305..69fe0c3 100644 --- a/zshrc/.aliases.zsh +++ b/zshrc/.aliases.zsh @@ -2,6 +2,7 @@ alias cl='clear' alias cld='clear && cd' alias neo='neofetch' alias f='fuck' +alias a='aerc' # put everything on nvim alias nano='nvim' @@ -101,7 +102,7 @@ alias tr='trash-restore' # pyenv alias pyl='pyenv local' # set this for folder in spec python version -alias pyg='pyenv global' # changes the global python version +alias pyg='pyenv global' # changes the global python version alias pyve='pyenv virtualenvs' # shows all possible vitualenvironments alias pyd='pyenv virtualenv-delete' alias pyn='pyenv virtualenv' # makes a new env $VSERION $NAME @@ -111,7 +112,7 @@ alias pyi='pyenv install' # aria2 and yt-dlp alias aryt="yt-dlp --external-downloader aria2c --external-downloader-args '-x 8 -j2'" # add URL in '' -alias aria='aria2c -x 8' # add URL in '' for 8 segmented download +alias aria='aria2c -x 8' # add URL in '' for 8 segmented download alias yd='yt-dlp' # copy link from videodownload helper and add the URL in '' # ffmpeg @@ -134,7 +135,7 @@ alias boumo='borg umount /tmp/borg' # unmount the mount folder alias sysen='sudo systemctl enable' alias sysst='sudo systemctl start' -# podmand +# podmand alias pops='podman ps' alias pos='podman start' alias post='podman stop'