emacs를위한 브라우저 스타일 '탭'?


22

파이어 폭스와 같은 탭이지만 emacs 용입니다.

나는 이것을 발견했다 : http://emacswiki.org/emacs/TabBarMode

그러나 현재 열려있는 버퍼를 보여주는 막대 를 각 버퍼 ( Emacs 용어의 창) 에 추가합니다 .

원하는대로 분할 할 수있는 여러 버퍼 ( Emacs teminology의 창) 를 보유 할 수있는 탭을 원합니다. 즉, 각 탭은 "창 상태"와 일치해야합니다 (의 의미 window-state-get).

내 작업에 대한 하나의 탭, 코드에 대한 탭, 웹 읽기에 대한 탭이 있습니다.

이것이 가능한가? 이 작업을 수행하기 위해 tabbar를 조정할 수 있습니까?

[edit2]
이 질문은 제가 예상했던 것보다 더 많은 관심을 끌었습니다. 솔루션이있는 것처럼 보이지만 약간의 연구와 조정이 필요한 솔루션입니다. 이번 주 / 다음 주가 조금 바빠서 답을 파싱하고 효과가있는 것을 만들려고 노력한 다음이 질문을 편집하여 찾은 결과를 반영합니다. 잠시만 기다려주세요 =)

[편집]
비슷한 종류 :
/programming/24157754/make-frames-in-emacs-gui-behaves-like-frames-in-terminal

단일 GUI 세션에서 여러 프레임으로 해결합니다.


2
"탭이 여러 버퍼를 저장할 수 있기를 원합니다. 원하는대로 분할 할 수 있습니다." 여러 개의 을 의미 합니까?
Malabarba

1
매우 다이내믹 한 탭을 갖고 싶습니다. 그것들을 만든 다음 창으로 채 웁니다. 즉, 탭을 프레임으로 만들고 싶습니다. 그런 다음 새 탭에 새 프레임이 있습니다. 각 탭 / 프레임 내부에서 원하는 창 / (버퍼)을 열 수 있습니다. 이것이 가능합니까? (즉, 하드 코딩 된 버퍼 이름 등은 없습니다.)
Leo Ufimtsev

1
특정 창과 관련된 변수가 있지만 그것에 대해 이야기하는 실을 보았을 때 한 달 또는 두 달이 지났으며 그것이 무엇인지를 알 수 없습니다. 리스트가 프레임과 연관된 버퍼를 보유하고 해당리스트가 프레임 매개 변수에 통합되는 frame-bufs와 유사한 시스템을 사용하는 것이 좋습니다. 특정 창과 관련된 변수를 사용하여 목록으로 만들고 목록에서 버퍼를 추가 / 제거 할 수 있습니다.이 목록은 탭 모음에서 사용할 버퍼 그룹입니다. 이것은 모두 이론적이지만 효과가 있다고 생각합니다.
법률 목록

1
stackoverflow.com/questions/24157754/… 참조 할 수 있지만 해당 게시물에 확실한 대답이없는 것 같습니다 :-/
Leo Ufimtsev

1
엘 스크린 패키지를 살펴 보는 것이 좋습니다.
blarghmatey

답변:


8

그룹의 분할 버퍼

tabbar로 가능합니다. 그룹의 그룹 버퍼에 규칙을 추가 할 수 있습니다. 기본 스 니펫은 다음과 같습니다.

(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"
     ))))

예제 규칙 :

  1. 버퍼 이름을 나열하십시오.
    ((member (buffer-name)
             '("*scratch*" "*Messages*" "*Help*"))
     "Common" ;; this is a group name
     )
  1. 공통 버퍼와 관련하여 이름이 별표로 시작하는 각 버퍼를 "공통"으로 설정하는 것을 선호합니다. 다음은이 규칙에 대한 버퍼를 만드는 예입니다.
    ((string-equal "*" (substring (buffer-name) 0 1))
     "Common"
     )
  1. 다음은 주요 모드별로 버퍼를 그룹화하는 예입니다.
    ((memq major-mode
           '(org-mode text-mode rst-mode))
     "Text"
     )
  1. 다음은 파생 모드를 기반으로 버퍼를 그룹화하는 예입니다.
    ((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. 다음은 regexp로 탭을 그룹화하는 예입니다.
    ((string-match "^__" (buffer-name))
     "Templates"
     )
  1. 주요 모드별로 그룹 버퍼 :
    (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))

규칙을 구성한 후에는 탭 막대의 탭 줄에서 + 또는-를 눌러 그룹을 전환하고 ◀ 및 ▶를 눌러 버퍼간에 전환 할 수 있습니다. 또는 다음 defuns을 바인딩하십시오.

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

키보드로 탭과 탭 그룹 사이를 이동하십시오.

개인적으로 탭을 그룹화하여 열려있는 항목을 볼 수 있지만로 탐색합니다 ido-switch-buffer.

규칙 세트 간 전환

또한 다른 버퍼 그룹화 규칙 세트를 정의하고 이들 사이를 순환 할 수 있습니다. 다음은 두 세트의 버퍼 그룹화 규칙 사이를 순환하는 예입니다.

;; 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)

이것은 그룹화 데펀 tabbar-buffer-groups-commontabbar-buffer-groups탭 그룹을 전환합니다.

이름별로 탭바 버퍼 정렬

탭 바 버퍼를 이름별로 정렬하는 것이 유리하다는 것을 알았습니다. 얻는 방법은 다음과 같습니다.

(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))))))))))

자세한 답변 감사합니다. 나는 위의 시도를 시도하고 ~ 최종적으로 알려줄 것이다 :)
Leo Ufimtsev 2

그러나 OP는 "창 당 하나의 탭 막대"를 원하지 않고 프레임 당 하나의 탭 막대를 원하며 탭 막대의 각 탭은 버퍼가 아닌 "창 구성"(예 : 여러 개의 창)을 나타내야하므로 그룹화 버퍼는 문제가되지 않습니다. .
Stefan

6

속성 : 프레임 단위로 버퍼를 그룹화하는 것은 라이브러리 프레임-버프에서 Alp Aker가 개발 / 기록한 개념의 개념과 선택 부분을 직접 구현 한 것입니다 : https://github.com/alpaker/Frame-Bufs

다음은 tabbar.el으로 탭 / 버퍼를 추가하거나 탭 / 버퍼를 C-c C-a제거 하여 라이브러리 및 그룹 탭 / 버퍼를 프레임별로 동적으로 사용하는 방법의 예입니다 C-c C-n. 현재 프레임 (예 "A":)과 관련이 있고 현재 프레임 (예 :)과 관련 이없는 두 개의 그룹 만 있습니다 "N". 그룹은 프레임 로컬이므로 각 프레임마다 고유 한 그룹이있을 수 있습니다. 로 사용자 정의 그룹화를 재설정 할 수 있습니다 C-c C-r. 와 관련 및 비 관련 그룹 간 전환 C-tab. 으로 현재 그룹의 다음 탭 / 버퍼로 전환하십시오 M-s-right. 로 현재 그룹의 이전 탭 / 버퍼로 전환하십시오 M-s-left.

탭 / 또는 완충제를 첨가하여 프로그래밍 방식으로 제거 가능 my-add-buffer하고 my-remove-buffer. 선택 프레임에서 특정 버퍼를 여는 방법의 예를 들어, 자격 관련 스레드를 참조하십시오 이 열리기 전에 파일을 차단하는 방법을 어느 프레임 결정 : /programming//a/18371427/2112489 기능은 my-add-buffer필요가 사용자가 해당 기능을 구현하기로 선택한 경우 위 링크에서 적절한 코드 위치에 통합해야합니다.

사용자는 mode-line-format다음 스 니펫을 통합하여 모드 행에 현재 탭 그룹의 이름을 표시 하는 항목을 사용자 정의에 작성할 수 있습니다 . (:eval (when tabbar-mode (format "%s" (tabbar-current-tabset t)))) 그러나 모드 행을보다 자세하게 사용자 정의하는 것은이 예제의 범위를 벗어납니다.

이 기능 tabbar-add-tab은 탭 / 버퍼를 알파벳순으로 표시하도록 수정되었습니다.

tabbar-line-tab상황에 따라 4 개의 다른면을 제공하도록 기능 이 수정되었습니다. 탭 / 버퍼가 프레임과 연관되고 IS가 선택된 경우 tabbar-selected-associated얼굴 을 사용하십시오 . 탭 / 버퍼가 프레임과 연관되어 있고 선택되지 않은 경우 tabbar-unselected-associated면 을 사용하십시오 . 탭 / 버퍼가 프레임과 연관되어 있지 않고 IS를 선택한 경우에는 tabbar-selected-unassociated얼굴 을 사용하십시오 . 탭 / 버퍼가 프레임과 연결되어 있지 않고 선택되어 있지 않으면 tabbar-unselected-unassociated면 을 사용하십시오 .

;; 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)

다음 스크린 샷은 두 가지 가능한 버퍼 / 탭 그룹화를 보여줍니다. (1) 왼쪽의 SYSTEM[노란색 및 흰색 탭] 이라는 프레임과 연관된 버퍼 / 탭의 그룹은 대문자 "A"로 표시됩니다. 모드 라인; 오른쪽 (2)은 해당되는 버퍼 / 탭으로 그룹화 NOT 이라는 프레임과 연관된 SYSTEM모드 라인에 표시된 대문자 "N"과, [파랑 및 빨강 탭].

예


그러나 OP는 "창 당 하나의 탭 바 "를 원하지 않고 프레임 당 하나의 탭 바를 원 하며 탭 바의 각 탭은 버퍼가 아닌 "창 구성"(예 : 여러 창)을 나타내야합니다.
Stefan

5

실제로 버퍼를 그룹화하지는 않지만 elscreen 체크 아웃을 고려하십시오 .

수행하는 작업은 그룹 창이며 빠르게 이동할 수있는 여러 레이아웃 (탭)에 대한 액세스를 제공합니다. 내 워크 플로에는 종종 한 화면에 일부 루비 코드와 관련 테스트가 있지만 내 할 일 및 조직 메모는 다른 화면에 있으며 SQL 쿼리 작성을위한 스크래치 버퍼는 세 번째입니다. 각 화면이 동일한 버퍼 풀을 사용하더라도 작업과 프로젝트 사이를 쉽게 이동할 수 있습니다.


3

플러그인, centaur-tabs는 어떻습니까? 그것은 많은 구성 옵션을 가지고 있으며, 실제로 기능적이며 Kaolin Themes와 같은 인기있는 테마로 지원되며 전반적으로 사용자의 의견에 따라 정말 멋지고 미적 인 패키지입니다. MELPA에서 사용할 수 있으며 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


이것은 또 다른 "각 탭은 버퍼를 나타내며 각 창에는 자체 탭 표시 줄이 있습니다."
Stefan

방금 탭 이름 대신 탭 그룹을 표시하도록 사용자 정의를 추가 했으므로 규칙을 설정하는 기능 (예 : 한 그룹의 그룹 elisp 및 lisp, 다른 그룹의 그룹 c 및 c ++ 등)과 탭에 해당 그룹이 표시됩니다.
Emmanuel Bustos

여전히 창에 대한 것이 아니라 프레임 당 하나의 탭 막대가 있어야 하고 각 탭은 창 구성을 나타내는 질문에 대답하지 않습니다 .
스테판

나는 이해하지 못했다. 조사하고 노력하겠습니다!
Emmanuel Bustos

0

다음은 가치있는 구성입니다. 그것은 특징 :

  • (탭에 마우스 동작 mouse-2에 가까운, 브라우저에서와 같이 , mouse-3 처럼, 새로운 이맥스 창에 열려있는 팝업하는 I3 )
  • 키보드 컨트롤 ( TMux / ScreenM-left 과 같은 오른쪽 스위치 탭 )
  • 색상 ( "Moe 테마 / moe-dark"구성 과 일치 )
  • 그룹화 (현재 Emacs *buffers*및 "일반")
  • 자동 업데이트 ( use-package 사용 )

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))

부록 1-모에 테마

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

부록 2-마지막 2 개의 버퍼 전환 (KB 매크로)

(define-key global-map [(control tab)] (kbd "C-x b <return>")) 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.