버퍼가 표시되는 창을 제어하는 ​​방법은 무엇입니까?


13

Q :org-deadline 캘린더를 표시하는 데 사용 하는 창을 어떻게 제어 할 수 있습니까?

org-deadlinecalendar최종 기한을 설정할 때 창 에서 버퍼를 임시로 팝업 한 다음 완료 후 다시 닫습니다. 창이 하나만 있으면 기존 프레임의 맨 아래에 새 창이 나타납니다. 여러 개의 창이 get-lru-window있는 경우 사용 가능한 창 중 하나를 선택합니다 .

후자는 마감일 (날짜, 시간 등)을 설정하는 데 필요한 정보가있는 다른 창 중 하나를 인계받는 경우 문제가됩니다. 이는 일반적으로 다음과 같은 창 설정에서 문제입니다.

+--------------------+--------------------+
|                    |                    |
|                    |  (B: mu4e header)  |
|                    |                    |
|                    +--------------------+
|  (A: agenda file)  |                    |
|                    |                    |
|                    |                    |
|                    |  (C: mu4e view)    |
|                    |                    |
|                    |                    |
|                    |                    |
+--------------------+--------------------+

(A)의 일정 파일에 마감일을 추가하면 org-deadline필요한 날짜 / 시간 정보가 포함 된 전자 메일이 포함 된 (B) 또는 (C)를 인계받습니다. org-deadline(A)에서 전화 를 걸면 calendar아래와 같이 버퍼 를 포함하는 임시 창 (D)가 나타납니다 .

+--------------------+--------------------+
|                    |                    |
|                    |  (B: mu4e header)  |
|                    |                    |
|                    +--------------------+
|  (A: agenda file)  |                    |
|                    |                    |
|                    |                    |
+--------------------+  (C: mu4e view)    |
|                    |                    |
|   (D: calendar)    |                    |
|                    |                    |
+--------------------+--------------------+

그래서 : 어떻게 하나의 강제 org-deadline(및 유사한 기능)가 다른 창 중 하나를 대신하는 것이 아니라 활성 창의 맨 아래에 새로운 임시 창을 표시합니까?

추신 : 나는 전용 창을 알고 있지만 함수가 "짧은"중 하나를 차지하지 않기 위해 버퍼를 창에 전용으로 사용하고 싶지 않기 때문에 최선의 접근 방식으로 나를 공격하지 않습니다. 그들.


누군가가 새로운 임시 창을 미세하게 제어 할 수있는 대답을 다시 얻기를 바랍니다. ( popwin.el ?? display-buffer-alist) 그러나 org-deadline사용 calendar하는 창을 제어하는 ​​데 방해가되는 사용 으로 인해 추가 주름이 있다고 생각 합니다. 의 의견 참조 calendar-basic-setup.
purple_arrows

답변:


10

다음은 원하는 것을해야합니다.

(defun my-window-displaying-agenda-p (window)
    (equal (with-current-buffer (window-buffer window) major-mode)
        'org-agenda-mode)) 

(defun my-position-calendar-buffer (buffer alist)
  (let ((agenda-window (car (remove-if-not #'my-window-displaying-agenda-p (window-list)))))
    (when agenda-window
      (let ((desired-window (split-window agenda-window nil 'below)))
        (set-window-buffer desired-window  buffer)
        desired-window))))

(add-to-list 'display-buffer-alist (cons "\\*Calendar\\*" (cons #'my-position-calendar-buffer nil)))

달력 기능을 사용하여 calendar-basic-setup, 일정 버퍼를 표시하도록 calendar-basic-setup회전 용도에 pop-to-buffer회전 용도에 display-buffer일정 버퍼를 표시한다. 이제는 display-buffer고도로 사용자 정의가능 하며 display-buffer-alist여기에서 하나의 변수를 사용하는 특정 변수를 사용하여 버퍼를 표시하는 함수를 제공 할 수 있습니다.

기본적으로 우리는 emacs가이 함수 my-position-calendar-buffer를 사용 하여 regexp와 일치하는 버퍼를 표시 한다고 말합니다 \*Calendar\*. 함수 my-position-calendar-buffer는 이러한 창을 찾을 수없는 경우, 조직 의제를 표시하는 창을 검색, 그것은 경우가있는 아무것도하지 않습니다 display-buffer버퍼를 표시하기 위해 다른 기능을 다할 것입니다. org-agenda를 표시하는 창이 발견되면이 기능은 해당 창을 세로로 분할하고 달력 버퍼를 표시합니다.

나는 이것을 철저히 테스트하지 않았다 (의제보기와 의제보기가없는 달력을 시작하려고 시도했다). 작동하는 것처럼 보이지만 몇 가지 버그가있을 수있다.


1
add-to-listdisplay-buffer-alist 와 같은 것을 사용하는 것이 좋습니다. 를 사용하면 setq다른 사용자 지정 내용이 무시됩니다.
Malabarba

@Malabarba 제안에 감사드립니다.
Iqbal Ansari
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.