From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Schulte Subject: Re: [OT] The joy of elisp Date: Tue, 06 Dec 2011 07:27:03 -0700 Message-ID: <877h29epxk.fsf@gmx.com> References: Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([140.186.70.92]:37916) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RXw0I-00086U-NL for emacs-orgmode@gnu.org; Tue, 06 Dec 2011 09:28:26 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RXw0A-0004g2-Dl for emacs-orgmode@gnu.org; Tue, 06 Dec 2011 09:28:18 -0500 Received: from mailout-us.gmx.com ([74.208.5.67]:37260) by eggs.gnu.org with smtp (Exim 4.71) (envelope-from ) id 1RXw0A-0004fq-6F for emacs-orgmode@gnu.org; Tue, 06 Dec 2011 09:28:10 -0500 In-Reply-To: (Marcelo de Moraes Serpa's message of "Mon, 5 Dec 2011 11:34:11 -0600") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Marcelo de Moraes Serpa Cc: Org Mode Marcelo de Moraes Serpa writes: > Here's a new version: > > (defun find-wiki-by-tags (tags) > (interactive "sEnter tags: ") > (shell-command (format "cd ~/org; ack \"\\* tags.*(%s).*\" --all" tags) > "mybuf") > (set-buffer "mybuf") > (beginning-of-buffer) > (ignore-errors > (while (search-forward-regexp "\\(.*?\\):") > (replace-match "[[~/org/\\1]]" ) > )) > (org-mode) > ) > > Problems: > > 1) It's slow, not sure where the bottleneck is (ack in itself is fast, I > suppose the problem lies in elisp's side) A pure elisp implementation would likely be faster, maybe something like the following would work as an improvement (defun org-files () "Return a list of the files in the \"~/org/\" directory." (directory-files "~/org/" nil ".*.org$")) (defun collect-links (tag) "Collect links in \"~/org/\" including TAG." (save-window-excursion ; save the current buffer and point (let ((rx (format "^\\* tags.*%s" tag)) ; build a regexp for the given tag links) ; hold collected links (dolist (file (org-files)) ; for all files returned by `org-files' (find-file (expand-file-name file "~/org/")) ; in this file (save-excursion (goto-char (point-min)) ; go to the beginning of the file (while (re-search-forward rx nil t) ; search for matches (push (org-store-link nil) links)))) ; save a link to the match links))) ; return the collected links (defun find-wiki-by-tag (tag) "Pop to a buffer of links to headlines \"~/org/\" in including TAG." (pop-to-buffer (set-buffer (generate-new-buffer "*tag-matches*"))) (org-mode) (dolist (link (collect-links tag)) (insert link) (insert "\n"))) > > 2) The regexp is not optmized, and I'm getting some trash, although it > lists the files for me so it works well enough now. > Try the `regexp-builder' function in one of your org files to interactively build up a regexp and see what it matches. In general the following two functions are very useful for finding useful functions and documentation. - describe-function :: used with tab completion to show documentation of functions - elisp-index-search :: to look up documentation on broad elisp topics Cheers, > > - Marcelo. > > > > > On Mon, Dec 5, 2011 at 12:08 AM, Marcelo de Moraes Serpa < > celoserpa@gmail.com> wrote: > >> Hi list! >> >> I decided to finally get my hands dirty and build a small function to >> improve my org-based productivity system. >> >> Let me explain: >> >> I have a subdirectory under ~/org which has a bunch of files named after >> different subjects. Originally it was supposed to model a wiki, but in >> practice, I create a file there whenever I start studying a new (often >> complex) subject and that I know I will come back often and edit / improve. >> It's indeed like a wiki. >> >> However, I don't keep those files in the agenda. It would slow it down a >> lot. To keep the organization as organic as possible, I simply use tags to >> bring them together semantically. So, I have other files with items that >> are tagged, say, business, and I have a "wiki file" with a headline like >> this: >> >> * tags :business: >> >> >> >> I use the tags headline to tag those files. >> >> Now, what I wanted was to get a list of files related to say, the business >> tag. It's quite useful to find myself in the (good) chaos of tagged "wiki >> files", I came up with a small elisp function that does just that! >> >> (progn >> (shell-command "cd ~/org; ack \"\\* tags.*(business).*\" --all" "mybuf") >> (set-buffer "mybuf") >> (beginning-of-buffer) >> (ignore-errors >> (while (search-forward-regexp "\\(.*?\\):") >> (replace-match "[[~/org/\\1]]" ) >> )) >> (org-mode) >> ) >> >> Bear in mind this is my first elisp program ever. It's not even a function >> yet, actually. But it works pretty well for what I want :) >> >> Took me around 1 hour to bring it up. >> >> The joy of breaking your head on something! >> >> Cheers! >> >> (Suggestions on how to improve it welcome!) >> >> Marcelo. >> -- Eric Schulte http://cs.unm.edu/~eschulte/