Compare commits

..

75 Commits

Author SHA1 Message Date
d41f82c771 Update submodules 2025-06-29 18:49:21 +09:00
c77fa00f98 Fix pyenv 2025-06-21 18:28:35 +09:00
da8cc2b511 Update submodules 2025-05-19 22:16:31 +09:00
ef9c4afff3 Update submodules 2025-04-30 21:43:41 +09:00
9dcf45baa5 Update submodules 2025-04-17 21:28:52 +09:00
4ac2c06595 Merge branch 'main' of git.zander.im:Zander671/zsh-config 2025-03-18 22:53:43 +09:00
4935fdbf15 Update submodules 2025-03-18 22:53:29 +09:00
ffb23c98fc Remove ros2 stuff 2025-03-18 22:53:12 +09:00
8bc2b5efe5 Update aliases 2025-03-01 21:42:25 -08:00
2ff695ea43 Undo last commit 2025-02-26 15:09:46 -08:00
b784c01fc2 Source $EAT_SHELL_INTEGRATION_DIR/zsh 2025-02-26 14:48:24 -08:00
cd640456b1 Update submodules 2025-02-24 21:54:04 -08:00
6b7760784a Use the new server-eval-args-left 2025-02-24 19:10:33 -08:00
74d4fab26a Fix the last commit 2025-02-22 03:50:38 -08:00
645a6858b6 Fix tramp creating random files 2025-02-22 03:49:54 -08:00
1af11843ad Fix last commit 2025-02-20 19:28:55 -08:00
743332253a More bat stuff 2025-02-20 19:24:56 -08:00
f4526ea7a7 Fix bat in distrobox 2025-02-20 18:48:41 -08:00
b2e82b80d3 Improve distrobox detection 2025-02-18 13:13:15 -08:00
c06a7bffee Fix last commit 2025-02-18 06:25:44 -08:00
b8c898b3cc Some container stuff 2025-02-18 06:25:06 -08:00
5ff2811927 (Even x3) more changes to distrobox stuff 2025-02-17 21:27:08 -08:00
8579ba568b (Even even) more stuff for distrobox 2025-02-17 02:21:03 -08:00
5ed7f948ef Fix the last commit 2025-02-17 02:09:01 -08:00
4d0a221db4 Change editor for distrobox (again) 2025-02-17 02:07:08 -08:00
d20b129666 More stuff for older versions 2025-02-17 01:57:44 -08:00
b5c3ea0edb Make emacs-bookmark.zsh work on older versions of zsh 2025-02-17 01:10:03 -08:00
7c85a1d3ee (Even) more ros2 stuff 2025-02-17 00:50:44 -08:00
c3a8204ad2 Update lazy-ros2.zsh 2025-02-17 00:13:11 -08:00
5fae0b7ece Fix formatting 2025-02-17 00:05:33 -08:00
cfae639ad5 A few more compatability things 2025-02-16 23:58:26 -08:00
db749437ee More distrobox changes 2025-02-16 23:13:58 -08:00
4a3a91dd9c Add some more distrobox stuff 2025-02-16 23:06:32 -08:00
f21f778bd5 Alias doas to sudo if doas is not installed 2025-02-16 20:53:51 -08:00
ed1ccdcaec Add conditions to some init stuff 2025-02-16 20:52:45 -08:00
e6fdd25097 Remove debug statements 2025-02-15 22:43:00 -08:00
58da9200fc Merge branch 'main' of git.zander.im:Zander671/zsh-config 2025-02-15 22:41:31 -08:00
b57afeec32 Fix ros2 stuff 2025-02-15 22:41:04 -08:00
9962c7159b Update submodules 2025-02-12 11:24:44 -08:00
4348e98b97 Speed up the ros2 stuff 2025-02-11 03:29:15 -08:00
b85772067d Add init file timings and lazy load ros2 stuff 2025-02-10 23:26:27 -08:00
561596711f Add pyenv support 2025-01-27 03:00:17 -08:00
ca65659782 Move zsh-autosuggestions 2024-11-03 11:19:41 -08:00
c58ea7b136 Change to a more reliable emacs communication method 2024-11-03 10:30:31 -08:00
1b290bcf23 Fix debuginfod.sh 2024-11-02 09:22:27 -07:00
dfd7dddf75 Remove call to dirname(1) 2024-11-02 08:16:03 -07:00
d1d2422485 Add .local/share to $FPATH 2024-11-02 08:07:43 -07:00
50389ec227 Fix something with eza 2024-10-22 07:21:44 -07:00
03d7b3e1cf The temp fix stopped working 2024-10-21 05:32:43 -07:00
96ace6e0e8 Update submodules 2024-09-17 05:32:07 -07:00
d61e758c1c Clean up init.zsh 2024-09-10 02:16:14 -07:00
a16907ed82 Update submodules 2024-09-10 02:13:25 -07:00
6cf3c3c740 Add file offset support to emacs-bookmark.zsh 2024-09-08 14:47:51 -07:00
79695758a5 Fix emacs-bookmark.zsh (again) 2024-08-30 14:06:11 -07:00
aab934f5a1 Update emacs-bookmark.zsh 2024-08-27 18:39:17 -07:00
38f0a9fc2b Update emacs-bookmark.zsh 2024-08-27 18:36:33 -07:00
9abe05ccfe Update after bmrm 2024-08-27 11:34:24 -07:00
181dd2d533 Add auto-updating of bookmarks 2024-08-27 11:28:29 -07:00
06c33df30d Remove bookmark.zsh 2024-08-26 10:37:03 -07:00
db347d3f5c Finish fixing (hopefully) emacs-bookmark.zsh 2024-08-26 10:34:50 -07:00
8d3ef4b4e4 Update emacs-bookmark.zsh 2024-08-24 17:01:23 -04:00
7f7aa9def4 Update emacs-bookmark.zsh 2024-08-21 01:26:09 -04:00
9b90c216f3 Update emacs-bookmark.zsh 2024-08-20 00:37:48 -04:00
f22d24b042 Update emacs-bookmark.zsh 2024-08-18 11:42:48 -07:00
b39f4ce968 Update submodules 2024-08-17 11:52:15 -07:00
b67571bd7a Remove old ssh stuff in early-init.zsh 2024-08-07 15:07:07 -07:00
edddc6ece7 Update submodules 2024-08-06 20:37:39 -07:00
d958a4552d Update submodules 2024-08-01 01:01:06 -08:00
3d8c339eb8 Update submodules 2024-07-07 22:29:07 -07:00
1dc95bf2fd Merge branch 'main' of git.zander.im:Zander671/zsh-config 2024-07-07 22:28:41 -07:00
34d70ea469 Update submodules 2024-06-08 17:24:06 -07:00
0bdab76bba Update submodules 2024-05-14 14:42:57 -07:00
02b3a5ff58 Remove dired alias 2024-05-12 19:21:37 -07:00
c030bd1ab7 Switch to river 2024-04-28 21:14:14 -07:00
4ccf5cb65d Add gd alias 2024-04-20 16:10:03 -07:00
10 changed files with 304 additions and 204 deletions

View File

@ -1,3 +1,6 @@
# Arch specific config options
source "/etc/profile.d/debuginfod.sh"
function () {
emulate -L sh
source "/etc/profile.d/debuginfod.sh"
}
source "/usr/share/doc/pkgfile/command-not-found.zsh"

View File

@ -1,73 +0,0 @@
# A simple bookmark system
# $ZSH_BOOKMARK_DIR must be defined
# Create bookmark directory if it does not exist
[ ! -d "${ZSH_BOOKMARK_DIR}" ] && mkdir -p "${ZSH_BOOKMARK_DIR}"
function __zsh_list_bookmarks {
/bin/ls "${ZSH_BOOKMARK_DIR}"
}
function __zsh_check_bookmark_name {
! [[ "${1}" == *'/'* ]]
}
function _bookmarks {
for file in "${ZSH_BOOKMARK_DIR}/"*; do
compadd "${file#"${ZSH_BOOKMARK_DIR}/"}"
done
}
# bm <bookmark>
function bm {
# With no args, list all bookmarks
[ "${#}" -eq 0 ] && { __zsh_list_bookmarks; return }
# Otherwise, goto the bookmark in argv[1]
__zsh_check_bookmark_name "${1}" || { echo "No such bookmark: '${1}'!"; return 1 }
[ -L "${ZSH_BOOKMARK_DIR}/${1}" ] || { echo "No such bookmark: '${1}'!"; return 1 }
[ -e "${ZSH_BOOKMARK_DIR}/${1}" ] || { echo "The bookmark '${1}' refers to a non-existant file!"; return 1 }
cd -P "${ZSH_BOOKMARK_DIR}/${1}"
[[ -v ZSH_BOOKMARK_LS ]] && [[ "${ZSH_BOOKMARK_LS}" = 'true' ]] && ls
}
function _bm {
_arguments '::bookmark:_bookmarks'
}
compdef _bm bm
# bmadd [name] [dir]
function bmadd {
# With no args, add pwd
[ "${#}" -eq 0 ] && { bmadd "$(basename "${PWD}")" "${PWD}"; return }
# With one arg, add pwd as argv[1]
[ "${#}" -eq 1 ] && { bmadd "${1}" "${PWD}"; return }
local real_path="$(realpath "${2}")"
local bm_name="${1}"
__zsh_check_bookmark_name "${bm_name}" || { echo "Invalid bookmark: '${1}'!"; return 1 }
if [ -L "${ZSH_BOOKMARK_DIR}/${bm_name}" ]; then
echo "A bookmark with the name '${bm_name}' already exists!"
local reply
read -q 'reply?Overwrite? [y/N] '
printf '\n'
[[ "${reply}" =~ '[yY]' ]] || return 1
fi
ln -nfs "${real_path}" "${ZSH_BOOKMARK_DIR}/${bm_name}"
echo "Created bookmark '${bm_name}'"
}
function _bmadd {
_arguments ':name' '::directory:_directories'
}
compdef _bmadd bmadd
# bmrm <name>
function bmrm {
[ "${#}" -eq 0 ] && { echo "usage: bmrm <name>"; return 1 }
__zsh_check_bookmark_name "${1}" || { echo "No bookmark with the name '${1}' exists!"; return 1 }
[ -L "${ZSH_BOOKMARK_DIR}/${1}" ] || { echo "No bookmark with the name '${1}' exists!"; return 1 }
local reply
read -q 'reply?Really delete? [y/N] '
printf '\n'
[[ "${reply}" =~ '[yY]' ]] || return 1
/bin/rm "${ZSH_BOOKMARK_DIR}/${1}"
echo "Deleted bookmark '${1}'"
}
function _bmrm {
_arguments ':bookmark:_bookmarks'
}
compdef _bmrm bmrm

View File

@ -1,14 +1,6 @@
# Some extra environment variables
export PATH="${HOME}/.local/bin:${PATH}"
# add_ssh_keys() {
# pass show ssh/personal_gitea | ssh-add ~/.ssh/personal_gitea
# pass show ssh/personal_server | ssh-add ~/.ssh/personal_server
# pass show ssh/gandi_vps | ssh-add ~/.ssh/gandi_vps
# pass show ssh/notabug | ssh-add ~/.ssh/notabug
# pass show ssh/aur | ssh-add ~/.ssh/aur
# }
# Because I use zsh to start graphical sessions
[[ -v ZSH_GRAPHICAL_LOGIN ]] || ZSH_GRAPHICAL_LOGIN=true
if [[ -o login ]] && [[ "${ZSH_GRAPHICAL_LOGIN}" = 'true' ]] ; then
@ -16,11 +8,9 @@ if [[ -o login ]] && [[ "${ZSH_GRAPHICAL_LOGIN}" = 'true' ]] ; then
eval "$(gnome-keyring-daemon --start 2>/dev/null)"
export SSH_AUTH_SOCK="${XDG_RUNTIME_DIR}/gcr/ssh"
export SSH_ASKPASS=/usr/lib/seahorse/ssh-askpass
# SSH_ASKPASS_REQUIRE="force" \
# SSH_ASKPASS="/usr/local/bin/ssh-askpass-cat.sh" \
# add_ssh_keys &
if ! [[ -v WAYLAND_DISPLAY ]] && [ "${XDG_VTNR}" -eq 1 ]; then
exec Hyprland
source "${HOME}/.config/river/river-env.sh"
exec river
fi
fi

View File

@ -1,9 +1,37 @@
# Emacs-based bookmark system
# Enable color utilities
autoload colors && colors
zmodload -F zsh/stat b:zstat
zmodload zsh/datetime
zmodload zsh/mapfile
__bm_bookmark_cache=()
local __bm_bookmark_cache=()
let __bm_last_read_time=-1
function __bm_offset_to_row_col {
let off="${2}"
let row=1
let col=0
for line in "${(@f)mapfile[${1}]}"; do
let len="${#line}"
if (( off > len )); then
off='off - (len + 1)'
if (( off <= 0 )); then
(( len == 0 )) && col=0 || col='len - 1'
break
fi
row+=1
else
col='off'
off=0
break;
fi
done <"${1}"
if (( off > 0 )); then
row+=-1
fi
printf '%d\0%d' "${row}" "${col}"
}
function __bm_find_user_emacs_dir {
[[ -f "${HOME}/.emacs.d/var/bookmark-default.el" ]] &&
@ -22,58 +50,73 @@ function __bm_find_user_emacs_dir {
"daemon" or define $BM_BOOKMARK_PATH!\n'
return 1
}
function __bm_update_bookmark_list {
local quoted_output
case "${BM_MODE}" in
'daemon')
quoted_output=(${(z)${"$(command emacs -Q --batch --eval \
"(prin1
(progn
(require 'server)
(server-eval-at \"server\"
'(let ((out))
(dolist (entry bookmark-alist out)
(let ((path (alist-get 'filename (cdr entry) ""))
(pos (alist-get 'position (cdr entry) 1)))
(setq out (append (list (car entry) path
(expand-file-name path) pos)
out))))))))")":1:-1}})
;;
''|'emacs')
if ! [[ -v BM_BOOKMARK_PATH ]]; then
local BM_BOOKMARK_PATH="$(__bm_find_user_emacs_dir)"
fi
quoted_output=(${(z)${"$(command emacs -Q --batch --eval \
"(prin1
(with-temp-buffer
(insert-file-contents \"${BM_BOOKMARK_PATH:gs#\\#\\\\#:gs#\"#\\\"#}\")
(require 'cl-lib)
(let ((out))
(dolist (entry (read (current-buffer)) out)
(let ((path (alist-get 'filename (cdr entry) ""))
(pos (alist-get 'position (cdr entry) 1)))
(setq out (append (list (car entry) path
(expand-file-name path) pos)
out)))))))))")":1:-1}})
;;
*)
printf 'Unknown value for $BM_MODE: "%s"\n' "${BM_MODE}"
return 1
;;
esac
__bm_bookmark_cache=()
for entry in ${quoted_output}; do
__bm_bookmark_cache+="${(Q)entry}"
BM_BOOKMARK_PATH="${BM_BOOKMARK_PATH:-"$(__bm_find_user_emacs_dir)"}"
function __bm_hash_dirs {
# First empty the hash table
hash -dr
# Then add the hash dirs
for ((i = 1; i < ${#__bm_bookmark_cache}; i+=4)); do
local name="${__bm_bookmark_cache[${i}]://=/}"
hash -d "${name}=${__bm_bookmark_cache[${i} + 2]}"
done
}
function __bm_update_bookmark_list {
__bm_last_read_time="${EPOCHSECONDS}"
local args
local script
case "${BM_MODE}" in
'daemon')
script=$(<<'EOF'
(progn
(require 'server)
(dolist (entry (server-eval-at
"server"
'(when (boundp 'bookmark-alist)
bookmark-alist)))
(let ((path (alist-get 'filename (cdr entry) ""))
(pos (alist-get 'position (cdr entry) 1)))
(princ (format "%s\0%s\0%s\0%s\0" (car entry) path
(expand-file-name path) pos)))))
EOF
)
;;
''|'emacs')
args="--insert=${BM_BOOKMARK_PATH}"
script=$(<<'EOF'
(progn
(dolist (entry (read (current-buffer)))
(let ((path (alist-get 'filename (cdr entry) ""))
(pos (alist-get 'position (cdr entry) 1)))
(princ (format "%s\0%s\0%s\0%s\0" (car entry) path
(expand-file-name path) pos)))))
EOF
)
;;
*)
printf 'Unknown value for $BM_MODE: "%s"\n' "${BM_MODE}"
return 1
;;
esac
__bm_bookmark_cache=(${(0)"$(command emacs --batch ${args} --eval "${script}")"})
__bm_hash_dirs
}
function __bm_bookmark_location {
local parts=(${(s:/:)"${2}"})
local bm_name="${parts[1]}"
local rest_arr=(${parts:1})
local rest="${(j:/:)rest_arr}"
for ((i = 1; i < ${#__bm_bookmark_cache}; i+=4)); do
if [[ "${1}" = "${__bm_bookmark_cache[${i}]}" ]]; then
printf '%s\n%d\n' "${__bm_bookmark_cache[${i} + 2]}" \
"${__bm_bookmark_cache[${i} + 3]}"
if [[ "${bm_name}" = "${__bm_bookmark_cache[${i}]}" ]]; then
__bm_res=("${__bm_bookmark_cache[${i} + 2]}"
"${__bm_bookmark_cache[${i} + 3]}"
"${rest}")
return 0
fi
done
__bm_res=()
return 1
}
function __bm_list_bookmarks {
@ -92,7 +135,7 @@ function __bm_list_bookmarks {
function _bookmarks {
for ((i = 1; i < ${#__bm_bookmark_cache}; i+=4)); do
compadd "${__bm_bookmark_cache[${i}]}"
compadd -q "${__bm_bookmark_cache[${i}]}"
done
}
@ -101,19 +144,60 @@ function bm {
__bm_update_bookmark_list || \
{ printf 'Updating bookmark list failed!\n'; return 1 }
(( ${#} == 0 )) && { __bm_list_bookmarks; return }
local loc=(${(f)"$(__bm_bookmark_location "${1}")"})
if [[ -d "${loc[1]}" ]]; then
cd "${loc[1]}"
[[ "${BM_CWD_LS}" = '1' ]] && ls || true
elif [[ -e "${loc[1]}" ]]; then
${=EDITOR} "${loc[1]}"
local __bm_res
__bm_bookmark_location __bm_res "${1}"
local bm_loc="${__bm_res[1]}"
local target="${__bm_res[1]}/${__bm_res[3]}"
if (( ${#__bm_res} != 0 )) && [[ -e "${bm_loc}" ]]; then
if [[ -d "${target}" ]]; then
cd "${target}"
[[ "${BM_CWD_LS}" == 'true' ]] && ls || true
elif [[ -e "${bm_loc}" ]]; then
let offset="${__bm_res[2]}"
local rowcol=(${(0)"$(__bm_offset_to_row_col "${bm_loc}" "${offset}")"})
${=EDITOR} "+${rowcol[1]}:${rowcol[2]}" "${bm_loc}"
else
printf 'Bookmark exists, but trailing path doesn'"'"'t: "%s"\n' \
"${(q)__bm_res[3]}"
return 1
fi
else
printf 'No such bookmark: "%s"\n' "${1}"
printf 'No such bookmark: "%s"\n' "${(q)1}"
return 1
fi
}
function _bm {
_arguments ':bookmark:_bookmarks'
(( "${CURRENT}" == 2 )) || return
local arg="${(Q)words[${CURRENT}]}"
if ! [[ "${arg}" == */* ]]; then
for ((i = 1; i < ${#__bm_bookmark_cache}; i+=4)); do
compadd -q -S '/' -- "${__bm_bookmark_cache[${i}]}"
done
else
local __bm_res
__bm_bookmark_location __bm_res "${arg}"
if [[ -d "${__bm_res[1]}" ]]; then
local parts=(${(s:/:)__bm_res[3]})
local bm="${${(s:/:)${arg}}[1]}"
local subdir="${(j:/:)parts[1,-2]}"
local search="${parts[${#parts}]}"
if ((${#parts} > 0)) && [[ "${arg}" == */ ]]; then
subdir="${subdir}/${search}"
subdir="${subdir#/}"
search=""
fi
local pre_path="${__bm_res[1]}/${subdir}/"
local raw_arg="${words[${CURRENT}]}"
local prefix="${${(s:/:)${raw_arg}}[1]}/${subdir}"
if ! [[ -z "${subdir}" ]]; then
prefix+='/'
fi
compset -P "${(b)prefix}"
for file in "${pre_path}"*; do
compadd -W "${pre_path}" -f "${file:t}"
done
fi
fi
}
compdef _bm bm
@ -135,30 +219,32 @@ function bmadd {
name="${1:t}"
;;
*)
loc="${1}"
name="${2}"
;;
loc="${1}"
name="${2}"
;;
esac
__bm_update_bookmark_list
if __bm_bookmark_location "${name}" >/dev/null; then
printf 'Bookmark "%s" already exists. Overwrite it? [y/N] ' "${name}"
local __bm_res
if __bm_bookmark_location __bm_res "${name}" >/dev/null; then
printf 'Bookmark "%s" already exists. Overwrite it? [y/N] ' "${(q)name}"
read -q
let ans=${?}
printf '\n'
(( ${ans} != 0 )) && return 1
fi
local res="$(emacsclient --eval \
"(let* ((loc \"${loc:gs#\\#\\\\#:gs#\"#\\\"#}\")
(name \"${name:gs#\\#\\\\#:gs#\"#\\\"#}\")
"(let* ((loc (pop server-eval-args-left))
(name (pop server-eval-args-left))
(res (with-temp-buffer
(set-visited-file-name loc t nil)
(bookmark-set name)
(set-buffer-modified-p nil)))
(inhibit-message t))
(bookmark-save)
res)")"
[[ "${res}" = 'nil' ]] && printf 'Added bookmark "%s"\n' "${name}" \
res)" "${loc}" "${name}")"
[[ "${res}" = 'nil' ]] && printf 'Added bookmark "%s"\n' "${(q)name}" \
|| { printf '%s\n' "${res}"; return 1 }
__bm_update_bookmark_list
}
function _bmadd {
_arguments ':file:_files' ':name'
@ -176,18 +262,21 @@ function bmrm {
return 1
fi
__bm_update_bookmark_list
__bm_bookmark_location "${1}" >/dev/null || \
local __bm_res
__bm_bookmark_location __bm_res "${1}" >/dev/null || \
{ printf 'No such bookmark: "%s"\n' "${1}"; return 1 }
printf 'Really delete "%s"? [y/N] ' "${1}"
printf 'Really delete "%s"? [y/N] ' "${(q)1}"
if read -q; then
printf '\n'
local res="$(emacsclient --eval \
"(let* ((res (bookmark-delete \"${1:gs#\\#\\\\#:gs#\"#\\\"#}\"))
"(let* ((res (bookmark-delete (pop server-eval-args-left)))
(inhibit-message t))
(bookmark-save)
res)")"
[[ "${res}" = 'nil' ]] && printf 'Deleted bookmark "%s"\n' "${1}" \
|| { printf '%s\n' "${res}"; return 1 }
res)" "${1}")"
[[ "${res}" = 'nil' ]] && printf 'Deleted bookmark "%s"\n' "${(q)1}" \
|| { printf '%s\n' "${res}"; return 1 }
__bm_update_bookmark_list
else
printf '\n'
return 1
@ -198,4 +287,14 @@ function _bmrm {
}
compdef _bmrm bmrm
function __bm_precmd_hook {
# Auto reload
if [[ "${BM_AUTO_RELOAD}" == true ]] &&
(( ${__bm_last_read_time} < $(zstat +mtime "${BM_BOOKMARK_PATH}") )); then
__bm_update_bookmark_list
fi
}
(( ${precmd_functions[(I)__bm_precmd_hook]} )) ||
precmd_functions+=(__bm_precmd_hook)
__bm_update_bookmark_list

165
init.zsh
View File

@ -1,6 +1,10 @@
# Main zsh config file
zmodload zsh/datetime
let __init_zsh_start="${EPOCHREALTIME}"
# Enable completions
FPATH="${HOME}/.local/share/zsh/site-functions:${FPATH}"
autoload -U compinit && compinit
# Some utility stuff
@ -13,7 +17,6 @@ function load_plugin {
function cmd_exists {
hash "${1}" >/dev/null 2>&1
}
# source_user_file <name>
function source_user_file {
local machine_specific="${ZSH_CONFIG_DIR}/${1}.${HOST}.zsh"
@ -28,14 +31,47 @@ function source_user_file {
# Load user early init file
source_user_file "early-init"
# Load distrobox early init file
local is_in_distrobox=false
if [[ -e /run/.containerenv ]] && cmd_exists distrobox-host-exec; then
is_in_distrobox=true
local ctenv=("${(@f)"$(</run/.containerenv)"}")
for line in ${ctenv}; do
if [[ "${line}" == 'name='* ]]; then
export DISTROBOX_MY_NAME="${(Q)${line:5}}"
if [[ -d "${HOME}/src/compat/${DISTROBOX_MY_NAME}" ]]; then
export DISTROBOX_MY_COMPAT="${HOME}/src/compat/${DISTROBOX_MY_NAME}"
local init_file="${DISTROBOX_MY_COMPAT}/early-init.zsh"
[[ -e "${init_file}" ]] && source "${init_file}"
fi
break
fi
done
fi
# Some options
setopt autocd extendedglob rm_star_silent completealiases rc_quotes histignorespace
unsetopt beep notify
# Some general, random configuration
# History stuff
if [[ -v INSIDE_EMACS ]]; then
() {
emulate -L zsh
set -o rematchpcre
if [[ "${HISTFILE}" =~ '^~([^/]*)($|/.*)' ]]; then
local user="${match[1]}"
local rest="${match[2]}"
if [[ -z "${user}" ]]; then
HISTFILE="${HOME}${rest}"
else
HISTFILE="${userdirs[${user}]}"
fi
fi
}
fi
[ ! -d "${HISTFILE:h}" ] && mkdir -p "${HISTFILE:h}"
[ -v HISTFILE ] || HISTFILE="${HOME}/.cache/zsh/history"
[ ! -d "$(dirname "${HISTFILE}")" ] && mkdir -p "$(dirname "${HISTFILE}")"
HISTSIZE=1000
SAVEHIST=10000
@ -65,6 +101,7 @@ else
__zsh_sudo_cmd=sudo
alias sudo='sudo '
alias se='sudoedit '
alias doas='sudo '
fi
# Emacs and Neovim stuff
@ -74,34 +111,37 @@ if [[ -v NVIM ]]; then
alias nvim=nvr
alias e=nvr
alias emacs=nvr
elif [[ "${is_in_distrobox}" == true ]]; then
if [[ -v INSIDE_EMACS ]]; then
[[ -z "${XDG_RUNTIME_DIR}" ]] && \
export XDG_RUNTIME_DIR="/run/user/${UID}"
export EDITOR='distrobox-host-exec emacsclient -a nvim '
alias emacs='distrobox-host-exec emacsclient -a nvim '
else
export EDITOR='distrobox-host-exec emacsclient -a nvim -c '
alias emacs='distrobox-host-exec emacsclient -a nvim -c '
fi
alias n='emacs '
alias e='emacs '
elif [[ -v INSIDE_EMACS ]]; then
export EDITOR='emacsclient'
alias e='emacsclient '
alias emacs='emacsclient '
alias n='emacsclient '
alias dired='emacsclient '
alias d='emacsclient '
alias nvim='emacsclient '
else
export EDITOR='emacsclient -a nvim -nw'
# Because I keep using n by mistake
alias emacs="${EDITOR} "
alias n=emacs
alias e=emacs
function dired() {
if (( ${#} == 0 )); then
emacsclient -nw --eval '(dired ".")'
else
args=()
for arg; do
args+=(--eval "(dired \"${arg:gs#\\#\\\\#:gs#\"#\\\"#}\")")
done
emacsclient -nw ${args}
fi
}
alias d=dired
alias nvim=emacs
fi
export VISUAL="${EDITOR}"
# Make SBCL *slightly* less frustrating to use on the command line
alias sbcl='rlwrap -pblue -q "\"" sbcl'
# Safer file functions
alias cp="cp -i"
alias mv="mv -i"
@ -127,30 +167,41 @@ fi
export LESS="--mouse"
# Bat configuration
local bat_exec
if cmd_exists bat; then
bat_exec=bat
elif cmd_exists batcat; then
bat_exec=batcat;
alias bat=batcat
fi
if ! [[ -z "${bat_exec}" ]]; then
# Pager
export PAGER="bat --paging=always"
export PAGER="${bat_exec} --paging=always"
# Less syntax highlighting in interactive shells
alias less="bat --paging=always"
alias less="${bat_exec} --paging=always"
# Use bat instead of cat
alias cat="bat --paging=never"
alias pcat="bat -pp"
alias ncat="bat -pp --color=never"
alias cat="${bat_exec} --paging=never"
alias pcat="${bat_exec} -pp"
alias ncat="${bat_exec} -pp --color=never"
# Bat as man pager
export MANPAGER="zsh -c 'col -bx | bat -l man --paging=always --style=plain'"
export MANROFFOPT="-c"
if [[ "${bat_exec}" = (bat|*/bat) ]]; then
export MANPAGER="zsh -c 'col -bx | ${bat_exec} -l man --paging=always --style=plain'"
export MANROFFOPT="-c"
fi
fi
unset bat_exec
# Eza configuration
if cmd_exists eza; then
alias ls="eza --git -F"
alias la="ls -a"
alias l="ls -l"
alias ll="ls -al"
# Don't define an alias if ls is already an alias
if cmd_exists eza && ! alias ls >/dev/null; then
alias ls="eza --git -F=auto"
fi
alias la="ls -a"
alias l="ls -l"
alias ll="ls -al"
# Delta configuration
if cmd_exists delta; then
@ -174,6 +225,7 @@ alias gp="git push"
alias gu="git pull"
alias gf="git fetch"
alias gt="git status"
alias gd="git diff"
# Sudo last line with <Esc><Esc>
sudo-command-line() {
@ -181,18 +233,13 @@ sudo-command-line() {
if [[ $BUFFER == ${__zsh_sudo_cmd}\ * ]]; then
LBUFFER="${LBUFFER#${__zsh_sudo_cmd} }"
else
LBUFFER="${__zsh_sudo_cmd} $LBUFFER"
LBUFFER="${__zsh_sudo_cmd} ${LBUFFER}"
fi
}
zle -N sudo-command-line
bindkey -M vicmd "^f" sudo-command-line
bindkey -M viins "^f" sudo-command-line
# Autosuggestions
load_plugin zsh-autosuggestions
ZSH_AUTOSUGGEST_STRATEGY=(history completion)
bindkey '^ ' autosuggest-accept
# Use vi mode
bindkey -v
# Fast switch of modes
@ -207,7 +254,7 @@ function overwrite-mode {
zle -N overwrite-mode
# Fancy prompt (starship)
eval "$(starship init zsh)"
cmd_exists starship && eval "$(starship init zsh)"
# Change cursor shape for different vi modes.
function __zsh_vim_key_prompt_handler {
SPACESHIP_CHAR_SYMBOL=""
@ -253,13 +300,28 @@ if cmd_exists direnv; then
eval "$(direnv hook zsh)"
fi
# Pyenv
if cmd_exists pyenv; then
export PYENV_ROOT="${HOME}/.pyenv"
[[ -d "${PYENV_ROOT/bin}" ]] && export PATH="${PYENV_ROOT}/bin:${PATH}"
eval "$(pyenv init - zsh)"
eval "$(pyenv virtualenv-init - zsh)"
__zsh_fix_pyenv_prompt() {
if [[ -v _OLD_VIRTUAL_PS1 ]]; then
PS1="${_OLD_VIRTUAL_PS1}"
unset _OLD_VIRTUAL_PS1
fi
}
precmd_functions+=(__zsh_fix_pyenv_prompt)
fi
# Bookmarks
# [ -v ZSH_BOOKMARK_DIR ] || ZSH_BOOKMARK_DIR="${HOME}/.cache/zsh/bookmarks"
# [ -v ZSH_BOOKMARK_LS ] || ZSH_BOOKMARK_LS=true
# source "${ZSH_CONFIG_DIR}/bookmark.zsh"
[[ -v BM_MODE ]] || BM_CWD_LS=1
[[ -v BM_MODE ]] || BM_MODE=daemon
source "${ZSH_CONFIG_DIR}/emacs-bookmark.zsh"
if cmd_exists emacs; then
[[ -v BM_CWD_LS ]] || BM_CWD_LS=true
[[ -v BM_MODE ]] || BM_MODE=daemon
[[ -v BM_AUTO_RELOAD ]] || BM_AUTO_RELOAD=true
source "${ZSH_CONFIG_DIR}/emacs-bookmark.zsh"
fi
# Platform specific stuff
[ -f /usr/bin/pacman ] && source "${ZSH_CONFIG_DIR}/arch.zsh"
@ -281,9 +343,20 @@ zstyle ':fzf-tab:*' switch-group 'ctrl-h' 'ctrl-l'
# Toggle selected for all visible entries
zstyle ':fzf-tab:*' fzf-bindings 'ctrl-a:toggle-all'
# Autosuggestions
load_plugin zsh-autosuggestions
ZSH_AUTOSUGGEST_STRATEGY=(history completion)
bindkey '^ ' autosuggest-accept
# Load user init file
source_user_file 'local'
# Load distrobox normal init file
if [[ -v DISTROBOX_MY_COMPAT ]] && \
[[ -f "${DISTROBOX_MY_COMPAT}/init.zsh" ]]; then
source "${DISTROBOX_MY_COMPAT}/init.zsh"
fi
# THE FOLLOWING PLUGINS MUST COME LAST
# More completions
@ -312,11 +385,19 @@ setopt histignoredups
# Run fortune and cowsay if we are not in nvim or ssh
if cmd_exists fortune && cmd_exists cowsay; then
[[ -v NVIM ]] || [[ -v SSH_CLIENT ]] || \
[[ -v NVIM ]] || [[ -v SSH_CLIENT ]] || [[ -v INSIDE_EMACS ]] || \
fortune | cowsay -felephant-in-snake -n
fi
# [[ -v EAT_SHELL_INTEGRATION_DIR ]] && source "${EAT_SHELL_INTEGRATION_DIR}/zsh"
# Clean up internal functions
unfunction load_plugin
unfunction cmd_exists
unfunction source_user_file
unset is_in_distrobox
let ZSH_INIT_TIME="$(( EPOCHREALTIME - __init_zsh_start ))"
function zsh-init-time {
printf 'Zsh initialization took: %05fms\n' "$(( ZSH_INIT_TIME * 1000 ))"
}