12

I use org-mode to take notes. Currently I have a root directory, say, "Notes", and there are several subdirectories inside it, for example, "Linux", "Programming", etc. The notes taken using org-mode are stored under those subdirectories.

I was wondering whether there is an available set of settings so that I can search these notes(which are all org-mode files) very quickly. I know there is deft, but it is not designed for org-mode files. Actually I also tried helm-projectile but it's far from satisfactory.

To be more precise, what I want to achieve is that I can search these files using tags, headlines, or other features which are org-mode-related, maybe using some predefined syntaxes. And if possible, I would prefer something like helm. If there is no such an extension, will it be worth to implement such an extension? I thought deft+helm-projectile might be a good start point.

UPDATE: I tried both methods, directory-local variables(as @itsjeyd suggests in the answer) and org-agenda-custom-commands, and I found the latter one seemed more convenient. So here is my setting:

(setq org-agenda-custom-commands
  '(("n" . "Search in notes")
    ("nt" "Note tags search" tags ""
     ((org-agenda-files (file-expand-wildcards "path/to/Notes/*/*.org")))) 
    ("ns" "Note full text search" search ""
     ((org-agenda-files (file-expand-wildcards "path/to/Notes/*/*.org"))))))
cutejumper
  • 787
  • 5
  • 12
  • Have you tried?: `M-x org-search-view` Here is the link to the documentation: http://orgmode.org/manual/Search-view.html – lawlist Mar 14 '15 at 06:51
  • Afaik you can set up Deft to use org files by default with `(setq deft-extension "org")` and `(setq deft-text-mode 'org-mode)`. – mutbuerger Mar 14 '15 at 07:54
  • @ mutbuerger The settings are what I currently use. But Deft itself has no org-related search function – cutejumper Mar 14 '15 at 17:34

2 Answers2

10

Org itself provides a facility for filtering/searching information stored in .org files in various ways. It is called the "Agenda". The org-mode manual provides extensive information on how to use it (check the link above or do C-h i m Org Mode RET from within Emacs and navigate to the "Agenda Views" chapter), so it does not make sense to repeat all of this information here. The introductory text from the manual summarizes what you can do with it (emphasis mine):

Org can select items based on various criteria and display them in a separate buffer. Seven different view types are provided:

  • an agenda that is like a calendar and shows information for specific dates,
  • a TODO list that covers all unfinished action items,
  • a match view, showings headlines based on the tags, properties, and TODO state associated with them,
  • a timeline view that shows all events in a single Org file, in time-sorted view,
  • a text search view that shows all entries from multiple files that contain specified keywords,
  • a stuck projects view showing projects that currently don't move along, and
  • custom views that are special searches and combinations of different views.

The only thing you need to do to start using the agenda for searching your notes is add any files you want to search to org-agenda-files:

The information to be shown is normally collected from all agenda files, the files listed in the variable org-agenda-files. If a directory is part of this list, all files with the extension .org in this directory will be part of the list.

So in your case you'll want to add something like this to your init-file:

(setq org-agenda-files '("/path/to/Notes/Linux" "/path/to/Notes/Programming"))

For lots of examples and practical advice I also recommend you check out the article on Advanced Searching on Worg.

[UPDATE] Limiting search to specific file sets

As mentioned in the comments, OP wants to be able to restrict searches to specific sets of files. In technical terms, this means setting org-agenda-files to different values depending on context. This can be achieved using directory-local variables:

The usual way to define directory-local variables is to put a file named .dir-locals.el in a directory. Whenever Emacs visits any file in that directory or any of its subdirectories, it will apply the directory-local variables specified in .dir-locals.el, [...].

For example, let's say that

  • while visiting files stored in Notes/Linux you want to use the agenda to only search .org files stored in Notes/Linux.

  • while visiting files stored in Notes/Programming, you want to use the agenda to only search .org files stored in Notes/Programming.

Here's what to do to enable this behavior:

  1. Add a .dir-locals.el file with the following content to both Notes/Linux and Notes/Programming:

     ((nil . ((org-agenda-files . (".")))))
    

    This sets the list of org-agenda-files to include all files in the current directory.

  2. Add the following code to your init-file:

     (add-hook 'org-agenda-mode-hook #'hack-dir-local-variables-non-file-buffer)
    

    This step is necessary to ensure that *Org Agenda* (a non-file buffer) respects your directory-local settings for org-agenda-files.

Next time you visit a file stored in Notes/Linux or Notes/Programming, Emacs will ask you whether you would like to apply the settings stored in .dir-locals.el. Hit ! to tell Emacs to apply the settings and mark them as safe for future sessions (you will not be prompted again for files in the same directory).

itsjeyd
  • 14,586
  • 3
  • 58
  • 87
  • Maybe I didn't indicate clearly in the question...I have used agenda, but the problem is that I have other org files showing my schedules and TODOs for my agenda, and I don't want my notes to mess up the agenda view. Maybe what I want is something like the search function in Evernote since I want to use Emacs as my note taking application. Do you know Deft? It has a good search interface but is not org-related – cutejumper Mar 14 '15 at 17:33
  • @cutejumper I'm not sure I follow. What do you mean by "messing up the agenda view"? If the headlines in your Linux/Programming/etc. notes do not have `TODO` states associated with them, they shouldn't show up in your agenda when you list your TODO items. – itsjeyd Mar 14 '15 at 20:34
  • Well, this way might be clearer: I actually want to have separate sets of agenda files. My understanding for agenda of the current org-mode is that it is more like a "global" set while I want a search interface for a certain "project"(kind of like projectile) so that when I do the search I only see the relevant contents in a "project". Do I overlook any functionality that agenda actually offers? – cutejumper Mar 14 '15 at 21:53
  • You can locally set `org-agenda-files` to just the files (or directory) your interested in inside an agenda template or use `C-c a <` to restrict the agenda search to only the current file. – erikstokes Mar 15 '15 at 00:08
  • @cutejumper I see. You can use directory-local variables to limit the scope of your agenda searches to specific sets of files. Please see the updates to my answer. – itsjeyd Mar 15 '15 at 00:40
  • Using directory-local variables is impressive since I've never known this before. I accepted this answer. BTW, as @erikstokes said, I googled and found `org-agenda-custom-commands' was also a clean solution, and [this tutorial](http://orgmode.org/worg/org-tutorials/org-custom-agenda-commands.html) gave some good examples. – cutejumper Mar 15 '15 at 01:37
  • Just curious: is it possible to perform on-the-fly agenda search? – cutejumper Mar 15 '15 at 06:16
  • @cutejumper Not sure what you mean by "on-the-fly agenda search". Can you give a concrete example of the type of functionality you have in mind? – itsjeyd Mar 15 '15 at 07:44
  • When I'm typing, the search results in the agenda view buffer will be updated immediately. Like helm: When using helm-M-x, the results will be updated automatically. – cutejumper Mar 15 '15 at 07:50
  • 1
    @cutejumper I don't think the agenda buffer supports this use case out of the box. However, the command @BrianZ mentions in his answer (`helm-org-agenda-files-headings`) does exactly what you want (for headings). Note that you will need to set up directory-local variables in order to make it possible to run `helm-org-agenda-files-headings` on specific file sets. – itsjeyd Mar 15 '15 at 09:34
3

There are a few org related functions in helm. I think helm-org-agenda-files-headings is basically what you have in mind. If it's not already available for you in emacs, try getting helm-org.el off Github.

Brian Z
  • 2,863
  • 16
  • 22