Re-add my "Search the Notes" feature
Instead of calling a shell-script, find-notes, I now call `mdfind` and `recoll` directly and then call `grep` on the resulting files.
This commit is contained in:
		
							parent
							
								
									d412456896
								
							
						
					
					
						commit
						fbf4ee929c
					
				
					 1 changed files with 55 additions and 0 deletions
				
			
		
							
								
								
									
										55
									
								
								ha-org.org
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								ha-org.org
									
									
									
									
									
								
							|  | @ -262,6 +262,61 @@ Of course, I need an 'undo' feature when the meeting is over… | ||||||
|       (fringe-mode 1) |       (fringe-mode 1) | ||||||
|       (winner-undo))             ; Put the windows back in place |       (winner-undo))             ; Put the windows back in place | ||||||
| #+END_SRC | #+END_SRC | ||||||
|  | ** Searching | ||||||
|  | Now that my paragraphs in an org file are on a single line, I need this less, but being able to use an /indexed search system/, like [[https://ss64.com/osx/mdfind.html][mdfind]] on Macos, or [[https://www.lesbonscomptes.com/recoll/][recoll]] on Linux, gives better results that line-oriented search systems, like =grep=. Let’s create operating-system functions the command line for searching: | ||||||
|  | #+BEGIN_SRC emacs-lisp | ||||||
|  |   (defun ha-search-notes--macos (phrase path) | ||||||
|  |     "Return the indexed search system command on MACOS, mdfind. | ||||||
|  |   Including the parameters using the PHRASE on the PATH(s)." | ||||||
|  |     (let ((paths (if (listp path) | ||||||
|  |                      (mapconcat (lambda (p) (concat "-onlyin " p)) path " ") | ||||||
|  |                    (concat "-onlyin " path)))) | ||||||
|  |       (format "mdfind %s -interpret %s" paths phrase))) | ||||||
|  | 
 | ||||||
|  |   (defun ha-search-notes--linux (phrase path) | ||||||
|  |     "Return the indexed search system command on Linux, recoll. | ||||||
|  |   Including the parameters using the PHRASE on the PATH(s)." | ||||||
|  |       (format "recoll -t -a -b %s" phrase)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #+END_SRC | ||||||
|  | 
 | ||||||
|  | This function calls these operating-system functions, but returns the matching files as a /single string/ (where each file is wrapped in single quotes, and all joined together, separated by spaces. This function also allows me to /not-match/ backup files and whatnot. | ||||||
|  | #+BEGIN_SRC emacs-lisp | ||||||
|  |   (defun ha-search-notes--files (phrase path) | ||||||
|  |     "Return an escaped string of all files matching PHRASE. | ||||||
|  |   On a Mac, this search is limited by PATH" | ||||||
|  |     (let ((command (if (equal system-type 'darwin) | ||||||
|  |                        (ha-search-notes--macos phrase path) | ||||||
|  |                      (ha-search-notes--linux phrase path)))) | ||||||
|  |       (->> command | ||||||
|  |            (shell-command-to-list)    ; Function from piper! | ||||||
|  |            (--remove (s-matches? "~$" it)) | ||||||
|  |            (--remove (s-matches? "#" it)) | ||||||
|  |            (--map (format "'%s'" it)) | ||||||
|  |            (s-join " ")))) | ||||||
|  | 
 | ||||||
|  | #+END_SRC | ||||||
|  | 
 | ||||||
|  | The =ha-search-notes= function prompts for the phrase to search, and then searches through the =org-directory= path to acquire the matching files. It then feeds that list to =grep= (and the [[help:grep][grep function]] in order to display a list of matches that I can jump to. | ||||||
|  | 
 | ||||||
|  | #+BEGIN_SRC emacs-lisp | ||||||
|  |   (defun ha-search-notes (phrase &optional path) | ||||||
|  |     "Search files in PATH for PHRASE and display in a grep mode buffer." | ||||||
|  |     (interactive "sSearch notes for: ") | ||||||
|  |     (let* ((command   (if (equal system-type 'darwin) "ggrep" "grep")) | ||||||
|  |            (regexp    (string-replace " " "\\|" phrase)) | ||||||
|  |            (use-paths (if path path (list org-directory org-journal-dir))) | ||||||
|  |            (files     (ha-search-notes--files phrase use-paths))) | ||||||
|  |       (grep (format "%s -ni -m 1 '%s' %s" command regexp files)))) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #+END_SRC | ||||||
|  | Eventually, I would like to change the output so that the title of the Org mode is displayed instead of the first match, but that is good enough. | ||||||
|  | 
 | ||||||
|  | #+BEGIN_SRC emacs-lisp | ||||||
|  | (ha-leader "f n" '("find notes" . ha-search-notes)) | ||||||
|  | #+END_SRC | ||||||
| ** Misc | ** Misc | ||||||
| *** Babel Blocks | *** Babel Blocks | ||||||
| I use [[https://orgmode.org/worg/org-contrib/babel/intro.html][org-babel]] (obviously) and don’t need confirmation before evaluating a block: | I use [[https://orgmode.org/worg/org-contrib/babel/intro.html][org-babel]] (obviously) and don’t need confirmation before evaluating a block: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue