Neovim and Tmux¶
Install Neovim¶
Neovim¶
macOS:
brew install neovim
Linux 等平台参考 Neovim 官方安装说明。 快速版要求 Neovim 0.10+,日常版要求 0.12+。
Neovim 配置依赖¶
快速版不需要 Node.js、Python provider、编译器或 Tree-sitter CLI。 日常版的按需安装说明见下面“两套独立配置”。
Install Tmux¶
brew install tmux
apt install tmux
First, please keep ~/.local/binin the PATH, then make && make installin the tmp/dir.
mkdir tmp
cd tmp/
curl -OL https://invisible-island.net/datafiles/release/ncurses.tar.gz
tar -xvf ncurses.tar.gz
LOC=$(curl -s https://api.github.com/repos/libevent/libevent/releases/latest | grep "browser_download_url"| awk '{ print $2 }' | awk -F '[\"\"]' '{print $2}' | grep tar.gz$ ) ; curl -OLl $LOC
LOC=$(curl -s https://api.github.com/repos/tmux/tmux/releases/latest | grep "browser_download_url" | awk '{ print $2 }' | awk -F '[\"\"]' '{print $2}'); curl -OL $LOC
# install libevent
mkdir $HOME/.local
cd $HOME/tmp
tar -zxf libevent*.tar.gz
cd libevent-*/
./configure --prefix=$HOME/.local --enable-shared
make && make install
cd $HOME/tmp
tar -zxf ncurses*.tar.gz
cd ncurses*/
./configure --prefix=$HOME/.local --with-shared --with-termlib --enable-pc-files --with-pkg-config-libdir=$HOME/.local/lib/pkgconfig
make && make install
# install tmux
cd $HOME/tmp
tar -zxf tmux-*.tar.gz
cd tmux-*/
PKG_CONFIG_PATH=$HOME/.local/lib/pkgconfig ./configure --prefix=$HOME/.local
make && make install
Neovim:两套独立配置¶
定位¶
LLM 负责生成代码后,编辑器仍需要快速查找、阅读差异、跳转和小范围修改。 这里保留两份单文件配置,不再让“快速模式”经过完整插件管理器。
nvim-lite:init-lite.lua,Neovim 0.10+,零第三方插件,离线可用。 内置语法高亮、文件浏览、撤销历史、注释、单词补全、分屏和剪贴板快捷键。nvim-daily:init.lua,Neovim 0.12+,保留 Telescope、Git、文件树、 bufferline、终端、Tree-sitter、VimTeX、个人 UltiSnips 和 nvim-cmp。 沿用原来默认关闭 LSP 的习惯,需要时开启。
一键安装配置¶
先安装 Neovim;macOS 可用 brew install neovim。
在本仓库根目录执行:
bash nvim/install.sh # 安装两套配置和启动命令
# 或只安装快速版:bash nvim/install.sh light
# 或只安装日常版:bash nvim/install.sh daily
export PATH="$HOME/.local/bin:$PATH" # 如果尚未加入 PATH
nvim-lite notes.md
nvim-daily project.py
安装器支持 macOS/Linux,复制配置到 ${XDG_CONFIG_HOME:-~/.config}/nvim-lite
和 nvim-daily。启动命令通过 NVIM_APPNAME 隔离数据、插件、缓存和历史。
原有 ~/.config/nvim 不会被覆盖,普通 nvim 继续使用原配置。
重复安装会将同名配置、启动命令移动到随机命名的 *.backup.* 目录,
可从其中的 config / launcher 恢复。新安装不会自动合并本地修改。
可选参数:--config-home DIR --bin-dir DIR,便于自定义或临时试用。
安装器不安装系统软件,也不修改 shell 配置;快速版安装后即可使用,
日常版首次启动需要 Git 和联网下载插件。
不安装也能试用快速版:
bash nvim/nvim-server.sh notes.md
原来的 NVIM_PROFILE=server 开关已由独立入口代替。
若希望普通 nvim 也默认使用快速版,可自行给 shell 添加
alias nvim='NVIM_APPNAME=nvim-lite command nvim'。
日常版按需准备¶
全文搜索需要
ripgrep,macOS:brew install ripgrep。Tree-sitter 解析器安装需要 C 编译器、tar、curl 和
tree-sitter-cli >= 0.26.1。 macOS:brew install tree-sitter-cli,如缺编译器则安装 Xcode Command Line Tools。 进入编辑器执行:TSInstallDefaults;之后按需:TSInstall <language>。 平时启动不会下载解析器,未安装的语言使用普通语法高亮。 升级插件时用:TSUpdate同步解析器;安装完成后重新打开文件启用高亮。默认保留个人 UltiSnips,需要 Python 的
pynvimprovider。 例如已有 uv 时执行uv tool install pynvim,再用:checkhealth vim.provider检查。无需片段时:NVIM_ENABLE_ULTISNIPS=0 nvim-daily,LSP 片段改用内置vim.snippet。 仓库里的 JSON/vsnip 片段仍保留,但日常版只启用 UltiSnips 这一套个人片段来源。VimTeX 只在打开 TeX 文件时加载;编译仍需本机 TeX/latexmk 环境。
NVIM_ENABLE_LSP=1 nvim-daily
首次按需要运行 :LspInstall pyright、:LspInstall ts_ls 等。
已配置 Python、Rust、TypeScript/JavaScript、LaTeX 和 Typst 的语言服务。
Mason 不再每次启动自动安装全部服务;系统 PATH 中已有的服务也可使用。
Node.js 只在所选服务(例如 pyright、ts_ls)需要时安装,无需为快速版安装。
安装后重新打开文件;用 :checkhealth vim.lsp 检查连接。
格式化独立于 LSP,通过 <Space>cf 手动执行,不在保存时改写文件。
用 :Mason 安装所需格式化器,或使用 PATH 中现有工具;
Python 优先 Ruff,否则 isort + Black,Lua 用 StyLua,Shell 用 shfmt,
前端使用 prettierd/prettier。:ConformInfo 可查看工具是否可用。
移除了面向所有文件的 codespell/Prettier 兜底,防止无关文件被错误处理。
快捷键¶
两套配置的 leader 都是空格。
<Space>ff:快速版输入文件路径并用 Tab 补全;日常版模糊搜索。<Space>pt:文件浏览(快速版 netrw,日常版 nvim-tree)。Tab/Shift-Tab:切换 buffer;<Space>q:关闭 buffer。<Space>ws/<Space>wv:水平/垂直分屏。<Space>y/<Space>p:系统剪贴板复制/粘贴;普通 y/p 使用内部寄存器。 SSH 下复制可使用 Neovim 原生 OSC 52,需终端支持;远端读取剪贴板取决于终端能力。gc/gcc:原生注释;快速版Ctrl-n/Ctrl-p:内置单词补全。<Space>fed:编辑当前配置。日常版:
<Space>fg全文搜索,:GitGit 操作,<Space>cf格式化。LSP 开启并连接后:
gd定义、gr引用、<Space>cs/<Space>ds文档符号、<Space>ss工作区符号、gK签名帮助、<Space>cq诊断列表。 修复了原来诊断列表与关闭 buffer、工作区符号与分屏、签名帮助与窗口导航的按键冲突。
清理与迁移依据¶
不是所有插件都需要换成新项目;优先处理不兼容接口、停止维护和重复功能。
Tree-sitter main 是不兼容重写;沿用 main,使用新安装 API 和
vim.treesitter.start()。 高亮与折叠由 Neovim 提供,实验性缩进仍来自插件;Python 保留原有缩进。nvim-lspconfig 本身没有废弃,旧
require('lspconfig').xxx.setup接口已废弃;改用vim.lsp.config/vim.lsp.enable,匹配 Mason 2 的接口。neodev 已停止开发。 原配置没有 lua_ls,先移除;以后确实需要 Lua 开发辅助时再加 lazydev。
symbols-outline 已归档, 使用现有 Telescope 的文档符号搜索,不再新增另一套符号插件。
删除 Comment.nvim、vim-oscyank:使用内置注释和剪贴板 provider。
删除 none-ls:当前配置里主要与 Conform 重复,统一格式化入口。 原 none-ls 的 djlint 诊断也不再提供;需要时单独配置。
删除欢迎页 alpha、rhubarb、fidget、原生 fzf 编译扩展、未配置的 cmp-cmdline、 重复的 vsnip/cmp-vsnip。保留 nvim-cmp,不为追新强制迁移补全引擎。
保留 UltiSnips 和个人 vim-snippets 依赖:已有片段包含 Python 动态逻辑及 helper 导入, 不能简单换成静态片段而保持行为一致。
维护¶
日常版插件按事件/命令加载,Tree-sitter 按上游要求启动时加载。
:Lazy 检查插件,:Lazy update 主动更新,:Lazy restore 按 lockfile 恢复。
安装目录里的 lazy-lock.json 记录具体版本,验证更新后可保存回本仓库。
两套配置均保持单文件,避免为了配置编辑器再维护复杂框架。
网络受限时,按本地代理实际端口设置 https_proxy / http_proxy 后再安装插件。
本地验证:python3 nvim/tests/smoke.py 检查快速版和安装器;
已有插件时使用 python3 nvim/tests/smoke.py --plugins ~/.local/share/nvim/lazy
同时检查日常版。测试在临时 XDG 目录运行,不修改现有配置。
将已安装配置同步回仓库:bash nvim/update_init_lua_from_current_os.sh daily
或 light。
Why tmux instead of Zellij¶
其实我还真的挺喜欢Rust的,但是对于Zellij的使用体验确实不太好。
所以最后还是选用了tmux.
具体的启用包括复制下面的config到~/.tmux.conf,然后tmux source-file .tmux.conf即可。
curl -SL https://raw.githubusercontent.com/hotchilipowder/my_config/refs/heads/main/tmux/.tmux.conf -o ~/.tmux.conf
tmux source-file ~/.tmux.conf
~/.tmux.conf
# : << EOF
# https://github.com/gpakosz/.tmux
# (‑●‑●)> dual licensed under the WTFPL v2 license and the MIT license,
# without any warranty.
# Copyright 2012— Gregory Pakosz (@gpakosz).
# /!\ do not edit this file
# instead, override settings in ~/.tmux.conf.local, see README.md
# See: https://github.com/christoomey/vim-tmux-navigator
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h' 'select-pane -L'
bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j' 'select-pane -D'
bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k' 'select-pane -U'
bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l' 'select-pane -R'
bind-key -T copy-mode-vi 'C-h' select-pane -L
bind-key -T copy-mode-vi 'C-j' select-pane -D
bind-key -T copy-mode-vi 'C-k' select-pane -U
bind-key -T copy-mode-vi 'C-l' select-pane -R
# -- general -------------------------------------------------------------------
set-option -g mouse
set -g history-limit 10000 # boost history
bind -r H resize-pane -L 2
bind -r J resize-pane -D 2
bind -r K resize-pane -U 2
bind -r L resize-pane -R 2
setw -g xterm-keys on
set -s escape-time 10 # faster command sequences
set -sg repeat-time 600 # increase repeat timeout
set -s focus-events on
set -s set-clipboard on # set for osyank-tmux
Tmux with Neovim¶
The basic useful for my tmux with neovim is vim-tmux-navigator, 但是这个最大的问题就是其中 <C-\>和 toggleterm.nvim 设置的快捷键冲突了, 所以只能取消了。
注意
使用 :nmap <C-\>就能看出来了
:nmapfor normal mode mappings:vmapfor visual mode mappings:imapfor insert mode mappings
{
'christoomey/vim-tmux-navigator',
keys={
{'<C-h>', ':<C-U>TmuxNavigateLeft<cr>'},
{'<C-j>', ':<C-U>TmuxNavigateDown<cr>'},
{'<C-k>', ':<C-U>TmuxNavigateUp<cr>'},
{'<C-l>', ':<C-U>TmuxNavigateRight<cr>'},
},
},
Plug 'christoomey/vim-tmux-navigator',
let g:tmux_navigator_no_mappings = 1
noremap <silent> {Left-Mapping} :<C-U>TmuxNavigateLeft<cr>
noremap <silent> {Down-Mapping} :<C-U>TmuxNavigateDown<cr>
noremap <silent> {Up-Mapping} :<C-U>TmuxNavigateUp<cr>
noremap <silent> {Right-Mapping} :<C-U>TmuxNavigateRight<cr>