#디노트: 디레드 시그니처 통합

#디노트: 디레드 시그니처 통합

2023-11-13 Note denote dired notes signature

[텍스트 마스터 인덱스 목차] 에 반영해야 한다.

[2023-11-15 Wed 13:23] 나의 글이 될 것이다. [2023-11-13 Mon 16:24] 다음 글로부터 전체 컨셉을 배웠습니다. 그 다음에 고민하는 부분은 가상의 디렉토리 환경을 구성하여 글 작업을 하는 것이다. [2023-11-14 Tue 10:44] 그래서 다음 노트가 가이드가 된다. dired x manual

왜 Dired 가 필요한가?

[2023-11-13 Mon 11:09]

없어도 Emacs 사용하는데 상관 없었다. 아니 잘 몰라도 상관 없었다는 말이다. 물론 앞으로도 몰라도 괜찮을 수도 있다. 단 Denote 를 사용하지 않는다면!

Denote 는 Dired 를 사용할 때 완성 된다. 왜? 파일 네이밍에서 핵심 가치가 있기 때문이다. 많은 노트들을 다룰 때 데이터 베이스 없이 핵심 정보를 다루기 위해서는 결국 파일을 잘 다뤄야 한다. Emacs 에서는 디렉토리 매니저로 Dired 가 있다. 중복 기능을 구현하지 않고 워크 플로우를 통합 하기 위해서 Dired 는 필수다.

어떻게 사용하는가? 키 바인딩 측면

[2023-11-15 Wed 15:29] 내용 업데이트 한다. evil-matchit 를 끄면. 기본 바인딩과 evil-collection 에서 추가한 바인딩 둘다 사용 가능하다. 참고하면서 사용하면 된다.

evil-collection dired

[2023-11-13 Mon 11:35]

헛, dired-narrow, dired-filter, dired-x, dired-subtree 에 대한 설정도 여기서 하고 있다. filter, narrow 는 사용하지 않는 패키지였다. 넣어야겠구만.

Dired 를 사용하는 이상 할수 있는 좋은 장난은 다 지원하면 좋다. 통합 솔루션이 되어야 한다. 물론 Dirvish 가 새롭게 뜨고 있고 화려한 비주얼과 기능을 제공하고 있다지만 초보자들은 현혹되면 안된다.

Spacemacs 와 같은 배포판을 사용하면 키 바인딩을 배포판에서 정의하는지 아니면 이와 같은 외부 패키지를 이용하는지 알아야 한다. 우선 순위는 배포판이다. 배포판에서 없는 부분만 넣어야 한다.

참고로 wdired, wgrep 은 evil-collection 을 사용하지 않는다.

아래 키 바인딩만 알고 있으면 다 커버할 수 있다. 물론 많다.

;;;###autoload
(defun evil-collection-dired-setup ()
  "Set up `evil' bindings for `dired'."
  (evil-collection-define-key 'normal 'dired-mode-map
    "q" 'quit-window
    "j" 'dired-next-line
    "k" 'dired-previous-line
    [mouse-2] 'dired-mouse-find-file-other-window
    [follow-link] 'mouse-face
    ;; Commands to mark or flag certain categories of files
    "#" 'dired-flag-auto-save-files
    "." 'dired-clean-directory
    "~" 'dired-flag-backup-files
    ;; Upper case keys (except !) for operating on the marked files
    "A" 'dired-do-find-regexp
    "C" 'dired-do-copy
    "B" 'dired-do-byte-compile
    "D" 'dired-do-delete
    "gG" 'dired-do-chgrp ;; FIXME: This can probably live on a better binding.
    "H" 'dired-do-hardlink
    "L" 'dired-do-load
    "M" 'dired-do-chmod
    "O" 'dired-do-chown
    "P" 'dired-do-print
    "Q" 'dired-do-find-regexp-and-replace
    "R" 'dired-do-rename
    "S" 'dired-do-symlink
    "T" 'dired-do-touch
    "X" 'dired-do-shell-command
    "Z" 'dired-do-compress
    "c" 'dired-do-compress-to
    "!" 'dired-do-shell-command
    "&" 'dired-do-async-shell-command
    ;; Comparison commands
    "=" 'dired-diff
    ;; Tree Dired commands
    (kbd "M-C-?") 'dired-unmark-all-files
    (kbd "M-C-d") 'dired-tree-down
    (kbd "M-C-u") 'dired-tree-up
    (kbd "M-C-n") 'dired-next-subdir
    (kbd "M-C-p") 'dired-prev-subdir
    ;; move to marked files
    (kbd "M-{") 'dired-prev-marked-file
    (kbd "M-}") 'dired-next-marked-file
    ;; Make all regexp commands share a `%' prefix:
    ;; We used to get to the submap via a symbol dired-regexp-prefix,
    ;; but that seems to serve little purpose, and copy-keymap
    ;; does a better job without it.
    "%" nil
    "%u" 'dired-upcase
    "%l" 'dired-downcase
    "%d" 'dired-flag-files-regexp
    "%g" 'dired-mark-files-containing-regexp
    "%m" 'dired-mark-files-regexp
    "%r" 'dired-do-rename-regexp
    "%C" 'dired-do-copy-regexp
    "%H" 'dired-do-hardlink-regexp
    "%R" 'dired-do-rename-regexp
    "%S" 'dired-do-symlink-regexp
    "%&" 'dired-flag-garbage-files
    ;; mark
    "*" nil
    "**" 'dired-mark-executables
    "*/" 'dired-mark-directories
    "*@" 'dired-mark-symlinks
    "*%" 'dired-mark-files-regexp
    "*c" 'dired-change-marks
    "*s" 'dired-mark-subdir-files
    "*m" 'dired-mark
    "*u" 'dired-unmark
    "*?" 'dired-unmark-all-files
    "*!" 'dired-unmark-all-marks
    "U" 'dired-unmark-all-marks
    (kbd "* <delete>") 'dired-unmark-backward
    (kbd "* C-n") 'dired-next-marked-file
    (kbd "* C-p") 'dired-prev-marked-file
    "*t" 'dired-toggle-marks
    ;; Lower keys for commands not operating on all the marked files
    "a" 'dired-find-alternate-file
    "d" 'dired-flag-file-deletion
    "gf" 'dired-find-file
    (kbd "C-m") 'dired-find-file
    "gr" 'revert-buffer
    "i" 'dired-toggle-read-only
    "I" 'dired-maybe-insert-subdir
    "J" 'dired-goto-file
    "K" 'dired-do-kill-lines
    "r" 'dired-do-redisplay
    "m" 'dired-mark
    "t" 'dired-toggle-marks
    "u" 'dired-unmark                   ; also "*u"
    "W" 'browse-url-of-dired-file
    "x" 'dired-do-flagged-delete
    "gy" 'dired-show-file-type ;; FIXME: This could probably go on a better key.
    "Y" 'dired-copy-filename-as-kill
    "+" 'dired-create-directory
    ;; open
    (kbd "RET") 'dired-find-file
    (kbd "S-<return>") 'dired-find-file-other-window
    (kbd "M-RET") 'dired-display-file
    "gO" 'dired-find-file-other-window
    "go" 'dired-view-file
    ;; sort
    "o" 'dired-sort-toggle-or-edit
    ;; moving
    "gj" 'dired-next-dirline
    "gk" 'dired-prev-dirline
    "[[" 'dired-prev-dirline
    "]]" 'dired-next-dirline
    "<" 'dired-prev-dirline
    ">" 'dired-next-dirline
    "^" 'dired-up-directory
    "-" 'dired-up-directory
    " " 'dired-next-line
    [?\S-\ ] 'dired-previous-line
    [remap next-line] 'dired-next-line
    [remap previous-line] 'dired-previous-line
    ;; hiding
    "g$" 'dired-hide-subdir ;; FIXME: This can probably live on a better binding.
    (kbd "M-$") 'dired-hide-all
    "(" 'dired-hide-details-mode
    ;; isearch
    (kbd "M-s a C-s")   'dired-do-isearch
    (kbd "M-s a M-C-s") 'dired-do-isearch-regexp
    (kbd "M-s f C-s")   'dired-isearch-filenames
    (kbd "M-s f M-C-s") 'dired-isearch-filenames-regexp
    ;; misc
    [remap read-only-mode] 'dired-toggle-read-only
    ;; `toggle-read-only' is an obsolete alias for `read-only-mode'
    [remap toggle-read-only] 'dired-toggle-read-only
    "g?" 'dired-summary
    (kbd "<delete>") 'dired-unmark-backward
    [remap undo] 'dired-undo
    [remap advertised-undo] 'dired-undo
    ;; thumbnail manipulation (image-dired)
    (kbd "C-t d") 'image-dired-display-thumbs
    (kbd "C-t t") 'image-dired-tag-files
    (kbd "C-t r") 'image-dired-delete-tag
    (kbd "C-t j") 'image-dired-jump-thumbnail-buffer
    (kbd "C-t i") 'image-dired-dired-display-image
    (kbd "C-t x") 'image-dired-dired-display-external
    (kbd "C-t a") 'image-dired-display-thumbs-append
    (kbd "C-t .") 'image-dired-display-thumb
    (kbd "C-t c") 'image-dired-dired-comment-files
    (kbd "C-t f") 'image-dired-mark-tagged-files
    (kbd "C-t C-t") 'image-dired-dired-toggle-marked-thumbs
    (kbd "C-t e") 'image-dired-dired-edit-comment-and-tags
    ;; encryption and decryption (epa-dired)
    ";d" 'epa-dired-do-decrypt
    ";v" 'epa-dired-do-verify
    ";s" 'epa-dired-do-sign
    ";e" 'epa-dired-do-encrypt)

  ;; dired-x commands
  (with-eval-after-load 'dired-x
    (evil-collection-define-key 'normal 'dired-mode-map
      "*(" 'dired-mark-sexp
      "*." 'dired-mark-extension
      "*O" 'dired-mark-omitted))

  ;; dired-narrow commands
  (with-eval-after-load 'dired-narrow
    (evil-collection-define-key 'normal 'dired-mode-map
      "s" 'dired-narrow-regexp))

  ;; dired-subtree commands
  (with-eval-after-load 'dired-subtree
    (evil-collection-define-key 'normal 'dired-mode-map
      (kbd "TAB") 'dired-subtree-toggle
      "gh" 'dired-subtree-up
      "gl" 'dired-subtree-down
      (kbd "M-j") 'dired-subtree-next-sibling
      (kbd "M-k") 'dired-subtree-previous-sibling))

  (with-eval-after-load 'dired-filter
    (evil-collection-define-key 'normal 'dired-mode-map
      "*"  dired-filter-mark-map
      "g/" dired-filter-map)))

Spacemacs 설정 : 검색 관련 선택이 필요하다.

[2023-11-13 Mon 11:47]

기본은 evil-search

  (spacemacs/set-leader-keys
    "ad" 'spacemacs/dired
    "fj" 'dired-jump
    "jd" 'dired-jump
    "jD" 'dired-jump-other-window)
  ;; The search next/previous commands are different
  ;; because of the `evil-search-module' values:
  ;; vim = evil-search, hybrid = isearch
  (when (eq 'vim dotspacemacs-editing-style)
    (evil-define-key 'normal dired-mode-map (kbd "n") 'evil-ex-search-next)
    (evil-define-key 'normal dired-mode-map (kbd "N") 'evil-ex-search-previous))
  (when (eq 'hybrid dotspacemacs-editing-style)
    (evil-define-key 'normal dired-mode-map (kbd "n") 'evil-search-next)
    (evil-define-key 'normal dired-mode-map (kbd "N") 'evil-search-previous)))

dired 디렉토리 편집기 사용

[2023-11-13 Mon 11:18]

dired Emacs directory editor - Practicalli Spacemacs - practical.li

Dired 버퍼는 단일 디렉터리의 콘텐츠 또는 하나 이상의 하위 디렉터리 목록을 표시합니다. Dired 버퍼는 모든 파일 시스템의 임의의 파일 및 디렉터리 집합을 표시할 수 있습니다. dired 모드는 Emac 에 내장되어 있습니다(버전 23 이상).

SPC f f 를 클릭하고 디렉터리의 . 루트를 선택하면 디렉터리 목록이 dired 에서 열립니다.

SPC f j 또는 SPC j d 을 클릭하여 다이렉트 버퍼의 현재 버퍼로 이동합니다. SPC j D 을 클릭하면 다른 창에서 다이렉트 버퍼가 열립니다.

Use Evil style navigation and editing with the dired buffer

SPC SPC wdired-change-to-wdired-mode WDired mode (writable dired) enables editing of the dired buffer. Names of the files in the buffer, the target of symbolic links and the permission bits of the files can be changed.

SPC SPC wdired-change-to-wdired-mode WDired 모드(writable dired)를 사용하면 dired 버퍼를 편집할 수 있습니다. 버퍼에 있는 파일의 이름, 심볼릭 링크의 대상 및 파일의 권한 비트를 변경할 수 있습니다.

C-x C-q dired-read-only-toggle 이것도 유사한 것 아닌가!

Dired commands

m mark files to run an action across multiple files in the listing

keyAction
*mark / unmark meun 마크 / 마크 해제
Rrename a file 파일 이름 바꾸기
Ccopy file 파일 복사
+make directory 디렉토리 만들기
mmark files 마크 파일
uunmark 표시 취소
dflag for deletion 플래그를 삭제할 수 있습니다.
ssort menu 정렬 메뉴
ttoggle mark
xexecute deletions 삭제 실행
^ or -move up a directory 디렉토리 위로 이동

* Commands

[2023-11-13 Mon 11:29]

keyaction
*%mark files regex

이외에도 많이 있다.

[2023-11-13 Mon 11:32]

Rename files with WDired mode

WDired 모드로 파일 이름 바꾸기

디렉터리 목록의 이름은 디렉터리 버퍼의 파일 이름을 편집하고 변경 사항을 커밋하여 이름을 바꿀 수 있습니다.

SPC f f 를 클릭하고 디렉터리의 . 루트를 선택하여 디렉터리 목록을 dired 로 엽니다(또는 열린 dired 버퍼로 전환합니다).

SPC SPC wdired-change-to-wdired-mode 를 눌러 디렉터리 버퍼를 쓰기 가능하게 만듭니다. 커서가 삽입 모드로 전환되고 디렉토리 목록의 맨 위 항목에 배치됩니다.

이블 스타일 편집을 사용하여 파일 이름에 대한 변경 사항을 관리합니다. 일부 이블 도구와 다중 커서는 WDired 모드에서 사용할 수 없으므로 이블 기본 기능에 대한 경험이 있으면 매우 유용할 수 있습니다.

C-c C-c 를 클릭하여 변경 사항을 커밋하고 영향을 받는 모든 파일을 업데이트합니다.

C-c Esc 을 클릭하여 모든 변경 사항을 취소합니다.

TODO Emacs macro for multiple file renames

Record a macro to rename a file and run the macro over multiple lines in the dired buffer in WDired mode. 매크로를 기록하여 파일 이름을 바꾸고 WDired 모드에서 유선 버퍼의 여러 줄에 걸쳐 매크로를 실행합니다.

q a in normal mode will start recording all following key bindings q a 일반 모드에서 다음 키 바인딩을 모두 기록하기 시작합니다.

q again to stop recording and save all the key bindings as a macro bound to the a character. q 를 다시 입력하면 녹음이 중지되고 모든 키 바인딩이 a 문자에 바인딩된 매크로로 저장됩니다.

Any character other than q can be used as the macro name and Practicalli finds a, z and x as convenient characters for macros. q 이외의 모든 문자를 매크로 이름으로 사용할 수 있으며 Practicalli 는 a , z 및 x 을 매크로에 편리한 문자로 찾습니다.

@ a to run the macro and repeat the same change @ a 를 클릭하여 매크로를 실행하고 동일한 변경 사항을 반복합니다.

24 @ a to run the macro on the next 24 lines including the current line, repeating the same change on multiple file names in the dired buffer. 24 @ a 를 클릭해 현재 줄을 포함한 다음 24 줄에서 매크로를 실행하여 다이렉트 버퍼의 여러 파일 이름에 동일한 변경 사항을 반복합니다.

Hint::Reset cursor position at end of macroλ︎ 힌트::매크로 끝에서 커서 위치 재설정 λ︎

If using positional aspects for changes made by the macro ensure the cursor is moved back to the correct starting place just before ending the macro recording. 매크로에 의한 변경 사항에 위치 측면을 사용하는 경우 매크로 녹화를 종료하기 직전에 커서를 올바른 시작 위치로 다시 이동해야 합니다.

Reference: Mastering Emacs: Macros 참조: 이맥스 마스터하기: 매크로

주의 사항 : global-evil-matchit 하지 말 것!

[2023-11-15 Wed 15:22]

Dired 커맨드를 덮어 쓴다.

dired-virtual-mode 시나리오

TODO denote-signature-buffer

[2023-11-15 Wed 14:11]

시그니처 버퍼에 대한 활용 방법이다

[2023-11-15 Wed 15:27] 생각대로 안된다. 조금 더 기다려보자. 영상 올리면 그거 보고 해야겠다.

(defun efls/denote-signature-buffer ()
      (interactive)
      (switch-to-buffer "*denote-signatures*")
      (read-only-mode -1)
      (erase-buffer)
      (insert
        (shell-command-to-string
          "ls -l | awk /==/ | sed  's/--/=@/3' | sort -t '=' -Vk 3,3 | sed 's/=@/--/' "))
     (dired-virtual denote-directory)
      (denote-dired-mode)
      (auto-revert-mode -1))

eshell : 매뉴얼 참고

[2023-11-15 Wed 13:37] 여기에는 매뉴얼에 언급된 방식과 아래 시그니처 버퍼 사례가 있다. 먼저 매뉴얼 사례는 eshell 을 기준으로 다루고 있다. 다른 방법 없나?! 아니다. 함수만 긁어오면 된다. 가져오자.

이제 필요한 것은 ls -l | sort -t _ -k 2 의 출력을 Emacs 버퍼에 캡처한 다음 dired-virtual-mode 을 활성화하는 것입니다. 이를 위해 M-x shell 또는 M-x eshell 을 사용한 다음 관련 내용을 수동으로 복사할 수 있습니다. prot-eshell-exporteshell-mode-map 의 키에 바인딩하고 사용해 보세요(저는 C-c C-e 를 사용합니다). 생성된 버퍼에서 dired-virtual-mode 을 활성화합니다.

DONE Alternative identifier formats? - Note signatures

protesilaos/denote/issues/115 - github.com 훌륭하다. 저장해두었다. 지식인들의 논의 아닌가!

작성 된 순차적인 맥락이 중요하다. 오렌지가 과일이 아니라 둥근 것을 이야기하다 나온 것인가 아닌가?

The central idea of Denote is to not maintain any kind of database or external resource. The file name is designed in such a way as to provide as much valuable information as possible. It should be self-explanatory or, at least, easy to reason about and infer knowledge from.

Denote 의 핵심 아이디어는 어떤 종류의 데이터베이스나 외부 리소스도 유지하지 않는다는 것입니다. 파일 이름은 가능한 한 많은 가치 있는 정보를 제공하도록 설계되었습니다. 자명하거나 적어도 추론하고 지식을 유추하기 쉬운 이름이어야 합니다.

정렬 Sort chronologically

[2023-11-10 Fri 10:37]

시간 순대로 되어 있다면 이미 정렬되어 있는 것이다. 맞는 말인가 아닌가? 아닐 수도 있다.

I don’t. If they are sorted chronologically, they are already sorted by signature. It’s just that the other notes from other note sequences are in between. So I filter. In dired, I type %, m to mark files by regex, enter my search string (e.g. =1a) to mark all files belonging to that sequence, followed by t to invert (toggle) and k to remove (kill) the other notes from the current view. Doing that with the fruit example above, would yield this listing in dired:

아니요. 시간순으로 정렬되어 있다면 이미 서명별로 정렬되어 있는 것입니다. 다만 다른 노트 시퀀스의 다른 노트들이 그 사이에 있을 뿐입니다. 그래서 필터링합니다. dired 에서 % , m 을 입력해 정규식으로 파일을 표시하고, 검색 문자열(예: =1a )을 입력해 해당 시퀀스에 속한 모든 파일을 표시한 다음, t 을 입력해 반전(토글)하고 k 을 입력해 현재 보기에서 다른 노트들을 제거(킬)합니다. 위의 과일 예시로 이 작업을 수행하면 이 목록이 dired 로 표시됩니다:

20210110T133700==1a–apples__fruit.org 20220110T133700==1a1–round-things__geometry.org 20220110T133701==1a1a–spheres.org 20220110T133702==1a1b–circles.org 20230110T133700==1a1a1–oranges__fruit.org

Of course, this only establishes a sorted order for signatures that designate a sequence - as is the case with Luhmann’s style. Does this help you, @MirkoHernandez ?

물론 이것은 루만의 스타일과 마찬가지로 시퀀스를 지정하는 서명에 대한 정렬된 순서만 설정합니다. 도움이 되셨나요?

DONT Signature buffer via virtual dired

[2023-11-10 Fri 11:16]

EFLS - zetteldeft 저자.

I hacked together a function that does this in a virtual dired buffer. I’ll share the snippet from my personal config below.

Signature buffer via virtual dired

To more easily see notes sorted by signature, let’s emulate something in a virtual dired buffer (based on the Denote manual).

+ ls -l | sort -t = -k 2 we can sort the output of ls according to the signature.
+ Throw in awk /==/ to only keep lines with a signature.
+ this in a dired-virtual buffer, and we can act on the files.

Let’s combine all this in a single command. 이 모든 것을 하나의 명령으로 결합해 보겠습니다.

감사합니다 귀하의 솔루션은 버퍼를 완벽하게 표시하지만 default-directory 를 denote-directory 로 사용할 때 작동하지 않는다고 생각합니다. 리턴을 누르면 파일로 이동할 수 없습니다.

And there is an issue with the sorting when using that shell command (for instance I have the following notes in the wrong order 11a2 > 1a2 and 1d1 > 1d) . I’m using the following command that seems to work for all cases. It seems to work with denote hide details as well.

그리고 해당 셸 명령을 사용할 때 정렬에 문제가 있습니다(예를 들어 11a2 > 1a2 및 1d1 > 1d 의 잘못된 순서로 다음과 같은 메모가 있습니다). 모든 경우에 작동하는 것 같은 다음 명령을 사용하고 있습니다. 세부 정보 숨기기 표시와 함께 작동하는 것 같습니다.

(concat "find * -regex " "'\..*=="  ".*' | sed  's/--/=@/' | sort -t '=' -Vk 3,3 | sed 's/=@/--/' ")

The signature’s closing – is replaced by a =@ , then the sorting can work properly using the -vK 3,3 option since there is an ending delimiter. After that the =@ characters are replaced back to –. An ugly workaround.

서명의 닫는 –이 =@으로 대체되면 종료 구분 기호가 있기 때문에 -vK 3,3 옵션을 사용하여 정렬이 제대로 작동할 수 있습니다. 그 후에는 =@ 문자가 다시 –으로 바뀝니다. 추악한 해결 방법입니다.

I will try to combine both solutions, it is almost working for me. 두 솔루션을 결합하려고 노력할 것입니다. 거의 효과가 있습니다.

(defun efls/denote-signature-buffer ()
      (interactive)
      (switch-to-buffer "*denote-signatures*")
      (read-only-mode -1)
      (erase-buffer)
      (insert
        (shell-command-to-string
          "ls -l | awk /==/ | sort -t = -k 2"))
      (dired-virtual denote-directory)
      (denote-dired-mode)
      (auto-revert-mode -1))

(defun efls/denote-signature-buffer ()
      (interactive)
      (switch-to-buffer "*denote-signatures*")
      (read-only-mode -1)
      (erase-buffer)
      (insert
        (shell-command-to-string
          "ls -l | awk /==/ | sed  's/--/=@/3' | sort -t '=' -Vk 3,3 | sed 's/=@/--/' "))
     (dired-virtual denote-directory)
      (denote-dired-mode)
      (auto-revert-mode -1))

Something to figure out later: how can I hide the file details?

Without the -l flag, dired-virtual doesn’t seem to recognize the -l

서명이 숨겨져 있다?! 중요한 정보임에도 파일 이름에만 보이고 정작 파일에 들어가면 정보를 볼수가 없다.

DONE Emacs: sort Luhmann-style signatures with ‘denote-sort-dired’

반영 완료

,#+title: Emacs: sort Luhmann-style signatures with ‘denote-sort-dired’ | Protesilaos Stavrou ,#+link: https://protesilaos.com/codelog/2024-08-01-emacs-denote-luhmann-signature-sort/

• denote-sort-title-comparison-function • denote-sort-keywords-comparison-function • denote-sort-signature-comparison-function

  • Luhmann’s sequence notes and the code we need

Niklas Luhmann would edit notes to form sequences of thoughts with branching paths, such as 1.1, 1.1a, 1.2, 1.2a, 1.2b, etc. With the Denote file-naming scheme, we make the word separator in each file name component use the same character as the entire field, so words in a title have a dash between them and signatures have the equals sign. This makes searches unambiguous. Thus, our Luhmann-style signatures will be slightly different in their appearance: 1=1, 1=1a, 1=2, 1=2a, 1=2b.

When using the denote-sort-dired command (or any of our Org dynamic blocks) with default settings, those Luhmann-style signatures will not sort in an intuitive way. This is because they combine numbers and letters, which require a different approach than what the default sorting function is using. The following will get the job done:


(progn
  (defun my-denote--split-luhman-sig (signature)
    "Split numbers and letters in Luhmann-style SIGNATURE string."
    (replace-regexp-in-string
     "\\([a-zA-Z]+?\\)\\([0-9]\\)" "\\1=\\2"
     (replace-regexp-in-string
      "\\([0-9]+?\\)\\([a-zA-Z]\\)" "\\1=\\2"
      signature)))

  (defun my-denote--pad-sig (signature)
    "Create a new signature with padded spaces for all components"
    (combine-and-quote-strings
     (mapcar
      (lambda (x)
        (string-pad x 5 32 t))
      (split-string (my-denote--split-luhman-sig signature) "=" t))
     "="))

  (defun my-denote-sort-for-signatures (sig1 sig2)
    "Return non-nil if SIG1 is smaller that SIG2.
Perform the comparison with `string<'."
    (string< (my-denote--pad-sig sig1) (my-denote--pad-sig sig2)))

  ;; Change the sorting function only when we sort by signature.
  (setq denote-sort-signature-comparison-function #'my-denote-sort-for-signatures) ; default - string-collate-lessp
  )

Then continue using denote-sort-dired or Org dynamic blocks to get the expected results.

  • A sorted and filtered Dired listing (per denote-sort-dired)

The ‘denote-sort-dired’ with nicely-sorted Luhmann-style signatures

Related-Notes

References

마지막 수정일자