diff --git a/modules/tools/tmux/README.org b/modules/tools/tmux/README.org index ed976f94a..69c5f7e4a 100644 --- a/modules/tools/tmux/README.org +++ b/modules/tools/tmux/README.org @@ -10,7 +10,8 @@ This module provides an API for talking to Tmux sessions. /This module has no dedicated maintainers./ [[doom-contrib-maintainer:][Become a maintainer?]] ** Module flags -/This module has no flags./ +- +navigator :: + Enable navigation between Emacs buffer windows and tmux panes. reference: [[https://github.com/keith/evil-tmux-navigator][evil-tmux-navigator]] ** Packages /This module doesn't install any packages./ diff --git a/modules/tools/tmux/config.el b/modules/tools/tmux/config.el new file mode 100644 index 000000000..52efeb321 --- /dev/null +++ b/modules/tools/tmux/config.el @@ -0,0 +1,62 @@ +;;; tools/tmux/config.el -*- lexical-binding: t; -*- + +(when (modulep! +navigator) + (use-package! evil + :defer t + :config + + ; This requires windmove commands + (when (fboundp 'windmove-default-keybindings) + (windmove-default-keybindings)) + + (defun tmux-navigate (direction) + (let + ((cmd (concat "windmove-" direction))) + (condition-case nil + (funcall (intern cmd)) + (error + (tmux-command direction))))) + + (defun tmux-command (direction) + (unless (display-graphic-p) + (shell-command-to-string + (concat "tmux select-pane -" + (tmux-direction direction))))) + + (defun tmux-direction (direction) + (upcase + (substring direction 0 1))) + + (defun tmux-nav-left () + (interactive) + (tmux-navigate "left")) + + (defun tmux-nav-right () + (interactive) + (tmux-navigate "right")) + + (defun tmux-nav-up () + (interactive) + (tmux-navigate "up")) + + (defun tmux-nav-down () + (interactive) + (tmux-navigate "down")) + + (define-key evil-normal-state-map (kbd "C-h") #'tmux-nav-left) + (define-key evil-normal-state-map (kbd "C-j") #'tmux-nav-down) + (define-key evil-normal-state-map (kbd "C-k") #'tmux-nav-up) + (define-key evil-normal-state-map (kbd "C-l") #'tmux-nav-right) + + (define-key evil-motion-state-map (kbd "C-h") #'tmux-nav-left) + (define-key evil-motion-state-map (kbd "C-j") #'tmux-nav-down) + (define-key evil-motion-state-map (kbd "C-k") #'tmux-nav-up) + (define-key evil-motion-state-map (kbd "C-l") #'tmux-nav-right) + + ;; Modify `evil-evilified-state-map-original' because `evil-evilified-state-map' + ;; is reset to this value each time the evilify macro is run. + (when (boundp 'evil-evilified-state-map-original) + (define-key evil-evilified-state-map-original (kbd "C-h") #'tmux-nav-left) + (define-key evil-evilified-state-map-original (kbd "C-j") #'tmux-nav-down) + (define-key evil-evilified-state-map-original (kbd "C-k") #'tmux-nav-up) + (define-key evil-evilified-state-map-original (kbd "C-l") #'tmux-nav-right))))