Kiểu 'trình duyệt' cho emacs?


22

Tôi muốn các tab như firefox nhưng cho emacs.

Tôi tìm thấy cái này: http://emacswiki.org/emacs/TabBarMode

Nhưng nó chỉ thêm vào mỗi bộ đệm ( cửa sổ theo thuật ngữ Emacs) một thanh hiển thị bộ đệm hiện đang mở.

Tôi muốn một tab để có thể chứa nhiều bộ đệm ( cửa sổ trong temacology Emacs), mà tôi có thể chia theo ý muốn. Tức là mỗi tab phải tương ứng với một "trạng thái cửa sổ" (theo nghĩa window-state-get).

Tôi có một tab cho các nhiệm vụ của mình, một tab khác cho mã, một tab khác để đọc web, v.v.

Điều này có thể không? Tabbar có thể được điều chỉnh để làm điều này?

[edit2]
Câu hỏi này đã thu hút nhiều sự chú ý hơn tôi dự đoán. Có vẻ như có một giải pháp, nhưng một giải pháp sẽ cần một chút nghiên cứu và điều chỉnh. Mặc dù điều này / tuần tới hơi bận rộn đối với tôi, tôi sẽ phân tích các câu trả lời và sẽ cố gắng xây dựng một cái gì đó hoạt động và sau đó tôi sẽ chỉnh sửa câu hỏi này để phản ánh những phát hiện của mình. Vui lòng giữ =)

[sửa]
Sắp xếp tương tự như:
/programming/24157754/make-frames-in-emacs-gui-behaves-like-frames-in-terminal

Tôi cũng sẽ giải quyết với nhiều khung trong một phiên GUI.


2
"Tôi muốn một tab có thể chứa nhiều bộ đệm, tôi có thể chia theo ý muốn." Bạn có nghĩa là nhiều cửa sổ ?
Malabarba 17/03/2015

1
Nó giống như tôi muốn có các tab rất mờ. Tôi sẽ tạo ra chúng và sau đó đưa chúng vào cửa sổ. Tôi muốn một tab là một khung. Sau đó, một tab mới một khung mới. Trong mỗi tab / khung tôi có thể mở các cửa sổ / (bộ đệm) mong muốn. Đây có phải là có thể làm được? (Tức là không có tên bộ đệm được mã hóa cứng, v.v.)
Leo Ufimtsev 17/03/2015

1
Có một biến liên quan đến các cửa sổ cụ thể, nhưng đã được một hoặc hai tháng kể từ khi tôi thấy một chủ đề nói về nó và tôi không biết nó được gọi là gì ngoài tầm tay. Bạn có thể quan tâm đến việc sử dụng một hệ thống tương tự như khung hình trong đó một danh sách chứa các bộ đệm được liên kết với một khung và danh sách đó được kết hợp vào tham số khung. Bạn có thể sử dụng biến được liên kết với một cửa sổ cụ thể và biến nó thành một danh sách, thêm / xóa bộ đệm khỏi danh sách - danh sách đó sẽ là một nhóm bộ đệm được sử dụng bởi thanh tab. Đây là tất cả lý thuyết, nhưng tôi tin rằng nó sẽ làm việc.
luật

1
Tôi nghĩ bạn có thể tham khảo: stackoverflow.com/questions/24157754/, nhưng bài đăng đó dường như không có câu trả lời chắc chắn: - /
Leo Ufimtsev 17/03/2015

1
Tôi khuyên bạn nên xem qua gói elscreen.
blarghmatey 17/03/2015

Câu trả lời:


8

Chia bộ đệm theo nhóm

Nó có thể với thanh tab. Bạn có thể thêm quy tắc vào bộ đệm nhóm trong nhóm. Đây là một đoạn cơ bản:

(defun tabbar-buffer-groups ()
  "Returns the list of group names the current buffer belongs to."
  (list
   (cond

    ;; ADD RULES TO SPLIT BUFFERS IN GROUPS HERE!

    ;; if buffer is not grouped by the rules you would add above 
    ;; put it in the "General" group:
    (t
       "General"
     ))))

Quy tắc ví dụ:

  1. Liệt kê tên bộ đệm:
    ((member (buffer-name)
             '("*scratch*" "*Messages*" "*Help*"))
     "Common" ;; this is a group name
     )
  1. Về bộ đệm chung, tôi thích đặt "Chung" cho mỗi bộ đệm có tên bắt đầu bằng một ngôi sao. Điều này đưa ra một ví dụ về việc tạo bộ đệm cho quy tắc này:
    ((string-equal "*" (substring (buffer-name) 0 1))
     "Common"
     )
  1. Đây là một ví dụ về nhóm bộ đệm theo chế độ chính:
    ((memq major-mode
           '(org-mode text-mode rst-mode))
     "Text"
     )
  1. Đây là một ví dụ về việc nhóm các bộ đệm dựa trên chế độ mà chúng có nguồn gốc từ:
    ((or (get-buffer-process (current-buffer))
         ;; Check if the major mode derives from `comint-mode' or
         ;; `compilation-mode'.
         (tabbar-buffer-mode-derived-p
          major-mode '(comint-mode compilation-mode)))
     "Process"
     )
  1. Dưới đây là một ví dụ về việc nhóm các tab bằng regrec:
    ((string-match "^__" (buffer-name))
     "Templates"
     )
  1. Bộ đệm theo chế độ chính:
    (if (and (stringp mode-name)
                  ;; Take care of preserving the match-data because this
                  ;; function is called when updating the header line.
                  (save-match-data (string-match "[^ ]" mode-name)))
             mode-name
           (symbol-name major-mode))

Khi bạn soạn các quy tắc, bạn có thể nhấn vào dòng tab + hoặc - trên thanh tab của tab để chuyển đổi các nhóm và cả ◀ và ▶ để chuyển giữa các bộ đệm. Hoặc chỉ ràng buộc các defun sau:

tabbar-forward
tabbar-backward
tabbar-forward-group
tabbar-backward-group

và di chuyển giữa các tab và nhóm tab bằng bàn phím.

Cá nhân tôi nhóm các tab, để tôi thấy những gì đang mở, nhưng điều hướng chúng với ido-switch-buffer.

Chuyển đổi giữa các quy tắc

Ngoài ra người ta có thể định nghĩa tập hợp các quy tắc nhóm bộ đệm khác nhau và chu kỳ giữa các quy tắc này. Đây là một ví dụ về việc đạp xe giữa hai bộ quy tắc nhóm bộ đệm:

;; tab-groups!
(setq tbbr-md "common")
(defun toggle-tabbar-mode ()
  "Toggles tabbar modes - all buffers vs. defined in the `tabbar-buffer-groups'."
  (interactive)
  (if (string= tbbr-md "groups")
      (progn ;; then
        (setq tabbar-buffer-groups-function 'tabbar-buffer-groups-common)
        (setq tbbr-md "common"))
    (progn ;; else
      (setq tabbar-buffer-groups-function 'tabbar-buffer-groups)
      (setq tbbr-md "groups"))))
;; by default - all tabs:
(setq tabbar-buffer-groups-function 'tabbar-buffer-groups-common)

Đây Toggles giữa tabbar-buffer-groups-commontabbar-buffer-groupstab nhóm defuns.

Sắp xếp bộ đệm thanh theo tên

Tôi thấy nó có lợi để sắp xếp bộ đệm thanh theo tên. Đây là cách để có được nó:

(defun tabbar-add-tab (tabset object &optional append_ignored)
  "Add to TABSET a tab with value OBJECT if there isn't one there yet.
If the tab is added, it is added at the beginning of the tab list,
unless the optional argument APPEND is non-nil, in which case it is
added at the end."
  (let ((tabs (tabbar-tabs tabset)))
    (if (tabbar-get-tab object tabset)
        tabs
      (let ((tab (tabbar-make-tab object tabset)))
        (tabbar-set-template tabset nil)
        (set tabset (sort (cons tab tabs)
                          (lambda (a b) (string< (buffer-name (car a)) (buffer-name (car b))))))))))

Cảm ơn bạn đã trả lời chi tiết. Tôi sẽ cố gắng để thử những điều trên và sẽ cho bạn biết ~ cuối cùng :)
Leo Ufimtsev

Nhưng OP không muốn "một thanh tab trên mỗi cửa sổ", anh ta muốn một thanh tab trên mỗi khung và mỗi tab trong thanh tab phải đại diện cho "cấu hình cửa sổ" (nghĩa là một số cửa sổ) chứ không phải là bộ đệm, vì vậy việc nhóm các bộ đệm không phải là vấn đề .
Stefan

6

ATTRIBUTE: Việc nhóm các bộ đệm trên cơ sở mỗi khung là việc triển khai trực tiếp các khái niệm và chọn các phần mã được phát triển / viết bởi Alp Aker trong thư viện khung-bufs: https://github.com/alpaker/Frame-Bufs

Sau đây là một ví dụ về cách sử dụng linh hoạt các tabbar.eltab / bộ đệm của thư viện và nhóm trên cơ sở từng khung bằng cách thêm các tab / bộ đệm với C-c C-ahoặc xóa các tab / bộ đệm bằng C-c C-n. Chỉ có hai (2) nhóm - được liên kết với khung hiện tại (nghĩa là "A") và KHÔNG được liên kết với khung hiện tại (nghĩa là "N"). Các nhóm là khung cục bộ, có nghĩa là mỗi khung có thể có nhóm riêng. Nhóm tùy chỉnh có thể được thiết lập lại với C-c C-r. Chuyển đổi giữa các nhóm liên kết và không liên kết với C-tab. Chuyển sang tab / bộ đệm tiếp theo trong nhóm hiện tại với M-s-right. Chuyển sang tab / bộ đệm trước đó trong nhóm hiện tại với M-s-left.

Tab / bộ đệm có thể được thêm hoặc xóa theo chương trình với my-add-buffermy-remove-buffer. Để biết ví dụ về cách mở một số bộ đệm nhất định trong các khung được chọn, vui lòng xem chủ đề liên quan có tên Cách chặn tệp trước khi mở và quyết định khung nào : /programming//a/18371427/2112361 Hàm my-add-buffersẽ cần được kết hợp tại các vị trí thích hợp của mã trong liên kết trên nếu người dùng chọn thực hiện tính năng đó.

Người dùng có thể muốn tạo một mục trong một tùy chỉnh mode-line-formathiển thị tên của nhóm tab hiện tại trong dòng chế độ bằng cách kết hợp đoạn mã sau: (:eval (when tabbar-mode (format "%s" (tabbar-current-tabset t)))) Tuy nhiên, việc tùy chỉnh dòng chế độ chi tiết hơn nằm ngoài phạm vi của ví dụ này.

Các chức năng tabbar-add-tabđã được sửa đổi để bảng chữ cái các tab / bộ đệm.

Chức năng tabbar-line-tabđã được sửa đổi để cung cấp bốn (4) khuôn mặt khác nhau tùy theo tình huống. Nếu tab / bộ đệm được liên kết với khung và IS được chọn, thì hãy sử dụng tabbar-selected-associatedkhuôn mặt. Nếu tab / bộ đệm được liên kết với khung và KHÔNG được chọn, thì hãy sử dụng tabbar-unselected-associatedkhuôn mặt. Nếu tab / bộ đệm KHÔNG được liên kết với khung và IS được chọn, thì hãy sử dụng tabbar-selected-unassociatedkhuôn mặt. Nếu tab / bộ đệm KHÔNG được liên kết với khung và KHÔNG được chọn, thì hãy sử dụng tabbar-unselected-unassociatedkhuôn mặt.

;; Download tabbar version 2.0.1 by David Ponce:
;;   https://marmalade-repo.org/packages/tabbar
;; or use package-install for marmalade repositories.

;; Place tabbar-2.0.1.el in the `load-path` -- it is okay to rename it to tabbar.el
;; or add the directory (where `tabbar.el` resides) to the `load-path`.
;; EXAMPLE:  (setq load-path (append '("/Users/HOME/.emacs.d/lisp/") load-path))

(require 'tabbar)

(setq tabbar-cycle-scope 'tabs)

(remove-hook 'kill-buffer-hook 'tabbar-buffer-track-killed)

(defun my-buffer-groups ()
  "Function that gives the group names the current buffer belongs to.
It must return a list of group names, or nil if the buffer has no
group.  Notice that it is better that a buffer belongs to one group."
  (list
    (cond
      ((memq (current-buffer) (my-buffer-list (selected-frame)))
        "A")
      (t
        "N"))))

(setq tabbar-buffer-groups-function 'my-buffer-groups) ;; 'tabbar-buffer-groups

;; redefine tabbar-add-tab so that it alphabetizes / sorts the tabs
(defun tabbar-add-tab (tabset object &optional append)
  "Add to TABSET a tab with value OBJECT if there isn't one there yet.
If the tab is added, it is added at the beginning of the tab list,
unless the optional argument APPEND is non-nil, in which case it is
added at the end."
  (let ((tabs (tabbar-tabs tabset)))
    (if (tabbar-get-tab object tabset)
        tabs
      (let* ((tab (tabbar-make-tab object tabset))
             (tentative-new-tabset
               (if append
                 (append tabs (list tab))
                 (cons tab tabs)))
             (new-tabset
               (sort
                  tentative-new-tabset
                  #'(lambda (e1 e2)
                     (string-lessp
                       (format "%s" (car e1)) (format "%s" (car e2)))))))
        (tabbar-set-template tabset nil)
        (set tabset new-tabset)))))

;; AUTHOR:  Alp Aker -- https://github.com/alpaker/Frame-Bufs
;; @lawlist extracted/revised the function(ality) from said library.
(defun my-buffer-list (frame)
  ;; Remove dead buffers.
  (set-frame-parameter frame 'frame-bufs-buffer-list
    (delq nil (mapcar #'(lambda (x) (if (buffer-live-p x) x))
      (frame-parameter frame 'frame-bufs-buffer-list))))
  ;; Return the associated-buffer list.
  (frame-parameter frame 'frame-bufs-buffer-list))

(defun my-kill-buffer-fn ()
"This function is attached to a buffer-local `kill-buffer-hook'."
  (let ((frame (selected-frame))
        (current-buffer (current-buffer)))
    (when (memq current-buffer (my-buffer-list frame))
      (my-remove-buffer current-buffer frame))))

;; AUTHOR:  Alp Aker -- https://github.com/alpaker/Frame-Bufs
;; @lawlist extracted/revised the function(ality) from said library.
(defun my-add-buffer (&optional buf frame)
"Add BUF to FRAME's associated-buffer list if not already present."
(interactive)
  (let* ((buf (if buf buf (current-buffer)))
         (frame (if frame frame (selected-frame)))
         (associated-bufs (frame-parameter frame 'frame-bufs-buffer-list)))
    (unless (bufferp buf)
      (signal 'wrong-type-argument (list 'bufferp buf)))
    (unless (memq buf associated-bufs)
      (set-frame-parameter frame 'frame-bufs-buffer-list (cons buf associated-bufs)))
    (with-current-buffer buf
      (add-hook 'kill-buffer-hook 'my-kill-buffer-fn 'append 'local))
    (when tabbar-mode (tabbar-display-update))))

;; AUTHOR:  Alp Aker -- https://github.com/alpaker/Frame-Bufs
;; @lawlist extracted/revised the function(ality) from said library.
(defun my-remove-buffer (&optional buf frame)
"Remove BUF from FRAME's associated-buffer list."
(interactive)
  (let ((buf (if buf buf (current-buffer)))
        (frame (if frame frame (selected-frame))))
    (set-frame-parameter frame 'frame-bufs-buffer-list
      (delq buf (frame-parameter frame 'frame-bufs-buffer-list)))
    (when tabbar-mode (tabbar-display-update))))

;; AUTHOR:  Alp Aker -- https://github.com/alpaker/Frame-Bufs
;; @lawlist extracted/revised the function(ality) from said library.
(defun my-buffer-list-reset ()
    "Wipe the entire slate clean for the selected frame."
  (interactive)
    (modify-frame-parameters (selected-frame) (list (cons 'frame-bufs-buffer-list nil)))
    (when tabbar-mode (tabbar-display-update)))

(defun my-switch-tab-group ()
"Switch between tab group `A` and `N`."
(interactive)
  (let ((current-group (format "%s" (tabbar-current-tabset t)))
        (tab-buffer-list (mapcar
            #'(lambda (b)
                (with-current-buffer b
                  (list (current-buffer)
                        (buffer-name)
                        (funcall tabbar-buffer-groups-function))))
                 (funcall tabbar-buffer-list-function))))
    (catch 'done
      (mapc
        #'(lambda (group)
            (when (not (equal current-group
                          (format "%s" (car (car (cdr (cdr group)))))))
              (throw 'done (switch-to-buffer (car (cdr group))))))
        tab-buffer-list))))

(defface tabbar-selected-associated
  '((t :background "black" :foreground "yellow" :box (:line-width 2 :color "yellow")))
  "Face used for the selected tab -- associated with the `frame-bufs-buffer-list`."
  :group 'tabbar)

(defface tabbar-unselected-associated
  '((t :background "black" :foreground "white" :box (:line-width 2 :color "white")))
  "Face used for unselected tabs  -- associated with the `frame-bufs-buffer-list`."
  :group 'tabbar)

(defface tabbar-selected-unassociated
  '((t :background "black" :foreground "white" :box (:line-width 2 :color "firebrick")))
  "Face used for the selected tab -- UNassociated with the `frame-bufs-buffer-list`."
  :group 'tabbar)

(defface tabbar-unselected-unassociated
  '((t :background "black" :foreground "white" :box (:line-width 2 :color "blue")))
  "Face used for unselected tabs -- UNassociated with the `frame-bufs-buffer-list`."
  :group 'tabbar)

(setq tabbar-background-color "black")

(defsubst tabbar-line-tab (tab)
  "Return the display representation of tab TAB.
That is, a propertized string used as an `header-line-format' template
element.
Call `tabbar-tab-label-function' to obtain a label for TAB."
  (concat
    (propertize
      (if tabbar-tab-label-function
          (funcall tabbar-tab-label-function tab)
        tab)
      'tabbar-tab tab
      'local-map (tabbar-make-tab-keymap tab)
      'help-echo 'tabbar-help-on-tab
      'mouse-face 'tabbar-highlight
      'face
        (cond
          ((and
              (tabbar-selected-p tab (tabbar-current-tabset))
              (memq (current-buffer) (my-buffer-list (selected-frame))))
            'tabbar-selected-associated)
          ((and
              (not (tabbar-selected-p tab (tabbar-current-tabset)))
              (memq (current-buffer) (my-buffer-list (selected-frame))))
            'tabbar-unselected-associated)
          ((and
              (tabbar-selected-p tab (tabbar-current-tabset))
              (not (memq (current-buffer) (my-buffer-list (selected-frame)))))
            'tabbar-selected-unassociated)
          ((and
              (not (tabbar-selected-p tab (tabbar-current-tabset)))
              (not (memq (current-buffer) (my-buffer-list (selected-frame)))))
            'tabbar-unselected-unassociated))
      'pointer 'hand)
    tabbar-separator-value))

(define-key global-map "\C-c\C-r" 'my-buffer-list-reset)

(define-key global-map "\C-c\C-a" 'my-add-buffer)

(define-key global-map "\C-c\C-n" 'my-remove-buffer)

(define-key global-map (kbd "<M-s-right>") 'tabbar-forward)

(define-key global-map (kbd "<M-s-left>") 'tabbar-backward)

(define-key global-map [C-tab] 'my-switch-tab-group)

(tabbar-mode 1)

Ảnh chụp màn hình sau đây mô tả hai nhóm bộ đệm / tab có thể: (1) ở bên trái là một nhóm các bộ đệm / tab được liên kết với khung có tên SYSTEM[tab màu vàng và trắng], với chữ in hoa "A" được chỉ định trong chế độ dòng; và (2) ở bên phải là một nhóm các bộ đệm / tab KHÔNG được liên kết với khung có tên SYSTEM[tab màu xanh và đỏ], với chữ in hoa "N" được chỉ định trong dòng chế độ.

Thí dụ


Nhưng OP không muốn "một thanh tab trên mỗi cửa sổ", anh ta muốn một thanh tab trên mỗi khung và mỗi tab trong thanh tab phải đại diện cho "cấu hình cửa sổ" (nghĩa là một số cửa sổ) thay vì bộ đệm.
Stefan

5

Xem xét việc kiểm tra màn hình , mặc dù nó không thực sự là bộ đệm nhóm.

Những gì nó làm là nhóm các cửa sổ và cung cấp quyền truy cập vào nhiều bố cục (tab) mà bạn có thể di chuyển nhanh chóng. Quy trình làm việc của tôi thường có một số mã Ruby và các kiểm tra liên quan trong một màn hình, trong khi các ghi chú cần làm và Org của tôi ở một màn hình khác và có lẽ bộ đệm đầu để soạn thảo các truy vấn SQL nằm ở một phần ba. Điều này cho phép tôi chuyển đổi giữa các tác vụ và dự án một cách dễ dàng, mặc dù mỗi màn hình dựa trên cùng một nhóm bộ đệm.


3

Làm thế nào về plugin của tôi, centaur-tab? Nó có rất nhiều tùy chọn cấu hình, nó thực sự có chức năng, nó được hỗ trợ bởi các chủ đề rất phổ biến như Kaolin Themes và nói chung là một gói thực sự đẹp mắt và thẩm mỹ (theo phản hồi của người dùng). Nó có sẵn trong MELPA và có vẻ như thế này:

nhập mô tả hình ảnh ở đây


Đây dường như là một "mỗi tab đại diện cho một bộ đệm và mỗi cửa sổ có một thanh tab riêng" không phải là giải pháp.
Stefan

Tôi vừa thêm một tùy chỉnh để hiển thị các nhóm tab thay vì tên tab để trong chức năng bạn thiết lập quy tắc (ví dụ: elisp và lisp trong một nhóm, nhóm c và c ++ trong một nhóm khác và vv) và trong các tab đó, các nhóm đó được hiển thị.
Emmanuel Bustos

Nó vẫn không trả lời câu hỏi, nơi cần có một thanh tab trên mỗi khung (thay vì mỗi cửa sổ) và mỗi tab đại diện cho cấu hình cửa sổ.
Stefan

Ok tôi đã không hủy bỏ. Tôi sẽ điều tra và làm việc với nó!
Emmanuel Bustos

0

Đây là cấu hình của tôi, cho những gì có giá trị. Nó có tính năng:

  • Thao tác chuột trên các tab ( mouse-2để đóng, như trong trình duyệt , mouse-3 để bật mở trong cửa sổ Emacs mới, như trong i3 )
  • Điều khiển bàn phím ( M-left& tab chuyển đổi bên phải, như trong TMux / Màn hình )
  • Màu sắc (phù hợp với moe-darkcấu hình "Moe theme / ")
  • Phân nhóm (hiện tại, Emacs *buffers*và "thường xuyên")
  • Tự động cập nhật (với gói sử dụng )

TabBar

(use-package tabbar
  :ensure t
  :bind
  ("<M-left>" . tabbar-backward)
  ("<M-right>" . tabbar-forward)

  :config
  (set-face-attribute
   'tabbar-button nil
   :box '(:line-width 1 :color "gray19"))

  (set-face-attribute
   'tabbar-selected nil
   :foreground "orange"
   :background "gray19"
   :box '(:line-width 1 :color "gray19"))

  (set-face-attribute
   'tabbar-unselected nil
   :foreground "gray75"
   :background "gray25"
   :box '(:line-width 1 :color "gray19"))

  (set-face-attribute
   'tabbar-highlight nil
   :foreground "black"
   :background "orange"
   :underline nil
   :box '(:line-width 1 :color "gray19" :style nil))

  (set-face-attribute
   'tabbar-modified nil
   :foreground "orange red"
   :background "gray25"
   :box '(:line-width 1 :color "gray19"))

  (set-face-attribute
   'tabbar-selected-modified nil
   :foreground "orange red"
   :background "gray19"
   :box '(:line-width 1 :color "gray19"))

  (custom-set-variables
   '(tabbar-separator (quote (0.2))))

  (defun tabbar-buffer-tab-label (tab)
    "Return a label for TAB.
  That is, a string used to represent it on the tab bar."
    (let ((label  (if tabbar--buffer-show-groups
                      (format " [%s] " (tabbar-tab-tabset tab))
                    (format " %s " (tabbar-tab-value tab)))))
      (if tabbar-auto-scroll-flag
          label
        (tabbar-shorten
         label (max 1 (/ (window-width)
                         (length (tabbar-view
                                  (tabbar-current-tabset)))))))))

  (defun px-tabbar-buffer-select-tab (event tab)
    "On mouse EVENT, select TAB."
    (let ((mouse-button (event-basic-type event))
          (buffer (tabbar-tab-value tab)))
      (cond
       ((eq mouse-button 'mouse-2) (with-current-buffer buffer (kill-buffer)))
       ((eq mouse-button 'mouse-3) (pop-to-buffer buffer t))
       (t (switch-to-buffer buffer)))
      (tabbar-buffer-show-groups nil)))

  (defun px-tabbar-buffer-help-on-tab (tab)
    "Return the help string shown when mouse is onto TAB."
    (if tabbar--buffer-show-groups
        (let* ((tabset (tabbar-tab-tabset tab))
               (tab (tabbar-selected-tab tabset)))
          (format "mouse-1: switch to buffer %S in group [%s]"
                  (buffer-name (tabbar-tab-value tab)) tabset))
      (format "\
mouse-1: switch to %S\n\
mouse-2: kill %S\n\
mouse-3: Open %S in another window"
              (buffer-name (tabbar-tab-value tab))
              (buffer-name (tabbar-tab-value tab))
              (buffer-name (tabbar-tab-value tab)))))

  (defun px-tabbar-buffer-groups ()
    "Sort tab groups."
    (list (cond ((or
                  (eq major-mode 'dired-mode)
                  (string-equal "*" (substring (buffer-name) 0 1))) "emacs")
                (t "user"))))
  (setq tabbar-help-on-tab-function 'px-tabbar-buffer-help-on-tab
        tabbar-select-tab-function 'px-tabbar-buffer-select-tab
        tabbar-buffer-groups-function 'px-tabbar-buffer-groups)

  :init
  (tabbar-mode 1))

Phụ lục 1 - Chủ đề Moe

(use-package moe-theme
  :ensure t
  :config
  (progn
    (load-theme 'moe-dark :no-confirm)
    (set-face-attribute 'fringe nil :background "gray19")))

Phụ lục 2 - Chuyển đổi 2 bộ đệm cuối cùng (macro KB)

(define-key global-map [(control tab)] (kbd "C-x b <return>")) 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.