awesome-tab 与 hydra 结合,清洁界面并减少按键记忆负担


#1

本人并不是很喜欢标签栏或则侧边栏之类的功能,因为他们在绝大多数时间中的作用只是占界面空间。

但是,我不得不承认,在代码任务复杂时,上述两者确实可以在一定程度上减少大脑负担。

因此,我使用 hydra 配合 awesome 在这两个问题上做了一个折中。编写代码时不会显示标签栏,只有在需要切换标签时才通过 hydra 显示标签栏。

效果图:

而在没有开启 hydra 时没有 tab 栏,界面清爽干净:

以下是在 spacemacs 中的代码,使用 spacemacs 自带的 spacemacs|define-transient-state 宏 ,本质不过是对 hdyra 的封装,想必各位都是看得懂的。

(defun mp-hacking/init-awesome-tab ()
  (use-package awesome-tab
    :commands (awesome-tab-toggle-tabbar-mode-on awesome-tab-toggle-tabbar-mode-off)
    :defer t
    :init
    (progn
      (spacemacs|define-transient-state awesometab
        :title "Awesome-tab Transient State"
        :doc "
 Tab^^                    Group^^                   Other^^
 ───────^^────────────  ─────^^───────────────  ─────^^──────────────
 [_h_/_l_] pre/next       [_p_/_n_] pre/next group  [_H_/_L_] other pre/next
 [_b_/_e_] beginning/end  [_s_] switch            [_d_/_K_] delete/Kill all    [_q_] quit"
        :on-enter (awesome-tab-toggle-tabbar-mode-on)
        :on-exit (awesome-tab-toggle-tabbar-mode-off)
        :bindings
        ;; Tab
        ("h" awesome-tab-backward)
        ("l" awesome-tab-forward)
        ("b" awesome-tab-select-beg-tab)
        ("e" awesome-tab-select-end-tab)
        ;; Group
        ("p" awesome-tab-backward-group)
        ("n" awesome-tab-forward-group)
        ("s" awesome-tab-switch-group)
        ;; Other
        ("d" spacemacs/kill-this-buffer)
        ("K" awesome-tab-kill-all-buffers-in-current-group)
        ("H" awesome-tab-forward-tab-other-window)
        ("L" awesome-tab-backward-tab-other-window)
        ("q" nil :exit t))
      (memacs/define-evil-normal-keybinding "C-t" 'spacemacs/awesometab-transient-state/body))
      :config
      (progn
        (setq awesome-tab-active-color
              (face-attribute 'spacemacs-normal-face :background)
              awesome-tab-inactive-color
              (face-attribute 'font-lock-comment-face :foreground))
        (set-face-attribute 'awesome-tab-selected nil
                            :foreground awesome-tab-active-color
                            :underline nil
                            :overline awesome-tab-active-color
                            )
        (set-face-attribute 'awesome-tab-unselected nil
                            :foreground awesome-tab-inactive-color
                            :underline awesome-tab-inactive-color
                            :overline nil
                            ))
      ))

其中 memacs/define-evil-normal-keybinding 是对 evil 的 normal 状态和 motion 状态的键位绑定的封装。

(defun memacs/define-evil-normal-keybinding (key def &rest bindings)
  "Binding keys and func for normal state map and motion state map"
  (while key
    (define-key evil-normal-state-map (kbd key) def)
    (define-key evil-motion-state-map (kbd key) def)
    (setq key (pop bindings) def (pop bindings)))
  )

欢迎各位交流探讨。


#2

挺喜欢你的字体的?能说一下是什么字体吗?


#3

monofur for Powerline


#4

Thanks


#5

awesome-tab-toggle-tabbar-mode-on和awesome-tab-toggle-tabbar-mode-off没有定义啊?


#7

请问,能在非spacemacs中用 spacemacs|define-transient-state 这个宏不(当然要将这个宏copy过去)?


#8

我发这个贴时,awesome-tab 只有 1.6 版本,现在已经到了5.9版本了,这两个函数已经没有了


#9

哈哈哈哈哈哈哈


#10

恐怕不行,这个宏里面有很多 spacemacs 自己定义的函数


#11

我根据最新版本调整了一些配置,并将它独立成了一个layer :

由于 awesome-tab5.9 使用 powerline 会影响到 spaceline ,所以我使用自己fork后修改的版本,它去掉了 powerline 相关内容,使用原来的显示方式,又保留 ace jump 、 icon 等功能。


#12

参考上面和 awesome tab 的 readme,写了一个非 spacemacs 可以用的 use package 配置

  (use-package awesome-tab
    :commands (awesome-tab-mode)
    :load-path "plugin/awesome-tab"
    :init
    (defhydra hydra-tab (
                         :pre (awesome-tab-mode t)
                         :post (awesome-tab-mode -1))
      "
   ^^^^Fast Move             ^^^^Tab                    ^^Search            ^^Misc
  -^^^^--------------------+-^^^^---------------------+-^^----------------+-^^---------------------------
     ^_k_^   prev group    | _C-a_^^     select first | _b_ search buffer | _C-k_   kill buffer
   _h_   _l_  switch tab   | _C-e_^^     select last  | _g_ search group  | _C-S-k_ kill others in group
     ^_j_^   next group    | _a_^^     ace jump     | ^^                | ^^
   ^^0 ~ 9^^ select window | _C-h_/_C-l_ move current | ^^                | ^^
  -^^^^--------------------+-^^^^---------------------+-^^----------------+-^^---------------------------
  "
      ("h" awesome-tab-backward-tab)
      ("j" awesome-tab-forward-group)
      ("k" awesome-tab-backward-group)
      ("l" awesome-tab-forward-tab)
      ("a" awesome-tab-ace-jump)
      ("C-a" awesome-tab-select-beg-tab)
      ("C-e" awesome-tab-select-end-tab)
      ("C-h" awesome-tab-move-current-tab-to-left)
      ("C-l" awesome-tab-move-current-tab-to-right)
      ("b" ivy-switch-buffer)
      ("g" awesome-tab-counsel-switch-group)
      ("C-k" kill-current-buffer)
      ("C-S-k" awesome-tab-kill-other-buffers-in-current-group)
      ("q" nil "quit"))
    :bind
    (("M-t" . hydra-tab/body)))

#13

继续微调下:

 ;; tabbar
(defun awesome-tab-config ()
  (use-package awesome-tab
    :commands (awesome-tab-mode)
    :load-path "site-lisp/awesome-tab" 
    :init
    (set-face-attribute
     'header-line nil
     :box nil)
    (setq awesome-tab-style "alternate")
    (defhydra hydra-tab (:color pink :hint nil
				:pre (awesome-tab-mode t)
				:post (awesome-tab-mode -1))
      "
   ^^Tab                   Group^^               Other^^                  Search
  -^^^^--------------------+-^^------------------+-^^---------------------+-^^----------------
    ^_H_^    move to left  | _p_   prev group    | _d_   kill buffer      | _b_ search buffer
  _h_   _l_  switch tab    | _n_   next group    | _K_   kill-all-buffers | _g_ search group
   ^ _L_^    move to right | _s_   switch group  | _C-h_ backward window  | ^^
  ^^0 ~ 9^^  select window | ^^                  | _C-l_ forward window   | ^^
  -^^^^--------------------+-^^------------------+-^^---------------------+-^^----------------
"
      ;; Tab
      ("h" awesome-tab-backward-tab)
      ("l" awesome-tab-forward-tab)
      ("H" awesome-tab-move-current-tab-to-left)
      ("L" awesome-tab-move-current-tab-to-right)
      ;; Group
      ("p" awesome-tab-backward-group)
      ("n" awesome-tab-forward-group)
      ("s" awesome-tab-switch-group)
      ;; Other
      ("d" spacemacs/kill-this-buffer)q
      ("K" awesome-tab-kill-all-buffers-in-current-group)
      ;; ("b" awesome-tab-select-beg-tab)
      ;; ("e" awesome-tab-select-end-tab)
      ("C-h" awesome-tab-backward-tab-other-window)
      ("C-l" awesome-tab-forward-tab-other-window)
      ;; Search
      ("b" ivy-switch-buffer)
      ("g" awesome-tab-counsel-switch-group)
      ("q" nil "quit"))
    :bind
    (("M-t" . hydra-tab/body)))
  )

TIM%E5%9B%BE%E7%89%8720190909102848


#14

markdown语法啊 ,这样格式化

(use-package awesome-tab
    :commands (awesome-tab-mode)
    :load-path "plugin/awesome-tab")


#15

3Q!以按你的指示重新编辑了。谢谢!