Re: [O] [OT]: Search for missing :END:
I just found a few of these errors in *Messages* and since I have 20 .org files, I used this approach cd ~/orgmode # this gives me the byte offset the filename for each matching line grep -br 'CLOCK: ' * ~/tmp/org-missing-end.txt #this searches within a few bytes of the byte offset reported by emacs grep -E :3007.: ~/tmp/org-missing-end.txt Searching within a few bytes was not necessary. In my case I found a :CLOCK: string at the byte-offset in the error message. -- Brian Wood Applications Programmer UC Berkeley IST
Re: [O] [OT]: Search for missing :END:
Markus Heller helle...@gmail.com wrote: Hello all, I have an OT request that can hopefully be answered by emacs gurus in less than a minute: I'm looking for an emacs search expression that finds :PROPERTIES: *without* a matching :END: ... If you mean a regexp, you are wasting your time[fn:1]. Regexps are powerful, but their range of applicability is limited to regular languages and even then, you have to worry about their efficiency. The above *is* a regular language: if P stands for :PROPERTIES: and E stands for :END:, then the regexp is ([^EP]*P[^EP]*E)* In words, the stuff inside the parens says: 0 or more other things (non-P and non-E), followed by a P, followed by 0 or more other things, followed by an E. You can then have 0 or more of the parenthesized things. This will succeed on well formed sentences and fail on others. But it might have to backtrack over the inner [^EP]* matches and then the outer matches, and rescan arbitrarily long stretches, which in the worst case, can turn your search into an exponentially slow descent into the abyss. You might be able to write non-greedy regexps that might behave better in this case. In most cases, you'd end up with a horrendous-looking regexp: good luck trying to understand it next week. That's my biggest problem with complicated regexps. However, a change of tool will simplify the problem enormously. E.g. here's a simple algorithm that can be used for this kind of problem: start a nesting depth at 0 - when you see a P, increment the nesting depth by 1; when you see an E, decrement it by 1. If the nesting depth ever becomes something other than 0 or 1, you got a problem - also, if at EOF, the nesting depth is not 0, you got a problem. Easy variations of this will check well-formedness even when nesting *is* allowed. You can easily write such a program in any language you are familiar with (it does not have to be elisp, although you *can* write it in elisp - personally, I'd use awk). But assuming that you are getting some error from org, you don't know where the problem is and you are trying to find it, it will be simpler to just use egrep: grep -E -n ':PROPERTIES:|:END:' foo.org will filter out the relevant lines, so all you have to do is scan the output by eye and spot any irregularity (consecutive :PROPERTIES: or consecutive :END: lines). Even if you have hundreds of them, that's *easy* for humans to do.[fn:2] Or, if you prefer, you can write trivial validation programs to operate on the output, e.g.: grep -E -n ':PROPERTIES:|:END:' foo.org | tee foo.out | grep PROP | wc -l grep END foo.out | wc -l (the counts 'd better be the same). or grep -E -n ':PROPERTIES:|:END:' foo.org | foo.awk where foo.awk implements the nesting depth algorithm above - something like this: --8---cut here---start-8--- #! /bin/bash awk ' BEGIN { d = 0;} /:PROPERTIES:/ { d++; if (d 1) { print $1, $d; exit; }} /:END:/{ d--; if (d 0) { print $1, $d; exit; }} END{ if (d != 0) { print $1, $d; }}' --8---cut here---end---8--- Even on Windoze, you can probably do all this stuff with cygwin. Nick Thanks and Cheers and sorry for the OT ... Markus Footnotes: [fn:1] In the (approximate) words of Jamie Zawinski: You have a problem. You think 'I know, let me use regexps to solve it'. Now you have two problems. [fn:2] Of course, if you have formatted your file perversely or done other naughty things, this might not work. The point is that although this is not foolproof, it should deal with the vast majority of reasonable files out there.
Re: [O] [OT]: Search for missing :END:
Nick Dokos nicholas.do...@hp.com writes: Markus Heller helle...@gmail.com wrote: Hello all, I have an OT request that can hopefully be answered by emacs gurus in less than a minute: I'm looking for an emacs search expression that finds :PROPERTIES: *without* a matching :END: ... If you mean a regexp, you are wasting your time[fn:1]. Regexps are powerful, but their range of applicability is limited to regular languages and even then, you have to worry about their efficiency. The above *is* a regular language: if P stands for :PROPERTIES: and E stands for :END:, then the regexp is ([^EP]*P[^EP]*E)* In words, the stuff inside the parens says: 0 or more other things (non-P and non-E), followed by a P, followed by 0 or more other things, followed by an E. You can then have 0 or more of the parenthesized things. This will succeed on well formed sentences and fail on others. But it might have to backtrack over the inner [^EP]* matches and then the outer matches, and rescan arbitrarily long stretches, which in the worst case, can turn your search into an exponentially slow descent into the abyss. You might be able to write non-greedy regexps that might behave better in this case. In most cases, you'd end up with a horrendous-looking regexp: good luck trying to understand it next week. That's my biggest problem with complicated regexps. However, a change of tool will simplify the problem enormously. E.g. here's a simple algorithm that can be used for this kind of problem: start a nesting depth at 0 - when you see a P, increment the nesting depth by 1; when you see an E, decrement it by 1. If the nesting depth ever becomes something other than 0 or 1, you got a problem - also, if at EOF, the nesting depth is not 0, you got a problem. Easy variations of this will check well-formedness even when nesting *is* allowed. You can easily write such a program in any language you are familiar with (it does not have to be elisp, although you *can* write it in elisp - personally, I'd use awk). But assuming that you are getting some error from org, you don't know where the problem is and you are trying to find it, it will be simpler to just use egrep: grep -E -n ':PROPERTIES:|:END:' foo.org will filter out the relevant lines, so all you have to do is scan the output by eye and spot any irregularity (consecutive :PROPERTIES: or consecutive :END: lines). Even if you have hundreds of them, that's *easy* for humans to do.[fn:2] Or, if you prefer, you can write trivial validation programs to operate on the output, e.g.: grep -E -n ':PROPERTIES:|:END:' foo.org | tee foo.out | grep PROP | wc -l grep END foo.out | wc -l (the counts 'd better be the same). or grep -E -n ':PROPERTIES:|:END:' foo.org | foo.awk where foo.awk implements the nesting depth algorithm above - something like this: #! /bin/bash awk ' BEGIN { d = 0;} /:PROPERTIES:/ { d++; if (d 1) { print $1, $d; exit; }} /:END:/{ d--; if (d 0) { print $1, $d; exit; }} END{ if (d != 0) { print $1, $d; }}' Even on Windoze, you can probably do all this stuff with cygwin. Hi Nick, thanks for this informative reply. Unfortunately, I cannot install cygwin on my work computer. I'll have to figure something else out ... AS for an example, I'm in one of my org files and I do C-TAB and get the following error: OVERVIEW CONTENTS...done SHOW ALL if: :END: line missing at position 18720 Quit Mark set Where is position 18720? I apologize if this is a stupid question, but I can't seem to figure this out ... Thanks again Markus
Re: [O] [OT]: Search for missing :END:
My guess is that it's the 18720th byte of the file. To get there, go to the start of your buffer and type M-x goto-char 18720 On Mon, Nov 21, 2011 at 11:27 PM, Markus Heller helle...@gmail.com wrote: Nick Dokos nicholas.do...@hp.com writes: Markus Heller helle...@gmail.com wrote: Hello all, I have an OT request that can hopefully be answered by emacs gurus in less than a minute: I'm looking for an emacs search expression that finds :PROPERTIES: *without* a matching :END: ... If you mean a regexp, you are wasting your time[fn:1]. Regexps are powerful, but their range of applicability is limited to regular languages and even then, you have to worry about their efficiency. The above *is* a regular language: if P stands for :PROPERTIES: and E stands for :END:, then the regexp is ([^EP]*P[^EP]*E)* In words, the stuff inside the parens says: 0 or more other things (non-P and non-E), followed by a P, followed by 0 or more other things, followed by an E. You can then have 0 or more of the parenthesized things. This will succeed on well formed sentences and fail on others. But it might have to backtrack over the inner [^EP]* matches and then the outer matches, and rescan arbitrarily long stretches, which in the worst case, can turn your search into an exponentially slow descent into the abyss. You might be able to write non-greedy regexps that might behave better in this case. In most cases, you'd end up with a horrendous-looking regexp: good luck trying to understand it next week. That's my biggest problem with complicated regexps. However, a change of tool will simplify the problem enormously. E.g. here's a simple algorithm that can be used for this kind of problem: start a nesting depth at 0 - when you see a P, increment the nesting depth by 1; when you see an E, decrement it by 1. If the nesting depth ever becomes something other than 0 or 1, you got a problem - also, if at EOF, the nesting depth is not 0, you got a problem. Easy variations of this will check well-formedness even when nesting *is* allowed. You can easily write such a program in any language you are familiar with (it does not have to be elisp, although you *can* write it in elisp - personally, I'd use awk). But assuming that you are getting some error from org, you don't know where the problem is and you are trying to find it, it will be simpler to just use egrep: grep -E -n ':PROPERTIES:|:END:' foo.org will filter out the relevant lines, so all you have to do is scan the output by eye and spot any irregularity (consecutive :PROPERTIES: or consecutive :END: lines). Even if you have hundreds of them, that's *easy* for humans to do.[fn:2] Or, if you prefer, you can write trivial validation programs to operate on the output, e.g.: grep -E -n ':PROPERTIES:|:END:' foo.org | tee foo.out | grep PROP | wc -l grep END foo.out | wc -l (the counts 'd better be the same). or grep -E -n ':PROPERTIES:|:END:' foo.org | foo.awk where foo.awk implements the nesting depth algorithm above - something like this: #! /bin/bash awk ' BEGIN { d = 0;} /:PROPERTIES:/ { d++; if (d 1) { print $1, $d; exit; }} /:END:/ { d--; if (d 0) { print $1, $d; exit; }} END { if (d != 0) { print $1, $d; }}' Even on Windoze, you can probably do all this stuff with cygwin. Hi Nick, thanks for this informative reply. Unfortunately, I cannot install cygwin on my work computer. I'll have to figure something else out ... AS for an example, I'm in one of my org files and I do C-TAB and get the following error: OVERVIEW CONTENTS...done SHOW ALL if: :END: line missing at position 18720 Quit Mark set Where is position 18720? I apologize if this is a stupid question, but I can't seem to figure this out ... Thanks again Markus
Re: [O] [OT]: Search for missing :END:
Markus Heller helle...@gmail.com wrote: AS for an example, I'm in one of my org files and I do C-TAB and get the following error: OVERVIEW CONTENTS...done SHOW ALL if: :END: line missing at position 18720 Quit Mark set Where is position 18720? I apologize if this is a stupid question, but I can't seem to figure this out ... M-x goto-char RET 18720 RET will take you there, but it's probably at the very end of the buffer: search backwards for :PROPERTIES: and you should be able to find it (if your diagnosis is indeed correct). Nick
Re: [O] [OT]: Search for missing :END:
Markus Heller helle...@gmail.com wrote: Unfortunately, I cannot install cygwin on my work computer. I'll have to figure something else out ... Just copy the file to a Linux/Unix/OSX/... machine and do the searches there. USB sticks were invented for exactly that purpose :-) AS for an example, I'm in one of my org files and I do C-TAB and get the following error: OVERVIEW CONTENTS...done SHOW ALL if: :END: line missing at position 18720 Quit Mark set Where is position 18720? I apologize if this is a stupid question, but I can't seem to figure this out ... Thanks again Markus
Re: [O] [OT]: Search for missing :END:
Nick Dokos nicholas.do...@hp.com writes: Markus Heller helle...@gmail.com wrote: AS for an example, I'm in one of my org files and I do C-TAB and get the following error: OVERVIEW CONTENTS...done SHOW ALL if: :END: line missing at position 18720 Quit Mark set Where is position 18720? I apologize if this is a stupid question, but I can't seem to figure this out ... M-x goto-char RET 18720 RET will take you there, but it's probably at the very end of the buffer: search backwards for :PROPERTIES: and you should be able to find it (if your diagnosis is indeed correct). Thanks to Nick and the other posters for an enlightening answer. This worked beautifully :) Thanks again and Cheers Markus, who knew that there was some easy way to solve this but couldn't figure it out himself