(defun exwm/switch-buffer (&optional same-app?)
(interactive "P")
(let ((ivy-wrap t) ; 设置 ivy-wrap 为 non-nil 可以循环切换
(apps (--filter
(and (not (string-match-p "^ " it))
(or (not same-app?) ; same-app? 是 non-nil 则可以在属于同一个 class 的程序间切换
(equal exwm-class-name
(buffer-local-value 'exwm-class-name
(get-buffer it)))))
(--map (buffer-name (cdr it)) exwm--id-buffer-alist))))
(if (not apps)
(message "No apps !!")
;; 当前的 buffer 可能不是 EXWM 的 buffer, 也加入到列表中
(add-to-list 'apps (buffer-name))
(ivy-read "Switch app: "
apps
:preselect (buffer-name)
:require-match t
:action (lambda (buffer)
(let ((win (get-buffer-window buffer)))
;; 如果 buffer 已经显示, 直接选择对应 window
(if (window-live-p win)
(select-window win)
(switch-to-buffer buffer))))
;; 利用 `ivy-read` 的 `:keymap` 属性使得`Alt-<tab>` 可以不断重复
:keymap (let ((map (make-sparse-keymap)))
(define-key map (this-command-keys)
#'ivy-next-line-and-call)
map)))))
(exwm-input-set-key (kbd "M-<tab>") #'exwm/switch-buffer)
(exwm-input-set-key (kbd "M-`") (lambda () (interactive) (exwm/switch-buffer t)))
在 EXWM 里, Alt-<tab>
可以切换到下一个EXWM应用程序里切换 ,