Compare commits

..

36 Commits

Author SHA1 Message Date
43d42a685f rename .chezmoitemplates/sh_common.tmpl -> .chezmoitemplates/common.sh.tmpl 2025-05-02 11:21:47 +08:00
8bb3783246 bashrc: 從作業系統範本截取 2025-05-02 11:14:19 +08:00
5e616bcd4f chezmoi 調整架構,將共通部份移出 2025-05-02 10:47:03 +08:00
42f0328079 加入 .bashrc 並調整chezmoi架構把共通內容搬出來 2025-05-02 10:11:11 +08:00
ee6816e276 增加預設編輯器,並調整chezmoi架構 2025-05-02 09:30:44 +08:00
79c2ae90c6 nvim editor color 2025-05-02 07:13:09 +08:00
7e5a875405 feat nvim: add editor color 2025-05-01 19:44:43 +08:00
b72c1af17b feat nvim: add lazygit 2025-05-01 19:12:50 +08:00
6456ddb4f9 refactor nvim: neo-tree調整結構成lazy的格式 2025-05-01 18:40:06 +08:00
ccdbc64be5 nvim: telescope 增加設定,並顯示隱藏檔 2025-05-01 18:34:05 +08:00
b3ef08caf3 fix nvim: neo-tree 暫時關閉圖片預覽(目前功能是壞的) 2025-05-01 18:24:35 +08:00
3519892943 fix nvim: 圖片顯示在GUI不支援,要動態關閉 2025-05-01 18:06:54 +08:00
3863c62bdc nvim feat: 新增在Markdown含圖片的圖片預覽功能 2025-05-01 17:36:29 +08:00
33d18b82f2 nvim gitsigns: 處理無狀態時的佔位符號 2025-05-01 15:46:58 +08:00
5bdee7a33e nvim: C-p C-n 快速鍵 2025-05-01 15:28:40 +08:00
795598954a nvim: lualine add file permission 2025-05-01 15:27:50 +08:00
a09c0a1096 nvim: add undotree 2025-05-01 13:52:12 +08:00
216df53a1e nvim: undolist 2025-05-01 11:40:50 +08:00
7ad0d308e5 nvim set: terminal shortcut 2025-05-01 11:18:47 +08:00
d19ffabaec nvim: listchars 2025-05-01 11:10:21 +08:00
1507861a34 nvim gitsigns: 調整習慣的設定 2025-05-01 11:00:51 +08:00
2a76c55268 nvim: gitsigns 2025-05-01 10:55:58 +08:00
411722360d nvim: enable suda_smart_edit 2025-05-01 10:36:56 +08:00
85138cdaa1 nvim add: comment註解開關功能 2025-05-01 10:22:44 +08:00
a8e4862e0b nvim: add auto ime change 2025-05-01 08:46:14 +08:00
883103e2e6 nvim: add project.nvim & telescope 2025-05-01 08:19:08 +08:00
09eff51488 nvim: add project.nvim 2025-05-01 07:33:52 +08:00
818053f6f6 nvim: 在 Insert 模式下,Ctrl + Shift + 方向鍵移動並選取單詞 2025-04-30 22:05:20 +08:00
55a4f6ee14 nvim: scrollview 2025-04-30 20:30:46 +08:00
2850e08c76 feat nvim: 單詞移動快速鍵 2025-04-30 16:56:41 +08:00
b45a8766b8 refactor nvim: keymap 2025-04-30 16:48:48 +08:00
fb102108aa nvim: 更換跳窗快速鍵變成 C-A-hjkl 2025-04-30 16:46:26 +08:00
5c9b9fcb42 feat nvim: add scrollview 2025-04-30 16:38:51 +08:00
d93ab2d409 feat nvim: add sudo 2025-04-30 12:41:27 +08:00
b8c2e2d874 feat nvim: add indent-blankline 2025-04-30 12:31:01 +08:00
89a00d03e8 fix nvim: lua/config/lazy.lua 2025-04-30 12:20:26 +08:00
29 changed files with 1301 additions and 573 deletions

View File

@ -2,9 +2,6 @@
{{- $email := promptStringOnce . "email" "輸入您的Email地址" -}} {{- $email := promptStringOnce . "email" "輸入您的Email地址" -}}
sourceDir = "~/.local/share/chezmoi" sourceDir = "~/.local/share/chezmoi"
[edit]
command = "vim"
[data] [data]
name = {{ $name | quote }} name = {{ $name | quote }}
email = {{ $email | quote }} email = {{ $email | quote }}

View File

@ -0,0 +1,81 @@
{{/* 以下是套用到 ~/.zshrc ~/.bashrc 用的共通內容 */ -}}
{{/* ---- 設定與修復PATH路徑對應 ------------------------------------------- */ -}}
# Created by `pipx` on 2023-01-30 19:57:14
export PATH="$PATH:$HOME/.local/bin"
# GoLang Path
export PATH="$PATH:$HOME/go/bin"
# Fix Python3 to python Path on macOS
if [ "$(uname -s)" = 'Darwin' ]; then
export PATH=/usr/local/opt/python/libexec/bin:$PATH
fi
# Install ruby¬
# Based on "`brew --prefix ruby`/bin"¬
export PATH="/usr/local/opt/ruby/bin:$PATH
# Based on "`gem environment gemdir`/bin"¬
export PATH="/usr/local/lib/ruby/gems/3.3.0/bin:$PATH
export PATH="$HOME/.local/share/gem/ruby/3.3.0/bin:$PATH"
{{/* ---- 設定環境變數 ---------------------------------------------------- */ -}}
{{- /* 設定預設編輯器 */ -}}
{{ if eq .chezmoi.os "linux" }}
# linux config
[ -n "$DISPLAY" ] && export EDITOR=kate|| export EDITOR=nvim
{{ else }}
export EDITOR=nvim
# non-linux config
{{ end }}
export VISUAL=nvim
{{/* ---- 設定ailas ------------------------------------------------------ */ -}}
# alias
alias gitu='git add . && git commit && git push'
{{/* ---- 擴充功能 ------------------------------------------------------- */ -}}
# 圖片顯示
# 既然即使加入判斷後還是「進入函數定義段落且噴錯」那就代表zsh 在解析 .zshrc 時,在到達 if 邏輯前,就已經知道 imgcat 是 alias並因此直接報錯這是因為
# ⚠️ 在 zsh 中,如果你寫 function_name() 這種形式,然後這個名稱之前被定義為 alias會在 parse 階段直接錯誤,不會等到 if 判斷。
# 解決方式:延遲定義(用 eval 避開 parser
# 你需要避免 zsh 在 parse 階段就看到 imgcat() 的寫法。可以這樣寫,透過 eval 延遲定義函數內容:
if ! alias imgcat &>/dev/null && ! functions imgcat &>/dev/null && command -v magick &>/dev/null; then
eval '
imgcat() {
if [[ -z "$1" ]]; then
echo "❌ 請指定圖片檔案例如imgcat ~/Pictures/foo.png"
return 1
fi
magick "$1" -geometry 800x480 sixel:-
}'
fi
#
# # ex - archive extractor
# # usage: ex <file>
ex ()
{
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xjf $1 ;;
*.tar.gz) tar xzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xf $1 ;;
*.tbz2) tar xjf $1 ;;
*.tgz) tar xzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1;;
*.7z) 7z x $1 ;;
*) echo "'$1' cannot be extracted via ex()" ;;
esac
else
echo "'$1' is not a valid file"
fi
}

View File

@ -8,6 +8,10 @@ end_of_line = lf
insert_final_newline = true insert_final_newline = true
trim_trailing_whitespace = true trim_trailing_whitespace = true
[.chezmoitemplates/*]
insert_final_newline = false
trim_trailing_whitespace = true
[*.md] [*.md]
indent_size = 4 indent_size = 4
indent_style = space indent_style = space

View File

@ -195,6 +195,7 @@ chezmoi apply ~/.zshrc
將單一檔案轉換成tmpl範本 將單一檔案轉換成tmpl範本
``` ```
chezmoi add --template ~/.bashrc
chezmoi chattr +template ~/.config/iterm2/com.googlecode.iterm2.plist chezmoi chattr +template ~/.config/iterm2/com.googlecode.iterm2.plist
``` ```

11
dot_bashrc.tmpl Normal file
View File

@ -0,0 +1,11 @@
{{ if and (eq .chezmoi.os "darwin") (stat (print "/etc/bashrc")) }}
# ----取自 /etc/bashrc 預設內容 ----------------------------------------------
{{ include "/etc/bashrc" | trim }}
{{ else if (stat (print "/etc/skel/.bashrc")) }}
# ----取自 /etc/skel/.bashrc 預設內容 ----------------------------------------
{{ include "/etc/skel/.bashrc" | trim }}
{{ end }}
# ----以下是我的自訂內容 ------------------------------------------------------
{{ template "common.sh.tmpl" . }}

View File

@ -15,6 +15,7 @@ Yuan Neovim 備忘
* move cursor: <window>(方向鍵) * move cursor: <window>(方向鍵)
### 擴充自行設定的快速鍵 ### 擴充自行設定的快速鍵
* `<F6>` 可以回朔到開啟檔案以來的任何歷史,還會標出修改的地方
* `<F8>`: NeoTree: 查看已經開啟的檔案 * `<F8>`: NeoTree: 查看已經開啟的檔案
* `<F9>`: NeoTree * `<F9>`: NeoTree
* `<F10>`: git status * `<F10>`: git status
@ -22,7 +23,6 @@ Yuan Neovim 備忘
* `<leader>fB`: 已開啟的檔案 * `<leader>fB`: 已開啟的檔案
#### 預計設定 #### 預計設定
* <F6> 可以回朔到開啟檔案以來的任何歷史,還會標出修改的地方
* <F7> 看看你設定了哪些變數、函數,也可以快速跳轉 * <F7> 看看你設定了哪些變數、函數,也可以快速跳轉
### 編輯習慣(已經覆寫) ### 編輯習慣(已經覆寫)

View File

@ -1,34 +1,46 @@
-- 這個檔案是依據自己之前在vscode的編輯習慣用來設定editor的鍵盤快捷鍵 -- 這個檔案是依據自己之前在vscode的編輯習慣用來設定editor的鍵盤快捷鍵
local map = vim.keymap.set
local neomap = vim.api.nvim_set_keymap
-- 處理剪貼簿習慣對應在Insert模式可使用慣用的快速鍵 -- 處理剪貼簿習慣對應在Insert模式可使用慣用的快速鍵
vim.opt.keymodel = "startsel" -- 啟用 Shift + 方向鍵選取功能 vim.opt.keymodel = "startsel" -- 啟用 Shift + 方向鍵選取功能
vim.api.nvim_set_keymap('i', '<C-v>', '<Esc>"+pa', { noremap = true, silent = true }) -- Insert Mode 下的 Ctrl+V 貼上 neomap('i', '<C-v>', '<Esc>"+pa', { noremap = true, silent = true }) -- Insert Mode 下的 Ctrl+V 貼上
vim.api.nvim_set_keymap('v', '<C-c>', '"+y', { noremap = true, silent = true }) -- Visual Mode 下的 Ctrl+C 複製 neomap('v', '<C-c>', '"+y', { noremap = true, silent = true }) -- Visual Mode 下的 Ctrl+C 複製
vim.api.nvim_set_keymap('v', '<C-x>', '"+d', { noremap = true, silent = true }) -- Visual Mode 下的 Ctrl+X 剪下 neomap('v', '<C-x>', '"+d', { noremap = true, silent = true }) -- Visual Mode 下的 Ctrl+X 剪下
vim.api.nvim_set_keymap('v', '<C-v>', '"+p', { noremap = true, silent = true }) -- Visual Mode 下的 Ctrl+V 貼上 neomap('v', '<C-v>', '"+p', { noremap = true, silent = true }) -- Visual Mode 下的 Ctrl+V 貼上
-- 單字的左右移動
neomap('n', '<C-Right>', 'w', { noremap = true, silent = true })
neomap('n', '<C-Left>', 'b', { noremap = true, silent = true })
neomap('n', '<C-S-Right>', 'W', { noremap = true, silent = true })
neomap('n', '<C-S-Left>', 'B', { noremap = true, silent = true })
-- 在 Insert 模式下Ctrl + Shift + 方向鍵移動並選取單詞
vim.api.nvim_set_keymap('i', '<C-S-Right>', '<Esc>v<C-o>w<C-o>i', { noremap = true, silent = true })
vim.api.nvim_set_keymap('i', '<C-S-Left>', '<Esc>v<C-o>b<C-o>i', { noremap = true, silent = true })
-- 整行移動的快速鍵 -- 整行移動的快速鍵
vim.api.nvim_set_keymap('n', '<A-j>', ':m .+1<CR>==', { noremap = true, silent = true }) neomap('n', '<A-j>', ':m .+1<CR>==', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<A-k>', ':m .-2<CR>==', { noremap = true, silent = true }) neomap('n', '<A-k>', ':m .-2<CR>==', { noremap = true, silent = true })
vim.api.nvim_set_keymap('i', '<A-j>', '<Esc>:m .+1<CR>==gi', { noremap = true, silent = true }) neomap('i', '<A-j>', '<Esc>:m .+1<CR>==gi', { noremap = true, silent = true })
vim.api.nvim_set_keymap('i', '<A-k>', '<Esc>:m .-2<CR>==gi', { noremap = true, silent = true }) neomap('i', '<A-k>', '<Esc>:m .-2<CR>==gi', { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', '<A-j>', ":m '>+1<CR>gv=gv", { noremap = true, silent = true }) neomap('v', '<A-j>', ":m '>+1<CR>gv=gv", { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', '<A-k>', ":m '<-2<CR>gv=gv", { noremap = true, silent = true }) neomap('v', '<A-k>', ":m '<-2<CR>gv=gv", { noremap = true, silent = true })
-- 使用 Alt+方向鍵 移動整行 -- 使用 Alt+方向鍵 移動整行
vim.api.nvim_set_keymap('n', '<A-Down>', ':m .+1<CR>==', { noremap = true, silent = true }) neomap('n', '<A-Down>', ':m .+1<CR>==', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<A-Up>', ':m .-2<CR>==', { noremap = true, silent = true }) neomap('n', '<A-Up>', ':m .-2<CR>==', { noremap = true, silent = true })
vim.api.nvim_set_keymap('i', '<A-Down>', '<Esc>:m .+1<CR>==gi', { noremap = true, silent = true }) neomap('i', '<A-Down>', '<Esc>:m .+1<CR>==gi', { noremap = true, silent = true })
vim.api.nvim_set_keymap('i', '<A-Up>', '<Esc>:m .-2<CR>==gi', { noremap = true, silent = true }) neomap('i', '<A-Up>', '<Esc>:m .-2<CR>==gi', { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', '<A-Down>', ":m '>+1<CR>gv=gv", { noremap = true, silent = true }) neomap('v', '<A-Down>', ":m '>+1<CR>gv=gv", { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', '<A-Up>', ":m '<-2<CR>gv=gv", { noremap = true, silent = true }) neomap('v', '<A-Up>', ":m '<-2<CR>gv=gv", { noremap = true, silent = true })
-- Ctrl+Alt+Shift+j/k 複製整行並向下/向上貼上 -- Ctrl+Alt+Shift+j/k 複製整行並向下/向上貼上
vim.api.nvim_set_keymap('n', '<C-A-S-j>', 'yyp', { noremap = true, silent = true }) neomap('n', '<C-A-S-j>', 'yyp', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<C-A-S-k>', 'yyP', { noremap = true, silent = true }) neomap('n', '<C-A-S-k>', 'yyP', { noremap = true, silent = true })
-- Ctrl+Alt+Shift+方向鍵 複製整行並向下/向上貼上 -- Ctrl+Alt+Shift+方向鍵 複製整行並向下/向上貼上
vim.api.nvim_set_keymap('n', '<C-A-S-Down>', 'yyp', { noremap = true, silent = true }) neomap('n', '<C-A-S-Down>', 'yyp', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<C-A-S-Up>', 'yyP', { noremap = true, silent = true }) neomap('n', '<C-A-S-Up>', 'yyP', { noremap = true, silent = true })
vim.api.nvim_set_keymap('i', '<C-A-S-Down>', '<Esc>yypgi', { noremap = true, silent = true }) neomap('i', '<C-A-S-Down>', '<Esc>yypgi', { noremap = true, silent = true })
vim.api.nvim_set_keymap('i', '<C-A-S-Up>', '<Esc>yyPgi', { noremap = true, silent = true }) neomap('i', '<C-A-S-Up>', '<Esc>yyPgi', { noremap = true, silent = true })
-- -- 處理不同終端的行為 -- -- 處理不同終端的行為
-- -- 在 Insert Mode 下的 Ctrl+Enter 在下一行插入新行並保持 Insert 模式 -- -- 在 Insert Mode 下的 Ctrl+Enter 在下一行插入新行並保持 Insert 模式
@ -36,16 +48,16 @@ vim.api.nvim_set_keymap('i', '<C-A-S-Up>', '<Esc>yyPgi', { noremap = true, silen
-- local term_program = vim.fn.getenv("TERM_PROGRAM") -- local term_program = vim.fn.getenv("TERM_PROGRAM")
-- if term_program == "iTerm.app" then -- if term_program == "iTerm.app" then
-- -- iTerm 的快捷鍵設置 -- -- iTerm 的快捷鍵設置
-- vim.api.nvim_set_keymap('i', '<C-CR>', '<Esc>o', { noremap = true, silent = true }) -- neomap('i', '<C-CR>', '<Esc>o', { noremap = true, silent = true })
-- vim.api.nvim_set_keymap('i', '<C-S-CR>', '<Esc>O', { noremap = true, silent = true }) -- neomap('i', '<C-S-CR>', '<Esc>O', { noremap = true, silent = true })
-- elseif term == "alacritty" then -- elseif term == "alacritty" then
-- -- Alacritty 的快捷鍵設置 -- -- Alacritty 的快捷鍵設置
-- vim.api.nvim_set_keymap('i', '<C-CR>', '<Esc>o', { noremap = true, silent = true }) -- neomap('i', '<C-CR>', '<Esc>o', { noremap = true, silent = true })
-- vim.api.nvim_set_keymap('i', '<C-S-CR>', '<Esc>O', { noremap = true, silent = true }) -- neomap('i', '<C-S-CR>', '<Esc>O', { noremap = true, silent = true })
-- elseif term == "xterm-256color" then -- elseif term == "xterm-256color" then
-- -- xterm-256color 的快捷鍵設置 -- -- xterm-256color 的快捷鍵設置
-- vim.api.nvim_set_keymap('i', '<A-CR>', '<Esc>o', { noremap = true, silent = true }) -- neomap('i', '<A-CR>', '<Esc>o', { noremap = true, silent = true })
-- vim.api.nvim_set_keymap('i', '<A-S-CR>', '<Esc>O', { noremap = true, silent = true }) -- neomap('i', '<A-S-CR>', '<Esc>O', { noremap = true, silent = true })
-- end -- end
-- 使用Ctrl(Alt)+Enter 在下一行插入新行並保持 Insert 模式 -- 使用Ctrl(Alt)+Enter 在下一行插入新行並保持 Insert 模式
@ -53,19 +65,19 @@ vim.api.nvim_set_keymap('i', '<C-A-S-Up>', '<Esc>yyPgi', { noremap = true, silen
-- Alacritty, GUI(Neovide, Goneovim) 皆可 -- Alacritty, GUI(Neovide, Goneovim) 皆可
-- xterm-256color採用程式: Konsole, iTerm2, gnome-terminal 會有按鍵吃不到的問題,詳下述註解: -- xterm-256color採用程式: Konsole, iTerm2, gnome-terminal 會有按鍵吃不到的問題,詳下述註解:
-- 使用Ctrl+Enter 在下一行插入新行並保持 Insert 模式xterm-256color 吃不到) -- 使用Ctrl+Enter 在下一行插入新行並保持 Insert 模式xterm-256color 吃不到)
vim.api.nvim_set_keymap('i', '<C-CR>', '<Esc>o', { noremap = true, silent = true }) neomap('i', '<C-CR>', '<Esc>o', { noremap = true, silent = true })
vim.api.nvim_set_keymap('i', '<C-S-CR>', '<Esc>O', { noremap = true, silent = true }) neomap('i', '<C-S-CR>', '<Esc>O', { noremap = true, silent = true })
-- 使用Alt+Enter 在下一行插入新行並保持 Insert 模式 -- 使用Alt+Enter 在下一行插入新行並保持 Insert 模式
vim.api.nvim_set_keymap('i', '<A-CR>', '<Esc>o', { noremap = true, silent = true }) neomap('i', '<A-CR>', '<Esc>o', { noremap = true, silent = true })
vim.api.nvim_set_keymap('i', '<A-S-CR>', '<Esc>O', { noremap = true, silent = true }) -- xterm-256color 吃不到shift neomap('i', '<A-S-CR>', '<Esc>O', { noremap = true, silent = true }) -- xterm-256color 吃不到shift
-- 啟用 Tab 縮排 -- 啟用 Tab 縮排
vim.api.nvim_set_keymap('n', '<TAB>', 'v>', { noremap = true, silent = true }) neomap('n', '<TAB>', 'v>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<S-TAB>', 'v<', { noremap = true, silent = true }) neomap('n', '<S-TAB>', 'v<', { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', '<TAB>', '>gv', { noremap = true, silent = true }) neomap('v', '<TAB>', '>gv', { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', '<S-TAB>', '<gv', { noremap = true, silent = true }) neomap('v', '<S-TAB>', '<gv', { noremap = true, silent = true })
vim.api.nvim_set_keymap('i', '<S-TAB>', '<C-d>', { noremap = true, silent = true }) -- Insert Mode 下的 Shift+Tab 退縮排 neomap('i', '<S-TAB>', '<C-d>', { noremap = true, silent = true }) -- Insert Mode 下的 Shift+Tab 退縮排
-- 透過 v 選取整行縮排後,不取消選取整行 -- 透過 v 選取整行縮排後,不取消選取整行
vim.api.nvim_set_keymap('v', '<', '<gv', { noremap = true, silent = true }) neomap('v', '<', '<gv', { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', '>', '>gv', { noremap = true, silent = true }) neomap('v', '>', '>gv', { noremap = true, silent = true })

View File

@ -17,14 +17,14 @@ map("i", "<C-s>", "<Esc><cmd>write<CR>a", { noremap = true, silent = true, desc
-- vim.api.nvim_set_keymap('n', '<A-LEFT>', '<cmd>tabprevious<CR>', { noremap = true, silent = true }) -- vim.api.nvim_set_keymap('n', '<A-LEFT>', '<cmd>tabprevious<CR>', { noremap = true, silent = true })
-- Move to window using the <ctrl> hjkl keys -- Move to window using the <ctrl> hjkl keys
map("n", "<C-h>", "<C-w>h", { desc = "Go to Left Window", remap = true }) map("n", "<C-A-h>", "<C-w>h", { desc = "Go to Left Window", remap = true })
map("n", "<C-j>", "<C-w>j", { desc = "Go to Lower Window", remap = true }) map("n", "<C-A-j>", "<C-w>j", { desc = "Go to Lower Window", remap = true })
map("n", "<C-k>", "<C-w>k", { desc = "Go to Upper Window", remap = true }) map("n", "<C-A-k>", "<C-w>k", { desc = "Go to Upper Window", remap = true })
map("n", "<C-l>", "<C-w>l", { desc = "Go to Right Window", remap = true }) map("n", "<C-A-l>", "<C-w>l", { desc = "Go to Right Window", remap = true })
map("n", "<C-Left>", "<C-w>h", { desc = "Go to Left Window", remap = true }) map("n", "<C-A-Left>", "<C-w>h", { desc = "Go to Left Window", remap = true })
map("n", "<C-Down>", "<C-w>j", { desc = "Go to Lower Window", remap = true }) map("n", "<C-A-Down>", "<C-w>j", { desc = "Go to Lower Window", remap = true })
map("n", "<C-Up>", "<C-w>k", { desc = "Go to Upper Window", remap = true }) map("n", "<C-A-Up>", "<C-w>k", { desc = "Go to Upper Window", remap = true })
map("n", "<C-Right>", "<C-w>l", { desc = "Go to Right Window", remap = true }) map("n", "<C-A-Right>", "<C-w>l", { desc = "Go to Right Window", remap = true })
-- Clear search, diff update and redraw -- Clear search, diff update and redraw
-- taken from runtime/lua/_editor.lua -- taken from runtime/lua/_editor.lua

View File

@ -44,8 +44,9 @@ require("lazy").setup({
-- { import = "plugins.themes.github-theme" }, -- 自訂配色 -- { import = "plugins.themes.github-theme" }, -- 自訂配色
-- { import = "plugins.themes.onedark" }, -- 自訂配色 -- { import = "plugins.themes.onedark" }, -- 自訂配色
{ import = "plugins.components.buffer.barbar" }, -- 目前只有barbar處理Buffer是最好的 { import = "plugins.editor" },
{ import = "plugins.components" }, { import = "plugins.components" },
{ import = "plugins.components.buffer.barbar" }, -- 目前只有barbar處理Buffer是最好的
{ import = "plugins.ui" }, { import = "plugins.ui" },
-- 手動引入 o-plugins 資料夾中的插件 -- 手動引入 o-plugins 資料夾中的插件

View File

@ -8,7 +8,7 @@
vim.opt.listchars = { vim.opt.listchars = {
trail = "-", trail = "-",
eol = "", -- eol = "↲",
tab = "» ", tab = "» ",
space = "·", -- space = "·",
} }

View File

@ -10,6 +10,8 @@ return {
tab = "> ", tab = "> ",
trail = "-", trail = "-",
nbsp = "+", nbsp = "+",
eol = "",
space = "·",
}, },
notifications = true, -- Enable or disable listchars notifications notifications = true, -- Enable or disable listchars notifications
exclude_filetypes = {}, -- List of filetypes where `listchars` is disabled exclude_filetypes = {}, -- List of filetypes where `listchars` is disabled

View File

@ -2,7 +2,7 @@ return {
{'romgrk/barbar.nvim', {'romgrk/barbar.nvim',
version = '^1.0.0', -- optional: only update when a new 1.x version is released version = '^1.0.0', -- optional: only update when a new 1.x version is released
dependencies = { dependencies = {
'lewis6991/gitsigns.nvim', -- OPTIONAL: for git status -- 'lewis6991/gitsigns.nvim', -- OPTIONAL: for git status
'nvim-tree/nvim-web-devicons', -- OPTIONAL: for file icons 'nvim-tree/nvim-web-devicons', -- OPTIONAL: for file icons
}, },
init = function() vim.g.barbar_auto_setup = false end, init = function() vim.g.barbar_auto_setup = false end,
@ -17,6 +17,10 @@ return {
-- animation = false, -- 禁用動畫效果 -- animation = false, -- 禁用動畫效果
sidebar_filetypes = { sidebar_filetypes = {
['neo-tree'] = {event = 'BufWipeout'}, ['neo-tree'] = {event = 'BufWipeout'},
undotree = {
text = 'undotree',
align = 'center', -- *optionally* specify an alignment (either 'left', 'center', or 'right')
},
}, },
} }
@ -37,6 +41,8 @@ return {
vim.api.nvim_set_keymap('n', '<A-h>', '<cmd>BufferPrevious<CR>', { noremap = true, silent = true }) vim.api.nvim_set_keymap('n', '<A-h>', '<cmd>BufferPrevious<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<A-RIGHT>', '<cmd>BufferNext<CR>', { noremap = true, silent = true }) vim.api.nvim_set_keymap('n', '<A-RIGHT>', '<cmd>BufferNext<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<A-LEFT>', '<cmd>BufferPrevious<CR>', { noremap = true, silent = true }) vim.api.nvim_set_keymap('n', '<A-LEFT>', '<cmd>BufferPrevious<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<C-n>', '<cmd>enew<CR>', { noremap = true, silent = true })
end, end,
}, },
} }

View File

@ -0,0 +1,19 @@
-- if true then return {} end
return {
-- 會自動cd到專案目錄
-- "ahmedkhalf/project.nvim",
-- 使用修改版的project.nvim
-- 因為此套件會噴警告,原作者已經沒再維護了
-- vim.lsp.buf_get_clients() is deprecated. Run ":checkhealth vim.deprecated" for more information
"Spelis/project.nvim",
branch = "patch-1",
config = function()
require("project_nvim").setup {
-- your configuration comes here
-- or leave it empty to use the default settings
-- refer to the configuration section below
}
end
}

View File

@ -0,0 +1,25 @@
return {
"kdheepak/lazygit.nvim",
lazy = true,
cmd = {
"LazyGit",
"LazyGitConfig",
"LazyGitCurrentFile",
"LazyGitFilter",
"LazyGitFilterCurrentFile",
},
-- optional for floating window border decoration
dependencies = {
"nvim-telescope/telescope.nvim",
"nvim-lua/plenary.nvim",
},
-- setting the keybinding for LazyGit with 'keys' is recommended in
-- order to load the plugin when the command is run for the first time
keys = {
{ "<F10>", "<cmd>LazyGit<cr>", desc = "LazyGit" },
{ "<leader>lg", "<cmd>LazyGit<cr>", desc = "LazyGit" },
},
config = function()
require("telescope").load_extension("lazygit")
end,
}

View File

@ -0,0 +1,60 @@
return {
{
"3rd/image.nvim",
build = false, -- so that it doesn't build the rock https://github.com/3rd/image.nvim/issues/91#issuecomment-2453430239
-- cond = not vim.g.neovide and not vim.fn.has("goneovim") == 1 and not vim.fn.has("gui_running") == 1,
cond = function()
-- 如果是在 GUI如 NeoVide、Goneovim則不啟用插件
if vim.g.neovide or vim.fn.has("goneovim") == 1 or vim.fn.has("gui_running") == 1 then
return false
end
-- 獲取 TERM 環境變數
local term = vim.fn.getenv("TERM")
-- 檢查是否是常見的文字終端
local is_terminal = term and (term:match("xterm") or term:match("screen") or term:match("tmux") or term:match("linux"))
-- 如果是文字終端,則啟用插件
return is_terminal ~= nil
end,
lazy = false,
opts = {
backend = "ueberzug",
processor = "magick_cli", -- or "magick_rock"
integrations = {
markdown = {
enabled = true,
clear_in_insert_mode = false,
download_remote_images = true,
only_render_image_at_cursor = false,
only_render_image_at_cursor_mode = "popup",
floating_windows = false, -- if true, images will be rendered in floating markdown windows
filetypes = { "markdown", "vimwiki" }, -- markdown extensions (ie. quarto) can go here
},
neorg = {
enabled = true,
filetypes = { "norg" },
},
typst = {
enabled = true,
filetypes = { "typst" },
},
html = {
enabled = false,
},
css = {
enabled = false,
},
},
max_width = nil,
max_height = nil,
max_width_window_percentage = nil,
max_height_window_percentage = 50,
window_overlap_clear_enabled = false, -- toggles images when windows are overlapped
window_overlap_clear_ft_ignore = { "cmp_menu", "cmp_docs", "snacks_notif", "scrollview", "scrollview_sign" },
editor_only_render_when_focused = false, -- auto show/hide images when the editor gains/looses focus
tmux_show_only_in_active_window = false, -- auto show/hide images in the correct Tmux window (needs visual-activity off)
hijack_file_patterns = { "*.png", "*.jpg", "*.jpeg", "*.gif", "*.webp", "*.avif" }, -- render image files as images when opened
}
}
}

View File

@ -20,6 +20,7 @@ return {
"nvim-lua/plenary.nvim", "nvim-lua/plenary.nvim",
"nvim-tree/nvim-web-devicons", -- not strictly required, but recommended "nvim-tree/nvim-web-devicons", -- not strictly required, but recommended
"MunifTanjim/nui.nvim", "MunifTanjim/nui.nvim",
-- "3rd/image.nvim",
-- {"3rd/image.nvim", -- {"3rd/image.nvim",
-- build = false, -- build = false,
-- opts = { -- opts = {
@ -71,36 +72,14 @@ return {
{ "<leader>fT", "<cmd>Neotree float<cr>", desc = "NeoTree Float" }, { "<leader>fT", "<cmd>Neotree float<cr>", desc = "NeoTree Float" },
{ "<leader>fF", "<cmd>Neotree filesystem float<cr>", desc = "NeoTree Filesystem Float" }, { "<leader>fF", "<cmd>Neotree filesystem float<cr>", desc = "NeoTree Filesystem Float" },
{ "<leader>fG", "<cmd>Neotree git_status float<cr>", desc = "NeoTree Git Status Float" }, { "<leader>fG", "<cmd>Neotree git_status float<cr>", desc = "NeoTree Git Status Float" },
{ "<F10>", "<cmd>Neotree git_status float<cr>", desc = "NeoTree Git Status Float" }, { "<S-F9>", "<cmd>Neotree git_status float<cr>", desc = "NeoTree Git Status Float" }, --警告!在標準終端無法使用
{ "<leader>fB", "<cmd>Neotree buffers float<cr>", desc = "NeoTree Buffers Float" }, { "<leader>fB", "<cmd>Neotree buffers float<cr>", desc = "NeoTree Buffers Float" },
}, },
lazy = false, lazy = false,
-----Instead of using `config`, you can use `opts` instead, if you'd like: -----Instead of using `config`, you can use `opts` instead, if you'd like:
-----@module "neo-tree" -----@module "neo-tree"
-----@type neotree.Config -----@type neotree.Config
--opts = {}, opts = {
config = function()
-- If you want icons for diagnostic errors, you'll need to define them somewhere.
-- In Neovim v0.10+, you can configure them in vim.diagnostic.config(), like:
--
-- vim.diagnostic.config({
-- signs = {
-- text = {
-- [vim.diagnostic.severity.ERROR] = '',
-- [vim.diagnostic.severity.WARN] = '',
-- [vim.diagnostic.severity.INFO] = '',
-- [vim.diagnostic.severity.HINT] = '󰌵',
-- },
-- }
-- })
--
-- In older versions, you can define the signs manually:
-- vim.fn.sign_define("DiagnosticSignError", { text = " ", texthl = "DiagnosticSignError" })
-- vim.fn.sign_define("DiagnosticSignWarn", { text = " ", texthl = "DiagnosticSignWarn" })
-- vim.fn.sign_define("DiagnosticSignInfo", { text = " ", texthl = "DiagnosticSignInfo" })
-- vim.fn.sign_define("DiagnosticSignHint", { text = "󰌵", texthl = "DiagnosticSignHint" })
require("neo-tree").setup({
close_if_last_window = true, -- Close Neo-tree if it is the last window left in the tab close_if_last_window = true, -- Close Neo-tree if it is the last window left in the tab
popup_border_style = "NC", -- or "" to use 'winborder' on Neovim v0.11+ popup_border_style = "NC", -- or "" to use 'winborder' on Neovim v0.11+
enable_git_status = true, enable_git_status = true,
@ -222,7 +201,7 @@ return {
["<2-LeftMouse>"] = "open", ["<2-LeftMouse>"] = "open",
["<cr>"] = "open", ["<cr>"] = "open",
["<esc>"] = "cancel", -- close preview or floating neo-tree window ["<esc>"] = "cancel", -- close preview or floating neo-tree window
["P"] = { "toggle_preview", config = { use_float = true, use_image_nvim = true } }, ["P"] = { "toggle_preview", config = { use_float = true, use_image_nvim = false } },
-- Read `# Preview Mode` for more information -- Read `# Preview Mode` for more information
["l"] = "focus_preview", ["l"] = "focus_preview",
["S"] = "open_split", ["S"] = "open_split",
@ -421,7 +400,29 @@ return {
winbar = false, winbar = false,
statusline = false statusline = false
} }
}) },
config = function(_, opts)
-- If you want icons for diagnostic errors, you'll need to define them somewhere.
-- In Neovim v0.10+, you can configure them in vim.diagnostic.config(), like:
--
-- vim.diagnostic.config({
-- signs = {
-- text = {
-- [vim.diagnostic.severity.ERROR] = '',
-- [vim.diagnostic.severity.WARN] = '',
-- [vim.diagnostic.severity.INFO] = '',
-- [vim.diagnostic.severity.HINT] = '󰌵',
-- },
-- }
-- })
--
-- In older versions, you can define the signs manually:
-- vim.fn.sign_define("DiagnosticSignError", { text = " ", texthl = "DiagnosticSignError" })
-- vim.fn.sign_define("DiagnosticSignWarn", { text = " ", texthl = "DiagnosticSignWarn" })
-- vim.fn.sign_define("DiagnosticSignInfo", { text = " ", texthl = "DiagnosticSignInfo" })
-- vim.fn.sign_define("DiagnosticSignHint", { text = "󰌵", texthl = "DiagnosticSignHint" })
require("neo-tree").setup(opts)
-- vim.keymap.set("n", "<leader>e", "<Cmd>Neotree reveal<CR>") -- vim.keymap.set("n", "<leader>e", "<Cmd>Neotree reveal<CR>")

View File

@ -0,0 +1,8 @@
return {
"lambdalisue/suda.vim",
lazy = false,
cmd = { "SudaRead", "SudaWrite" },
keys = {
{ "<leader>e", "<cmd>SudaRead<cr>", desc = "Edit with sudo" },
},
}

View File

@ -0,0 +1,89 @@
-- if true then return {} end
return {
-- 'nvim-telescope/telescope.nvim', tag = '0.1.8',
'nvim-telescope/telescope.nvim', branch = '0.1.x',
dependencies = { 'nvim-lua/plenary.nvim' },
lazy = false,
keys = {
{ "<C-p>", "<cmd>Telescope find_files<cr>", desc = "Find files" },
{ "<leader>ff", "<cmd>Telescope find_files<cr>", desc = "Find files" },
{ "<leader>fg", "<cmd>Telescope live_grep<cr>", desc = "Grep" },
{ "<leader>fb", "<cmd>Telescope buffers<cr>", desc = "Buffers" },
{ "<leader>fh", "<cmd>Telescope help_tags<cr>", desc = "Help tags" },
{ "<leader>fk", "<cmd>Telescope keymaps<cr>", desc = "Keymaps" },
},
opts = function()
local actions = require("telescope.actions")
local open_with_trouble = function(...)
return require("trouble.sources.telescope").open(...)
end
local find_files_no_ignore = function()
local action_state = require("telescope.actions.state")
local line = action_state.get_current_line()
LazyVim.pick("find_files", { no_ignore = true, default_text = line })()
end
local find_files_with_hidden = function()
local action_state = require("telescope.actions.state")
local line = action_state.get_current_line()
LazyVim.pick("find_files", { hidden = true, default_text = line })()
end
local function find_command()
if 1 == vim.fn.executable("rg") then
return { "rg", "--files", "--color", "never", "-g", "!.git" }
elseif 1 == vim.fn.executable("fd") then
return { "fd", "--type", "f", "--color", "never", "-E", ".git" }
elseif 1 == vim.fn.executable("fdfind") then
return { "fdfind", "--type", "f", "--color", "never", "-E", ".git" }
elseif 1 == vim.fn.executable("find") and vim.fn.has("win32") == 0 then
return { "find", ".", "-type", "f" }
elseif 1 == vim.fn.executable("where") then
return { "where", "/r", ".", "*" }
end
end
return {
defaults = {
prompt_prefix = "",
selection_caret = "",
-- open files in the first window that is an actual file.
-- use the current window if no other window is available.
get_selection_window = function()
local wins = vim.api.nvim_list_wins()
table.insert(wins, 1, vim.api.nvim_get_current_win())
for _, win in ipairs(wins) do
local buf = vim.api.nvim_win_get_buf(win)
if vim.bo[buf].buftype == "" then
return win
end
end
return 0
end,
mappings = {
i = {
["<c-t>"] = open_with_trouble,
["<a-t>"] = open_with_trouble,
["<a-i>"] = find_files_no_ignore,
["<a-h>"] = find_files_with_hidden,
["<C-Down>"] = actions.cycle_history_next,
["<C-Up>"] = actions.cycle_history_prev,
["<C-f>"] = actions.preview_scrolling_down,
["<C-b>"] = actions.preview_scrolling_up,
},
n = {
["q"] = actions.close,
},
},
},
pickers = {
find_files = {
find_command = find_command,
hidden = true,
},
},
}
end,
}

View File

@ -39,7 +39,10 @@ return {
} }
-- 添加第二個快捷鍵映射 -- 添加第二個快捷鍵映射
vim.api.nvim_set_keymap('n', '<A-\\>', '<cmd>ToggleTerm<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<C-`>', '<cmd>ToggleTerm<CR>', { noremap = true, silent = true }) vim.api.nvim_set_keymap('n', '<C-`>', '<cmd>ToggleTerm<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('t', '<A-\\>', '<cmd>ToggleTerm<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('t', '<C-`>', '<cmd>ToggleTerm<CR>', { noremap = true, silent = true })
-- 添加Alt+Esc鍵離開終端模式回到Normal Mode -- 添加Alt+Esc鍵離開終端模式回到Normal Mode
vim.api.nvim_set_keymap('t', '<A-Esc>', [[<C-\><C-n>]], { noremap = true, silent = true }) vim.api.nvim_set_keymap('t', '<A-Esc>', [[<C-\><C-n>]], { noremap = true, silent = true })

View File

@ -0,0 +1,70 @@
return {
{
"mbbill/undotree",
config = function()
-- vim.g.mundo_preview_bottom = 1
-- vim.g.mundo_auto_preview = 1
-- vim.g.mundo_window_height = 20
-- vim.g.mundo_window_width = 80
-- vim.g.mundo_window_top = 0
-- vim.g.mundo_window_left = 0
vim.keymap.set('n', '<F6>', vim.cmd.UndotreeToggle)
vim.g.undotree_WindowLayout = 3
vim.cmd([[
function g:Undotree_CustomMap()
map <buffer> <s-DOWN> J
map <buffer> <s-UP> K
endfunction
]])
-- 使用 vim.cmd 執行 Vim 傳統語法
-- vim.cmd([[
-- nnoremap <F6> :UndotreeToggle<CR>
-- if !exists('g:undotree_WindowLayout')
-- let g:undotree_WindowLayout = 1
-- endif
-- ]])
end,
}
-- {
-- "mbbill/undotree",
-- dependencies = "nvim-lua/plenary.nvim",
-- config = true,
-- keys = { -- load the plugin only when using it's keybinding:
-- { "<F6>", "<cmd>lua require('undotree').toggle()<cr>" },
-- { "<leader>u", "<cmd>lua require('undotree').toggle()<cr>" },
-- },
-- }
-- {
-- "jiaoshijie/undotree",
-- dependencies = "nvim-lua/plenary.nvim",
-- config = true,
-- keys = { -- load the plugin only when using it's keybinding:
-- { "<F6>", "<cmd>lua require('undotree').toggle()<cr>" },
-- { "<leader>u", "<cmd>lua require('undotree').toggle()<cr>" },
-- },
-- opts = {
-- float_diff = true, -- using float window previews diff, set this `true` will disable layout option
-- layout = "left_bottom", -- "left_bottom", "left_left_bottom"
-- position = "right", -- "left", "right", "bottom"
-- ignore_filetype = { 'undotree', 'undotreeDiff', 'qf', 'TelescopePrompt', 'spectre_panel', 'tsplayground' },
-- window = {
-- winblend = 30,
-- },
-- keymaps = {
-- ['j'] = "move_next",
-- ['k'] = "move_prev",
-- ['gj'] = "move2parent",
-- ['J'] = "move_change_next",
-- ['K'] = "move_change_prev",
-- ['<cr>'] = "action_enter",
-- ['p'] = "enter_diffbuf",
-- ['q'] = "quit",
-- },
-- },
-- }
}

View File

@ -0,0 +1,79 @@
return {
-- 單純顯示顏色
-- 不過以下ccc.nvim與oklch-color-picker.nvim都有此功能故關閉
-- {
-- 'norcalli/nvim-colorizer.lua',
-- lazy = false,
-- config = function()
-- -- Attaches to every FileType mode
-- require 'colorizer'.setup()
-- -- require("colorizer").setup({
-- -- '*'; -- Highlight all files, but customize some others.
-- -- '!vim'; -- Exclude vim from highlighting.
-- -- '!markdown'; -- Exclude markdown from highlighting.
-- -- '!text'; -- Exclude text from highlighting.
-- -- '!html'; -- Exclude html from highlighting.
-- -- '!css'; -- Exclude css from highlighting.
-- -- '!javascript'; -- Exclude javascript from highlighting.
-- -- '!typescript'; -- Exclude typescript from highlighting.
-- -- }, {
-- -- RGB = true; -- #RGB hex codes
-- -- RRGGBB = true; -- #RRGGBB hex codes
-- -- names = false; -- "Name" codes like Blue or blue
-- -- RRGGBBAA = true; -- #RRGGBBAA hex codes
-- -- rgb_fn = true; -- CSS rgb() and rgba() functions
-- -- hsl_fn = true; -- CSS hsl() and hsla() functions
-- -- })
-- end,
-- },
-- {
-- "uga-rosa/ccc.nvim",
-- lazy = false,
-- cmd = "CccPick",
-- keys = {
-- {
-- "<leader>v", "<cmd>CccPick<cr>", desc = "Color pick under cursor"
-- },
-- },
-- config = function()
-- -- Enable true color
-- vim.opt.termguicolors = true
--
-- local ccc = require("ccc")
-- local mapping = ccc.mapping
--
-- ccc.setup({
-- -- Your preferred settings
-- -- Example: enable highlighter
-- highlighter = {
-- auto_enable = true,
-- lsp = true,
-- },
-- inputs = {
-- ccc.input.rgb,
-- ccc.input.hsl,
-- ccc.input.cmyk,
--
-- }
-- })
-- end,
-- }
{
"eero-lehtinen/oklch-color-picker.nvim",
event = "VeryLazy",
version = "*",
keys = {
-- One handed keymap recommended, you will be using the mouse
{
"<leader>v",
function() require("oklch-color-picker").pick_under_cursor() end,
desc = "Color pick under cursor",
},
},
---@type oklch.Opts
opts = {},
}
}

View File

@ -0,0 +1,64 @@
-- if true then return {} end -- 暫時停用
return {
{
"numToStr/Comment.nvim",
opts = {
padding = true,
sticky = true,
ignore = nil,
toggler = { line = 'gcc', block = 'gbc' },
opleader = { line = 'gc', block = 'gb' },
extra = { above = 'gcO', below = 'gco', eol = 'gcA' },
mappings = { basic = true, extra = true },
pre_hook = nil,
post_hook = nil,
},
config = function(_, opts)
require("Comment").setup(opts)
local api = require('Comment.api')
local config = require('Comment.config'):get()
-- api.toggle.linewise(motion, config?)
-- api.toggle.linewise.current(motion?, config?)
-- api.toggle.linewise.count(count, config?)
-- api.toggle.blockwise(motion, config?)
-- api.toggle.blockwise.current(motion?, config?)
-- api.toggle.blockwise.count(count, config?)
-- Toggle current line (linewise) using C-/
vim.keymap.set('n', '<C-_>', api.toggle.linewise.current)
-- -- Toggle current line (blockwise) using C-\
-- vim.keymap.set('n', '<C-\\>', api.toggle.blockwise.current)
-- Toggle lines (linewise) with dot-repeat support
-- Example: <leader>gc3j will comment 4 lines
vim.keymap.set(
'n', '<leader>gc', api.call('toggle.linewise', 'g@'),
{ expr = true }
)
-- Toggle lines (blockwise) with dot-repeat support
-- Example: <leader>gb3j will comment 4 lines
vim.keymap.set(
'n', '<leader>gb', api.call('toggle.blockwise', 'g@'),
{ expr = true }
)
local esc = vim.api.nvim_replace_termcodes(
'<ESC>', true, false, true
)
-- Toggle selection (linewise)
-- vim.keymap.set('x', '<leader>c', function()
vim.keymap.set('x', '<C-_>', function()
vim.api.nvim_feedkeys(esc, 'nx', false)
api.toggle.linewise(vim.fn.visualmode())
end)
end,
}
}

View File

@ -0,0 +1,99 @@
return {
"lewis6991/gitsigns.nvim",
opts = {
signs = {
add = { text = "" },
change = { text = "" },
delete = { text = "" },
topdelete = { text = "" },
changedelete = { text = "" },
untracked = { text = "" },
},
signs_staged = {
add = { text = "" },
change = { text = "" },
delete = { text = "" },
topdelete = { text = "" },
changedelete = { text = "" },
untracked = { text = "" },
},
signs_staged_enable = true,
signcolumn = true, -- Toggle with `:Gitsigns toggle_signs`
numhl = false, -- Toggle with `:Gitsigns toggle_numhl`
linehl = false, -- Toggle with `:Gitsigns toggle_linehl`
word_diff = true, -- Toggle with `:Gitsigns toggle_word_diff`
watch_gitdir = {
follow_files = true
},
auto_attach = true,
attach_to_untracked = false,
current_line_blame = true, -- Toggle with `:Gitsigns toggle_current_line_blame`
current_line_blame_opts = {
virt_text = true,
virt_text_pos = 'eol', -- 'eol' | 'overlay' | 'right_align'
delay = 1000,
ignore_whitespace = false,
virt_text_priority = 100,
use_focus = true,
},
current_line_blame_formatter = ' <author>, <author_time:%R> - <summary>',
sign_priority = 6,
update_debounce = 100,
status_formatter = nil, -- Use default
max_file_length = 40000, -- Disable if file is longer than this (in lines)
preview_config = {
-- Options passed to nvim_open_win
style = 'minimal',
relative = 'cursor',
row = 0,
col = 1
},
on_attach = function(buffer)
-- 處理無狀態時的佔位符號
vim.wo.signcolumn = "yes"
-- 添加一個空白占位符
vim.fn.sign_define("GitSignsPlaceholder", { text = " ", texthl = "NonText" })
-- 在沒有 Git 變更時手動放置占位符
local line_count = vim.api.nvim_buf_line_count(buffer)
for lnum = 1, line_count do
vim.fn.sign_place(0, "GitSignsPlaceholderGroup", "GitSignsPlaceholder", buffer, { lnum = lnum })
end
-- 其他預設動作
local gs = package.loaded.gitsigns
local function map(mode, l, r, desc)
vim.keymap.set(mode, l, r, { buffer = buffer, desc = desc })
end
-- stylua: ignore start
map("n", "]h", function()
if vim.wo.diff then
vim.cmd.normal({ "]c", bang = true })
else
gs.nav_hunk("next")
end
end, "Next Hunk")
map("n", "[h", function()
if vim.wo.diff then
vim.cmd.normal({ "[c", bang = true })
else
gs.nav_hunk("prev")
end
end, "Prev Hunk")
map("n", "]H", function() gs.nav_hunk("last") end, "Last Hunk")
map("n", "[H", function() gs.nav_hunk("first") end, "First Hunk")
map({ "n", "v" }, "<leader>ghs", ":Gitsigns stage_hunk<CR>", "Stage Hunk")
map({ "n", "v" }, "<leader>ghr", ":Gitsigns reset_hunk<CR>", "Reset Hunk")
map("n", "<leader>ghS", gs.stage_buffer, "Stage Buffer")
map("n", "<leader>ghu", gs.undo_stage_hunk, "Undo Stage Hunk")
map("n", "<leader>ghR", gs.reset_buffer, "Reset Buffer")
map("n", "<leader>ghp", gs.preview_hunk_inline, "Preview Hunk Inline")
map("n", "<leader>ghb", function() gs.blame_line({ full = true }) end, "Blame Line")
map("n", "<leader>ghB", function() gs.blame() end, "Blame Buffer")
map("n", "<leader>ghd", gs.diffthis, "Diff This")
map("n", "<leader>ghD", function() gs.diffthis("~") end, "Diff This ~")
map({ "o", "x" }, "ih", ":<C-U>Gitsigns select_hunk<CR>", "GitSigns Select Hunk")
end,
},
}

View File

@ -0,0 +1,31 @@
return {
{
"pysan3/fcitx5.nvim",
cond = function()
return vim.fn.executable("fcitx5-remote") == 1
end,
event = { "ModeChanged" }, -- 在模式改變時載入插件
config = function()
require("fcitx5").setup() -- 初始化插件
-- 以下是手動指定規則
-- local en = "keyboard-us"
-- local tw = "chewing"
-- require("fcitx5").setup({
-- imname = {
-- norm = en,
-- ins = tw,
-- cmd = en,
-- },
-- remember_prior = false,
-- })
-- -- If you are using `jk` to escape, map 全角のjk.
-- vim.cmd([[
-- inoremap <silent> <Esc>
-- tnoremap <silent> <Esc>
-- ]])
end,
},
}

View File

@ -0,0 +1,40 @@
return {
{
"lukas-reineke/indent-blankline.nvim",
main = "ibl",
---@module "ibl"
---@type ibl.config
-- opts = {},
config = function(_, opts)
-- require("ibl").setup(opts)
local highlight = {
"RainbowRed",
"RainbowYellow",
"RainbowBlue",
"RainbowOrange",
"RainbowGreen",
"RainbowViolet",
"RainbowCyan",
}
local hooks = require "ibl.hooks"
-- create the highlight groups in the highlight setup hook, so they are reset
-- every time the colorscheme changes
hooks.register(hooks.type.HIGHLIGHT_SETUP, function()
vim.api.nvim_set_hl(0, "RainbowRed", { fg = "#E06C75" })
vim.api.nvim_set_hl(0, "RainbowYellow", { fg = "#E5C07B" })
vim.api.nvim_set_hl(0, "RainbowBlue", { fg = "#61AFEF" })
vim.api.nvim_set_hl(0, "RainbowOrange", { fg = "#D19A66" })
vim.api.nvim_set_hl(0, "RainbowGreen", { fg = "#98C379" })
vim.api.nvim_set_hl(0, "RainbowViolet", { fg = "#C678DD" })
vim.api.nvim_set_hl(0, "RainbowCyan", { fg = "#56B6C2" })
end)
vim.g.rainbow_delimiters = { highlight = highlight }
require("ibl").setup { scope = { highlight = highlight } }
hooks.register(hooks.type.SCOPE_HIGHLIGHT, hooks.builtin.scope_highlight_from_extmark)
end,
}
}

View File

@ -24,6 +24,21 @@ return {
return "📍 " .. location -- 在字首添加 emoji return "📍 " .. location -- 在字首添加 emoji
end end
-- Function to determine file permissions and appropriate background color
local function get_permissions_color()
local file = vim.fn.expand("%:p")
if file == "" or file == nil then
return "No File", "#3B4252" -- Default blue for no or non-existing file
else
local permissions = vim.fn.getfperm(file)
-- Check only the first three characters for 'rwx' to determine owner permissions
local owner_permissions = permissions:sub(1, 3)
-- Green for owner 'rwx', blue otherwise
return permissions, owner_permissions == "rwx" and "#97C378" or "#3B4252"
end
end
return { return {
options = { options = {
icons_enabled = true, icons_enabled = true,
@ -33,6 +48,7 @@ return {
disabled_filetypes = { disabled_filetypes = {
statusline = {}, statusline = {},
winbar = {}, winbar = {},
{'undotree'}
}, },
ignore_focus = {}, ignore_focus = {},
always_divide_middle = true, always_divide_middle = true,
@ -48,7 +64,28 @@ return {
lualine_a = {'mode'}, lualine_a = {'mode'},
lualine_b = {'branch', 'diff', 'diagnostics'}, lualine_b = {'branch', 'diff', 'diagnostics'},
lualine_c = {'filename'}, lualine_c = {'filename'},
lualine_x = {'encoding', 'fileformat', 'filetype'}, lualine_x = {
{
function()
local permissions, _ = get_permissions_color() -- Ignore bg_color here if unused
return permissions
end,
color = function()
local _, bg_color = get_permissions_color() -- Use bg_color for dynamic coloring
return { fg = fg_color, bg = bg_color, gui = "bold" }
end,
-- separator = { left = "", right = "" },
-- separator = { left = "", right = "" },
-- separator = { left = "", right = "" },
-- separator = { left = "", right = "" },
-- separator = { left = "", right = "" },
separator = { left = "", right = "" },
-- separator = { left = "", right = "" },
-- separator = { left = "", right = "" },
padding = 1,
},
'encoding', 'fileformat', 'filetype'
},
lualine_y = {'progress'}, lualine_y = {'progress'},
lualine_z = {{ selectionCount }, { customLocation },} lualine_z = {{ selectionCount }, { customLocation },}
}, },

View File

@ -1,157 +1,175 @@
if true then return {} end -- 先停用 -- if true then return {} end -- 先停用
return { return {
{ "petertriho/nvim-scrollbar", 'dstein64/nvim-scrollview',
cond = true, setup = function()
config = function() require('scrollview').setup({
require("scrollbar").setup({ -- Default options
show = true, current_only = true, -- Only show scroll indicator in current window
show_in_active_only = false, winblend = 0, -- Blend of the scroll indicator
set_highlights = true, -- base = 1, -- Base value for the scroll indicator
folds = 1000, -- handle folds, set to number to disable folds if no. of lines in buffer exceeds this -- max_lines = 1000, -- Maximum number of lines to show the scroll indicator
max_lines = false, -- disables if no. of lines in buffer exceeds this excluded_filetypes = { 'help', 'neo-tree' }, -- Filetypes to exclude from showing the scroll indicator
hide_if_all_visible = false, -- Hides everything if all lines are visible base = 'buffer',
throttle_ms = 100, -- column = 80,
handle = { signs_on_startup = {'all'},
text = " ", diagnostics_severities = {vim.diagnostic.severity.ERROR}
blend = 30, -- Integer between 0 and 100. 0 for fully opaque and 100 to full transparent. Defaults to 30.
color = nil,
color_nr = nil, -- cterm
highlight = "CursorColumn",
hide_if_all_visible = true, -- Hides handle if all lines are visible
},
marks = {
Cursor = {
text = "",
priority = 0,
gui = nil,
color = nil,
cterm = nil,
color_nr = nil, -- cterm
highlight = "Normal",
},
Search = {
text = { "-", "=" },
priority = 1,
gui = nil,
color = nil,
cterm = nil,
color_nr = nil, -- cterm
highlight = "Search",
},
Error = {
text = { "-", "=" },
priority = 2,
gui = nil,
color = nil,
cterm = nil,
color_nr = nil, -- cterm
highlight = "DiagnosticVirtualTextError",
},
Warn = {
text = { "-", "=" },
priority = 3,
gui = nil,
color = nil,
cterm = nil,
color_nr = nil, -- cterm
highlight = "DiagnosticVirtualTextWarn",
},
Info = {
text = { "-", "=" },
priority = 4,
gui = nil,
color = nil,
cterm = nil,
color_nr = nil, -- cterm
highlight = "DiagnosticVirtualTextInfo",
},
Hint = {
text = { "-", "=" },
priority = 5,
gui = nil,
color = nil,
cterm = nil,
color_nr = nil, -- cterm
highlight = "DiagnosticVirtualTextHint",
},
Misc = {
text = { "-", "=" },
priority = 6,
gui = nil,
color = nil,
cterm = nil,
color_nr = nil, -- cterm
highlight = "Normal",
},
GitAdd = {
text = "",
priority = 7,
gui = nil,
color = nil,
cterm = nil,
color_nr = nil, -- cterm
highlight = "GitSignsAdd",
},
GitChange = {
text = "",
priority = 7,
gui = nil,
color = nil,
cterm = nil,
color_nr = nil, -- cterm
highlight = "GitSignsChange",
},
GitDelete = {
text = "",
priority = 7,
gui = nil,
color = nil,
cterm = nil,
color_nr = nil, -- cterm
highlight = "GitSignsDelete",
},
},
excluded_buftypes = {
"terminal",
},
excluded_filetypes = {
"dropbar_menu",
"dropbar_menu_fzf",
"DressingInput",
"cmp_docs",
"cmp_menu",
"noice",
"prompt",
"TelescopePrompt",
},
autocmd = {
render = {
"BufWinEnter",
"TabEnter",
"TermEnter",
"WinEnter",
"CmdwinLeave",
"TextChanged",
"VimResized",
"WinScrolled",
},
clear = {
"BufWinLeave",
"TabLeave",
"TermLeave",
"WinLeave",
},
},
handlers = {
cursor = true,
diagnostic = true,
gitsigns = false, -- Requires gitsigns
handle = true,
search = false, -- Requires hlslens
ale = false, -- Requires ALE
},
}) })
end end,
},
} }
-- return {
-- { "petertriho/nvim-scrollbar",
-- cond = true,
-- config = function()
-- require("scrollbar").setup({
-- show = true,
-- show_in_active_only = false,
-- set_highlights = true,
-- folds = 1000, -- handle folds, set to number to disable folds if no. of lines in buffer exceeds this
-- max_lines = false, -- disables if no. of lines in buffer exceeds this
-- hide_if_all_visible = false, -- Hides everything if all lines are visible
-- throttle_ms = 100,
-- handle = {
-- text = " ",
-- blend = 30, -- Integer between 0 and 100. 0 for fully opaque and 100 to full transparent. Defaults to 30.
-- color = nil,
-- color_nr = nil, -- cterm
-- highlight = "CursorColumn",
-- hide_if_all_visible = true, -- Hides handle if all lines are visible
-- },
-- marks = {
-- Cursor = {
-- text = "•",
-- priority = 0,
-- gui = nil,
-- color = nil,
-- cterm = nil,
-- color_nr = nil, -- cterm
-- highlight = "Normal",
-- },
-- Search = {
-- text = { "-", "=" },
-- priority = 1,
-- gui = nil,
-- color = nil,
-- cterm = nil,
-- color_nr = nil, -- cterm
-- highlight = "Search",
-- },
-- Error = {
-- text = { "-", "=" },
-- priority = 2,
-- gui = nil,
-- color = nil,
-- cterm = nil,
-- color_nr = nil, -- cterm
-- highlight = "DiagnosticVirtualTextError",
-- },
-- Warn = {
-- text = { "-", "=" },
-- priority = 3,
-- gui = nil,
-- color = nil,
-- cterm = nil,
-- color_nr = nil, -- cterm
-- highlight = "DiagnosticVirtualTextWarn",
-- },
-- Info = {
-- text = { "-", "=" },
-- priority = 4,
-- gui = nil,
-- color = nil,
-- cterm = nil,
-- color_nr = nil, -- cterm
-- highlight = "DiagnosticVirtualTextInfo",
-- },
-- Hint = {
-- text = { "-", "=" },
-- priority = 5,
-- gui = nil,
-- color = nil,
-- cterm = nil,
-- color_nr = nil, -- cterm
-- highlight = "DiagnosticVirtualTextHint",
-- },
-- Misc = {
-- text = { "-", "=" },
-- priority = 6,
-- gui = nil,
-- color = nil,
-- cterm = nil,
-- color_nr = nil, -- cterm
-- highlight = "Normal",
-- },
-- GitAdd = {
-- text = "┆",
-- priority = 7,
-- gui = nil,
-- color = nil,
-- cterm = nil,
-- color_nr = nil, -- cterm
-- highlight = "GitSignsAdd",
-- },
-- GitChange = {
-- text = "┆",
-- priority = 7,
-- gui = nil,
-- color = nil,
-- cterm = nil,
-- color_nr = nil, -- cterm
-- highlight = "GitSignsChange",
-- },
-- GitDelete = {
-- text = "▁",
-- priority = 7,
-- gui = nil,
-- color = nil,
-- cterm = nil,
-- color_nr = nil, -- cterm
-- highlight = "GitSignsDelete",
-- },
-- },
-- excluded_buftypes = {
-- "terminal",
-- },
-- excluded_filetypes = {
-- "dropbar_menu",
-- "dropbar_menu_fzf",
-- "DressingInput",
-- "cmp_docs",
-- "cmp_menu",
-- "noice",
-- "prompt",
-- "TelescopePrompt",
-- },
-- autocmd = {
-- render = {
-- "BufWinEnter",
-- "TabEnter",
-- "TermEnter",
-- "WinEnter",
-- "CmdwinLeave",
-- "TextChanged",
-- "VimResized",
-- "WinScrolled",
-- },
-- clear = {
-- "BufWinLeave",
-- "TabLeave",
-- "TermLeave",
-- "WinLeave",
-- },
-- },
-- handlers = {
-- cursor = true,
-- diagnostic = true,
-- gitsigns = false, -- Requires gitsigns
-- handle = true,
-- search = false, -- Requires hlslens
-- ale = false, -- Requires ALE
-- },
-- })
-- end
-- },
-- }

View File

@ -1,3 +1,4 @@
vim.g.suda_smart_edit = 1
require("config.options") require("config.options")
require("config.keymaps_nvim") require("config.keymaps_nvim")
require("config.keymaps") require("config.keymaps")

View File

@ -127,7 +127,6 @@ zstyle ':completion:*' menu select
alias cp="cp -i" # Confirm before overwriting something alias cp="cp -i" # Confirm before overwriting something
alias df='df -h' # Human-readable sizes alias df='df -h' # Human-readable sizes
alias free='free -m' # Show sizes in MB alias free='free -m' # Show sizes in MB
alias gitu='git add . && git commit && git push'
# overwrite ls # overwrite ls
if command -v colorls &> /dev/null; then if command -v colorls &> /dev/null; then
@ -152,43 +151,10 @@ elif [ "$(uname -s)" = 'Darwin' ]; then
fi fi
# bindkey -s '^E' 'gnome-terminal --working-directory="$PWD" -- zsh\n' # bindkey -s '^E' 'gnome-terminal --working-directory="$PWD" -- zsh\n'
# Install ruby¬ {{ if eq .chezmoi.os "darwin" -}}
# Based on "`brew --prefix ruby`/bin"¬
export PATH="/usr/local/opt/ruby/bin:$PATH
# Based on "`gem environment gemdir`/bin"¬
export PATH="/usr/local/lib/ruby/gems/3.3.0/bin:$PATH
export PATH="$HOME/.local/share/gem/ruby/3.3.0/bin:$PATH"
# Fix ython3 to python Path on macOS
if [ "$(uname -s)" = 'Darwin' ]; then
export PATH=/usr/local/opt/python/libexec/bin:$PATH
fi
# Created by `pipx` on 2023-01-30 19:57:14
export PATH="$PATH:$HOME/.local/bin"
# GoLang Path
export PATH="$PATH:$HOME/go/bin"
# iterm2 # iterm2
test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh" test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh"
{{ end -}}
# 圖片顯示
# 既然即使加入判斷後還是「進入函數定義段落且噴錯」那就代表zsh 在解析 .zshrc 時,在到達 if 邏輯前,就已經知道 imgcat 是 alias並因此直接報錯這是因為
# ⚠️ 在 zsh 中,如果你寫 function_name() 這種形式,然後這個名稱之前被定義為 alias會在 parse 階段直接錯誤,不會等到 if 判斷。
# 解決方式:延遲定義(用 eval 避開 parser
# 你需要避免 zsh 在 parse 階段就看到 imgcat() 的寫法。可以這樣寫,透過 eval 延遲定義函數內容:
if ! alias imgcat &>/dev/null && ! functions imgcat &>/dev/null && command -v magick &>/dev/null; then
eval '
imgcat() {
if [[ -z "$1" ]]; then
echo "❌ 請指定圖片檔案例如imgcat ~/Pictures/foo.png"
return 1
fi
magick "$1" -geometry 800x480 sixel:-
}'
fi
zinit light mass8326/zsh-chezmoi zinit light mass8326/zsh-chezmoi
@ -205,3 +171,6 @@ function git_pushmulti() {
# 執行 git pushmulti # 執行 git pushmulti
noglob git pushmulti "$remotes" "$branches" noglob git pushmulti "$remotes" "$branches"
} }
{{ template "common.sh.tmpl" . }}