LazyVim环境下nvim-tmux-navigation插件跨窗导航异常排查
我在LazyVim环境下安装了nvim-tmux-navigation插件,用于实现Tmux窗格与Neovim窗格间的无缝切换。当前无Tmux会话时,可通过Ctrl+hjkl正常切换Neovim窗格,但进入Tmux会话后,仅能切换Tmux窗格,无法在Neovim内部或Tmux与Neovim之间导航。NvimTmux相关命令可正常执行,推测问题出在Tmux侧配置。
我的配置文件
lua/plugins/tmux.lua
return { "alexghergh/nvim-tmux-navigation", event = "VeryLazy", config = function() local nvim_tmux_nav = require("nvim-tmux-navigation") nvim_tmux_nav.setup({ disable_when_zoomed = true, -- defaults to false keybindings = { left = "<C-h>", down = "<C-j>", up = "<C-k>", right = "<C-l>", last_active = "<C-\>", next = "<C-Space>", }, }) end, }
lua/config/keymap.lua
vim.keymap.set("n", "<C-h>", "<Cmd>NvimTmuxNavigateLeft<CR>", { silent = true }) vim.keymap.set("n", "<C-j>", "<Cmd>NvimTmuxNavigateDown<CR>", { silent = true }) vim.keymap.set("n", "<C-k>", "<Cmd>NvimTmuxNavigateUp<CR>", { silent = true }) vim.keymap.set("n", "<C-l>", "<Cmd>NvimTmuxNavigateRight<CR>", { silent = true }) vim.keymap.set("n", "<C-\>", "<Cmd>NvimTmuxNavigateLastActive<CR>", { silent = true }) vim.keymap.set("n", "<C-Space>", "<Cmd>NvimTmuxNavigateNavigateNext<CR>", { silent = true })
~/.tmux.conf
set -g default-terminal "screen-256color" set -g prefix C-a unbind C-b bind-key C-a send-prefix unbind % bind | split-window -h unbind '"' bind - split-window -v unbind r bind r source-file ~/.tmux.conf bind -r j resize-pane -D 5 bind -r k resize-pane -U 5 bind -r l resize-pane -R 5 bind -r h resize-pane -L 5 bind -r m resize-pane -Z set -g mouse on set-window-option -g mode-keys vi bind-key -T copy-mode-vi 'v' send -X begin-selection # start selecting text with "v" bind-key -T copy-mode-vi 'y' send -X copy-selection # copy text with "y" unbind -T copy-mode-vi MouseDragEnd1Pane # don't exit copy mode when dragging with mouse # remove delay for exiting insert mode with ESC in Neovim set -sg escape-time 10 # tpm plugin set -g @plugin 'tmux-plugins/tpm' # list of tmux plugins # set -g @plugin 'christoomey/vim-tmux-navigator' # THIS IS WHERE THE NEW CODE FOR NAVIGATION IS 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' tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")' if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \ "bind-key -n 'C-\' if-shell \"$is_vim\" 'send-keys C-\' 'select-pane -l'" if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \ "bind-key -n 'C-\' if-shell \"$is_vim\" 'send-keys C-\\\' 'select-pane -l'" bind-key -n 'C-Space' if-shell "$is_vim" 'send-keys C-Space' 'select-pane -t:.+' 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 bind-key -T copy-mode-vi 'C-\' select-pane -l bind-key -T copy-mode-vi 'C-Space' select-pane -t:.+ # END FANCY STUFF <--------- set -g @plugin 'jimeh/tmux-themepack' set -g @plugin 'tmux-plugins/tmux-resurrect' # persist tmux sessions after computer restart set -g @plugin 'tmux-plugins/tmux-continuum' # automatically saves sessions for you every 15 minutes set -g @themepack 'powerline/default/cyan' set -g @resurrect-capture-pane-contents 'on' set -g @continuum-restore 'on' # Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf) run '~/.tmux/plugins/tpm/tpm'
问题解决
问题根源是Fig的Figterm覆盖了Vim进程,导致Tmux无法识别运行的Neovim会话。参考相关讨论后,通过自定义脚本修复了该问题。
内容的提问来源于stack exchange,提问作者PandaPlaysAll
相关产品推荐
相关产品推荐

