[EXWM] 使用 Alt-<tab> 切换程序

(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应用程序里切换 ,

2 个赞

我是用ivy切换,我习惯将程序当buffer来管理,不过我最常用的还是 jump-or-exec,就是如果程序没开,就打开程序,如果程序已经开了,就切换window

对常用的应用,我也用类似 jump-or-exec 的方法,上面的函数,其实也可以用 ivy 搜索

嗯,你平时就使用 EXWM,还是只是测试体验一下?

用了大概一个星期了, 感觉在窗口切换, 管理方面还是很方便的. 但是还有些不习惯的地方, 和其他一些小问题. 正在考虑要不要作为主要WM