#지케이: #노트테이킹 #패키지 #매뉴얼 #이맥스
2023-10-31 Note emacs manual notes notetaking packages zkNEXT denote 와 통합 환경 구성
왜 굳이? 라고 하기에는 zk 가 너무 훌륭한 워크플로우를 가지고 있다. 어짜피 둘다 데이터베이스 사용하지 않는데 무슨 상관인가? 같이 쓰면 좋은 일이다. 물론 디노트로 다 할 수 있으면 가장 깔끔한데 범용이라 제텔카스텐에 집중하기가 당장은 어렵다. 배워야 하는 부분도 많다. 그래서 조금 더 공격적인 방법이 필요하다.
- zk 루만 인덱스를 테스트해보라. 그게 먼저다.
- 디노트의 장점이 무엇인가? Dired 에서 쉽고 빠르게 검색할 수 있다는 점이다. 이를 충분히 활용하면 좋을 것이다.
- zk 는 인덱스와 데스크톱 제텔 시나리오가 좋다. 남은 문제는 제텔 아이디를 할당하는 것이다. 임의로 되는지 모르겠다만 동일하게 이름만 맞춰 준다면 호환이 된다.
- Denote 키워드는 어떻게 관리할 것인가? 이건 따로 넣어 준다. Dired 분류용이며 카테고리 범주이다. Denote 는 한글 제목에 집중한다.
- zk 의 태그는? 별도 시스템으로 가져간다. 이게 강점이 된다. 자유롭게 사용해도 좋을 것 같다. Denote 키워드는 아무련 한계가 있다.
- zk 메뉴얼 참고하여 링크를 디노트로 통합하라. 링크는 조직 링크를 사용하거나 간단 링크를 사용하는 것이다. 간단 링크는 심플하고 좋겠지만 디노트에서 인식할 수 없다. 조직 링크는 디노트를 사용하게 해야 한다.
- tag 관리를 명확히 한다. 명확하게 조건을 두고 태그를 관리. # 이라고 다 태그화하면 적절하지 않다. 함수를 수정해서 필터링해야 한다.
- zk 의 장점 파일 링크 관리가 너무 자연스럽고 편리하다. 2023-12-01
learning vim and evil on spacemacs__evil [denote:20230615T080000]
zk-tag-insert / zk-tag-search / zk-tag-grep-function
tag 관련하여 # 붙으면 다 태그로 간주한다. 이건 아니다. tags 에서만 인식하도록 한다. 그래야 태그 관리가 된다.
zk and zettelkasten
zettelkasten 을 제대로 사용하고 싶다. 그래야 한다. 그게 방법이 될 것이다.
01 Emacs: zk note-taking package demo - Invidious - vid.puffyan.us
zk-new-note
생성하기
선택 영역으로 생성하기
- 버튼 동작하는가?
- tooltip-mode 를 켜라. 그래야 마우스 위에 보인다.
- 링크에 커서가 있으면, 에코 영역에 타이틀 나와야 하는거 아닌가?
zk-rename-note
- 타이틀을 바꾸고 호출하면 -> 파일명을 바꿔준다. 이건 매우 유용하다.
zk-insert-note
orderless 를 사용하면 편하다. 영상과 다르게 앞에 아이디가 안보이네?! 옵션으로 껐나보다.
zk-backlinks
이건 현재 노트를 <- 으로 지정하고 있는 녀석들이다.
zk-find-file-by-full-text-search : 파일 목록
검색하는 텍스트가 들어있는 파일 목록
vertico and corfu multi-frame
왜 안되는가? 후크로 넣어놨을텐데. corfu 도 동작이 안된다. 훔. 이건 확인해보자. 호출해서 불러올 수는 있어야 한다.
corfu 설정 확인할 것!
Embark
on link at minibuffer
CANCELLED ace-window and link-hint
아주 간단한 시나리오로 빛을 만들 수 있다. 이건 명확하다.
CANCELLED DONT zk-index zk-desktop
For a video demonstration, see: https://youtu.be/7qNT87dphiA
- 00:00 Introduction
- 03:10 ZK-Index
- 04:00 Browsing with Note Preview
- 05:30 Narrowing the Index, with Focus and Search
- 08:22 Sorting the Index
- 09:59 ZK-Desktop
- 11:33 Rearranging Notes
- 12:20 Edit Mode
- 13:18 Multiple Desktops
영상을 보면 완전 Dired 에서 필요한 기능을 뽑아 낸 것. 키 바인딩이 안먹고, 폰트 효과가 없다. 불 필요해 보인다. 다만 누적 키워드 기능이 있는데. 이게 쓸만한가? 아무튼 Dired 로 커버할 일 같긴하다만. 잠시만 더 고민할 여지가 남았다. 그래도 커스텀이 되어 있지 않는가?!
Desktop 은 사실 별게 없다. 추린 결과일 뿐이다. 이게 그렇다면 index 와 Desktop 은 별 기능이 없다는 말이다.
Manual KO
zk.el - A dead-simple, feature-rich Zettelkasten implementation for Emacs
Introduction
이 함수 집합은 제텔데프트 패키지의 많은 기능(전부는 아님)을 구현하는 동시에 데프트 또는 다른 외부 패키지에 대한 의존성을 우회하고 제거하는 것을 목표로 합니다. 백엔드 캐시나 데이터베이스를 사용하지 않고, 대신 평문 노트 디렉토리를 직접 쿼리하여 그 디렉토리 자체를 충분한 데이터베이스로 취급하고 활용하는 것을 선호합니다.
제공하는 함수는 가장 낮은 수준에서 grep
호출하고 반환 되는 파일 리스트, 링크, 태그는 Emacs 완성 함수인 completing-read
에 전달 하며 이를 바탕으로 버퍼에 관련 링크와 태그를 추가할 수 있습니다.
기본적으로 링크는 내장된 =button.el=을 사용하여 만든 클릭 가능한 버튼입니다. 즉, 링크는 기본 모드, 텍스트 모드, 개요 모드, 마크다운 모드 등 거의 모든 주요 모드에서 동일한 방식으로 작동합니다. 주요 예외는 조직 모드인데, 클릭 가능한 zk 링크를 사용하려면 약간의 변경이 필요합니다. (자세한 내용은 아래를 참조하세요.)
이 함수 집합의 구조적 단순성은 https://www.zettelkasten.de 등 여러 곳에서 많은 내용을 읽을 수 있는 소위 “Zettelkasten 방법"의 구조적 단순성과 일치합니다. 궁극적으로 이 패키지는 간결하고 이해하기 쉬우며 포크가 가능한 Emac 용 Zettelkasten 구현을 목표로 합니다. 포크하여 나만의 것으로 만들어 보세요.
Video demonstrations:
- zk - Setup and Main Features
- zk - Getting Started - Hydra and Inbox Note
- zk-index and zk-desktop
- zk-luhmann
File Structure
노트는 모두 하위 디렉터리 없이 zk-directory
변수로 설정된 단일 디렉터리에 보관됩니다.
각 노트는 별도의 파일로, 고유 ID 번호 뒤에 노트 제목과 파일 확장자(zk-file-extension
변수에 설정됨)가 붙습니다(예: “202012091130 종의 기원.txt”).
IDs and Links
노트 사이의 기본 연결 고리는 간단한 링크로, [[202012091130]]=와 같이 대괄호로 묶인 ID 번호의 형태를 취합니다. 노트의 ID 번호는 기본적으로 노트가 원래 생성된 날짜와 시간에 해당하는 12자리 문자열로 되어 있습니다. 예를 들어, 2020년 12월 9일 11:30에 만든 노트의 ID는 "202012091130"입니다. 이러한 노트에 연결하려면 =[[202012091130]]
문자열을 디렉터리의 다른 노트에 넣기만 하면 됩니다.
이 ID 와 파일 명명 체계의 주요 결과는 노트의 제목이 디렉토리 어디에 있든 노트에 대한 기존 링크가 끊어지지 않고 변경될 수 있다는 점입니다.
Completion
파일 이름과 링크를 완성하는 최상의 경험을 위해서는 https://github.com/oantolin/orderless[같은 이름의 패키지]의 순서 없는
완성 스타일을 사용하는 것을 강조 권장합니다. 미니 버퍼에서 완성하려면 Vertico를 사용하는 것도 좋습니다.
Setup
The easiest way to install is from MELPA.
Or, manually add zk.el
to your loadpath and include (require 'zk)
in your init.el file.
At a minimum, you must set the variables zk-directory
and zk-file-extension
:
(setq zk-directory "~/path/to/your/zk-directory")
(setq zk-file-extension "md") ;; any plaintext file extension, eg, "org" or "txt"
Zk=가 로드되면 =M-x zk-new-note=를 호출해 노트를 만들거나 =M-x zk-find-file=을 호출해 기존 노트를 엽니다.
Additional Setup:
Zk 파일을 열 때 자동 링크 생성을 활성화하려면 초기 구성에
(zk-setup-auto-link-buttons)
함수를 포함하세요. 이렇게 하면 =zk-enable-link-buttons=가 =t=로 설정되고 Emacs 의 =find-file-hook=에 =zk-make-link-buttons=가 추가됩니다.Embark 통합을 활성화하려면 초기 구성에
(zk-setup-embark)
함수를 포함하세요.
Sample setup with use-package
(use-package zk
:custom
(zk-directory "~/path/to/zk-directory")
(zk-file-extension "md")
:config
(zk-setup-auto-link-buttons)
(zk-setup-embark))
Sample setup with straight.el
to include optional zk-consult.el
functions
See
(use-package zk
:straight (zk :files (:defaults "zk-consult.el"))
:custom
(zk-directory "~/path/to/zk-directory")
(zk-file-extension "md")
:config
(require 'zk-consult)
(zk-setup-auto-link-buttons)
(zk-setup-embark)
(setq zk-tag-grep-function #'zk-consult-grep-tag-search
zk-grep-function #'zk-consult-grep))
Features
Follow Links
링크는 기본 제공 패키지 =button.el=로 만든 버튼으로, 클릭 가능한 텍스트이며 모든 주요 모드에서 동일한 방식으로 작동합니다. 기본 모드, 텍스트 모드, 윤곽선 모드, 마크다운 모드 등 어떤 모드에서든 zk 링크에서 =RET=을 클릭하거나 누르면 해당 노트가 열립니다. 유일한 예외는 조직 모드입니다. (조직 모드에서 클릭 가능한 링크를 구성하는 방법은 아래를 참조하세요.)
링크가 특정 지점에 있을 때 zk-follow-link-at-point
명령을 호출하거나, 현재 노트에 있는 모든 링크의 completing-read
목록이 표시되도록 zk-links-in-note
명령을 호출할 수도 있습니다.
Using Org-Mode and zk-links
조직 모드에서 기본 형식 zk-link-format
(double-brackets 안의 ID)의 링크는 내부 링크로 취급됩니다. 즉, 해당 링크를 클릭하면 기본적으로 조직은 지정된 ID 로 명명되거나 포함된 버퍼 내 제목 또는 대상을 찾습니다. Org 가 zk-link 를 as zk-link 로 취급하고 해당 노트를 열도록 하려면 org-open-at-point
함수에 다음과 같이 알려주기만 하면 됩니다:
(defun zk-org-try-to-follow-link (fn &optional arg)
"When 'org-open-at-point' FN fails, try 'zk-follow-link-at-point'.
Optional ARG."
(let ((org-link-search-must-match-exact-headline t))
(condition-case nil
(apply fn arg)
(error (zk-follow-link-at-point)))))
(advice-add 'org-open-at-point :around #'zk-org-try-to-follow-link)
간단히 설명하면, 이 함수는 링크가 내부 링크가 아닐 때 org-open-at-point=에게 =zk-follow-link-at-point
호출을 시도하도록 지시합니다.
조직 모드를 사용하는 다른 방법은 =zk-link-format=을 이중 대괄호 대신 단일 대괄호(single bracket)를 사용하도록 변경하는 것입니다. 이렇게 변경하면 기본 링크 버튼이 예상대로 작동합니다.
Note that using Org links makes the creation of link buttons, via zk-make-link-buttons
, redundant. This link button aspects of the package can be disabled by setting zk-enable-link-buttons
to nil.
조직 링크를 사용하면 =zk-make-link-buttons=를 통한 링크 버튼 생성이 중복된다는 점에 유의하세요. 패키지의 이 링크 버튼 측면은 =zk-enable-link-buttons=를 nil 로 설정하여 비활성화할 수 있습니다.
Using Org-links with zk-org-link.el
The companion package zk-org-link.el
provides a custom Org-link type called zk
, such that links will be styled [[zk:201812101245]]
instead of [[201812101245]]
. Using Org-links allows notes to be followed as expected, as well as exported to various formats via org-export
, stored via org-store-link
, and completed via org-insert-link
.
동반 패키지 zk-org-link.el=은 =zk=라는 사용자 지정 조직 링크 유형을 제공해 링크 스타일이 =[[201812101245]]
대신 ==로 지정됩니다. 조직 링크를 사용하면 예상대로 노트를 따라갈 수 있을 뿐 아니라 =org-export=를 통해 다양한 형식으로 내보내고, =org-store-link=를 통해 저장하고, =org-insert-link=로 완성할 수도 있습니다.
링크 스타일은 결합할 수 없으며 상호 호환되지 않습니다. 한 가지 스타일만 사용하세요. 즉, =zk-org-link.el=을 사용하거나 사용하지 마세요. (저는 사용하지 않지만 어쨌든 여기에 있습니다.)
To use org-links, include the following in your init.el:
조직 링크를 사용하려면 init.el 에 다음을 포함하세요:
(with-eval-after-load 'org
(with-eval-after-load 'zk
(require 'zk-org-link)))
This will set create the zk
Org-link type and set necessary values for several variables. Be sure to load zk-org-link.el
after zk, as the above code snippet does.
이렇게 하면 zk
조직 링크 유형 생성이 설정되고 여러 변수에 필요한 값이 설정됩니다. 위의 코드 스니펫과 같이 zk-org-link.el
after zk 를 로드해야 합니다.
NOTE: zk-completion-at-point
functionality is not available when using zk-org-link.el
.
참고: zk-org-link.el=을 사용할 때는 =zk-completion-at-point
기능을 사용할 수 없습니다.
link-hint.el
To allow link-hint.el to find zk-links, it is necessary to add a new link type, as follows:
Link-hint.el 이 zk 링크를 찾을 수 있도록 하려면 다음과 같이 새 링크 유형을 추가해야 합니다:
(defun zk-link-hint--zk-link-at-point-p ()
"Return the id of the zk-link at point or nil."
(thing-at-point-looking-at (zk-link-regexp)))
(defun zk-link-hint--next-zk-link (&optional bound)
"Find the next zk-link.
Only search the range between just after the point and BOUND."
(link-hint--next-regexp zk-id-regexp bound))
(eval-when-compile
(link-hint-define-type 'zk-link
:next #'zk-link-hint--next-zk-link
:at-point-p #'zk-link-hint--zk-link-at-point-p
:open #'zk-follow-link-at-point
:copy #'kill-new))
(push 'link-hint-zk-link link-hint-types)
List Backlinks
Calling zk-backlinks
in any note presents a list, with completion, of all notes that contain at least one link to the current note.
Smart New-Note Creation
The function zk-new-note
prompts for a title and generates a unique ID number for the new note based on the current date and time. A new file with that ID and title will be created in the zk-directory
.
New-Note Header and Backlink
The header of the new note is inserted by means of a function, the name of which must be set to the variable zk-new-note-header-function
.
The default header function, zk-new-note-header
, behaves differently depending on the context in which zk-new-note
is initiated. If zk-new-note
is called within an existing note, from within the zk-directory
, the new note’s header will contain a backlink to that note. If zk-new-note
is called from outside of the zk-directory
, there are two possible behaviors, depending on the setting of the variable zk-default-backlink
. If this variable is set to nil, the header of the new note will contain no backlink. If this variable is set to an ID (as a string), the header will contain a link and title corresponding with that ID. This can be useful if the directory contains a something like a “home” note or an “inbox” note.
Insert New-Note Link at Point of Creation
By default, a link to the new note, along with the new note’s title, will be placed at point wherever zk-new-note
was called. This behavior can be configured with the variable zk-new-note-link-insert
: when set to t
, a link is always inserted; when set to zk
, a link is inserted only when zk-new-note
is initiated inside an existing note in zk-directory
; when set to ask
, the user is asked whether or not a link should be inserted; when set to nil
, a link is not inserted. Calling zk-new-note
with a prefix-argument will insert a link regardless of setting of zk-new-note-link-insert
.
ID Format
By default, the date/time of a generated ID only goes to the minute, though this can be configured with the variable zk-id-time-string-format
. In the default case, however, if more than one note is created in the same minute, the ID will be incremented by 1 until it is unique, allowing for rapid note creation.
New-Note from Region
Finally, a new note can be created from a selected region of text. The convention for this feature is that the first line of the region will be used as the new note’s title, while the subsequent lines will be used as the body, with the exception of a single separator line between title and body. To clarify, consider the following as the region selected swhen zk-new-note
is called:
On the origin of species
It is not knowledge we lack. What is missing is the courage to understand
what we know and to draw conclusions.
The title of the new note in this case will be “On the origin of species.” The body will be the two sentences that follow it. The empty line separating title from body is necessary and should not be excluded.
Note: This behavior is derived from the behavior of an earlier, long-used Zettelkasten implementation and it persists here by custom only. It would be trivial to alter this function to behave perhaps more sensibly, for example by using the selected region in its entirety as the body and prompting for a title. For now, though, custom prevails.
Insert Links
Insert Links via Function
Calling zk-insert-link
presents a list, with completion, of all notes in the zk-directory
. By default this function inserts only the link itself, like so: [[202012091130]]
.
To insert both a link and title, either use a prefix-argument before calling zk-insert-link
or set the variable zk-link-insert-title
to t
, to always insert link and title together. Note that when zk-link-insert-title
is set to t
, calling zk-insert-link
with a prefix-argument temporarily restores the default behavior and inserts the link without a title.
To be prompted with a yes-or-no query, asking whether to insert a title with the link or insert only a link by itself, set zk-link-insert-title
to ask
. With this setting, a prefix-argument also restores the default behavior of inserting only a link.
The format in which link and title are inserted can be configured with the variable zk-link-and-title-format
.
Completion-at-Point
This package includes a completion-at-point-function, zk-completion-at-point
, for inserting links. Completion candidates are formatted as links followed by a title, i.e., [[202012091130]] On the origin of species
, such that typing [[
will initiate completion. To enable this functionality, add zk-completion-at-point
function to completion-at-point-functions
, by evaluating the following:
이 패키지에는 링크 삽입을 위한 특정 시점 완료 함수인 zk-completion-at-point=가 포함되어 있습니다. 완성 후보는 링크 뒤에 제목이 오는 형식(예: =[[202012091130]])으로 표시됩니다 종의 기원에
, 즉 [[=를 입력하면 완성이 시작되도록 합니다. 이 기능을 사용하려면 다음을 평가하여 =zk-completion-at-point
함수를 =complement-at-point-functions=에 추가하세요:
(add-hook 'completion-at-point-functions #'zk-completion-at-point 'append)
Consider using Corfu or Company as a convenient interface for such completions.
이러한 완료를 위한 편리한 인터페이스로 코르푸 또는 회사를 사용하는 것을 고려하세요.
Search
Note Search
The default search behavior of zk-search
calls the built-in function lgrep
to search for a regexp in all files in zk-directory
. Results are presented in a grep
buffer.
The function zk-find-file-by-full-text-search
presents, via completing-read
, a list of all files containing at least a single instance of a give search string somewhere in the body of the note. Compare this to zk-file-file
which returns matches only from the filename.
Tag Search (and Insert)
There are two functions that query all notes in the zk-directory
for tags in following form: #tag
. One of the functions, zk-tag-search
, opens a grep buffer listing all notes that contain the selected tag. The other function, zk-tag-insert
, inserts the selected tag into the current buffer.
Alternative Search Functions, using Consult-Grep
The file zk-consult.el
includes two alternative functions, for use with the Consult package, that display the results using completing-read
.
To use, make sure Consult
is loaded, then load zk-consult.el
, and set the following variables accordingly:
(setq zk-grep-function 'zk-consult-grep)
(setq zk-tag-grep-function 'zk-consult-grep-tag-search)
Embark Integration
This package includes support for Embark, both on links-at-point and in the minibuffer.
To enable Embark integration, evaluate the function zk-setup-embark
. Include this function in your config file to setup Embark integration on startup.
When Embark is loaded, calling embark-act
on a zk-id at point makes available the functions in the keymap zk-id-map
. This is a convenient way to follow links or to search for instances of the ID in all notes using zk-search
.
Calling embark-act
in the minibuffer makes available the functions in zk-file-map
. This is a convenient way to open notes or insert links.
Additionally, note that because the function zk-current-notes
uses read-buffer
by default, all Embark buffer actions are automatically available through embark-act
. This makes killing open notes a snap!
Last note: adding zk-search
to other Embark keymaps is a convenient way to search all notes for a given Embark target. Consider adding it to the embark-region-map
, for example, with a memorable keybinding — like “z”!
List Current Notes
The function zk-current-notes
presents a list of all currently open notes. Selecting a note opens it in the current frame.
The command can be set to use custom function, however, by setting the variable zk-current-note-function
to the name of a function.
One such function is available in zk-consult.el
: zk-consult-current-notes
presents the list of current notes as a narrowed consult-buffer-source
. Note that this source can also be included in the primary consult-buffer
interface by adding zk-consult-source
to list consult-buffer-sources
. (This is not done by default.)
ZK-Index and ZK-Desktop
Zk-index.el= 패키지는 =zk=의 동반자로, zk 디렉터리에서 노트 작업을 위한 두 가지 버퍼 기반 인터페이스를 제공합니다.
For a video demonstration, see: https://youtu.be/7qNT87dphiA
ZK-Index
This package is available on MELPA.
Sample setup with use-package
:
(use-package zk-index
:after zk
:config
(zk-index-setup-embark))
The function zk-index
pops up a buffer listing of all note titles, each of which is a clickable button. Clicking a title will pop the note into the above window.
Zk-index= 함수는 모든 노트 제목의 버퍼 목록을 팝업으로 표시하며, 각 제목은 클릭 가능한 버튼입니다. 제목을 클릭하면 노트가 위의 창으로 팝업됩니다.
The ZK-Index buffer is in a major mode with a dedicated keymap:
ZK-Index 버퍼는 전용 키맵이 있는 주 모드에 있습니다:
(defvar zk-index-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "n") #'zk-index-next-line)
(define-key map (kbd "p") #'zk-index-previous-line)
(define-key map (kbd "v") #'zk-index-view-note)
(define-key map (kbd "o") #'other-window)
(define-key map (kbd "f") #'zk-index-focus)
(define-key map (kbd "s") #'zk-index-search)
(define-key map (kbd "g") #'zk-index-query-refresh)
(define-key map (kbd "c") #'zk-index-current-notes)
(define-key map (kbd "i") #'zk-index-refresh)
(define-key map (kbd "S") #'zk-index-sort-size)
(define-key map (kbd "M") #'zk-index-sort-modified)
(define-key map (kbd "C") #'zk-index-sort-created)
(define-key map (kbd "RET") #'zk-index-open-note)
(define-key map (kbd "q") #'delete-window)
(make-composed-keymap map tabulated-list-mode-map))
"Keymap for ZK-Index buffer.")
Navigation
The keys n
and p
move the point to the next/previous index item, previewing the note at point in the above window. (This previewing behavior can be disabled by setting zk-index-auto-scroll
to nil.) In contrast, using C-n
and C-p
will move the point up and down the list without previewing notes.
N=과 p
키를 누르면 다음/이전 색인 항목으로 지점을 이동해 위 창에서 해당 지점의 노트를 미리 볼 수 있습니다. (이 미리 보기 동작은 =zk-index-auto-scroll=을 nil 로 설정해 비활성화할 수 있습니다) 반대로 =C-n=과 =C-p=를 사용하면 노트 미리보기 없이 목록의 위아래로 지점을 이동합니다.
Pressing v
(short for for ‘view’) on an index item will open the corresponding note in read-only-mode
, such that pressing q
will quit the buffer and return the point to the index. Pressing RET
on an index item will open the corresponding note the expected major mode.
색인 항목에서 =v=(‘보기’의 줄임말)를 누르면 해당 노트가 =읽기 전용 모드=로 열리고, =q=를 누르면 버퍼를 종료하고 해당 지점을 색인으로 되돌립니다. 색인 항목에서 =RET=을 누르면 해당 노트가 예상되는 주 모드로 열립니다.
Narrowing and Filtering
The key f
(for ‘focus’) filters notes by matching a string in the note’s TITLE. For example, pressing f
and entering the string “nature” will produce an index of all notes with the word “nature” in their titles.
F=(‘포커스’의 경우) 키는 노트의 제목에 있는 문자열과 일치하는 노트를 필터링합니다. 예를 들어, =f=를 누르고 “nature” 문자열을 입력하면 제목에 “nature"라는 단어가 포함된 모든 노트의 색인이 만들어집니다.
The focus feature is cumulative, so pressing f
again and entering another string, say, “climate,” will narrow down the index down further, to notes with the words “nature” and “climate” in the title.
초점 기능은 누적 기능이므로 =f=를 다시 누르고 ‘기후’와 같은 다른 문자열을 입력하면 제목에 ‘자연’과 ‘기후’라는 단어가 포함된 노트들로 색인 범위가 더 좁혀집니다.
The key s
(for ‘search’) for filters notes by matching a string in their full text. So, pressing s
and entering the string “nature” will produce an index of all notes that contain the word “nature” anywhere in the note itself.
S=(‘검색’의 경우) 키는 전체 텍스트의 문자열과 일치해 노트를 필터링합니다. 따라서 =s=를 누르고 “nature"라는 문자열을 입력하면 노트 자체 어디에서나 “nature"라는 단어가 포함된 모든 노트의 색인이 만들어집니다.
The search feature is also cumulative.
검색 기능도 누적됩니다.
Moreover, focus and search can be combined: you can focus by title and then search by content, or the other way around.
제목으로 초점을 맞춘 다음 콘텐츠로 검색하거나 그 반대로 검색할 수 있는 등 포커스와 검색을 결합할 수도 있습니다.
The key i
refreshes the index, canceling any filtering/narrowing, returning all notes to the list.
I= 키를 누르면 색인이 새로 고쳐져 필터링/축소가 취소되고 모든 노트가 목록으로 돌아옵니다.
Sorting
By default the index is sorted by time of last modification, with most recently modified notes being sorted to the top of the index. The key M
(for ‘modified’) enacts this sorting method.
기본적으로 색인은 마지막 수정 시간별로 정렬되며, 가장 최근에 수정한 노트가 색인의 맨 위에 정렬됩니다. M=(‘수정됨’의 경우) 키는 이 정렬 방식을 시행합니다.
The key C
(for ‘created’) sorts the index by time of creation, with the most recently created notes sorted to the top.
C=(‘생성됨’의 경우) 키는 생성 시간별로 인덱스를 정렬해 가장 최근에 생성된 노트가 맨 위에 정렬됩니다.
The key S
(for ‘size’) sorts the index by size of note, with largest notes sorted to the top.
키 =S=(‘크기’의 경우)는 노트 크기별로 색인을 정렬하며, 가장 큰 노트가 맨 위에 정렬됩니다.
ZK-Desktop
The feature zk-desktop
allows users to select and organize groups of notes relevant to specific projects. The only necessary setup is setting a directory for saved desktops. A convenient and unobtrusive option is to simply use the zk-directory
itself:
Zk-desktop= 기능을 사용하면 특정 프로젝트와 관련된 노트 그룹을 선택해 정리할 수 있습니다. 필요한 설정은 저장된 데스크톱의 디렉터리를 설정하는 것뿐입니다. 편리하고 눈에 거슬리지 않는 옵션은 zk-directory
자체를 사용하는 것입니다:
(use-package zk-desktop
:after zk-index
:config
(zk-desktop-setup-embark)
:custom
(zk-desktop-directory "path/to/zk-directory"))
Think of zk-desktop
as allowing you to achieve something like pulling project-specific note cards from a physical file cabinet and laying them out on a desktop in front of you, to be grouped and rearranged any way you like. In this case, however, the “desktop” is a simple plaintext file saved in the zk-directory
and the “note cards” are just note titles, each a clickable button, just like in zk-index
.
실제 파일 캐비닛에서 프로젝트별 노트 카드를 꺼내 눈앞의 데스크톱에 펼쳐놓고 원하는 방식으로 그룹화하고 재배치할 수 있다고 생각하면 됩니다. 하지만 이 경우 ‘데스크톱’은 =zk-directory=에 저장된 단순한 일반 텍스트 파일이고 ‘노트 카드’는 =zk-index=에서처럼 각각 클릭 가능한 버튼인 노트 제목일 뿐입니다.
In contrast to zk-index
, all notes on a given desktop are selected and placed there individually by the user, note-by-note, rather than en masse and programmatically. Additionally, the notes placed on the desktop can be rearranged, grouped, and commented on in-line.
Zk-index=와 달리, 특정 데스크톱의 모든 노트는 일괄적으로 프로그래밍 방식으로 배치하는 것이 아니라 사용자가 노트 단위로 선택해 개별적으로 배치합니다. 또한, 바탕화면에 배치된 노트는 실시간으로 재배열, 그룹화, 주석 달기가 가능합니다.
It is possible to have several desktops at once, each an individual file, and each corresponding to a different project. Use the function zk-desktop-select
to switch from working with one desktop to working with another.
한 번에 여러 개의 데스크톱을 사용할 수 있으며, 각각 개별 파일과 각기 다른 프로젝트에 해당하는 파일을 사용할 수 있습니다. 한 데스크톱 작업에서 다른 데스크톱 작업으로 전환하려면 zk-desktop-select
함수를 사용하세요.
Working with notes on a desktop
The notes listed on in the zk-desktop buffer can be rearranged, a single note can appear more than once, and the user can type on the desktop just like in a normal buffer — for example, to create headings or simply to type notes.
Zk-desktop 버퍼에 나열된 노트는 재배열이 가능하고, 하나의 노트가 두 번 이상 표시될 수 있으며, 사용자는 일반 버퍼에서처럼 데스크톱에 타이핑을 할 수 있습니다(예: 제목을 만들거나 단순히 노트를 입력하는 등).
A zk-desktop buffers open in fundamental-mode
by default, but this can be changed by setting the variable zk-desktop-major-mode
to the symbol for a major mode. Consider setting this to text-mode
, outline-mode
, or org-mode
.
Zk-desktop 버퍼는 기본적으로 기본 모드=로 열리지만 =zk-desktop-major-mode
변수를 주요 모드의 심볼로 설정하여 변경할 수 있습니다. 텍스트 모드, 개요 모드 또는 조직 모드로 설정하는 것도 고려해 보세요.
(setq zk-desktop-major-mode 'outline-mode)
Adding notes to a desktop
Each method of adding notes to the currently active desktop is accomplished via the same function: zk-desktop-send-to-desktop
.
현재 활성 데스크톱에 노트를 추가하는 각 방법은 동일한 함수인 =zk-desktop-send-to-desktop=을 통해 수행됩니다.
When this function is called in the zk-index
buffer itself, the note at point is sent to the desktop. If several notes are selected in the index, all notes in the active region are sent to the current deskop. This selection feature is usefully combined with the focus/search feature of zk-index
, to allow for sending a lot of relevant notes to a desktop at once.
이 함수가 zk-index
버퍼 자체에서 호출되면 해당 지점의 노트가 바탕화면으로 전송됩니다. 인덱스에서 여러 개의 노트를 선택한 경우, 활성 영역에 있는 모든 노트가 현재 바탕화면으로 전송됩니다. 이 선택 기능은 =zk-index=의 포커스/검색 기능과 결합해 한 번에 많은 관련 노트를 데스크톱으로 보낼 수 있는 유용한 기능입니다.
Embark Integration for ZK-Index and ZK-Desktop
To enable integration with Embark, include (zk-index-setup-embark)
and (zk-desktop-setup-embark)
in your init config.
엠바크와의 통합을 활성화하려면 초기 구성에 (zk-index-setup-embark)
및 =(zk-desktop-setup-embark)=를 포함하세요.
This setup allows all index and desktop items to be recognized as zk-id Embark targets, making available all Embark actions in the zk-id-map
.
이 설정을 사용하면 모든 인덱스 및 데스크톱 항목이 zk-id 엠바크 대상으로 인식되어 =zk-id-map=에서 모든 엠바크 작업을 사용할 수 있습니다.
The latter adds zk-desktop-send-to-deskop
to zk-id-map
and zk-file-map
, to facilitate sending files to desktop from the minibuffer or via embark-act
in the zk-index buffer.
후자는 미니 버퍼에서 데스크톱으로 파일을 보내거나 zk 인덱스 버퍼의 embark-act=를 통해 데스크톱으로 파일을 쉽게 보낼 수 있도록 =zk-desktop-send-to-deskop=을 =zk-id-map
및 =zk-file-map=에 추가합니다.
Embark-Select and Embark-Export
Use embark-select
to mark candidates, including zk-links, items in zk-index, and zk-files in the minibuffer. These selected items can then be acted on via embark-act-all
. For example, zk-copy-link-and-title
will add to the kill-ring a nicely formatted list of links to the selected notes. Similarly, zk-insert-link
will insert a nicely formatted list of links into the appropriate buffer.
엠바크-선택=을 사용하여 미니버퍼에 있는 zk-링크, zk-인덱스의 항목, zk-파일을 포함한 후보를 표시합니다. 이렇게 선택된 항목은 =embark-act-all=을 통해 작업할 수 있습니다. 예를 들어, =zk-copy-link-and-title=은 선택한 노트에 대한 멋진 형식의 링크 목록을 킬링링에 추가합니다. 마찬가지로, =zk-insert-link=는 적절한 버퍼에 멋진 형식의 링크 목록을 삽입합니다.
When zk-index
is loaded, calling embark-export
on selected zk-files in the minibuffer or items in a zk-index export those items to a new ZK-Index buffer. Calling zk-index-narrow
on selected items will narrow the primary ZK-Index buffer to those files.
Zk-index=가 로드되면 미니 버퍼의 선택된 zk 파일 또는 zk-index 의 항목에 대해 =embark-export=를 호출하면 해당 항목을 새 ZK-Index 버퍼로 내보냅니다. 선택한 항목에 대해 =zk-index-narrow=를 호출하면 기본 ZK-Index 버퍼가 해당 파일로 좁혀집니다.
Comparable Zettelkasten(-like) Implementations
Emacs-based
Non-Emacs
Why not use one of these?
You should! They are great. I used each one of them for a least some time, some for longer than others. At a certain point with each, however, I found that I couldn’t make them do exactly what I wanted. My sense, eventually, was that the best implementation of a Zettelkasten is the one in which a user has as much control as possible over its structure, over its behavior, and, frankly, over its future viability. At first, this primarily meant using only plaintext files — no proprietary formats, no opaque databases. Eventually, however, it also meant seeking out malleability and extensibility in the means of dealing with those plaintext files, ie, in the software.
해야 합니다! 그들은 훌륭합니다. 저는 적어도 얼마 동안 각각을 사용했습니다, 어떤 것은 다른 것보다 더 오래 사용했습니다. 하지만 어느 순간부터 저는 제가 원하는 것을 정확하게 할 수 없다는 것을 알게 되었습니다. 결국 제가 느낀 것은 제텔카스텐을 가장 잘 구현하는 것은 사용자가 구조를 최대한 구조와 동작에 대해 가능한 한 많은 통제권을 가지고 있으며 솔직히 말해서 미래의 실행 가능성까지. 처음에는 주로 독점 형식이나 불투명한 데이터베이스가 없는 일반 텍스트 파일만을 사용하는 것을 의미했습니다. 결국 그러나 이는 또한 이러한 평문 파일을 처리하는 수단에서 즉, 소프트웨어에서 이러한 일반 텍스트 파일을 처리하는 수단에서 가변성과 확장성을 추구해야 했습니다.
My best experiences in this regard were with “The Archive” and, after I discovered Emacs, with “Zetteldeft.” The former is highly extensible, largely by virtue (at least at this point) of the macro editor “KeyboardMaestro,” through which one can do nearly anything with a directory of text files, in terms of editing, querying, inserting tags and links, etc. If I hadn’t fallen into Emacs, I would definitely still be using “The Archive” in combination with “KeyboardMaestro.” Little about my note-taking practices and preferences has changed since I used “The Archive.” As for “Zetteldeft,” the notable differences between it and the present package are only to be found under-the-hood, so to speak. The only reason I’m not still using it is that, over time, it became this. This set of functions aims to implement many (but not all) of the features of the package Zetteldeft, while circumventing and eliminating any dependency on Deft, or any other external packages for that matter. It does not use any backend cache or database, preferring instead to query a directory of plaintext notes directly, treating and utilizing that directory as a sufficient database unto itself.
이와 관련하여 제가 가장 좋았던 경험은 “The Archive"와 이맥스를 발견한 후 “Zetteldeft"였습니다 전자는 매크로 편집기인 “KeyboardMaestro"를 통해 텍스트 파일 디렉토리로 편집, 쿼리, 태그 및 링크 삽입 등 거의 모든 작업을 수행할 수 있는 확장성이 매우 뛰어납니다(적어도 현재 시점에서는). 만약 제가 Emacs 에 빠져들지 않았다면 “The Archive"와 “KeyboardMaestro"를 함께 사용하고 있었을 것입니다 “The Archive"를 사용한 후 제 노트 필기 방식과 선호도에 거의 변화가 없었습니다 “제텔데프트"의 경우, 현재 패키지와 눈에 띄는 차이점은 말하자면 내부 기능에서만 찾을 수 있습니다. 제가 아직도 사용하지 않는 유일한 이유는 시간이 지남에 따라 이렇게 되었기 때문입니다. 이 기능 집합은 Zetteldeft 패키지의 많은 기능(전부는 아님)을 구현하는 동시에 Deft 또는 다른 외부 패키지에 대한 의존성을 우회하고 제거하는 것을 목표로 합니다. 백엔드 캐시나 데이터베이스를 사용하지 않고, 대신 일반 텍스트 노트 디렉토리를 직접 쿼리하여 그 디렉토리 자체를 충분한 데이터베이스로 취급하고 활용하는 것을 선호합니다