Compare commits
75 Commits
c05f963d1b
...
main
Author | SHA1 | Date | |
---|---|---|---|
d41f82c771
|
|||
c77fa00f98
|
|||
da8cc2b511
|
|||
ef9c4afff3
|
|||
9dcf45baa5
|
|||
4ac2c06595
|
|||
4935fdbf15
|
|||
ffb23c98fc
|
|||
8bc2b5efe5
|
|||
2ff695ea43
|
|||
b784c01fc2
|
|||
cd640456b1
|
|||
6b7760784a
|
|||
74d4fab26a
|
|||
645a6858b6
|
|||
1af11843ad
|
|||
743332253a
|
|||
f4526ea7a7
|
|||
b2e82b80d3
|
|||
c06a7bffee
|
|||
b8c898b3cc
|
|||
5ff2811927
|
|||
8579ba568b
|
|||
5ed7f948ef
|
|||
4d0a221db4
|
|||
d20b129666
|
|||
b5c3ea0edb
|
|||
7c85a1d3ee
|
|||
c3a8204ad2
|
|||
5fae0b7ece
|
|||
cfae639ad5
|
|||
db749437ee
|
|||
4a3a91dd9c
|
|||
f21f778bd5
|
|||
ed1ccdcaec
|
|||
e6fdd25097
|
|||
58da9200fc
|
|||
b57afeec32
|
|||
9962c7159b
|
|||
4348e98b97
|
|||
b85772067d
|
|||
561596711f
|
|||
ca65659782
|
|||
c58ea7b136
|
|||
1b290bcf23
|
|||
dfd7dddf75
|
|||
d1d2422485
|
|||
50389ec227
|
|||
03d7b3e1cf
|
|||
96ace6e0e8
|
|||
d61e758c1c
|
|||
a16907ed82
|
|||
6cf3c3c740
|
|||
79695758a5
|
|||
aab934f5a1
|
|||
38f0a9fc2b
|
|||
9abe05ccfe
|
|||
181dd2d533
|
|||
06c33df30d
|
|||
db347d3f5c
|
|||
8d3ef4b4e4
|
|||
7f7aa9def4
|
|||
9b90c216f3
|
|||
f22d24b042
|
|||
b39f4ce968
|
|||
b67571bd7a
|
|||
edddc6ece7
|
|||
d958a4552d
|
|||
3d8c339eb8
|
|||
1dc95bf2fd
|
|||
34d70ea469
|
|||
0bdab76bba
|
|||
02b3a5ff58
|
|||
c030bd1ab7
|
|||
4ccf5cb65d
|
5
arch.zsh
5
arch.zsh
@ -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"
|
||||
|
73
bookmark.zsh
73
bookmark.zsh
@ -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
|
@ -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
|
||||
|
@ -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
165
init.zsh
@ -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 ))"
|
||||
}
|
||||
|
Submodule plugins/fast-syntax-highlighting updated: cf318e06a9...dcee72bb99
Submodule plugins/fzf-tab updated: bf3ef5588a...2abe1f2f1c
Submodule plugins/zsh-autosuggestions updated: c3d4e576c9...85919cd1ff
Submodule plugins/zsh-completions updated: 2f951267cd...e07f6fb780
Reference in New Issue
Block a user