[zsh] 集成 zsh 配置

This commit is contained in:
2026-01-18 19:54:11 +08:00
parent 3600124906
commit 05138184df
13 changed files with 4310 additions and 13 deletions
+146
View File
@@ -0,0 +1,146 @@
cmake-llvm () {
local cmake_args=("-G" "Ninja")
# find cmake root dir
# if defined PROJECT or P, use it as project root
# if within git (git rev-parse --is-inside-work-tree), use git rev-parse --show-toplevel
# if setted LLVM_ROOT, use it
# default "../llvm", if not exist, error
local llvm_root=".."
if [ -n "${PROJECT}" ]; then
llvm_root="${PROJECT}"
elif [ -n "${P}" ]; then
llvm_root="${P}"
elif git rev-parse --is-inside-work-tree &> /dev/null; then
llvm_root=$(git rev-parse --show-toplevel)
elif [ -n "${LLVM_ROOT}" ]; then
llvm_root="${LLVM_ROOT}"
fi
if [ ! -d "${llvm_root}/llvm" ]; then
echo "Error: not inside a llvm directory"
return 1
fi
cmake_args+=("${llvm_root}/llvm")
# Set build_type from arg[1]
local build_type="${1}"
if [ -z "${build_type}" ]; then
echo "Error: build_type is empty"
return 1
fi
cmake_args+=("-DCMAKE_BUILD_TYPE=${build_type}")
# check LLVM_PROJECTS env
if [ -z "${LLVM_PROJECTS}" ]; then
echo "Error: LLVM_PROJECTS env is not set"
return 1
fi
cmake_args+=("-DLLVM_ENABLE_PROJECTS=${LLVM_PROJECTS}")
# check LLVM_TARGETS
if [ -z "${LLVM_TARGETS}" ]; then
echo "Error: LLVM_TARGETS env is not set"
return 1
fi
cmake_args+=("-DLLVM_TARGETS_TO_BUILD=${LLVM_TARGETS}")
# if setted LLVM_COMPILER, use it, else default clang
if [ -z "${LLVM_COMPILER}" ]; then
# if setted CMAKE_C_COMPILER or CMAKE_CXX_COMPILER, use it, else default clang
cmake_args+=(
"-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER:-clang}"
"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER:-clang++}"
)
elif [ "${LLVM_COMPILER}" == "gcc" ]; then
cmake_args+=("-DCMAKE_C_COMPILER=gcc" "-DCMAKE_CXX_COMPILER=g++")
elif [ "${LLVM_COMPILER}" == "clang" ]; then
cmake_args+=("-DCMAKE_C_COMPILER=clang" "-DCMAKE_CXX_COMPILER=clang++")
else
echo "Error: LLVM_COMPILER is invalid"
return 1
fi
# if not setted LLVM_NO_*, use default optimized options
if [ -z "${LLVM_NO_SHARED}" ]; then
cmake_args+=("-DBUILD_SHARED_LIBS=On")
fi
if [ -z "${LLVM_APPEND_VC_REV}"]; then
cmake_args+=("-DLLVM_APPEND_VC_REV=Off")
fi
if [ -z "${LLVM_NO_LLD}" ]; then
cmake_args+=("-DLLVM_ENABLE_LLD=On")
fi
if [ -z "${LLVM_NO_OPT_TABLEGEN}" ]; then
cmake_args+=("-DLLVM_OPTIMIZED_TABLEGEN=On")
fi
if [ -z "${LLVM_NO_SPLIT_DWARF}" ]; then
cmake_args+=("-DLLVM_USE_SPLIT_DWARF=On")
fi
cmake_args+=("-DCMAKE_EXPORT_COMPILE_COMMANDS=On")
# append args[2:] to cmake_args
cmake_args+=("${@:2}")
# print cmake args, one for each line
# and ask for confirmation
for arg in "${cmake_args[@]}"; do
echo "${arg}"
done
read "?Press enter to continue?"
# run cmake with cmake_args
cmake "${cmake_args[@]}"
}
git-local-exclude () {
local file="${1}"
# if file is empty, exit
if [ -z "${file}" ]; then
echo "Error: file is empty"
return 1
fi
# if .git/info/exclude not exist, exit
if [ ! -f .git/info/exclude ]; then
echo "warning: .git/info/exclude not exist, maybe in other worktree?"
return 1
fi
echo "${file}" >> .git/info/exclude
}
generate-local-dir () {
if git rev-parse --is-inside-work-tree &> /dev/null; then
project_root=$(git rev-parse --show-toplevel)
else
echo "Error: not inside a git repository"
return 1
fi
pushd "${project_root}"
git-local-exclude .local
mkdir -p .local
mkdir -p .local/bin
touch .local/notes.md
cat > .local/env.sh << EOF
export P="${project_root}"
export D="\$P/build-debug/bin"
export R="\$P/build-release/bin"
export L="\$P/.local"
export PATH="\$L/bin:\$PATH"
EOF
git-local-exclude .vscode
mkdir -p .vscode
if [ -f .vscode/settings.json ]; then
echo "Warning: .vscode/settings.json already exist"
else
echo '{}' > .vscode/settings.json
fi
popd
}