Commit b220751b b220751be26a8b0f4e39def7da1bd2b583a9d568 by cnb.bofCdSsphPA

Update 1

1 parent d8fd2d15
FROM debian:13.4
# syntax=docker/dockerfile:1
# ================================================================
# Multi-stage build for minimal container image
# Uses COPY technique: builder stage downloads + extracts,
# final stage only copies runtime artifacts.
# ================================================================
# ---- Stage 1: Builder (downloads + extracts) ----
FROM debian:13.4-slim AS builder
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ca-certificates curl unzip && \
rm -rf /var/lib/apt/lists/*
# Python (Miniconda)
RUN curl -sSLk https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py310_23.11.0-2-Linux-x86_64.sh \
-o /tmp/miniconda.sh && \
bash /tmp/miniconda.sh -b -p /usr/local/miniconda3 && \
rm /tmp/miniconda.sh
# Node.js (prebuilt binary, no build tools needed)
RUN curl -sSLk https://unofficial-builds.nodejs.org/download/release/v22.22.2/node-v22.22.2-linux-x64-glibc-217.tar.gz \
-o /tmp/node.tar.gz && \
tar -xzf /tmp/node.tar.gz -C /usr/local/ && \
rm /tmp/node.tar.gz && \
ln -sf /usr/local/node-v22.22.2-linux-x64-glibc-217/bin/node /usr/local/bin/node && \
ln -sf /usr/local/node-v22.22.2-linux-x64-glibc-217/bin/npm /usr/local/bin/npm
# Bun
RUN curl -fsSL https://bun.sh/install | BUN_INSTALL=/usr/local/bun bash
# opencode-ai
RUN npm i -g opencode-ai --registry https://mirrors.cloud.tencent.com/npm/
# ---- Stage 2: Minimal final image ----
FROM debian:13.4-slim
# Mirror (China mainland)
RUN sed -i 's/deb.debian.org/mirrors.tencent.com/g' /etc/apt/sources.list.d/debian.sources
# System packages + Claude Code (single RUN layer for minimal size)
RUN apt-get update && \
apt-get install -y wget unzip lsof nload htop net-tools dnsutils openssh-server \
build-essential curl git gcc libc6-dev \
pkg-config libssl-dev ca-certificates vim ripgrep jq sudo && \
apt-get install -y --no-install-recommends \
ca-certificates curl wget unzip \
git git-lfs \
zsh tmux \
ripgrep jq sudo \
build-essential gcc libc6-dev \
pkg-config libssl-dev vim \
tzdata locales \
lsof nload htop net-tools dnsutils \
openssh-server && \
# Claude Code official apt repo
install -d -m 0755 /etc/apt/keyrings && \
curl -fsSL https://downloads.claude.ai/keys/claude-code.asc \
-o /etc/apt/keyrings/claude-code.asc && \
chmod a+r /etc/apt/keyrings/claude-code.asc && \
echo "deb [signed-by=/etc/apt/keyrings/claude-code.asc] https://downloads.claude.ai/claude-code/apt/stable stable main" \
> /etc/apt/sources.list.d/claude-code.list && \
apt-get update && \
apt-get install -y --no-install-recommends claude-code && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Create non-root user
RUN useradd -m -s /bin/bash user && \
echo "user:user" | chpasswd && \
adduser user sudo
adduser user sudo && \
echo "user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Copy Python/Node/Bun/opencode from builder (COPY technique)
COPY --from=builder /usr/local/miniconda3 /usr/local/miniconda3
COPY --from=builder /usr/local/node-v22.22.2-linux-x64-glibc-217 /usr/local/node-v22.22.2-linux-x64-glibc-217
COPY --from=builder /usr/local/bun /usr/local/bun
COPY --from=builder /usr/local/node-v22.22.2-linux-x64-glibc-217/lib/node_modules /usr/local/node-v22.22.2-linux-x64-glibc-217/lib/node_modules
COPY --from=builder /usr/local/node-v22.22.2-linux-x64-glibc-217/bin/opencode /usr/local/node-v22.22.2-linux-x64-glibc-217/bin/opencode
RUN echo "user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
RUN ln -sf /usr/local/node-v22.22.2-linux-x64-glibc-217/bin/node /usr/local/bin/node && \
ln -sf /usr/local/node-v22.22.2-linux-x64-glibc-217/bin/npm /usr/local/bin/npm && \
ln -sf /usr/local/bun/bin/bun /usr/local/bin/bun
USER user
# Install code-server and extensions
RUN curl -fsSL https://code-server.dev/install.sh | sudo sh \
&& code-server --install-extension golang.go \
ENV PATH="/usr/local/miniconda3/bin:/usr/local/node-v22.22.2-linux-x64-glibc-217/bin:/usr/local/bun/bin:${PATH}"
# Helix: pre-built binary + config from context (COPY technique)
COPY helix_config/ /opt/helix_config/
RUN mkdir -p /home/user/.config && \
ln -sf /opt/helix_config /home/user/.config/helix && \
chown -R user:user /home/user/.config
ENV PATH="/opt/helix_config/bin:${PATH}"
ENV HELIX_RUNTIME=/opt/helix_config
# Scripts for runtime use
COPY scripts/ /home/user/scripts/
RUN chown -R user:user /home/user/scripts && \
chmod +x /home/user/scripts/*.sh
# code-server
RUN curl -fsSL https://code-server.dev/install.sh | sh
# code-server extensions (run as user so they install to ~/.local)
USER user
RUN code-server --install-extension golang.go \
&& code-server --install-extension cnbcool.cnb-welcome \
&& code-server --install-extension formulahendry.code-runner \
&& code-server --install-extension ms-kubernetes-tools.vscode-kubernetes-tools \
......@@ -25,30 +108,38 @@ RUN curl -fsSL https://code-server.dev/install.sh | sudo sh \
&& code-server --install-extension github.github-vscode-theme \
&& code-server --install-extension ms-ceintl.vscode-language-pack-zh-hans \
&& code-server --install-extension eddieposey.vscode-icons-mac \
&& code-server --install-extension oderwat.indent-rainbow \
&& code-server --install-extension oderwat.indent-rainbow \
&& code-server --install-extension yzhang.markdown-all-in-one
# leetcode.vscode-leetcode
#RUN wget -c -N "https://marketplace.visualstudio.com/_apis/public/gallery/publishers/panxiaoan/vsextensions/themes-falcon-vscode/3.0.1/vspackage" -O panxiaoan.themes-falcon-vscode-3.0.1.vsix && \
# code-server --install-extension ./panxiaoan.themes-falcon-vscode-3.0.1.vsix
ENV TZ=Asia/Shanghai
ENV GIT_TERMINAL_PROMPT=0
USER root
RUN sudo apt-get -y update && sudo apt-get -y install hx wget curl git git-lfs zsh tmux tzdata && \
RUNZSH=no CHSH=no sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" && \
sudo apt-get install -y locales \
&& sudo rm -rf /var/lib/apt/lists/* \
&& sudo sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen \
&& sudo localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 \
&& sudo dpkg-reconfigure --frontend=noninteractive locales
# oh-my-zsh
RUN RUNZSH=no CHSH=no sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" && \
chsh -s $(which zsh) user
RUN sudo /usr/bin/chsh -s $(which zsh)
# Neovim
RUN curl -fsSL https://github.com/neovim/neovim/releases/download/v0.12.2/nvim-linux-x86_64.tar.gz \
-o /tmp/nvim.tar.gz && \
tar xf /tmp/nvim.tar.gz -C /usr/local && \
ln -sf /usr/local/nvim-linux-x86_64/bin/nvim /usr/bin/nvim && \
rm /tmp/nvim.tar.gz
# tmux config (user's home)
RUN cd /home/user && \
git clone --single-branch https://github.com/gpakosz/.tmux.git && \
ln -s -f .tmux/.tmux.conf && \
cp .tmux/.tmux.conf.local . && \
chown -R user:user /home/user
# Locale (Chinese + English)
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 && \
dpkg-reconfigure --frontend=noninteractive locales
ENV TZ=Asia/Shanghai
ENV GIT_TERMINAL_PROMPT=0
ENV LANG=zh_CN.UTF-8
ENV LANGUAGE=zh_CN:zh
# ENV LC_ALL=zh_CN.UTF-8
RUN wget -c -N https://github.com/neovim/neovim/releases/download/v0.12.2/nvim-linux-x86_64.tar.gz && \
sudo tar xf nvim-linux-x86_64.tar.gz -C /usr/local && \
sudo ln -sf /usr/local/nvim-linux-x86_64/bin/nvim /usr/bin/nvim
RUN cd /home/user && git clone --single-branch https://github.com/gpakosz/.tmux.git && \
ln -s -f .tmux/.tmux.conf && cp .tmux/.tmux.conf.local .
WORKDIR /home/user
USER user
......
This file is too large to display.
# theme = "base16-gruvbox-material-light-medium"
# theme = "gruvbox_light"
# theme = "ayu_light"
#theme = "catppuccin_mocha"
# theme = "catppuccin_latte"
[editor]
line-number = "relative"
cursorline = true
color-modes = true
true-color = true
[editor.cursor-shape]
insert = "bar"
normal = "block"
select = "underline"
[editor.indent-guides]
render = true
[editor.file-picker]
hidden = false
# vim keybindgs from https://github.com/LGUG2Z/helix-vim/blob/master/config.toml
[keys.normal]
#C-c = "normal_mode" # 在 Normal 模式按 C-c 等同于 Esc (用于取消选择等)
# Quick iteration on config changes
C-o = ":config-open"
# ref: https://github.com/clo4/dotfiles/blob/674dc6417c4d0ffa688d132fd46b027561afcea6/dot_config/helix/config.toml
# Select within the line bounds, useful for quick whole-line changes
X = ["goto_first_nonwhitespace", "select_mode", "goto_line_end", "normal_mode"]
# Change everything from the cursor to the end of the line
A-l = ["collapse_selection", "select_mode", "goto_line_end", "change_selection"]
# Delete from cursor to line end
C-l = ["collapse_selection", "select_mode", "goto_line_end", "delete_selection"]
# Reload the current document from disk
C-r = ":reload"
# Use L/R arrow keys to switch between buffers, visible in the bufferline
left = ":buffer-previous"
right = ":buffer-next"
#
A-f = ":format"
C-q = ":q!"
# Some nice Helix stuff
C-h = "select_prev_sibling"
C-j = "shrink_selection"
C-k = "expand_selection"
# C-l = "select_next_sibling"
# Personal preference
o = ["open_below", "normal_mode"]
O = ["open_above", "normal_mode"]
# Muscle memory
"{" = ["goto_prev_paragraph", "collapse_selection"]
"}" = ["goto_next_paragraph", "collapse_selection"]
0 = "goto_line_start"
"$" = "goto_line_end"
"^" = "goto_first_nonwhitespace"
G = "goto_file_end"
"%" = "match_brackets"
V = ["select_mode", "extend_to_line_bounds"]
C = ["collapse_selection", "extend_to_line_end", "change_selection"] # Requires https://github.com/helix-editor/helix/issues/2051#issuecomment-1140358950
D = ["extend_to_line_end", "delete_selection"]
S = "surround_add" # Would be nice to be able to do something after this but it isn't chainable
# Extend and select commands that expect a manual input can't be chained
# I've kept d[X] commands here because it's better to at least have the stuff you want to delete
# selected so that it's just a keystroke away to delete
d = { d = ["extend_to_line_bounds", "delete_selection"], t = ["extend_till_char"], s = ["surround_delete"], i = ["select_textobject_inner"], a = ["select_textobject_around"] }
# Clipboards over registers ye ye
x = "delete_selection"
p = "paste_clipboard_after"
P = "paste_clipboard_before"
# Would be nice to add ya and yi, but the surround commands can't be chained
y = ["yank_main_selection_to_clipboard", "normal_mode", "flip_selections", "collapse_selection"]
Y = ["extend_to_line_bounds", "yank_main_selection_to_clipboard", "goto_line_start", "collapse_selection"]
# Uncanny valley stuff, this makes w and b behave as they do Vim
w = ["move_next_word_start", "move_char_right", "collapse_selection"]
e = ["move_next_word_end", "collapse_selection"]
b = ["move_prev_word_start", "collapse_selection"]
# If you want to keep the selection-while-moving behaviour of Helix, this two lines will help a lot,
# especially if you find having text remain selected while you have switched to insert or append mode
#
# There is no real difference if you have overriden the commands bound to 'w', 'e' and 'b' like above
# But if you really want to get familiar with the Helix way of selecting-while-moving, comment the
# bindings for 'w', 'e', and 'b' out and leave the bindings for 'i' and 'a' active below. A world of difference!
i = ["insert_mode", "collapse_selection"] # Requires https://github.com/helix-editor/helix/issues/2052#issuecomment-1140358950
a = ["append_mode", "collapse_selection"] # Requires https://github.com/helix-editor/helix/issues/2052#issuecomment-1140358950
# Escape the madness! No more fighting with the cursor! Or with multiple cursors!
esc = ["collapse_selection", "keep_primary_selection"]
# quick close
Q = { c = ":buffer-close" }
"space" = { c = ":buffer-close", C = ":buffer-close!"}
C-s = ":w"
[keys.insert]
# Escape the madness! No more fighting with the cursor! Or with multiple cursors!
esc = ["collapse_selection", "normal_mode"]
C-c = "normal_mode" # [!] 你的要求: C-c 退出插入模式
C-k = "normal_mode" # [!] 另一个流行的退出键 (特别是在终端)
"C-[" = "normal_mode" # [!] 修正:使用引号,因为 [ 是特殊字符
C-o = "open_below"
[keys.select]
# Muscle memory
"{" = ["extend_to_line_bounds", "goto_prev_paragraph"]
"}" = ["extend_to_line_bounds", "goto_next_paragraph"]
0 = "goto_line_start"
"$" = "goto_line_end"
"^" = "goto_first_nonwhitespace"
G = "goto_file_end"
D = ["extend_to_line_bounds", "delete_selection", "normal_mode"]
C = ["goto_line_start", "extend_to_line_bounds", "change_selection"]
"%" = "match_brackets"
S = "surround_add" # Basically 99% of what I use vim-surround for
# Visual-mode specific muscle memory
i = "select_textobject_inner"
a = "select_textobject_around"
x = "delete_selection"
# Some extra binds to allow us to insert/append in select mode because it's nice with multiple cursors
# tab = ["insert_mode", "collapse_selection"] # tab is read by most terminal editors as "C-i"
C-a = ["append_mode", "collapse_selection"]
# Make selecting lines in visual mode behave sensibly
k = ["extend_line_up", "extend_to_line_bounds"]
j = ["extend_line_down", "extend_to_line_bounds"]
# Clipboards over registers ye ye
d = ["yank_main_selection_to_clipboard", "delete_selection"]
#x = ["yank_main_selection_to_clipboard", "delete_selection"]
y = ["yank_main_selection_to_clipboard", "normal_mode", "flip_selections", "collapse_selection"]
Y = ["extend_to_line_bounds", "yank_main_selection_to_clipboard", "goto_line_start", "collapse_selection", "normal_mode"]
p = "replace_selections_with_clipboard" # No life without this
P = "paste_clipboard_before"
# Escape the madness! No more fighting with the cursor! Or with multiple cursors!
esc = ["collapse_selection", "keep_primary_selection", "normal_mode"]
# C-c = "normal_mode" # [!] 你的要求: C-c 退出插入模式
C-k = "normal_mode" # [!] 另一个流行的退出键 (特别是在终端)
"C-[" = "normal_mode" # [!] 修正:使用引号,因为 [ 是特殊字符
[keys.normal]
# Quick iteration on config changes
C-o = ":config-open"
C-r = ":config-reload"
# Some nice Helix stuff
C-h = "select_prev_sibling"
C-j = "shrink_selection"
C-k = "expand_selection"
C-l = "select_next_sibling"
# Personal preference
o = ["open_below", "normal_mode"]
O = ["open_above", "normal_mode"]
# Muscle memory
"{" = ["goto_prev_paragraph", "collapse_selection"]
"}" = ["goto_next_paragraph", "collapse_selection"]
0 = "goto_line_start"
"$" = "goto_line_end"
"^" = "goto_first_nonwhitespace"
G = "goto_file_end"
"%" = "match_brackets"
V = ["select_mode", "extend_to_line_bounds"]
C = ["extend_to_line_end", "yank_main_selection_to_clipboard", "delete_selection", "insert_mode"]
D = ["extend_to_line_end", "yank_main_selection_to_clipboard", "delete_selection"]
S = "surround_add" # Would be nice to be able to do something after this but it isn't chainable
# Clipboards over registers ye ye
x = "delete_selection"
p = ["paste_clipboard_after", "collapse_selection"]
P = ["paste_clipboard_before", "collapse_selection"]
# Would be nice to add ya and yi, but the surround commands can't be chained
Y = ["extend_to_line_end", "yank_main_selection_to_clipboard", "collapse_selection"]
# Uncanny valley stuff, this makes w and b behave as they do Vim
w = ["move_next_word_start", "move_char_right", "collapse_selection"]
W = ["move_next_long_word_start", "move_char_right", "collapse_selection"]
e = ["move_next_word_end", "collapse_selection"]
E = ["move_next_long_word_end", "collapse_selection"]
b = ["move_prev_word_start", "collapse_selection"]
B = ["move_prev_long_word_start", "collapse_selection"]
# If you want to keep the selection-while-moving behaviour of Helix, this two lines will help a lot,
# especially if you find having text remain selected while you have switched to insert or append mode
#
# There is no real difference if you have overridden the commands bound to 'w', 'e' and 'b' like above
# But if you really want to get familiar with the Helix way of selecting-while-moving, comment the
# bindings for 'w', 'e', and 'b' out and leave the bindings for 'i' and 'a' active below. A world of difference!
i = ["insert_mode", "collapse_selection"]
a = ["append_mode", "collapse_selection"]
# Undoing the 'd' + motion commands restores the selection which is annoying
u = ["undo", "collapse_selection"]
# Escape the madness! No more fighting with the cursor! Or with multiple cursors!
esc = ["collapse_selection", "keep_primary_selection"]
# Search for word under cursor
"*" = ["move_char_right", "move_prev_word_start", "move_next_word_end", "search_selection", "search_next"]
"#" = ["move_char_right", "move_prev_word_start", "move_next_word_end", "search_selection", "search_prev"]
# Make j and k behave as they do Vim when soft-wrap is enabled
j = "move_line_down"
k = "move_line_up"
# Extend and select commands that expect a manual input can't be chained
# I've kept d[X] commands here because it's better to at least have the stuff you want to delete
# selected so that it's just a keystroke away to delete
[keys.normal.d]
d = ["extend_to_line_bounds", "yank_main_selection_to_clipboard", "delete_selection"]
t = ["extend_till_char"]
s = ["surround_delete"]
i = ["select_textobject_inner"]
a = ["select_textobject_around"]
j = ["select_mode", "extend_to_line_bounds", "extend_line_below", "yank_main_selection_to_clipboard", "delete_selection", "normal_mode"]
down = ["select_mode", "extend_to_line_bounds", "extend_line_below", "yank_main_selection_to_clipboard", "delete_selection", "normal_mode"]
k = ["select_mode", "extend_to_line_bounds", "extend_line_above", "yank_main_selection_to_clipboard", "delete_selection", "normal_mode"]
up = ["select_mode", "extend_to_line_bounds", "extend_line_above", "yank_main_selection_to_clipboard", "delete_selection", "normal_mode"]
G = ["select_mode", "extend_to_line_bounds", "goto_last_line", "extend_to_line_bounds", "yank_main_selection_to_clipboard", "delete_selection", "normal_mode"]
w = ["move_next_word_start", "yank_main_selection_to_clipboard", "delete_selection"]
W = ["move_next_long_word_start", "yank_main_selection_to_clipboard", "delete_selection"]
g = { g = ["select_mode", "extend_to_line_bounds", "goto_file_start", "extend_to_line_bounds", "yank_main_selection_to_clipboard", "delete_selection", "normal_mode"] }
[keys.normal.y]
y = ["extend_to_line_bounds", "yank_main_selection_to_clipboard", "normal_mode", "collapse_selection"]
j = ["select_mode", "extend_to_line_bounds", "extend_line_below", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"]
down = ["select_mode", "extend_to_line_bounds", "extend_line_below", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"]
k = ["select_mode", "extend_to_line_bounds", "extend_line_above", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"]
up = ["select_mode", "extend_to_line_bounds", "extend_line_above", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"]
G = ["select_mode", "extend_to_line_bounds", "goto_last_line", "extend_to_line_bounds", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"]
w = ["move_next_word_start", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"]
W = ["move_next_long_word_start", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"]
g = { g = ["select_mode", "extend_to_line_bounds", "goto_file_start", "extend_to_line_bounds", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"] }
[keys.insert]
# Escape the madness! No more fighting with the cursor! Or with multiple cursors!
esc = ["collapse_selection", "normal_mode"]
C-c = "normal_mode" # 按 Ctrl + C 退出
C-k = "normal_mode" # 按 Ctrl + K 退出
"C-[" = "normal_mode" # 按 Ctrl + [ 退出 (这个键码和 ESC 一样)
[keys.select]
# Muscle memory
"{" = ["extend_to_line_bounds", "goto_prev_paragraph"]
"}" = ["extend_to_line_bounds", "goto_next_paragraph"]
0 = "goto_line_start"
"$" = "goto_line_end"
"^" = "goto_first_nonwhitespace"
G = "goto_file_end"
D = ["extend_to_line_bounds", "delete_selection", "normal_mode"]
C = ["goto_line_start", "extend_to_line_bounds", "change_selection"]
"%" = "match_brackets"
S = "surround_add" # Basically 99% of what I use vim-surround for
u = ["switch_to_lowercase", "collapse_selection", "normal_mode"]
U = ["switch_to_uppercase", "collapse_selection", "normal_mode"]
# Visual-mode specific muscle memory
i = "select_textobject_inner"
a = "select_textobject_around"
# Some extra binds to allow us to insert/append in select mode because it's nice with multiple cursors
tab = ["insert_mode", "collapse_selection"] # tab is read by most terminal editors as "C-i"
C-a = ["append_mode", "collapse_selection"]
# Make selecting lines in visual mode behave sensibly
k = ["extend_line_up", "extend_to_line_bounds"]
j = ["extend_line_down", "extend_to_line_bounds"]
# Clipboards over registers ye ye
d = ["yank_main_selection_to_clipboard", "delete_selection"]
x = ["yank_main_selection_to_clipboard", "delete_selection"]
y = ["yank_main_selection_to_clipboard", "normal_mode", "flip_selections", "collapse_selection"]
Y = ["extend_to_line_bounds", "yank_main_selection_to_clipboard", "goto_line_start", "collapse_selection", "normal_mode"]
p = "replace_selections_with_clipboard" # No life without this
P = "paste_clipboard_before"
# Escape the madness! No more fighting with the cursor! Or with multiple cursors!
esc = ["collapse_selection", "keep_primary_selection", "normal_mode"]
# ~/.config/helix/languages.toml
# -----------------------------------------------------------------
# PART 1: DEFINE ALL LANGUAGE SERVERS
# -----------------------------------------------------------------
[language-server.clangd]
command = "clangd"
args = ["--compile-commands-dir=build"]
[language-server.pyright]
#command = "pyright-langserver"
command = "/usr/local/miniconda3/bin/pyright-langserver"
args = ["--stdio"]
[language-server.rust-analyzer]
command = "rust-analyzer"
[language-server.marksman]
command = "marksman"
[language-server.vscode-html]
command = "vscode-html-language-server"
args = ["--stdio"]
[language-server.djlint]
command = "djlint"
args = ["--lsp"]
[language-server.docker-langserver]
command = "docker-langserver"
args = ["--stdio"]
[language-server.lua-ls]
command = "lua-language-server"
# -----------------------------------------------------------------
# PART 2: ASSIGN SERVERS TO LANGUAGES
# -----------------------------------------------------------------
[[language]]
name = "cpp"
# Use the "clangd" server defined above
language-servers = ["clangd"]
[[language]]
name = "c"
language-servers = ["clangd"]
[[language]]
name = "python"
language-servers = ["pyright"]
[[language]]
name = "rust"
language-servers = ["rust-analyzer"]
[[language]]
name = "markdown"
language-servers = ["marksman"]
[[language]]
name = "html"
language-servers = ["vscode-html"]
[[language]]
name = "htmldjango"
language-servers = ["djlint"]
[[language]]
name = "dockerfile"
language-servers = ["docker-langserver"]
[[language]]
name = "lua"
# We named the server "lua-ls" above
language-servers = ["lua-ls"]
# Syntax highlighting
# -------------------
"attribute" = "yellow"
"type" = "yellow"
"type.enum.variant" = "teal"
"constructor" = "sapphire"
"constant" = "peach"
"constant.character" = "teal"
"constant.character.escape" = "pink"
"string" = "green"
"string.regexp" = "pink"
"string.special" = "blue"
"string.special.symbol" = "red"
"comment" = { fg = "overlay2" }
"variable" = "text"
"variable.parameter" = { fg = "maroon" }
"variable.builtin" = "red"
"variable.other.member" = "blue"
"label" = "sapphire" # used for lifetimes
"punctuation" = "overlay2"
"punctuation.special" = "sky"
"keyword" = "mauve"
"keyword.control.conditional" = { fg = "mauve" }
"operator" = "sky"
"function" = "blue"
"function.macro" = "rosewater"
"tag" = "blue"
"namespace" = { fg = "yellow" }
"special" = "blue" # fuzzy highlight
"markup.heading.1" = "red"
"markup.heading.2" = "peach"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "sapphire"
"markup.heading.6" = "lavender"
"markup.list" = "teal"
"markup.list.unchecked" = "overlay2"
"markup.list.checked" = "green"
"markup.bold" = { fg = "red", modifiers = ["bold"] }
"markup.italic" = { fg = "red", modifiers = ["italic"] }
"markup.link.url" = { fg = "blue", modifiers = ["underlined"] }
"markup.link.text" = "lavender"
"markup.link.label" = "sapphire"
"markup.raw" = "green"
"markup.quote" = "pink"
"diff.plus" = "green"
"diff.minus" = "red"
"diff.delta" = "blue"
# User Interface
# --------------
"ui.background" = { fg = "text", bg = "base" }
"ui.linenr" = { fg = "surface1" }
"ui.linenr.selected" = { fg = "lavender" }
"ui.statusline" = { fg = "subtext1", bg = "mantle" }
"ui.statusline.inactive" = { fg = "surface2", bg = "mantle" }
"ui.statusline.normal" = { fg = "base", bg = "rosewater", modifiers = ["bold"] }
"ui.statusline.insert" = { fg = "base", bg = "green", modifiers = ["bold"] }
"ui.statusline.select" = { fg = "base", bg = "lavender", modifiers = ["bold"] }
"ui.popup" = { fg = "text", bg = "surface0" }
"ui.window" = { fg = "crust" }
"ui.help" = { fg = "overlay2", bg = "surface0" }
"ui.bufferline" = { fg = "subtext0", bg = "mantle" }
"ui.bufferline.active" = { fg = "mauve", bg = "base", underline = { color = "mauve", style = "line" } }
"ui.bufferline.background" = { bg = "crust" }
"ui.text" = "text"
"ui.text.focus" = { fg = "text", bg = "surface0", modifiers = ["bold"] }
"ui.text.inactive" = { fg = "overlay1" }
"ui.text.directory" = { fg = "blue" }
"ui.virtual" = "overlay0"
"ui.virtual.ruler" = { bg = "surface0" }
"ui.virtual.indent-guide" = "surface0"
"ui.virtual.inlay-hint" = { fg = "surface1", bg = "mantle" }
"ui.virtual.jump-label" = { fg = "rosewater", modifiers = ["bold"] }
"ui.selection" = { bg = "surface1" }
"ui.cursor" = { fg = "base", bg = "secondary_cursor" }
"ui.cursor.primary" = { fg = "base", bg = "rosewater" }
"ui.cursor.match" = { fg = "peach", modifiers = ["bold"] }
"ui.cursor.primary.normal" = { fg = "base", bg = "rosewater" }
"ui.cursor.primary.insert" = { fg = "base", bg = "green" }
"ui.cursor.primary.select" = { fg = "base", bg = "lavender" }
"ui.cursor.normal" = { fg = "base", bg = "secondary_cursor_normal" }
"ui.cursor.insert" = { fg = "base", bg = "secondary_cursor_insert" }
"ui.cursor.select" = { fg = "base", bg = "secondary_cursor_select" }
"ui.cursorline.primary" = { bg = "cursorline" }
"ui.highlight" = { bg = "surface1", modifiers = ["bold"] }
"ui.menu" = { fg = "overlay2", bg = "surface0" }
"ui.menu.selected" = { fg = "text", bg = "surface1", modifiers = ["bold"] }
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
"diagnostic.info" = { underline = { color = "sky", style = "curl" } }
"diagnostic.hint" = { underline = { color = "teal", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
error = "red"
warning = "yellow"
info = "sky"
hint = "teal"
rainbow = ["red", "peach", "yellow", "green", "sapphire", "lavender"]
[palette]
rosewater = "#f2d5cf"
flamingo = "#eebebe"
pink = "#f4b8e4"
mauve = "#ca9ee6"
red = "#e78284"
maroon = "#ea999c"
peach = "#ef9f76"
yellow = "#e5c890"
green = "#a6d189"
teal = "#81c8be"
sky = "#99d1db"
sapphire = "#85c1dc"
blue = "#8caaee"
lavender = "#babbf1"
text = "#c6d0f5"
subtext1 = "#b5bfe2"
subtext0 = "#a5adce"
overlay2 = "#949cbb"
overlay1 = "#838ba7"
overlay0 = "#737994"
surface2 = "#626880"
surface1 = "#51576d"
surface0 = "#414559"
base = "#303446"
mantle = "#292c3c"
crust = "#232634"
cursorline = "#3b3f52"
secondary_cursor = "#b8a5a6"
secondary_cursor_select = "#9192be"
secondary_cursor_normal = "#b8a5a6"
secondary_cursor_insert = "#83a275"
# Syntax highlighting
# -------------------
"attribute" = "yellow"
"type" = "yellow"
"type.enum.variant" = "teal"
"constructor" = "sapphire"
"constant" = "peach"
"constant.character" = "teal"
"constant.character.escape" = "pink"
"string" = "green"
"string.regexp" = "pink"
"string.special" = "blue"
"string.special.symbol" = "red"
"comment" = { fg = "overlay2" }
"variable" = "text"
"variable.parameter" = { fg = "maroon" }
"variable.builtin" = "red"
"variable.other.member" = "blue"
"label" = "sapphire" # used for lifetimes
"punctuation" = "overlay2"
"punctuation.special" = "sky"
"keyword" = "mauve"
"keyword.control.conditional" = { fg = "mauve" }
"operator" = "sky"
"function" = "blue"
"function.macro" = "rosewater"
"tag" = "blue"
"namespace" = { fg = "yellow" }
"special" = "blue" # fuzzy highlight
"markup.heading.1" = "red"
"markup.heading.2" = "peach"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "sapphire"
"markup.heading.6" = "lavender"
"markup.list" = "teal"
"markup.list.unchecked" = "overlay2"
"markup.list.checked" = "green"
"markup.bold" = { fg = "red", modifiers = ["bold"] }
"markup.italic" = { fg = "red", modifiers = ["italic"] }
"markup.link.url" = { fg = "blue", modifiers = ["underlined"] }
"markup.link.text" = "lavender"
"markup.link.label" = "sapphire"
"markup.raw" = "green"
"markup.quote" = "pink"
"diff.plus" = "green"
"diff.minus" = "red"
"diff.delta" = "blue"
# User Interface
# --------------
"ui.background" = { fg = "text", bg = "base" }
"ui.linenr" = { fg = "surface1" }
"ui.linenr.selected" = { fg = "lavender" }
"ui.statusline" = { fg = "subtext1", bg = "mantle" }
"ui.statusline.inactive" = { fg = "surface2", bg = "mantle" }
"ui.statusline.normal" = { fg = "base", bg = "rosewater", modifiers = ["bold"] }
"ui.statusline.insert" = { fg = "base", bg = "green", modifiers = ["bold"] }
"ui.statusline.select" = { fg = "base", bg = "lavender", modifiers = ["bold"] }
"ui.popup" = { fg = "text", bg = "surface0" }
"ui.window" = { fg = "crust" }
"ui.help" = { fg = "overlay2", bg = "surface0" }
"ui.bufferline" = { fg = "subtext0", bg = "mantle" }
"ui.bufferline.active" = { fg = "mauve", bg = "base", underline = { color = "mauve", style = "line" } }
"ui.bufferline.background" = { bg = "crust" }
"ui.text" = "text"
"ui.text.focus" = { fg = "text", bg = "surface0", modifiers = ["bold"] }
"ui.text.inactive" = { fg = "overlay1" }
"ui.text.directory" = { fg = "blue" }
"ui.virtual" = "overlay0"
"ui.virtual.ruler" = { bg = "surface0" }
"ui.virtual.indent-guide" = "surface0"
"ui.virtual.inlay-hint" = { fg = "surface1", bg = "mantle" }
"ui.virtual.jump-label" = { fg = "rosewater", modifiers = ["bold"] }
"ui.selection" = { bg = "surface1" }
"ui.cursor" = { fg = "base", bg = "secondary_cursor" }
"ui.cursor.primary" = { fg = "base", bg = "rosewater" }
"ui.cursor.match" = { fg = "peach", modifiers = ["bold"] }
"ui.cursor.primary.normal" = { fg = "base", bg = "rosewater" }
"ui.cursor.primary.insert" = { fg = "base", bg = "green" }
"ui.cursor.primary.select" = { fg = "base", bg = "lavender" }
"ui.cursor.normal" = { fg = "base", bg = "secondary_cursor_normal" }
"ui.cursor.insert" = { fg = "base", bg = "secondary_cursor_insert" }
"ui.cursor.select" = { fg = "base", bg = "secondary_cursor_select" }
"ui.cursorline.primary" = { bg = "cursorline" }
"ui.highlight" = { bg = "surface1", modifiers = ["bold"] }
"ui.menu" = { fg = "overlay2", bg = "surface0" }
"ui.menu.selected" = { fg = "text", bg = "surface1", modifiers = ["bold"] }
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
"diagnostic.info" = { underline = { color = "sky", style = "curl" } }
"diagnostic.hint" = { underline = { color = "teal", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
error = "red"
warning = "yellow"
info = "sky"
hint = "teal"
rainbow = ["red", "peach", "yellow", "green", "sapphire", "lavender"]
[palette]
rosewater = "#dc8a78"
flamingo = "#dd7878"
pink = "#ea76cb"
mauve = "#8839ef"
red = "#d20f39"
maroon = "#e64553"
peach = "#fe640b"
yellow = "#df8e1d"
green = "#40a02b"
teal = "#179299"
sky = "#04a5e5"
sapphire = "#209fb5"
blue = "#1e66f5"
lavender = "#7287fd"
text = "#4c4f69"
subtext1 = "#5c5f77"
subtext0 = "#6c6f85"
overlay2 = "#7c7f93"
overlay1 = "#8c8fa1"
overlay0 = "#9ca0b0"
surface2 = "#acb0be"
surface1 = "#bcc0cc"
surface0 = "#ccd0da"
base = "#eff1f5"
mantle = "#e6e9ef"
crust = "#dce0e8"
cursorline = "#e8ecf1"
secondary_cursor = "#e1a99d"
secondary_cursor_select = "#97a7fb"
secondary_cursor_normal = "#e1a99d"
secondary_cursor_insert = "#74b867"
# Syntax highlighting
# -------------------
"attribute" = "yellow"
"type" = "yellow"
"type.enum.variant" = "teal"
"constructor" = "sapphire"
"constant" = "peach"
"constant.character" = "teal"
"constant.character.escape" = "pink"
"string" = "green"
"string.regexp" = "pink"
"string.special" = "blue"
"string.special.symbol" = "red"
"comment" = { fg = "overlay2" }
"variable" = "text"
"variable.parameter" = { fg = "maroon" }
"variable.builtin" = "red"
"variable.other.member" = "blue"
"label" = "sapphire" # used for lifetimes
"punctuation" = "overlay2"
"punctuation.special" = "sky"
"keyword" = "mauve"
"keyword.control.conditional" = { fg = "mauve" }
"operator" = "sky"
"function" = "blue"
"function.macro" = "rosewater"
"tag" = "blue"
"namespace" = { fg = "yellow" }
"special" = "blue" # fuzzy highlight
"markup.heading.1" = "red"
"markup.heading.2" = "peach"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "sapphire"
"markup.heading.6" = "lavender"
"markup.list" = "teal"
"markup.list.unchecked" = "overlay2"
"markup.list.checked" = "green"
"markup.bold" = { fg = "red", modifiers = ["bold"] }
"markup.italic" = { fg = "red", modifiers = ["italic"] }
"markup.link.url" = { fg = "blue", modifiers = ["underlined"] }
"markup.link.text" = "lavender"
"markup.link.label" = "sapphire"
"markup.raw" = "green"
"markup.quote" = "pink"
"diff.plus" = "green"
"diff.minus" = "red"
"diff.delta" = "blue"
# User Interface
# --------------
"ui.background" = { fg = "text", bg = "base" }
"ui.linenr" = { fg = "surface1" }
"ui.linenr.selected" = { fg = "lavender" }
"ui.statusline" = { fg = "subtext1", bg = "mantle" }
"ui.statusline.inactive" = { fg = "surface2", bg = "mantle" }
"ui.statusline.normal" = { fg = "base", bg = "rosewater", modifiers = ["bold"] }
"ui.statusline.insert" = { fg = "base", bg = "green", modifiers = ["bold"] }
"ui.statusline.select" = { fg = "base", bg = "lavender", modifiers = ["bold"] }
"ui.popup" = { fg = "text", bg = "surface0" }
"ui.window" = { fg = "crust" }
"ui.help" = { fg = "overlay2", bg = "surface0" }
"ui.bufferline" = { fg = "subtext0", bg = "mantle" }
"ui.bufferline.active" = { fg = "mauve", bg = "base", underline = { color = "mauve", style = "line" } }
"ui.bufferline.background" = { bg = "crust" }
"ui.text" = "text"
"ui.text.focus" = { fg = "text", bg = "surface0", modifiers = ["bold"] }
"ui.text.inactive" = { fg = "overlay1" }
"ui.text.directory" = { fg = "blue" }
"ui.virtual" = "overlay0"
"ui.virtual.ruler" = { bg = "surface0" }
"ui.virtual.indent-guide" = "surface0"
"ui.virtual.inlay-hint" = { fg = "surface1", bg = "mantle" }
"ui.virtual.jump-label" = { fg = "rosewater", modifiers = ["bold"] }
"ui.selection" = { bg = "surface1" }
"ui.cursor" = { fg = "base", bg = "secondary_cursor" }
"ui.cursor.primary" = { fg = "base", bg = "rosewater" }
"ui.cursor.match" = { fg = "peach", modifiers = ["bold"] }
"ui.cursor.primary.normal" = { fg = "base", bg = "rosewater" }
"ui.cursor.primary.insert" = { fg = "base", bg = "green" }
"ui.cursor.primary.select" = { fg = "base", bg = "lavender" }
"ui.cursor.normal" = { fg = "base", bg = "secondary_cursor_normal" }
"ui.cursor.insert" = { fg = "base", bg = "secondary_cursor_insert" }
"ui.cursor.select" = { fg = "base", bg = "secondary_cursor_select" }
"ui.cursorline.primary" = { bg = "cursorline" }
"ui.highlight" = { bg = "surface1", modifiers = ["bold"] }
"ui.menu" = { fg = "overlay2", bg = "surface0" }
"ui.menu.selected" = { fg = "text", bg = "surface1", modifiers = ["bold"] }
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
"diagnostic.info" = { underline = { color = "sky", style = "curl" } }
"diagnostic.hint" = { underline = { color = "teal", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
error = "red"
warning = "yellow"
info = "sky"
hint = "teal"
rainbow = ["red", "peach", "yellow", "green", "sapphire", "lavender"]
[palette]
rosewater = "#f4dbd6"
flamingo = "#f0c6c6"
pink = "#f5bde6"
mauve = "#c6a0f6"
red = "#ed8796"
maroon = "#ee99a0"
peach = "#f5a97f"
yellow = "#eed49f"
green = "#a6da95"
teal = "#8bd5ca"
sky = "#91d7e3"
sapphire = "#7dc4e4"
blue = "#8aadf4"
lavender = "#b7bdf8"
text = "#cad3f5"
subtext1 = "#b8c0e0"
subtext0 = "#a5adcb"
overlay2 = "#939ab7"
overlay1 = "#8087a2"
overlay0 = "#6e738d"
surface2 = "#5b6078"
surface1 = "#494d64"
surface0 = "#363a4f"
base = "#24273a"
mantle = "#1e2030"
crust = "#181926"
cursorline = "#303347"
secondary_cursor = "#b6a6a7"
secondary_cursor_select = "#8b91bf"
secondary_cursor_normal = "#b6a6a7"
secondary_cursor_insert = "#80a57a"
# Syntax highlighting
# -------------------
"attribute" = "yellow"
"type" = "yellow"
"type.enum.variant" = "teal"
"constructor" = "sapphire"
"constant" = "peach"
"constant.character" = "teal"
"constant.character.escape" = "pink"
"string" = "green"
"string.regexp" = "pink"
"string.special" = "blue"
"string.special.symbol" = "red"
"comment" = { fg = "overlay2" }
"variable" = "text"
"variable.parameter" = { fg = "maroon" }
"variable.builtin" = "red"
"variable.other.member" = "blue"
"label" = "sapphire" # used for lifetimes
"punctuation" = "overlay2"
"punctuation.special" = "sky"
"keyword" = "mauve"
"keyword.control.conditional" = { fg = "mauve" }
"operator" = "sky"
"function" = "blue"
"function.macro" = "rosewater"
"tag" = "blue"
"namespace" = { fg = "yellow" }
"special" = "blue" # fuzzy highlight
"markup.heading.1" = "red"
"markup.heading.2" = "peach"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "sapphire"
"markup.heading.6" = "lavender"
"markup.list" = "teal"
"markup.list.unchecked" = "overlay2"
"markup.list.checked" = "green"
"markup.bold" = { fg = "red", modifiers = ["bold"] }
"markup.italic" = { fg = "red", modifiers = ["italic"] }
"markup.link.url" = { fg = "blue", modifiers = ["underlined"] }
"markup.link.text" = "lavender"
"markup.link.label" = "sapphire"
"markup.raw" = "green"
"markup.quote" = "pink"
"diff.plus" = "green"
"diff.minus" = "red"
"diff.delta" = "blue"
# User Interface
# --------------
"ui.background" = { fg = "text", bg = "base" }
"ui.linenr" = { fg = "surface1" }
"ui.linenr.selected" = { fg = "lavender" }
"ui.statusline" = { fg = "subtext1", bg = "mantle" }
"ui.statusline.inactive" = { fg = "surface2", bg = "mantle" }
"ui.statusline.normal" = { fg = "base", bg = "rosewater", modifiers = ["bold"] }
"ui.statusline.insert" = { fg = "base", bg = "green", modifiers = ["bold"] }
"ui.statusline.select" = { fg = "base", bg = "lavender", modifiers = ["bold"] }
"ui.popup" = { fg = "text", bg = "surface0" }
"ui.window" = { fg = "crust" }
"ui.help" = { fg = "overlay2", bg = "surface0" }
"ui.bufferline" = { fg = "subtext0", bg = "mantle" }
"ui.bufferline.active" = { fg = "mauve", bg = "base", underline = { color = "mauve", style = "line" } }
"ui.bufferline.background" = { bg = "crust" }
"ui.text" = "text"
"ui.text.focus" = { fg = "text", bg = "surface0", modifiers = ["bold"] }
"ui.text.inactive" = { fg = "overlay1" }
"ui.text.directory" = { fg = "blue" }
"ui.virtual" = "overlay0"
"ui.virtual.ruler" = { bg = "surface0" }
"ui.virtual.indent-guide" = "surface0"
"ui.virtual.inlay-hint" = { fg = "surface1", bg = "mantle" }
"ui.virtual.jump-label" = { fg = "rosewater", modifiers = ["bold"] }
"ui.selection" = { bg = "surface1" }
"ui.cursor" = { fg = "base", bg = "secondary_cursor" }
"ui.cursor.primary" = { fg = "base", bg = "rosewater" }
"ui.cursor.match" = { fg = "peach", modifiers = ["bold"] }
"ui.cursor.primary.normal" = { fg = "base", bg = "rosewater" }
"ui.cursor.primary.insert" = { fg = "base", bg = "green" }
"ui.cursor.primary.select" = { fg = "base", bg = "lavender" }
"ui.cursor.normal" = { fg = "base", bg = "secondary_cursor_normal" }
"ui.cursor.insert" = { fg = "base", bg = "secondary_cursor_insert" }
"ui.cursor.select" = { fg = "base", bg = "secondary_cursor_select" }
"ui.cursorline.primary" = { bg = "cursorline" }
"ui.highlight" = { bg = "surface1", modifiers = ["bold"] }
"ui.menu" = { fg = "overlay2", bg = "surface0" }
"ui.menu.selected" = { fg = "text", bg = "surface1", modifiers = ["bold"] }
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
"diagnostic.info" = { underline = { color = "sky", style = "curl" } }
"diagnostic.hint" = { underline = { color = "teal", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
error = "red"
warning = "yellow"
info = "sky"
hint = "teal"
rainbow = ["red", "peach", "yellow", "green", "sapphire", "lavender"]
[palette]
rosewater = "#f5e0dc"
flamingo = "#f2cdcd"
pink = "#f5c2e7"
mauve = "#cba6f7"
red = "#f38ba8"
maroon = "#eba0ac"
peach = "#fab387"
yellow = "#f9e2af"
green = "#a6e3a1"
teal = "#94e2d5"
sky = "#89dceb"
sapphire = "#74c7ec"
blue = "#89b4fa"
lavender = "#b4befe"
text = "#cdd6f4"
subtext1 = "#bac2de"
subtext0 = "#a6adc8"
overlay2 = "#9399b2"
overlay1 = "#7f849c"
overlay0 = "#6c7086"
surface2 = "#585b70"
surface1 = "#45475a"
surface0 = "#313244"
base = "#1e1e2e"
mantle = "#181825"
crust = "#11111b"
cursorline = "#2a2b3c"
secondary_cursor = "#b5a6a8"
secondary_cursor_select = "#878ec0"
secondary_cursor_normal = "#b5a6a8"
secondary_cursor_insert = "#7ea87f"
# Syntax highlighting
# -------------------
"attribute" = "yellow"
"type" = "yellow"
"type.enum.variant" = "teal"
"constructor" = "sapphire"
"constant" = "peach"
"constant.character" = "teal"
"constant.character.escape" = "pink"
"string" = "green"
"string.regexp" = "pink"
"string.special" = "blue"
"string.special.symbol" = "red"
"comment" = { fg = "overlay2", modifiers = ["italic"] }
"variable" = "text"
"variable.parameter" = { fg = "maroon", modifiers = ["italic"] }
"variable.builtin" = "red"
"variable.other.member" = "blue"
"label" = "sapphire" # used for lifetimes
"punctuation" = "overlay2"
"punctuation.special" = "sky"
"keyword" = "mauve"
"keyword.control.conditional" = { fg = "mauve", modifiers = ["italic"] }
"operator" = "sky"
"function" = "blue"
"function.macro" = "rosewater"
"tag" = "blue"
"namespace" = { fg = "yellow", modifiers = ["italic"] }
"special" = "blue" # fuzzy highlight
"markup.heading.1" = "red"
"markup.heading.2" = "peach"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "sapphire"
"markup.heading.6" = "lavender"
"markup.list" = "teal"
"markup.list.unchecked" = "overlay2"
"markup.list.checked" = "green"
"markup.bold" = { fg = "red", modifiers = ["bold"] }
"markup.italic" = { fg = "red", modifiers = ["italic"] }
"markup.link.url" = { fg = "blue", modifiers = ["italic", "underlined"] }
"markup.link.text" = "lavender"
"markup.link.label" = "sapphire"
"markup.raw" = "green"
"markup.quote" = "pink"
"diff.plus" = "green"
"diff.minus" = "red"
"diff.delta" = "blue"
# User Interface
# --------------
"ui.background" = { fg = "text", bg = "base" }
"ui.linenr" = { fg = "surface1" }
"ui.linenr.selected" = { fg = "lavender" }
"ui.statusline" = { fg = "subtext1", bg = "mantle" }
"ui.statusline.inactive" = { fg = "surface2", bg = "mantle" }
"ui.statusline.normal" = { fg = "base", bg = "rosewater", modifiers = ["bold"] }
"ui.statusline.insert" = { fg = "base", bg = "green", modifiers = ["bold"] }
"ui.statusline.select" = { fg = "base", bg = "lavender", modifiers = ["bold"] }
"ui.popup" = { fg = "text", bg = "surface0" }
"ui.window" = { fg = "crust" }
"ui.help" = { fg = "overlay2", bg = "surface0" }
"ui.bufferline" = { fg = "subtext0", bg = "mantle" }
"ui.bufferline.active" = { fg = "mauve", bg = "base", underline = { color = "mauve", style = "line" } }
"ui.bufferline.background" = { bg = "crust" }
"ui.text" = "text"
"ui.text.focus" = { fg = "text", bg = "surface0", modifiers = ["bold"] }
"ui.text.inactive" = { fg = "overlay1" }
"ui.text.directory" = { fg = "blue" }
"ui.virtual" = "overlay0"
"ui.virtual.ruler" = { bg = "surface0" }
"ui.virtual.indent-guide" = "surface0"
"ui.virtual.inlay-hint" = { fg = "surface1", bg = "mantle" }
"ui.virtual.jump-label" = { fg = "rosewater", modifiers = ["bold"] }
"ui.selection" = { bg = "surface1" }
"ui.cursor" = { fg = "base", bg = "secondary_cursor" }
"ui.cursor.primary" = { fg = "base", bg = "rosewater" }
"ui.cursor.match" = { fg = "peach", modifiers = ["bold"] }
"ui.cursor.primary.normal" = { fg = "base", bg = "rosewater" }
"ui.cursor.primary.insert" = { fg = "base", bg = "green" }
"ui.cursor.primary.select" = { fg = "base", bg = "lavender" }
"ui.cursor.normal" = { fg = "base", bg = "secondary_cursor_normal" }
"ui.cursor.insert" = { fg = "base", bg = "secondary_cursor_insert" }
"ui.cursor.select" = { fg = "base", bg = "secondary_cursor_select" }
"ui.cursorline.primary" = { bg = "cursorline" }
"ui.highlight" = { bg = "surface1", modifiers = ["bold"] }
"ui.menu" = { fg = "overlay2", bg = "surface0" }
"ui.menu.selected" = { fg = "text", bg = "surface1", modifiers = ["bold"] }
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
"diagnostic.info" = { underline = { color = "sky", style = "curl" } }
"diagnostic.hint" = { underline = { color = "teal", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
error = "red"
warning = "yellow"
info = "sky"
hint = "teal"
rainbow = ["red", "peach", "yellow", "green", "sapphire", "lavender"]
[palette]
rosewater = "#f2d5cf"
flamingo = "#eebebe"
pink = "#f4b8e4"
mauve = "#ca9ee6"
red = "#e78284"
maroon = "#ea999c"
peach = "#ef9f76"
yellow = "#e5c890"
green = "#a6d189"
teal = "#81c8be"
sky = "#99d1db"
sapphire = "#85c1dc"
blue = "#8caaee"
lavender = "#babbf1"
text = "#c6d0f5"
subtext1 = "#b5bfe2"
subtext0 = "#a5adce"
overlay2 = "#949cbb"
overlay1 = "#838ba7"
overlay0 = "#737994"
surface2 = "#626880"
surface1 = "#51576d"
surface0 = "#414559"
base = "#303446"
mantle = "#292c3c"
crust = "#232634"
cursorline = "#3b3f52"
secondary_cursor = "#b8a5a6"
secondary_cursor_select = "#9192be"
secondary_cursor_normal = "#b8a5a6"
secondary_cursor_insert = "#83a275"
# Syntax highlighting
# -------------------
"attribute" = "yellow"
"type" = "yellow"
"type.enum.variant" = "teal"
"constructor" = "sapphire"
"constant" = "peach"
"constant.character" = "teal"
"constant.character.escape" = "pink"
"string" = "green"
"string.regexp" = "pink"
"string.special" = "blue"
"string.special.symbol" = "red"
"comment" = { fg = "overlay2", modifiers = ["italic"] }
"variable" = "text"
"variable.parameter" = { fg = "maroon", modifiers = ["italic"] }
"variable.builtin" = "red"
"variable.other.member" = "blue"
"label" = "sapphire" # used for lifetimes
"punctuation" = "overlay2"
"punctuation.special" = "sky"
"keyword" = "mauve"
"keyword.control.conditional" = { fg = "mauve", modifiers = ["italic"] }
"operator" = "sky"
"function" = "blue"
"function.macro" = "rosewater"
"tag" = "blue"
"namespace" = { fg = "yellow", modifiers = ["italic"] }
"special" = "blue" # fuzzy highlight
"markup.heading.1" = "red"
"markup.heading.2" = "peach"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "sapphire"
"markup.heading.6" = "lavender"
"markup.list" = "teal"
"markup.list.unchecked" = "overlay2"
"markup.list.checked" = "green"
"markup.bold" = { fg = "red", modifiers = ["bold"] }
"markup.italic" = { fg = "red", modifiers = ["italic"] }
"markup.link.url" = { fg = "blue", modifiers = ["italic", "underlined"] }
"markup.link.text" = "lavender"
"markup.link.label" = "sapphire"
"markup.raw" = "green"
"markup.quote" = "pink"
"diff.plus" = "green"
"diff.minus" = "red"
"diff.delta" = "blue"
# User Interface
# --------------
"ui.background" = { fg = "text", bg = "base" }
"ui.linenr" = { fg = "surface1" }
"ui.linenr.selected" = { fg = "lavender" }
"ui.statusline" = { fg = "subtext1", bg = "mantle" }
"ui.statusline.inactive" = { fg = "surface2", bg = "mantle" }
"ui.statusline.normal" = { fg = "base", bg = "rosewater", modifiers = ["bold"] }
"ui.statusline.insert" = { fg = "base", bg = "green", modifiers = ["bold"] }
"ui.statusline.select" = { fg = "base", bg = "lavender", modifiers = ["bold"] }
"ui.popup" = { fg = "text", bg = "surface0" }
"ui.window" = { fg = "crust" }
"ui.help" = { fg = "overlay2", bg = "surface0" }
"ui.bufferline" = { fg = "subtext0", bg = "mantle" }
"ui.bufferline.active" = { fg = "mauve", bg = "base", underline = { color = "mauve", style = "line" } }
"ui.bufferline.background" = { bg = "crust" }
"ui.text" = "text"
"ui.text.focus" = { fg = "text", bg = "surface0", modifiers = ["bold"] }
"ui.text.inactive" = { fg = "overlay1" }
"ui.text.directory" = { fg = "blue" }
"ui.virtual" = "overlay0"
"ui.virtual.ruler" = { bg = "surface0" }
"ui.virtual.indent-guide" = "surface0"
"ui.virtual.inlay-hint" = { fg = "surface1", bg = "mantle" }
"ui.virtual.jump-label" = { fg = "rosewater", modifiers = ["bold"] }
"ui.selection" = { bg = "surface1" }
"ui.cursor" = { fg = "base", bg = "secondary_cursor" }
"ui.cursor.primary" = { fg = "base", bg = "rosewater" }
"ui.cursor.match" = { fg = "peach", modifiers = ["bold"] }
"ui.cursor.primary.normal" = { fg = "base", bg = "rosewater" }
"ui.cursor.primary.insert" = { fg = "base", bg = "green" }
"ui.cursor.primary.select" = { fg = "base", bg = "lavender" }
"ui.cursor.normal" = { fg = "base", bg = "secondary_cursor_normal" }
"ui.cursor.insert" = { fg = "base", bg = "secondary_cursor_insert" }
"ui.cursor.select" = { fg = "base", bg = "secondary_cursor_select" }
"ui.cursorline.primary" = { bg = "cursorline" }
"ui.highlight" = { bg = "surface1", modifiers = ["bold"] }
"ui.menu" = { fg = "overlay2", bg = "surface0" }
"ui.menu.selected" = { fg = "text", bg = "surface1", modifiers = ["bold"] }
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
"diagnostic.info" = { underline = { color = "sky", style = "curl" } }
"diagnostic.hint" = { underline = { color = "teal", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
error = "red"
warning = "yellow"
info = "sky"
hint = "teal"
rainbow = ["red", "peach", "yellow", "green", "sapphire", "lavender"]
[palette]
rosewater = "#dc8a78"
flamingo = "#dd7878"
pink = "#ea76cb"
mauve = "#8839ef"
red = "#d20f39"
maroon = "#e64553"
peach = "#fe640b"
yellow = "#df8e1d"
green = "#40a02b"
teal = "#179299"
sky = "#04a5e5"
sapphire = "#209fb5"
blue = "#1e66f5"
lavender = "#7287fd"
text = "#4c4f69"
subtext1 = "#5c5f77"
subtext0 = "#6c6f85"
overlay2 = "#7c7f93"
overlay1 = "#8c8fa1"
overlay0 = "#9ca0b0"
surface2 = "#acb0be"
surface1 = "#bcc0cc"
surface0 = "#ccd0da"
base = "#eff1f5"
mantle = "#e6e9ef"
crust = "#dce0e8"
cursorline = "#e8ecf1"
secondary_cursor = "#e1a99d"
secondary_cursor_select = "#97a7fb"
secondary_cursor_normal = "#e1a99d"
secondary_cursor_insert = "#74b867"
# Syntax highlighting
# -------------------
"attribute" = "yellow"
"type" = "yellow"
"type.enum.variant" = "teal"
"constructor" = "sapphire"
"constant" = "peach"
"constant.character" = "teal"
"constant.character.escape" = "pink"
"string" = "green"
"string.regexp" = "pink"
"string.special" = "blue"
"string.special.symbol" = "red"
"comment" = { fg = "overlay2", modifiers = ["italic"] }
"variable" = "text"
"variable.parameter" = { fg = "maroon", modifiers = ["italic"] }
"variable.builtin" = "red"
"variable.other.member" = "blue"
"label" = "sapphire" # used for lifetimes
"punctuation" = "overlay2"
"punctuation.special" = "sky"
"keyword" = "mauve"
"keyword.control.conditional" = { fg = "mauve", modifiers = ["italic"] }
"operator" = "sky"
"function" = "blue"
"function.macro" = "rosewater"
"tag" = "blue"
"namespace" = { fg = "yellow", modifiers = ["italic"] }
"special" = "blue" # fuzzy highlight
"markup.heading.1" = "red"
"markup.heading.2" = "peach"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "sapphire"
"markup.heading.6" = "lavender"
"markup.list" = "teal"
"markup.list.unchecked" = "overlay2"
"markup.list.checked" = "green"
"markup.bold" = { fg = "red", modifiers = ["bold"] }
"markup.italic" = { fg = "red", modifiers = ["italic"] }
"markup.link.url" = { fg = "blue", modifiers = ["italic", "underlined"] }
"markup.link.text" = "lavender"
"markup.link.label" = "sapphire"
"markup.raw" = "green"
"markup.quote" = "pink"
"diff.plus" = "green"
"diff.minus" = "red"
"diff.delta" = "blue"
# User Interface
# --------------
"ui.background" = { fg = "text", bg = "base" }
"ui.linenr" = { fg = "surface1" }
"ui.linenr.selected" = { fg = "lavender" }
"ui.statusline" = { fg = "subtext1", bg = "mantle" }
"ui.statusline.inactive" = { fg = "surface2", bg = "mantle" }
"ui.statusline.normal" = { fg = "base", bg = "rosewater", modifiers = ["bold"] }
"ui.statusline.insert" = { fg = "base", bg = "green", modifiers = ["bold"] }
"ui.statusline.select" = { fg = "base", bg = "lavender", modifiers = ["bold"] }
"ui.popup" = { fg = "text", bg = "surface0" }
"ui.window" = { fg = "crust" }
"ui.help" = { fg = "overlay2", bg = "surface0" }
"ui.bufferline" = { fg = "subtext0", bg = "mantle" }
"ui.bufferline.active" = { fg = "mauve", bg = "base", underline = { color = "mauve", style = "line" } }
"ui.bufferline.background" = { bg = "crust" }
"ui.text" = "text"
"ui.text.focus" = { fg = "text", bg = "surface0", modifiers = ["bold"] }
"ui.text.inactive" = { fg = "overlay1" }
"ui.text.directory" = { fg = "blue" }
"ui.virtual" = "overlay0"
"ui.virtual.ruler" = { bg = "surface0" }
"ui.virtual.indent-guide" = "surface0"
"ui.virtual.inlay-hint" = { fg = "surface1", bg = "mantle" }
"ui.virtual.jump-label" = { fg = "rosewater", modifiers = ["bold"] }
"ui.selection" = { bg = "surface1" }
"ui.cursor" = { fg = "base", bg = "secondary_cursor" }
"ui.cursor.primary" = { fg = "base", bg = "rosewater" }
"ui.cursor.match" = { fg = "peach", modifiers = ["bold"] }
"ui.cursor.primary.normal" = { fg = "base", bg = "rosewater" }
"ui.cursor.primary.insert" = { fg = "base", bg = "green" }
"ui.cursor.primary.select" = { fg = "base", bg = "lavender" }
"ui.cursor.normal" = { fg = "base", bg = "secondary_cursor_normal" }
"ui.cursor.insert" = { fg = "base", bg = "secondary_cursor_insert" }
"ui.cursor.select" = { fg = "base", bg = "secondary_cursor_select" }
"ui.cursorline.primary" = { bg = "cursorline" }
"ui.highlight" = { bg = "surface1", modifiers = ["bold"] }
"ui.menu" = { fg = "overlay2", bg = "surface0" }
"ui.menu.selected" = { fg = "text", bg = "surface1", modifiers = ["bold"] }
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
"diagnostic.info" = { underline = { color = "sky", style = "curl" } }
"diagnostic.hint" = { underline = { color = "teal", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
error = "red"
warning = "yellow"
info = "sky"
hint = "teal"
rainbow = ["red", "peach", "yellow", "green", "sapphire", "lavender"]
[palette]
rosewater = "#f4dbd6"
flamingo = "#f0c6c6"
pink = "#f5bde6"
mauve = "#c6a0f6"
red = "#ed8796"
maroon = "#ee99a0"
peach = "#f5a97f"
yellow = "#eed49f"
green = "#a6da95"
teal = "#8bd5ca"
sky = "#91d7e3"
sapphire = "#7dc4e4"
blue = "#8aadf4"
lavender = "#b7bdf8"
text = "#cad3f5"
subtext1 = "#b8c0e0"
subtext0 = "#a5adcb"
overlay2 = "#939ab7"
overlay1 = "#8087a2"
overlay0 = "#6e738d"
surface2 = "#5b6078"
surface1 = "#494d64"
surface0 = "#363a4f"
base = "#24273a"
mantle = "#1e2030"
crust = "#181926"
cursorline = "#303347"
secondary_cursor = "#b6a6a7"
secondary_cursor_select = "#8b91bf"
secondary_cursor_normal = "#b6a6a7"
secondary_cursor_insert = "#80a57a"
# Syntax highlighting
# -------------------
"attribute" = "yellow"
"type" = "yellow"
"type.enum.variant" = "teal"
"constructor" = "sapphire"
"constant" = "peach"
"constant.character" = "teal"
"constant.character.escape" = "pink"
"string" = "green"
"string.regexp" = "pink"
"string.special" = "blue"
"string.special.symbol" = "red"
"comment" = { fg = "overlay2", modifiers = ["italic"] }
"variable" = "text"
"variable.parameter" = { fg = "maroon", modifiers = ["italic"] }
"variable.builtin" = "red"
"variable.other.member" = "blue"
"label" = "sapphire" # used for lifetimes
"punctuation" = "overlay2"
"punctuation.special" = "sky"
"keyword" = "mauve"
"keyword.control.conditional" = { fg = "mauve", modifiers = ["italic"] }
"operator" = "sky"
"function" = "blue"
"function.macro" = "rosewater"
"tag" = "blue"
"namespace" = { fg = "yellow", modifiers = ["italic"] }
"special" = "blue" # fuzzy highlight
"markup.heading.1" = "red"
"markup.heading.2" = "peach"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "sapphire"
"markup.heading.6" = "lavender"
"markup.list" = "teal"
"markup.list.unchecked" = "overlay2"
"markup.list.checked" = "green"
"markup.bold" = { fg = "red", modifiers = ["bold"] }
"markup.italic" = { fg = "red", modifiers = ["italic"] }
"markup.link.url" = { fg = "blue", modifiers = ["italic", "underlined"] }
"markup.link.text" = "lavender"
"markup.link.label" = "sapphire"
"markup.raw" = "green"
"markup.quote" = "pink"
"diff.plus" = "green"
"diff.minus" = "red"
"diff.delta" = "blue"
# User Interface
# --------------
"ui.background" = { fg = "text", bg = "base" }
"ui.linenr" = { fg = "surface1" }
"ui.linenr.selected" = { fg = "lavender" }
"ui.statusline" = { fg = "subtext1", bg = "mantle" }
"ui.statusline.inactive" = { fg = "surface2", bg = "mantle" }
"ui.statusline.normal" = { fg = "base", bg = "rosewater", modifiers = ["bold"] }
"ui.statusline.insert" = { fg = "base", bg = "green", modifiers = ["bold"] }
"ui.statusline.select" = { fg = "base", bg = "lavender", modifiers = ["bold"] }
"ui.popup" = { fg = "text", bg = "surface0" }
"ui.window" = { fg = "crust" }
"ui.help" = { fg = "overlay2", bg = "surface0" }
"ui.bufferline" = { fg = "subtext0", bg = "mantle" }
"ui.bufferline.active" = { fg = "mauve", bg = "base", underline = { color = "mauve", style = "line" } }
"ui.bufferline.background" = { bg = "crust" }
"ui.text" = "text"
"ui.text.focus" = { fg = "text", bg = "surface0", modifiers = ["bold"] }
"ui.text.inactive" = { fg = "overlay1" }
"ui.text.directory" = { fg = "blue" }
"ui.virtual" = "overlay0"
"ui.virtual.ruler" = { bg = "surface0" }
"ui.virtual.indent-guide" = "surface0"
"ui.virtual.inlay-hint" = { fg = "surface1", bg = "mantle" }
"ui.virtual.jump-label" = { fg = "rosewater", modifiers = ["bold"] }
"ui.selection" = { bg = "surface1" }
"ui.cursor" = { fg = "base", bg = "secondary_cursor" }
"ui.cursor.primary" = { fg = "base", bg = "rosewater" }
"ui.cursor.match" = { fg = "peach", modifiers = ["bold"] }
"ui.cursor.primary.normal" = { fg = "base", bg = "rosewater" }
"ui.cursor.primary.insert" = { fg = "base", bg = "green" }
"ui.cursor.primary.select" = { fg = "base", bg = "lavender" }
"ui.cursor.normal" = { fg = "base", bg = "secondary_cursor_normal" }
"ui.cursor.insert" = { fg = "base", bg = "secondary_cursor_insert" }
"ui.cursor.select" = { fg = "base", bg = "secondary_cursor_select" }
"ui.cursorline.primary" = { bg = "cursorline" }
"ui.highlight" = { bg = "surface1", modifiers = ["bold"] }
"ui.menu" = { fg = "overlay2", bg = "surface0" }
"ui.menu.selected" = { fg = "text", bg = "surface1", modifiers = ["bold"] }
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
"diagnostic.info" = { underline = { color = "sky", style = "curl" } }
"diagnostic.hint" = { underline = { color = "teal", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
error = "red"
warning = "yellow"
info = "sky"
hint = "teal"
rainbow = ["red", "peach", "yellow", "green", "sapphire", "lavender"]
[palette]
rosewater = "#f5e0dc"
flamingo = "#f2cdcd"
pink = "#f5c2e7"
mauve = "#cba6f7"
red = "#f38ba8"
maroon = "#eba0ac"
peach = "#fab387"
yellow = "#f9e2af"
green = "#a6e3a1"
teal = "#94e2d5"
sky = "#89dceb"
sapphire = "#74c7ec"
blue = "#89b4fa"
lavender = "#b4befe"
text = "#cdd6f4"
subtext1 = "#bac2de"
subtext0 = "#a6adc8"
overlay2 = "#9399b2"
overlay1 = "#7f849c"
overlay0 = "#6c7086"
surface2 = "#585b70"
surface1 = "#45475a"
surface0 = "#313244"
base = "#1e1e2e"
mantle = "#181825"
crust = "#11111b"
cursorline = "#2a2b3c"
secondary_cursor = "#b5a6a8"
secondary_cursor_select = "#878ec0"
secondary_cursor_normal = "#b5a6a8"
secondary_cursor_insert = "#7ea87f"
# Syntax highlighting
# -------------------
"attribute" = "yellow"
"type" = "yellow"
"type.enum.variant" = "teal"
"constructor" = "sapphire"
"constant" = "peach"
"constant.character" = "teal"
"constant.character.escape" = "pink"
"string" = "green"
"string.regexp" = "pink"
"string.special" = "blue"
"string.special.symbol" = "red"
"comment" = { fg = "overlay2" }
"variable" = "text"
"variable.parameter" = { fg = "maroon" }
"variable.builtin" = "red"
"variable.other.member" = "blue"
"label" = "sapphire" # used for lifetimes
"punctuation" = "overlay2"
"punctuation.special" = "sky"
"keyword" = "mauve"
"keyword.control.conditional" = { fg = "mauve" }
"operator" = "sky"
"function" = "blue"
"function.macro" = "rosewater"
"tag" = "blue"
"namespace" = { fg = "yellow" }
"special" = "blue" # fuzzy highlight
"markup.heading.1" = "red"
"markup.heading.2" = "peach"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "sapphire"
"markup.heading.6" = "lavender"
"markup.list" = "teal"
"markup.list.unchecked" = "overlay2"
"markup.list.checked" = "green"
"markup.bold" = { fg = "red", modifiers = ["bold"] }
"markup.italic" = { fg = "red", modifiers = ["italic"] }
"markup.link.url" = { fg = "blue", modifiers = ["underlined"] }
"markup.link.text" = "lavender"
"markup.link.label" = "sapphire"
"markup.raw" = "green"
"markup.quote" = "pink"
"diff.plus" = "green"
"diff.minus" = "red"
"diff.delta" = "blue"
# User Interface
# --------------
"ui.background" = { fg = "text", bg = "base" }
"ui.linenr" = { fg = "surface1" }
"ui.linenr.selected" = { fg = "lavender" }
"ui.statusline" = { fg = "subtext1", bg = "mantle" }
"ui.statusline.inactive" = { fg = "surface2", bg = "mantle" }
"ui.statusline.normal" = { fg = "base", bg = "rosewater", modifiers = ["bold"] }
"ui.statusline.insert" = { fg = "base", bg = "green", modifiers = ["bold"] }
"ui.statusline.select" = { fg = "base", bg = "lavender", modifiers = ["bold"] }
"ui.popup" = { fg = "text", bg = "surface0" }
"ui.window" = { fg = "crust" }
"ui.help" = { fg = "overlay2", bg = "surface0" }
"ui.bufferline" = { fg = "subtext0", bg = "mantle" }
"ui.bufferline.active" = { fg = "mauve", bg = "base", underline = { color = "mauve", style = "line" } }
"ui.bufferline.background" = { bg = "crust" }
"ui.text" = "text"
"ui.text.focus" = { fg = "text", bg = "surface0", modifiers = ["bold"] }
"ui.text.inactive" = { fg = "overlay1" }
"ui.text.directory" = { fg = "blue" }
"ui.virtual" = "overlay0"
"ui.virtual.ruler" = { bg = "surface0" }
"ui.virtual.indent-guide" = "surface0"
"ui.virtual.inlay-hint" = { fg = "surface1", bg = "mantle" }
"ui.virtual.jump-label" = { fg = "rosewater", modifiers = ["bold"] }
"ui.selection" = { bg = "surface1" }
"ui.cursor" = { fg = "base", bg = "secondary_cursor" }
"ui.cursor.primary" = { fg = "base", bg = "rosewater" }
"ui.cursor.match" = { fg = "peach", modifiers = ["bold"] }
"ui.cursor.primary.normal" = { fg = "base", bg = "rosewater" }
"ui.cursor.primary.insert" = { fg = "base", bg = "green" }
"ui.cursor.primary.select" = { fg = "base", bg = "lavender" }
"ui.cursor.normal" = { fg = "base", bg = "secondary_cursor_normal" }
"ui.cursor.insert" = { fg = "base", bg = "secondary_cursor_insert" }
"ui.cursor.select" = { fg = "base", bg = "secondary_cursor_select" }
"ui.cursorline.primary" = { bg = "cursorline" }
"ui.highlight" = { bg = "surface1", modifiers = ["bold"] }
"ui.menu" = { fg = "overlay2", bg = "surface0" }
"ui.menu.selected" = { fg = "text", bg = "surface1", modifiers = ["bold"] }
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
"diagnostic.info" = { underline = { color = "sky", style = "curl" } }
"diagnostic.hint" = { underline = { color = "teal", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
error = "red"
warning = "yellow"
info = "sky"
hint = "teal"
rainbow = ["red", "peach", "yellow", "green", "sapphire", "lavender"]
[palette]
rosewater = "#f2d5cf"
flamingo = "#eebebe"
pink = "#f4b8e4"
mauve = "#ca9ee6"
red = "#e78284"
maroon = "#ea999c"
peach = "#ef9f76"
yellow = "#e5c890"
green = "#a6d189"
teal = "#81c8be"
sky = "#99d1db"
sapphire = "#85c1dc"
blue = "#8caaee"
lavender = "#babbf1"
text = "#c6d0f5"
subtext1 = "#b5bfe2"
subtext0 = "#a5adce"
overlay2 = "#949cbb"
overlay1 = "#838ba7"
overlay0 = "#737994"
surface2 = "#626880"
surface1 = "#51576d"
surface0 = "#414559"
base = "#303446"
mantle = "#292c3c"
crust = "#232634"
cursorline = "#3b3f52"
secondary_cursor = "#b8a5a6"
secondary_cursor_select = "#9192be"
secondary_cursor_normal = "#b8a5a6"
secondary_cursor_insert = "#83a275"
# Syntax highlighting
# -------------------
"attribute" = "yellow"
"type" = "yellow"
"type.enum.variant" = "teal"
"constructor" = "sapphire"
"constant" = "peach"
"constant.character" = "teal"
"constant.character.escape" = "pink"
"string" = "green"
"string.regexp" = "pink"
"string.special" = "blue"
"string.special.symbol" = "red"
"comment" = { fg = "overlay2" }
"variable" = "text"
"variable.parameter" = { fg = "maroon" }
"variable.builtin" = "red"
"variable.other.member" = "blue"
"label" = "sapphire" # used for lifetimes
"punctuation" = "overlay2"
"punctuation.special" = "sky"
"keyword" = "mauve"
"keyword.control.conditional" = { fg = "mauve" }
"operator" = "sky"
"function" = "blue"
"function.macro" = "rosewater"
"tag" = "blue"
"namespace" = { fg = "yellow" }
"special" = "blue" # fuzzy highlight
"markup.heading.1" = "red"
"markup.heading.2" = "peach"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "sapphire"
"markup.heading.6" = "lavender"
"markup.list" = "teal"
"markup.list.unchecked" = "overlay2"
"markup.list.checked" = "green"
"markup.bold" = { fg = "red", modifiers = ["bold"] }
"markup.italic" = { fg = "red", modifiers = ["italic"] }
"markup.link.url" = { fg = "blue", modifiers = ["underlined"] }
"markup.link.text" = "lavender"
"markup.link.label" = "sapphire"
"markup.raw" = "green"
"markup.quote" = "pink"
"diff.plus" = "green"
"diff.minus" = "red"
"diff.delta" = "blue"
# User Interface
# --------------
"ui.background" = { fg = "text", bg = "base" }
"ui.linenr" = { fg = "surface1" }
"ui.linenr.selected" = { fg = "lavender" }
"ui.statusline" = { fg = "subtext1", bg = "mantle" }
"ui.statusline.inactive" = { fg = "surface2", bg = "mantle" }
"ui.statusline.normal" = { fg = "base", bg = "rosewater", modifiers = ["bold"] }
"ui.statusline.insert" = { fg = "base", bg = "green", modifiers = ["bold"] }
"ui.statusline.select" = { fg = "base", bg = "lavender", modifiers = ["bold"] }
"ui.popup" = { fg = "text", bg = "surface0" }
"ui.window" = { fg = "crust" }
"ui.help" = { fg = "overlay2", bg = "surface0" }
"ui.bufferline" = { fg = "subtext0", bg = "mantle" }
"ui.bufferline.active" = { fg = "mauve", bg = "base", underline = { color = "mauve", style = "line" } }
"ui.bufferline.background" = { bg = "crust" }
"ui.text" = "text"
"ui.text.focus" = { fg = "text", bg = "surface0", modifiers = ["bold"] }
"ui.text.inactive" = { fg = "overlay1" }
"ui.text.directory" = { fg = "blue" }
"ui.virtual" = "overlay0"
"ui.virtual.ruler" = { bg = "surface0" }
"ui.virtual.indent-guide" = "surface0"
"ui.virtual.inlay-hint" = { fg = "surface1", bg = "mantle" }
"ui.virtual.jump-label" = { fg = "rosewater", modifiers = ["bold"] }
"ui.selection" = { bg = "surface1" }
"ui.cursor" = { fg = "base", bg = "secondary_cursor" }
"ui.cursor.primary" = { fg = "base", bg = "rosewater" }
"ui.cursor.match" = { fg = "peach", modifiers = ["bold"] }
"ui.cursor.primary.normal" = { fg = "base", bg = "rosewater" }
"ui.cursor.primary.insert" = { fg = "base", bg = "green" }
"ui.cursor.primary.select" = { fg = "base", bg = "lavender" }
"ui.cursor.normal" = { fg = "base", bg = "secondary_cursor_normal" }
"ui.cursor.insert" = { fg = "base", bg = "secondary_cursor_insert" }
"ui.cursor.select" = { fg = "base", bg = "secondary_cursor_select" }
"ui.cursorline.primary" = { bg = "cursorline" }
"ui.highlight" = { bg = "surface1", modifiers = ["bold"] }
"ui.menu" = { fg = "overlay2", bg = "surface0" }
"ui.menu.selected" = { fg = "text", bg = "surface1", modifiers = ["bold"] }
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
"diagnostic.info" = { underline = { color = "sky", style = "curl" } }
"diagnostic.hint" = { underline = { color = "teal", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
error = "red"
warning = "yellow"
info = "sky"
hint = "teal"
rainbow = ["red", "peach", "yellow", "green", "sapphire", "lavender"]
[palette]
rosewater = "#dc8a78"
flamingo = "#dd7878"
pink = "#ea76cb"
mauve = "#8839ef"
red = "#d20f39"
maroon = "#e64553"
peach = "#fe640b"
yellow = "#df8e1d"
green = "#40a02b"
teal = "#179299"
sky = "#04a5e5"
sapphire = "#209fb5"
blue = "#1e66f5"
lavender = "#7287fd"
text = "#4c4f69"
subtext1 = "#5c5f77"
subtext0 = "#6c6f85"
overlay2 = "#7c7f93"
overlay1 = "#8c8fa1"
overlay0 = "#9ca0b0"
surface2 = "#acb0be"
surface1 = "#bcc0cc"
surface0 = "#ccd0da"
base = "#eff1f5"
mantle = "#e6e9ef"
crust = "#dce0e8"
cursorline = "#e8ecf1"
secondary_cursor = "#e1a99d"
secondary_cursor_select = "#97a7fb"
secondary_cursor_normal = "#e1a99d"
secondary_cursor_insert = "#74b867"
# Syntax highlighting
# -------------------
"attribute" = "yellow"
"type" = "yellow"
"type.enum.variant" = "teal"
"constructor" = "sapphire"
"constant" = "peach"
"constant.character" = "teal"
"constant.character.escape" = "pink"
"string" = "green"
"string.regexp" = "pink"
"string.special" = "blue"
"string.special.symbol" = "red"
"comment" = { fg = "overlay2" }
"variable" = "text"
"variable.parameter" = { fg = "maroon" }
"variable.builtin" = "red"
"variable.other.member" = "blue"
"label" = "sapphire" # used for lifetimes
"punctuation" = "overlay2"
"punctuation.special" = "sky"
"keyword" = "mauve"
"keyword.control.conditional" = { fg = "mauve" }
"operator" = "sky"
"function" = "blue"
"function.macro" = "rosewater"
"tag" = "blue"
"namespace" = { fg = "yellow" }
"special" = "blue" # fuzzy highlight
"markup.heading.1" = "red"
"markup.heading.2" = "peach"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "sapphire"
"markup.heading.6" = "lavender"
"markup.list" = "teal"
"markup.list.unchecked" = "overlay2"
"markup.list.checked" = "green"
"markup.bold" = { fg = "red", modifiers = ["bold"] }
"markup.italic" = { fg = "red", modifiers = ["italic"] }
"markup.link.url" = { fg = "blue", modifiers = ["underlined"] }
"markup.link.text" = "lavender"
"markup.link.label" = "sapphire"
"markup.raw" = "green"
"markup.quote" = "pink"
"diff.plus" = "green"
"diff.minus" = "red"
"diff.delta" = "blue"
# User Interface
# --------------
"ui.background" = { fg = "text", bg = "base" }
"ui.linenr" = { fg = "surface1" }
"ui.linenr.selected" = { fg = "lavender" }
"ui.statusline" = { fg = "subtext1", bg = "mantle" }
"ui.statusline.inactive" = { fg = "surface2", bg = "mantle" }
"ui.statusline.normal" = { fg = "base", bg = "rosewater", modifiers = ["bold"] }
"ui.statusline.insert" = { fg = "base", bg = "green", modifiers = ["bold"] }
"ui.statusline.select" = { fg = "base", bg = "lavender", modifiers = ["bold"] }
"ui.popup" = { fg = "text", bg = "surface0" }
"ui.window" = { fg = "crust" }
"ui.help" = { fg = "overlay2", bg = "surface0" }
"ui.bufferline" = { fg = "subtext0", bg = "mantle" }
"ui.bufferline.active" = { fg = "mauve", bg = "base", underline = { color = "mauve", style = "line" } }
"ui.bufferline.background" = { bg = "crust" }
"ui.text" = "text"
"ui.text.focus" = { fg = "text", bg = "surface0", modifiers = ["bold"] }
"ui.text.inactive" = { fg = "overlay1" }
"ui.text.directory" = { fg = "blue" }
"ui.virtual" = "overlay0"
"ui.virtual.ruler" = { bg = "surface0" }
"ui.virtual.indent-guide" = "surface0"
"ui.virtual.inlay-hint" = { fg = "surface1", bg = "mantle" }
"ui.virtual.jump-label" = { fg = "rosewater", modifiers = ["bold"] }
"ui.selection" = { bg = "surface1" }
"ui.cursor" = { fg = "base", bg = "secondary_cursor" }
"ui.cursor.primary" = { fg = "base", bg = "rosewater" }
"ui.cursor.match" = { fg = "peach", modifiers = ["bold"] }
"ui.cursor.primary.normal" = { fg = "base", bg = "rosewater" }
"ui.cursor.primary.insert" = { fg = "base", bg = "green" }
"ui.cursor.primary.select" = { fg = "base", bg = "lavender" }
"ui.cursor.normal" = { fg = "base", bg = "secondary_cursor_normal" }
"ui.cursor.insert" = { fg = "base", bg = "secondary_cursor_insert" }
"ui.cursor.select" = { fg = "base", bg = "secondary_cursor_select" }
"ui.cursorline.primary" = { bg = "cursorline" }
"ui.highlight" = { bg = "surface1", modifiers = ["bold"] }
"ui.menu" = { fg = "overlay2", bg = "surface0" }
"ui.menu.selected" = { fg = "text", bg = "surface1", modifiers = ["bold"] }
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
"diagnostic.info" = { underline = { color = "sky", style = "curl" } }
"diagnostic.hint" = { underline = { color = "teal", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
error = "red"
warning = "yellow"
info = "sky"
hint = "teal"
rainbow = ["red", "peach", "yellow", "green", "sapphire", "lavender"]
[palette]
rosewater = "#f4dbd6"
flamingo = "#f0c6c6"
pink = "#f5bde6"
mauve = "#c6a0f6"
red = "#ed8796"
maroon = "#ee99a0"
peach = "#f5a97f"
yellow = "#eed49f"
green = "#a6da95"
teal = "#8bd5ca"
sky = "#91d7e3"
sapphire = "#7dc4e4"
blue = "#8aadf4"
lavender = "#b7bdf8"
text = "#cad3f5"
subtext1 = "#b8c0e0"
subtext0 = "#a5adcb"
overlay2 = "#939ab7"
overlay1 = "#8087a2"
overlay0 = "#6e738d"
surface2 = "#5b6078"
surface1 = "#494d64"
surface0 = "#363a4f"
base = "#24273a"
mantle = "#1e2030"
crust = "#181926"
cursorline = "#303347"
secondary_cursor = "#b6a6a7"
secondary_cursor_select = "#8b91bf"
secondary_cursor_normal = "#b6a6a7"
secondary_cursor_insert = "#80a57a"
# Syntax highlighting
# -------------------
"attribute" = "yellow"
"type" = "yellow"
"type.enum.variant" = "teal"
"constructor" = "sapphire"
"constant" = "peach"
"constant.character" = "teal"
"constant.character.escape" = "pink"
"string" = "green"
"string.regexp" = "pink"
"string.special" = "blue"
"string.special.symbol" = "red"
"comment" = { fg = "overlay2" }
"variable" = "text"
"variable.parameter" = { fg = "maroon" }
"variable.builtin" = "red"
"variable.other.member" = "blue"
"label" = "sapphire" # used for lifetimes
"punctuation" = "overlay2"
"punctuation.special" = "sky"
"keyword" = "mauve"
"keyword.control.conditional" = { fg = "mauve" }
"operator" = "sky"
"function" = "blue"
"function.macro" = "rosewater"
"tag" = "blue"
"namespace" = { fg = "yellow" }
"special" = "blue" # fuzzy highlight
"markup.heading.1" = "red"
"markup.heading.2" = "peach"
"markup.heading.3" = "yellow"
"markup.heading.4" = "green"
"markup.heading.5" = "sapphire"
"markup.heading.6" = "lavender"
"markup.list" = "teal"
"markup.list.unchecked" = "overlay2"
"markup.list.checked" = "green"
"markup.bold" = { fg = "red", modifiers = ["bold"] }
"markup.italic" = { fg = "red", modifiers = ["italic"] }
"markup.link.url" = { fg = "blue", modifiers = ["underlined"] }
"markup.link.text" = "lavender"
"markup.link.label" = "sapphire"
"markup.raw" = "green"
"markup.quote" = "pink"
"diff.plus" = "green"
"diff.minus" = "red"
"diff.delta" = "blue"
# User Interface
# --------------
"ui.background" = { fg = "text", bg = "base" }
"ui.linenr" = { fg = "surface1" }
"ui.linenr.selected" = { fg = "lavender" }
"ui.statusline" = { fg = "subtext1", bg = "mantle" }
"ui.statusline.inactive" = { fg = "surface2", bg = "mantle" }
"ui.statusline.normal" = { fg = "base", bg = "rosewater", modifiers = ["bold"] }
"ui.statusline.insert" = { fg = "base", bg = "green", modifiers = ["bold"] }
"ui.statusline.select" = { fg = "base", bg = "lavender", modifiers = ["bold"] }
"ui.popup" = { fg = "text", bg = "surface0" }
"ui.window" = { fg = "crust" }
"ui.help" = { fg = "overlay2", bg = "surface0" }
"ui.bufferline" = { fg = "subtext0", bg = "mantle" }
"ui.bufferline.active" = { fg = "mauve", bg = "base", underline = { color = "mauve", style = "line" } }
"ui.bufferline.background" = { bg = "crust" }
"ui.text" = "text"
"ui.text.focus" = { fg = "text", bg = "surface0", modifiers = ["bold"] }
"ui.text.inactive" = { fg = "overlay1" }
"ui.text.directory" = { fg = "blue" }
"ui.virtual" = "overlay0"
"ui.virtual.ruler" = { bg = "surface0" }
"ui.virtual.indent-guide" = "surface0"
"ui.virtual.inlay-hint" = { fg = "surface1", bg = "mantle" }
"ui.virtual.jump-label" = { fg = "rosewater", modifiers = ["bold"] }
"ui.selection" = { bg = "surface1" }
"ui.cursor" = { fg = "base", bg = "secondary_cursor" }
"ui.cursor.primary" = { fg = "base", bg = "rosewater" }
"ui.cursor.match" = { fg = "peach", modifiers = ["bold"] }
"ui.cursor.primary.normal" = { fg = "base", bg = "rosewater" }
"ui.cursor.primary.insert" = { fg = "base", bg = "green" }
"ui.cursor.primary.select" = { fg = "base", bg = "lavender" }
"ui.cursor.normal" = { fg = "base", bg = "secondary_cursor_normal" }
"ui.cursor.insert" = { fg = "base", bg = "secondary_cursor_insert" }
"ui.cursor.select" = { fg = "base", bg = "secondary_cursor_select" }
"ui.cursorline.primary" = { bg = "cursorline" }
"ui.highlight" = { bg = "surface1", modifiers = ["bold"] }
"ui.menu" = { fg = "overlay2", bg = "surface0" }
"ui.menu.selected" = { fg = "text", bg = "surface1", modifiers = ["bold"] }
"diagnostic.error" = { underline = { color = "red", style = "curl" } }
"diagnostic.warning" = { underline = { color = "yellow", style = "curl" } }
"diagnostic.info" = { underline = { color = "sky", style = "curl" } }
"diagnostic.hint" = { underline = { color = "teal", style = "curl" } }
"diagnostic.unnecessary" = { modifiers = ["dim"] }
error = "red"
warning = "yellow"
info = "sky"
hint = "teal"
rainbow = ["red", "peach", "yellow", "green", "sapphire", "lavender"]
[palette]
rosewater = "#f5e0dc"
flamingo = "#f2cdcd"
pink = "#f5c2e7"
mauve = "#cba6f7"
red = "#f38ba8"
maroon = "#eba0ac"
peach = "#fab387"
yellow = "#f9e2af"
green = "#a6e3a1"
teal = "#94e2d5"
sky = "#89dceb"
sapphire = "#74c7ec"
blue = "#89b4fa"
lavender = "#b4befe"
text = "#cdd6f4"
subtext1 = "#bac2de"
subtext0 = "#a6adc8"
overlay2 = "#9399b2"
overlay1 = "#7f849c"
overlay0 = "#6c7086"
surface2 = "#585b70"
surface1 = "#45475a"
surface0 = "#313244"
base = "#1e1e2e"
mantle = "#181825"
crust = "#11111b"
cursorline = "#2a2b3c"
secondary_cursor = "#b5a6a8"
secondary_cursor_select = "#878ec0"
secondary_cursor_normal = "#b5a6a8"
secondary_cursor_insert = "#7ea87f"
helix_config_bak @ 3ec4fc50
Subproject commit 3ec4fc503986099e115d98abe865aaabac76d49c
# !/usr/bin/env bash
set -euo pipefail
CLAUDE_CONFIG_DIR=${CLAUDE_CONFIG_DIR:-"${HOME}/.claude"}
BOOTSTRAP_MARKER=${BOOTSTRAP_MARKER:-"${CLAUDE_CONFIG_DIR}/.bootstrap-plugins-done"}
CLAUDE_FORCE_PLUGIN_BOOTSTRAP=${CLAUDE_FORCE_PLUGIN_BOOTSTRAP:-0}
CLAUDE_SKIP_SETTINGS_INIT=${CLAUDE_SKIP_SETTINGS_INIT:-0}
CLAUDE_ENABLE_THIRD_PARTY=${CLAUDE_ENABLE_THIRD_PARTY:-0}
DEFAULT_PLUGIN_LIST="superpowers pr-review-toolkit claude-code-setup ralph-loop typescript-lsp rust-analyzer-lsp"
CLAUDE_PLUGIN_LIST=${CLAUDE_PLUGIN_LIST:-"$DEFAULT_PLUGIN_LIST"}
require_claude() {
if ! command -v claude >/dev/null 2>&1; then
echo "[error] 未找到 claude 命令,请先安装 Claude Code。" >&2
exit 1
fi
}
check_auth() {
if [ -n "${ANTHROPIC_API_KEY:-}" ] || [ -n "${CLAUDE_CODE_OAUTH_TOKEN:-}" ] || [ -f "${CLAUDE_CONFIG_DIR}/.credentials.json" ]; then
return
fi
cat <<'EOF'
[warn] 未检测到认证信息。
[warn] 可稍后配置以下任一方式后重跑脚本:
export ANTHROPIC_API_KEY=...
export CLAUDE_CODE_OAUTH_TOKEN=...
EOF
}
prepare_config_dir() {
mkdir -p "$CLAUDE_CONFIG_DIR"
chmod 700 "$CLAUDE_CONFIG_DIR"
}
already_bootstrapped() {
[ "$CLAUDE_FORCE_PLUGIN_BOOTSTRAP" != "1" ] && [ -f "$BOOTSTRAP_MARKER" ]
}
install_plugin() {
local plugin=$1
echo "[plugin] 安装 $plugin..."
if printf '/plugin install %s@claude-plugins-official\n/reload-plugins\n/exit\n' "$plugin" | claude >/tmp/claude-plugin-${plugin}.log 2>&1; then
echo "[plugin] $plugin 安装完成"
return 0
fi
echo "[plugin] $plugin 安装失败,详见 /tmp/claude-plugin-${plugin}.log" >&2
return 1
}
init_settings() {
local settings_file="${CLAUDE_CONFIG_DIR}/settings.json"
if [ "$CLAUDE_SKIP_SETTINGS_INIT" = "1" ] || [ -f "$settings_file" ]; then
return
fi
cat >"$settings_file" <<'EOF'
{
"modelType": "anthropic",
"alwaysThinkingEnabled": false,
"skipDangerousModePermissionPrompt": true,
"permissions": {
"allow": [
"git status",
"git diff",
"git log",
"ls",
"pwd"
],
"deny": []
}
}
EOF
}
install_default_plugins() {
local failed=0
local plugin
echo "[info] 默认插件列表: $CLAUDE_PLUGIN_LIST"
for plugin in $CLAUDE_PLUGIN_LIST; do
if ! install_plugin "$plugin"; then
failed=1
fi
done
if [ "$CLAUDE_ENABLE_THIRD_PARTY" = "1" ]; then
echo "[info] 已启用第三方扩展位,但当前未配置第三方插件。"
fi
return "$failed"
}
write_marker() {
date -u +"%Y-%m-%dT%H:%M:%SZ" >"$BOOTSTRAP_MARKER"
}
main() {
require_claude
prepare_config_dir
check_auth
if already_bootstrapped; then
echo "[info] 检测到已完成 bootstrap,跳过。"
return
fi
install_default_plugins
init_settings
write_marker
echo "[done] Claude Code 插件 bootstrap 完成。"
}
main "$@"
#!/usr/bin/env bash
set -euo pipefail
export DEBIAN_FRONTEND=${DEBIAN_FRONTEND:-noninteractive}
SCRIPT_DIR=$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd)
BOOTSTRAP_SCRIPT=${CLAUDE_BOOTSTRAP_SCRIPT:-"$SCRIPT_DIR/bootstrap-claude-plugins.sh"}
CLAUDE_SKIP_BOOTSTRAP=${CLAUDE_SKIP_BOOTSTRAP:-0}
require_root() {
if [ "${EUID:-$(id -u)}" -ne 0 ]; then
echo "[error] 请使用 root 运行此脚本。" >&2
exit 1
fi
}
install_base_packages() {
echo "[1/5] 安装基础依赖..."
apt-get update
apt-get install -y --no-install-recommends \
bash \
ca-certificates \
curl \
git \
jq \
less \
procps \
ripgrep \
fd-find \
python3 \
python3-venv \
python3-pip \
nodejs \
npm
}
install_claude_code() {
echo "[2/5] 配置 Claude Code 官方 apt 源..."
install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://downloads.claude.ai/keys/claude-code.asc \
-o /etc/apt/keyrings/claude-code.asc
chmod a+r /etc/apt/keyrings/claude-code.asc
cat >/etc/apt/sources.list.d/claude-code.list <<'EOF'
deb [signed-by=/etc/apt/keyrings/claude-code.asc] https://downloads.claude.ai/claude-code/apt/stable stable main
EOF
echo "[3/5] 安装 Claude Code..."
apt-get update
apt-get install -y claude-code
}
verify_install() {
echo "[4/5] 校验 Claude Code 安装..."
claude --version
}
run_bootstrap() {
if [ "$CLAUDE_SKIP_BOOTSTRAP" = "1" ]; then
echo "[5/5] 跳过插件 bootstrap。"
return
fi
if [ ! -x "$BOOTSTRAP_SCRIPT" ]; then
echo "[error] 未找到可执行 bootstrap 脚本: $BOOTSTRAP_SCRIPT" >&2
exit 1
fi
echo "[5/5] 执行默认插件 bootstrap..."
"$BOOTSTRAP_SCRIPT"
}
print_next_steps() {
cat <<'EOF'
安装完成。
认证方式二选一:
export ANTHROPIC_API_KEY=your_api_key
export CLAUDE_CODE_OAUTH_TOKEN=your_oauth_token
默认插件:
superpowers
pr-review-toolkit
claude-code-setup
ralph-loop
typescript-lsp
rust-analyzer-lsp
如需仅安装 Claude Code 而跳过插件初始化:
CLAUDE_SKIP_BOOTSTRAP=1 ./install-claude-code-debian13.sh
EOF
}
require_root
install_base_packages
install_claude_code
verify_install
run_bootstrap
print_next_steps
#!/bin.bash
cd ~
curl -sSLk https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py310_23.11.0-2-Linux-x86_64.sh -o Miniconda3-py310_23.11.0-2-Linux-x86_64.sh && \
bash ./Miniconda3-py310_23.11.0-2-Linux-x86_64.sh -b -p /usr/local/miniconda3
curl -sSLk https://unofficial-builds.nodejs.org/download/release/v22.22.2/node-v22.22.2-linux-x64-glibc-217.tar.gz -o node-v22.22.2-linux-x64-glibc-217.tar.gz && \
tar -xzf node-v22.22.2-linux-x64-glibc-217.tar.gz -C /usr/local/ && \
ln -sf /usr/local/node-v22.22.2-linux-x64-glibc-217/bin/node /usr/local/bin/node && \
ln -sf /usr/local/node-v22.22.2-linux-x64-glibc-217/bin/npm /usr/local/bin/npm && \
rm -rf /node-v22.22.2-linux-x64-glibc-217.tar.gz
# 安装 Bun
curl -fsSL https://bun.sh/install | bash
# 重新加载 shell 配置
source ~/.zshrc # 或 exec /usr/bin/zsh
# 验证安装
# ~/.local/bin/bun --version
npm i -g opencode-ai --registry https://mirrors.cloud.tencent.com/npm/
# cp -r ./container/helix-config /root/.config/helix