From 4696eadc02ae296846dc8544ac7e1a3eca246116 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sat, 6 Aug 2022 15:19:01 +0300 Subject: [PATCH 01/17] Fix definition of khoj--search- functions in khoj.el --- src/interface/emacs/khoj.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el index e0e30460..cfac223b 100644 --- a/src/interface/emacs/khoj.el +++ b/src/interface/emacs/khoj.el @@ -80,10 +80,10 @@ C-x o | org-mode C-x l | ledger/beancount C-x i | images ") -(defun khoj--search-markdown (interactive) (setq khoj--search-type "markdown")) -(defun khoj--search-org (interactive) (setq khoj--search-type "org")) -(defun khoj--search-ledger (interactive) (setq khoj--search-type "ledger")) -(defun khoj--search-images (interactive) (setq khoj--search-type "image")) +(defun khoj--search-markdown () (interactive) (setq khoj--search-type "markdown")) +(defun khoj--search-org () (interactive) (setq khoj--search-type "org")) +(defun khoj--search-ledger () (interactive) (setq khoj--search-type "ledger")) +(defun khoj--search-images () (interactive) (setq khoj--search-type "image")) (defun khoj--make-search-keymap (&optional existing-keymap) "Setup keymap to configure Khoj search" (let ((kmap (or existing-keymap (make-sparse-keymap)))) From e95686c89ca9207cb01206b072e28991156af020 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sat, 6 Aug 2022 16:27:23 +0300 Subject: [PATCH 02/17] Show complete Khoj keybindings when initiate search in Emacs - The keybindings to select search types was previously confusing as it only highlighted the final symbol to press (the C-x was shown but it wasn't made apparent that it had to be pressed before) - Previously some keybindings unrelated to khoj were also being shown in the which-key popup. Now only the khoj keybindings are visible --- src/interface/emacs/khoj.el | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el index cfac223b..60bf8ba5 100644 --- a/src/interface/emacs/khoj.el +++ b/src/interface/emacs/khoj.el @@ -95,12 +95,9 @@ C-x i | images (defun khoj--display-keybinding-info () "Display information on keybindings to customize khoj search. Use `which-key` if available, else display simple message in echo area" - (if (fboundp 'which-key--create-buffer-and-show) - (which-key--create-buffer-and-show - (kbd "C-x") - (symbolp (khoj--make-search-keymap)) - '(lambda (binding) (string-prefix-p "khoj--" (cdr binding))) - "Khoj Bindings") + (if (fboundp 'which-key-show-full-keymap) + (let ((khoj--keymap (khoj--make-search-keymap))) + (which-key-show-full-keymap 'khoj--keymap)) (message "%s" khoj--keybindings-info-message))) (defun khoj--extract-entries-as-markdown (json-response query) @@ -262,6 +259,7 @@ Use `which-key` if available, else display simple message in echo area" (defun khoj--minibuffer-exit-advice (&rest _args) (khoj--incremental-search t)) + ;;;###autoload (defun khoj () "Natural, Incremental Search for your personal notes, transactions and music using Khoj" From f3c1512c38079dd9b8945182a70a2e2b312a8aa0 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sun, 7 Aug 2022 15:57:08 +0300 Subject: [PATCH 03/17] Fix to let user to start enter query right after initiating khoj on emacs - Fix regression since moving to use `which-key-show-full-keymap~ - The above function reads user keypress, so eats up 1 keypress before starting to enter query - No way to pass no-paging config via the external function to the internally used which-key--show-keymap function that does allow setting no-paging to not read user keypress - So use the internal function instead and set no-paging arg to t --- src/interface/emacs/khoj.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el index 60bf8ba5..12e64918 100644 --- a/src/interface/emacs/khoj.el +++ b/src/interface/emacs/khoj.el @@ -97,7 +97,9 @@ C-x i | images Use `which-key` if available, else display simple message in echo area" (if (fboundp 'which-key-show-full-keymap) (let ((khoj--keymap (khoj--make-search-keymap))) - (which-key-show-full-keymap 'khoj--keymap)) + (which-key--show-keymap (symbol-name 'khoj--keymap) + (symbol-value 'khoj--keymap) + nil t t)) (message "%s" khoj--keybindings-info-message))) (defun khoj--extract-entries-as-markdown (json-response query) @@ -242,7 +244,7 @@ Use `which-key` if available, else display simple message in echo area" (delete-process proc))))) (defun khoj--teardown-incremental-search () - (message "[Khoj]: Teardown Incremental Search") + (message "Khoj: Teardown Incremental Search") ;; remove advice to rerank results on normal exit from minibuffer (advice-remove 'exit-minibuffer #'khoj--minibuffer-exit-advice) ;; unset khoj minibuffer window From 6dc9801f45a6fe412b02e10c5f26f44b639e30a3 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sun, 7 Aug 2022 17:28:43 +0300 Subject: [PATCH 04/17] Get Khoj search-types enabled by user in Emacs --- src/interface/emacs/khoj.el | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el index 12e64918..6289060c 100644 --- a/src/interface/emacs/khoj.el +++ b/src/interface/emacs/khoj.el @@ -180,6 +180,20 @@ Use `which-key` if available, else display simple message in echo area" ((or (equal file-extension "markdown") (equal file-extension "md")) "markdown") (t "org")))) +(defun khoj--get-enabled-search-types () + (let ((config-url (format "%s/config/data" khoj--server-url))) + (with-temp-buffer + (erase-buffer) + (url-insert-file-contents config-url) + (let* ((json-response (json-parse-buffer :object-type 'alist)) + (content-type (cdr (assoc 'content-type json-response)))) + ;; return content-type items with configuration + (mapcar + 'car + (cl-remove-if-not + '(lambda (a) (not (eq (cdr a) :null))) + content-type)))))) + (defun khoj--construct-api-query (query search-type &optional rerank) (let ((rerank (or rerank "false")) (results-count (or khoj--results-count 5)) From ebee7160263a7c415af557e00bea5492972af139 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sun, 7 Aug 2022 18:01:21 +0300 Subject: [PATCH 05/17] Only show keybindings reference for enabled search types in khoj.el --- src/interface/emacs/khoj.el | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el index 6289060c..04c09cf1 100644 --- a/src/interface/emacs/khoj.el +++ b/src/interface/emacs/khoj.el @@ -86,11 +86,16 @@ C-x i | images (defun khoj--search-images () (interactive) (setq khoj--search-type "image")) (defun khoj--make-search-keymap (&optional existing-keymap) "Setup keymap to configure Khoj search" - (let ((kmap (or existing-keymap (make-sparse-keymap)))) - (define-key kmap (kbd "C-x m") #'khoj--search-markdown) - (define-key kmap (kbd "C-x o") #'khoj--search-org) - (define-key kmap (kbd "C-x l") #'khoj--search-ledger) - (define-key kmap (kbd "C-x i") #'khoj--search-images) + (let ((enabled-search-types (khoj--get-enabled-search-types)) + (kmap (or existing-keymap (make-sparse-keymap)))) + (when (member 'markdown enabled-search-types) + (define-key kmap (kbd "C-x m") #'khoj--search-markdown)) + (when (member 'org enabled-search-types) + (define-key kmap (kbd "C-x o") #'khoj--search-org)) + (when (member 'ledger enabled-search-types) + (define-key kmap (kbd "C-x l") #'khoj--search-ledger)) + (when (member 'image enabled-search-types) + (define-key kmap (kbd "C-x i") #'khoj--search-images)) kmap)) (defun khoj--display-keybinding-info () "Display information on keybindings to customize khoj search. From 5a10c47499cf6fe8af3a8d224622dac038aeda9b Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sun, 7 Aug 2022 18:03:06 +0300 Subject: [PATCH 06/17] Allow setting music as search type in khoj.el. Had forgotten to include it earlier --- src/interface/emacs/khoj.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el index 04c09cf1..651185b3 100644 --- a/src/interface/emacs/khoj.el +++ b/src/interface/emacs/khoj.el @@ -84,6 +84,7 @@ C-x i | images (defun khoj--search-org () (interactive) (setq khoj--search-type "org")) (defun khoj--search-ledger () (interactive) (setq khoj--search-type "ledger")) (defun khoj--search-images () (interactive) (setq khoj--search-type "image")) +(defun khoj--search-music () (interactive) (setq khoj--search-type "music")) (defun khoj--make-search-keymap (&optional existing-keymap) "Setup keymap to configure Khoj search" (let ((enabled-search-types (khoj--get-enabled-search-types)) @@ -96,6 +97,8 @@ C-x i | images (define-key kmap (kbd "C-x l") #'khoj--search-ledger)) (when (member 'image enabled-search-types) (define-key kmap (kbd "C-x i") #'khoj--search-images)) + (when (member 'music enabled-search-types) + (define-key kmap (kbd "C-x M") #'khoj--search-music)) kmap)) (defun khoj--display-keybinding-info () "Display information on keybindings to customize khoj search. From d08c25b62bdfc8004afc047d495276240831656e Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sun, 7 Aug 2022 18:04:26 +0300 Subject: [PATCH 07/17] Make default search type used in the Emacs interface configurable --- src/interface/emacs/khoj.el | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el index 651185b3..8ec0f540 100644 --- a/src/interface/emacs/khoj.el +++ b/src/interface/emacs/khoj.el @@ -56,6 +56,14 @@ :group 'khoj :type 'integer) +(defcustom khoj-default-search-type "org" + "The default content type to perform search on." + :group 'khoj + :type '(choice (const "org") + (const "markdown") + (const "ledger") + (const "music"))) + (defvar khoj--rerank-timer nil "Idle timer to make cross-encoder re-rank incremental search results if user idle.") @@ -180,13 +188,14 @@ Use `which-key` if available, else display simple message in echo area" json-response))))) (defun khoj--buffer-name-to-search-type (buffer-name) - (let ((file-extension (file-name-extension buffer-name))) + (let ((enabled-search-types (khoj--get-enabled-search-types)) + (file-extension (file-name-extension buffer-name))) (cond - ((equal buffer-name "Music.org") "music") - ((or (equal file-extension "bean") (equal file-extension "beancount")) "ledger") - ((equal file-extension "org") "org") - ((or (equal file-extension "markdown") (equal file-extension "md")) "markdown") - (t "org")))) + ((and (member 'music enabled-search-types) (equal buffer-name "Music.org")) "music") + ((and (member 'ledger enabled-search-types) (or (equal file-extension "bean") (equal file-extension "beancount"))) "ledger") + ((and (member 'org enabled-search-types) (equal file-extension "org")) "org") + ((and (member 'markdown enabled-search-types) (or (equal file-extension "markdown") (equal file-extension "md"))) "markdown") + (t khoj-default-search-type)))) (defun khoj--get-enabled-search-types () (let ((config-url (format "%s/config/data" khoj--server-url))) From 127c6e78dffda3c8dc4a44a593a5850bd8ebab14 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sun, 7 Aug 2022 18:40:35 +0300 Subject: [PATCH 08/17] Only show keybindings for enabled search types in simple info menu too Convert the khoj--keybindings-info-message into a func Dynamically generate info menu Show keybindings for enabled search types only --- src/interface/emacs/khoj.el | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el index 8ec0f540..bc619828 100644 --- a/src/interface/emacs/khoj.el +++ b/src/interface/emacs/khoj.el @@ -79,15 +79,23 @@ (defvar khoj--search-type "org" "The type of content to perform search on.") -(defvar khoj--keybindings-info-message - " +(defun khoj--keybindings-info-message () + (let ((enabled-search-types (khoj--get-enabled-search-types))) + (concat + " Set Search Type -------------------------- -C-x m | markdown -C-x o | org-mode -C-x l | ledger/beancount -C-x i | images -") +-------------------------\n" + (when (member 'markdown enabled-search-types) + "C-x m | markdown\n") + (when (member 'org enabled-search-types) + "C-x o | org-mode\n") + (when (member 'ledger enabled-search-types) + "C-x l | ledger\n") + (when (member 'image enabled-search-types) + "C-x i | images\n") + (when (member 'music enabled-search-types) + "C-x M | music\n")))) + (defun khoj--search-markdown () (interactive) (setq khoj--search-type "markdown")) (defun khoj--search-org () (interactive) (setq khoj--search-type "org")) (defun khoj--search-ledger () (interactive) (setq khoj--search-type "ledger")) @@ -116,7 +124,7 @@ Use `which-key` if available, else display simple message in echo area" (which-key--show-keymap (symbol-name 'khoj--keymap) (symbol-value 'khoj--keymap) nil t t)) - (message "%s" khoj--keybindings-info-message))) + (message "%s" (khoj--keybindings-info-message)))) (defun khoj--extract-entries-as-markdown (json-response query) "Convert json response from API to markdown entries" From dddc57e132a58680947aa4bd3b0caa8abc4af936 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sun, 7 Aug 2022 18:53:14 +0300 Subject: [PATCH 09/17] Rename get-enabled-search-types to get-enabled-content-types as more appropriate --- src/interface/emacs/khoj.el | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el index bc619828..d1fdc1c6 100644 --- a/src/interface/emacs/khoj.el +++ b/src/interface/emacs/khoj.el @@ -80,20 +80,20 @@ "The type of content to perform search on.") (defun khoj--keybindings-info-message () - (let ((enabled-search-types (khoj--get-enabled-search-types))) + (let ((enabled-content-types (khoj--get-enabled-content-types))) (concat " Set Search Type -------------------------\n" - (when (member 'markdown enabled-search-types) + (when (member 'markdown enabled-content-types) "C-x m | markdown\n") - (when (member 'org enabled-search-types) + (when (member 'org enabled-content-types) "C-x o | org-mode\n") - (when (member 'ledger enabled-search-types) + (when (member 'ledger enabled-content-types) "C-x l | ledger\n") - (when (member 'image enabled-search-types) + (when (member 'image enabled-content-types) "C-x i | images\n") - (when (member 'music enabled-search-types) + (when (member 'music enabled-content-types) "C-x M | music\n")))) (defun khoj--search-markdown () (interactive) (setq khoj--search-type "markdown")) @@ -103,17 +103,17 @@ (defun khoj--search-music () (interactive) (setq khoj--search-type "music")) (defun khoj--make-search-keymap (&optional existing-keymap) "Setup keymap to configure Khoj search" - (let ((enabled-search-types (khoj--get-enabled-search-types)) + (let ((enabled-content-types (khoj--get-enabled-content-types)) (kmap (or existing-keymap (make-sparse-keymap)))) - (when (member 'markdown enabled-search-types) + (when (member 'markdown enabled-content-types) (define-key kmap (kbd "C-x m") #'khoj--search-markdown)) - (when (member 'org enabled-search-types) + (when (member 'org enabled-content-types) (define-key kmap (kbd "C-x o") #'khoj--search-org)) - (when (member 'ledger enabled-search-types) + (when (member 'ledger enabled-content-types) (define-key kmap (kbd "C-x l") #'khoj--search-ledger)) - (when (member 'image enabled-search-types) + (when (member 'image enabled-content-types) (define-key kmap (kbd "C-x i") #'khoj--search-images)) - (when (member 'music enabled-search-types) + (when (member 'music enabled-content-types) (define-key kmap (kbd "C-x M") #'khoj--search-music)) kmap)) (defun khoj--display-keybinding-info () @@ -196,16 +196,17 @@ Use `which-key` if available, else display simple message in echo area" json-response))))) (defun khoj--buffer-name-to-search-type (buffer-name) - (let ((enabled-search-types (khoj--get-enabled-search-types)) + (let ((enabled-content-types (khoj--get-enabled-content-types)) (file-extension (file-name-extension buffer-name))) (cond - ((and (member 'music enabled-search-types) (equal buffer-name "Music.org")) "music") - ((and (member 'ledger enabled-search-types) (or (equal file-extension "bean") (equal file-extension "beancount"))) "ledger") - ((and (member 'org enabled-search-types) (equal file-extension "org")) "org") - ((and (member 'markdown enabled-search-types) (or (equal file-extension "markdown") (equal file-extension "md"))) "markdown") + ((and (member 'music enabled-content-types) (equal buffer-name "Music.org")) "music") + ((and (member 'ledger enabled-content-types) (or (equal file-extension "bean") (equal file-extension "beancount"))) "ledger") + ((and (member 'org enabled-content-types) (equal file-extension "org")) "org") + ((and (member 'markdown enabled-content-types) (or (equal file-extension "markdown") (equal file-extension "md"))) "markdown") (t khoj-default-search-type)))) -(defun khoj--get-enabled-search-types () +(defun khoj--get-enabled-content-types () + "Get content types enabled for search from API" (let ((config-url (format "%s/config/data" khoj--server-url))) (with-temp-buffer (erase-buffer) From f01fb16ebbbce74c865242f48c466b67511b1f62 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Tue, 9 Aug 2022 20:49:34 +0300 Subject: [PATCH 10/17] Use single hyphen in name of user configurable variables in khoj.el - Follow convention, two hyphens indicate variable private to library - Defcustom are user configurable variables. So they should have single - - Use khoj-results-count variable directly in code --- src/interface/emacs/khoj.el | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el index d1fdc1c6..bd4ffc96 100644 --- a/src/interface/emacs/khoj.el +++ b/src/interface/emacs/khoj.el @@ -36,22 +36,22 @@ (require 'url) (require 'json) -(defcustom khoj--server-url "http://localhost:8000" +(defcustom khoj-server-url "http://localhost:8000" "Location of Khoj API server." :group 'khoj :type 'string) -(defcustom khoj--image-width 156 +(defcustom khoj-image-width 156 "Width of rendered images returned by Khoj." :group 'khoj :type 'integer) -(defcustom khoj--rerank-after-idle-time 1.0 +(defcustom khoj-rerank-after-idle-time 1.0 "Idle time (in seconds) to trigger cross-encoder to rerank incremental search results." :group 'khoj :type 'float) -(defcustom khoj--results-count 5 +(defcustom khoj-results-count 5 "Number of results to get from Khoj API for each query." :group 'khoj :type 'integer) @@ -173,9 +173,9 @@ Use `which-key` if available, else display simple message in echo area" (cdr (assoc 'score args)) (cdr (assoc 'metadata_score args)) (cdr (assoc 'image_score args)) - khoj--server-url + khoj-server-url (cdr (assoc 'entry args)) - khoj--server-url + khoj-server-url (cdr (assoc 'entry args)) (random 10000))) json-response))))) @@ -207,7 +207,7 @@ Use `which-key` if available, else display simple message in echo area" (defun khoj--get-enabled-content-types () "Get content types enabled for search from API" - (let ((config-url (format "%s/config/data" khoj--server-url))) + (let ((config-url (format "%s/config/data" khoj-server-url))) (with-temp-buffer (erase-buffer) (url-insert-file-contents config-url) @@ -222,9 +222,8 @@ Use `which-key` if available, else display simple message in echo area" (defun khoj--construct-api-query (query search-type &optional rerank) (let ((rerank (or rerank "false")) - (results-count (or khoj--results-count 5)) (encoded-query (url-hexify-string query))) - (format "%s/search?q=%s&t=%s&r=%s&n=%s" khoj--server-url encoded-query search-type rerank results-count))) + (format "%s/search?q=%s&t=%s&r=%s&n=%s" khoj-server-url encoded-query search-type rerank khoj-results-count))) (defun khoj--query-api-and-render-results (query search-type query-url buffer-name) ;; get json response from api @@ -279,7 +278,7 @@ Use `which-key` if available, else display simple message in echo area" "Delete all network connections to khoj server" (dolist (proc (process-list)) (let ((proc-buf (buffer-name (process-buffer proc))) - (khoj-network-proc-buf (string-join (split-string khoj--server-url "://") " "))) + (khoj-network-proc-buf (string-join (split-string khoj-server-url "://") " "))) (when (string-match (format "%s" khoj-network-proc-buf) proc-buf) (delete-process proc))))) @@ -309,8 +308,8 @@ Use `which-key` if available, else display simple message in echo area" (let* ((khoj-buffer-name (get-buffer-create khoj--buffer-name))) ;; set khoj search type to last used or based on current buffer (setq khoj--search-type (or khoj--search-type (khoj--buffer-name-to-search-type (buffer-name)))) - ;; setup rerank to improve results once user idle for KHOJ--RERANK-AFTER-IDLE-TIME seconds - (setq khoj--rerank-timer (run-with-idle-timer khoj--rerank-after-idle-time t 'khoj--incremental-search t)) + ;; setup rerank to improve results once user idle for KHOJ-RERANK-AFTER-IDLE-TIME seconds + (setq khoj--rerank-timer (run-with-idle-timer khoj-rerank-after-idle-time t 'khoj--incremental-search t)) ;; switch to khoj results buffer (switch-to-buffer khoj-buffer-name) ;; open and setup minibuffer for incremental search From 0a758c9f0f3c1b4c20e31c291cca5d3e17f77854 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Tue, 9 Aug 2022 20:52:52 +0300 Subject: [PATCH 11/17] By default, wait for 2 seconds before initiating rerank in khoj.el - Subjectively, previous default seems to aggressive based on usage Doesn't give time for user to think and type their query --- src/interface/emacs/khoj.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el index bd4ffc96..73ea68aa 100644 --- a/src/interface/emacs/khoj.el +++ b/src/interface/emacs/khoj.el @@ -46,7 +46,7 @@ :group 'khoj :type 'integer) -(defcustom khoj-rerank-after-idle-time 1.0 +(defcustom khoj-rerank-after-idle-time 2.0 "Idle time (in seconds) to trigger cross-encoder to rerank incremental search results." :group 'khoj :type 'float) From 57026b802c9cc9c38cbcf77396d7144fefdb88d1 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Tue, 9 Aug 2022 20:55:10 +0300 Subject: [PATCH 12/17] Set size of rendered images using user customizable vars --- src/interface/emacs/khoj.el | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el index 73ea68aa..a75ad4a1 100644 --- a/src/interface/emacs/khoj.el +++ b/src/interface/emacs/khoj.el @@ -46,6 +46,11 @@ :group 'khoj :type 'integer) +(defcustom khoj-image-height 156 + "Height of rendered images returned by Khoj." + :group 'khoj + :type 'integer) + (defcustom khoj-rerank-after-idle-time 2.0 "Idle time (in seconds) to trigger cross-encoder to rerank incremental search results." :group 'khoj @@ -169,7 +174,7 @@ Use `which-key` if available, else display simple message in echo area" query (mapcar (lambda (args) (format - "\n\n

Score: %s Meta: %s Image: %s

\n\n\n\n" + "\n\n

Score: %s Meta: %s Image: %s

\n\n\n\n" (cdr (assoc 'score args)) (cdr (assoc 'metadata_score args)) (cdr (assoc 'image_score args)) @@ -177,7 +182,9 @@ Use `which-key` if available, else display simple message in echo area" (cdr (assoc 'entry args)) khoj-server-url (cdr (assoc 'entry args)) - (random 10000))) + (random 10000) + khoj-image-width + khoj-image-height)) json-response))))) (defun khoj--extract-entries-as-ledger (json-response query) From 84c1fc701d6e833aa4d945bde135d8e4cdd41a0b Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Tue, 9 Aug 2022 21:01:14 +0300 Subject: [PATCH 13/17] Fix query timing variables from being referenced before assignment --- src/main.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main.py b/src/main.py index f2bc7db9..ab36420c 100644 --- a/src/main.py +++ b/src/main.py @@ -69,10 +69,12 @@ def search(q: str, n: Optional[int] = 5, t: Optional[SearchType] = None, r: Opti print(f'No query param (q) passed in API call to initiate search') return {} + # initialize variables device = torch.device("cuda:0") if torch.cuda.is_available() else torch.device("cpu") user_query = q results_count = n results = {} + query_start, query_end, collate_start, collate_end = None, None, None, None if (t == SearchType.Org or t == None) and model.orgmode_search: # query org-mode notes @@ -136,8 +138,10 @@ def search(q: str, n: Optional[int] = 5, t: Optional[SearchType] = None, r: Opti collate_end = time.time() if verbose > 1: - print(f"Query took {query_end - query_start:.3f} seconds") - print(f"Collating results took {collate_end - collate_start:.3f} seconds") + if query_start and query_end: + print(f"Query took {query_end - query_start:.3f} seconds") + if collate_start and collate_end: + print(f"Collating results took {collate_end - collate_start:.3f} seconds") return results From eddf88f818663dd821277134280ff3fe197d0739 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Wed, 10 Aug 2022 12:57:37 +0300 Subject: [PATCH 14/17] Org buffer customization settings to tail of khoj.el results buffer - Results get priority screen real estate - Allows quick speed key based traversal of results as cursor on switching to buffer is at top level heading - E.g C-x o n n o 2 jumps to entry in actual file of second result - Unlike before when it is at the #+STARTUP org buffer customization settings --- src/interface/emacs/khoj.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/emacs/khoj.el b/src/interface/emacs/khoj.el index a75ad4a1..fe0d7248 100644 --- a/src/interface/emacs/khoj.el +++ b/src/interface/emacs/khoj.el @@ -152,7 +152,7 @@ Use `which-key` if available, else display simple message in echo area" (replace-regexp-in-string "^[\(\) ]" "" ;; extract entries from response as single string and convert to entries - (format "#+STARTUP: showall hidestars inlineimages\n* %s\n%s" + (format "* %s\n%s\n#+STARTUP: showall hidestars inlineimages" query (mapcar (lambda (args) From a02d9db457c1c64c4ebcadfd6e7db3eeff49f0a2 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Wed, 10 Aug 2022 13:48:18 +0300 Subject: [PATCH 15/17] Test Task State Extraction in OrgNode Tests --- tests/test_orgnode.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/test_orgnode.py b/tests/test_orgnode.py index a516fe7f..186eaaec 100644 --- a/tests/test_orgnode.py +++ b/tests/test_orgnode.py @@ -37,7 +37,7 @@ def test_parse_complete_entry(tmp_path): "Test parsing of entry with all important fields" # Arrange entry = f''' -*** [#A] Heading :Tag1:TAG2:tag3: +*** DONE [#A] Heading :Tag1:TAG2:tag3: CLOSED: [1984-04-01 Sun 12:00] SCHEDULED: <1984-04-01 Sun 09:00> DEADLINE: <1984-04-01 Sun> :PROPERTIES: :ID: 123-456-789-4234-1231 @@ -56,6 +56,7 @@ Body Line 2''' # Assert assert len(entries) == 1 assert entries[0].Heading() == "Heading" + assert entries[0].Todo() == "DONE" assert entries[0].Tags() == {"Tag1", "TAG2", "tag3"} assert entries[0].Body() == "- Clocked Log 1\nBody Line 1\nBody Line 2" assert entries[0].Priority() == "A" @@ -124,7 +125,7 @@ def test_parse_multiple_entries(tmp_path): "Test parsing of multiple entries" # Arrange content = f''' -*** [#A] Heading1 :tag1: +*** FAILED [#A] Heading1 :tag1: CLOSED: [1984-04-01 Sun 12:00] SCHEDULED: <1984-04-01 Sun 09:00> DEADLINE: <1984-04-01 Sun> :PROPERTIES: :ID: 123-456-789-4234-0001 @@ -135,7 +136,7 @@ CLOCK: [1984-04-01 Sun 09:00]--[1984-04-01 Sun 12:00] => 3:00 :END: Body 1 -*** [#A] Heading2 :tag2: +*** CANCELLED [#A] Heading2 :tag2: CLOSED: [1984-04-02 Sun 12:00] SCHEDULED: <1984-04-02 Sun 09:00> DEADLINE: <1984-04-02 Sun> :PROPERTIES: :ID: 123-456-789-4234-0002 @@ -156,6 +157,7 @@ Body 2 assert len(entries) == 2 for index, entry in enumerate(entries): assert entry.Heading() == f"Heading{index+1}" + assert entry.Todo() == "FAILED" if index == 0 else "CANCELLED" assert entry.Tags() == {f"tag{index+1}"} assert entry.Body() == f"- Clocked Log {index+1}\nBody {index+1}\n\n" assert entry.Priority() == "A" From fd31d339c1fb6f14a395d24579f106c53b76b446 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Wed, 10 Aug 2022 13:48:44 +0300 Subject: [PATCH 16/17] Remove spurious space in Entries without Todo in OrgNode Entry Repr --- src/processor/org_mode/orgnode.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/processor/org_mode/orgnode.py b/src/processor/org_mode/orgnode.py index fcf5d806..151c61df 100644 --- a/src/processor/org_mode/orgnode.py +++ b/src/processor/org_mode/orgnode.py @@ -370,7 +370,9 @@ class Orgnode(object): n = '' for _ in range(0, self.level): n = n + '*' - n = n + ' ' + self.todo + ' ' + n = n + ' ' + if self.todo: + n = n + self.todo + ' ' if self.prty: n = n + '[#' + self.prty + '] ' n = n + self.headline From 150ae196607bad32e016641bac0ed6a97c0edf56 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Wed, 10 Aug 2022 18:55:37 +0300 Subject: [PATCH 17/17] Indent Timestamps, Drawers at Body Level in OrgNode Entry Representation --- src/processor/org_mode/orgnode.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/processor/org_mode/orgnode.py b/src/processor/org_mode/orgnode.py index 151c61df..39c67731 100644 --- a/src/processor/org_mode/orgnode.py +++ b/src/processor/org_mode/orgnode.py @@ -38,6 +38,8 @@ import datetime from pathlib import Path from os.path import relpath +indent_regex = re.compile(r'^\s*') + def normalize_filename(filename): file_relative_to_home = f'~/{relpath(filename, start=Path.home())}' escaped_filename = f'{file_relative_to_home}'.replace("[","\[").replace("]","\]") @@ -384,7 +386,12 @@ class Orgnode(object): n = n + closecolon n = n + "\n" + # Get body indentation from first line of body + indent = indent_regex.match(self.body).group() + # Output Closed Date, Scheduled Date, Deadline Date + if self.closed or self.scheduled or self.deadline: + n = n + indent if self.closed: n = n + f'CLOSED: [{self.closed.strftime("%Y-%m-%d %a")}] ' if self.scheduled: @@ -395,10 +402,10 @@ class Orgnode(object): n = n + '\n' # Ouput Property Drawer - n = n + ":PROPERTIES:\n" + n = n + indent + ":PROPERTIES:\n" for key, value in self.properties.items(): - n = n + f":{key}: {value}\n" - n = n + ":END:\n" + n = n + indent + f":{key}: {value}\n" + n = n + indent + ":END:\n" n = n + self.body