From mboxrd@z Thu Jan 1 00:00:00 1970 From: "ISHIKAWA,chiaki" Subject: Fwd: org-mode and 'intangible text property Date: Fri, 19 Apr 2013 22:03:26 +0900 Message-ID: <5171409E.4000200@yk.rim.or.jp> References: Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from eggs.gnu.org ([208.118.235.92]:47320) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UTBHY-0000dK-Rz for Emacs-orgmode@gnu.org; Fri, 19 Apr 2013 09:23:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UTBHU-00073s-HR for Emacs-orgmode@gnu.org; Fri, 19 Apr 2013 09:23:16 -0400 Received: from mbos141-211.alpenstock.jp ([220.156.141.211]:59709 helo=phnompenh.mbos.jp) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UTBHT-00073g-LT for Emacs-orgmode@gnu.org; Fri, 19 Apr 2013 09:23:12 -0400 Received: from [172.16.30.41] ([172.16.30.41]) by phnompenh.mbos.jp ([172.16.30.51]) with ESMTP id 2013041922:03:02:234153.32359.3066026896 for ; Fri, 19 Apr 2013 22:03:02 +0900 (JST) Received: from nttkyo748190.tkyo.nt.ftth.ppp.infoweb.ne.jp (HELO [192.168.0.112]) (ishikawa_yk@smp.mbos.jp@[116.80.227.190]) (envelope-sender ) by pyongyang.mbos (qmail-ldap-1.03) with SMTP for ; 19 Apr 2013 22:03:02 +0900 In-Reply-To: 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: Emacs-orgmode@gnu.org Hi, I have posted this to help-gnu-emacs mailing list, but was advised to org-mode specific mailing list and so am posting this here. After posting, I thought maybe the use of overlay property instead of text-property might be the way to go. But I would appreciate the opinion of the people in the know. Thank you. -------- Original Message -------- Subject: org-mode and 'intangible text property Date: Thu, 18 Apr 2013 19:07:48 +0900 From: ishikawa@yk.rim.or.jp To: org-mode and 'intangible text property Hello, I have a question about org-mode.el. (sorry for the lengthy posting, I wanted to list the background of the issue in one e-mail.) I am a user of Emacs over the years (20+ years). I have been using outline mode and have come to realize that org-mode seems to offer additional benefits by reading blogs and others. However, when I tried to use org-mode, I hit a snug. I tried to input Japanese string using a Japanese input system written in Emacs Lisp called tamago/egg. But when I tried to type in, say, a first-level heading in org-mode, the string completely disappears (not even a trace of it) after I hit the return (to finalize the Japanese input.) The cause of the problem seems to be as follows: The use of 'intangible property of org-mode collided with the use of 'intangible property of the Japanese input method implemented in Emacs Lisp. Basically, the problem is that org-mode removes the 'intangible property set by egg/tamago Japanese input system without discrimination at all is what someone wrote in his blog. (org-mode seems to use 'intangible internally.) The Japanese input system, egg/tamago, was a rather popular system in late 1980 and 1990's. It now sees many competitive Japanese input systems, but there are emacs die hards who can't live without it when it comes to typing Japanese into Emacs buffer. Although egg/tamago is in strictly maintenance mode, it is difficult for me (and others who have grown up to use this input system figuratively speaking) to ditch this egg/tamago input system if I can avoid it. [No major update has been done in the last 4-5 years to tamago/egg and its major web site is now torn down. Only the packages that are in the major linux distributions, FreeBSD, NetBSD packaging systems are more or less used by many, with some patches floating around. For example, when emacs 23.4 appeared, finally we have to replace or use defalias to fix the missing last-command-char variable in egg/tamago package. There *ARE* people willing to maintain egg/tamago to keep it alive in the face of such issues for sure, mine included.] On the other hand, if org-mode is a great replacement for outline-mode, then I would certainly like to try it out (and still use egg/tamago for input if possible.) Org mode seems to use 'intangible text property one way or the other. igrep mode search within org subdirectory of lisp directory of emacs 24.3 turned up the following hits (shown at the end of this e-mail). One of the macro's found in org-mac.el is as follows. : org-maybe-intangible This is quoted a few lines below. The document string for this macro suggests that org-mode had an issue with flyspell.el due to the intangible text property use. But now the particular usage seems to be avoided by the introduction of macros. ;; FIXME: Slated for removal. Current Org mode does not support Emacs < 22 (defmacro org-maybe-intangible (props) "Add '(intangible t) to PROPS if Emacs version is earlier than Emacs 22. In Emacs 21, invisible text is not avoided by the command loop, so the intangible property is needed to make sure point skips this text. In Emacs 22, this is not necessary. The intangible text property has led to problems with flyspell. These problems are fixed in flyspell.el, but we still avoid setting the property in Emacs 22 and later. We use a macro so that the test can happen at compilation time." (if (< emacs-major-version 22) `(append '(intangible t) ,props) props)) HOWEVER there are still about a dozen references to 'intangible property in org-mode emacs-lisp code. I wonder if such avoidance as in the case of flyspell.el can be made for the conflict of usage of 'intangible with egg/tamago input routine written in Emacs-Lisp. Someone in Japan who faced this incompatibility problem of org-mode and egg/tamago input method stated that he (I assume he) substituted all the references to "intangible" in org-mode elisp code with "org-intangible". Now, as far as he is concerned, the Japanese input now works, and he has not bumped into a case where cursor moves into an awkward (or should not happen) position in org-mode (which should have been avoided by the use of 'intangible property in org-mode). His drastic surgery may be the last straw if no alternative is available. (His blog in Japanese is available here: http://d.hatena.ne.jp/grandVin/20090129/1233226833 (dated January 2009) Also, it is quoted in an independent someone's emacs wiki written in Japanese prominently. http://www.tsukune.org/skk/memo/index.php?emacs#n27db692 At least you can see there are Japanese users who are bitten by the problem and want to solve it somehow. Does anyone in the know can evaluate the perspective of removing the references to 'intangible in the org code? If, due to the conflict with flyspell.el, some usages of intangible could be removed, can some remaining references be removed, too? (Well, I am not sure of this. Probably intangible is used to make sure that the cursor does not move, say, into a next cell in a table.) OR, more important to me, can someone suggest a manner how a conflicting use of 'intangible can be somehow managed? Thank you for reading so far. I am outlining a rough idea how this could be handled. But maybe I am wrong. Any tips will be appreciated. TIA PS: my idea is to use defadvise function to redefine the meanings of the following functions both in org-mode and when egg/tamago Japanese input is in effect, - set-text-properties - remove-text-properties - add-text-properties (may not be necessary according to the usage pattern.) - get-text-property - put-text-property These functions are used to set/add or reference the text property in org-mode (and egg/tamago Japanese input method.) My idea is roughly as follows: Let us keep the both forms of 'intangible property PLUS the value pair for org-mode and egg/tamago as part of the text property, and set/remove and return only the property set in the same mode. Let us use org-mode-intangible and egg-mode-intangible for these internal forms in the explanation below. For example, when remove-text-properties is called and 'intangible is about to be removed, and if it is called within org-mode, delete the intangible property for org-mode, i.e., org-mode-intangible becomes nil. if it is called from egg/tamago input mode, intangible property for egg-mode, i.e., egg-mode-intangible becomes nil. (If it is called outside these modules, the behavior of the function remains the same.) When get-text-property is called for 'intangible, check what was set in each mode previously, and return the value for the matching mode. I found that, for org-mode, we can simply return t or nil for 'intangible. For egg-mode, we probably need to return 'its-part-1, 'its-part-2 or nil depending on what was set before. (If it is called outside these modules, the behavior of the function remains the same.) Now the difficult part is to set 'intangible that is shown to the rest of the Emacs Lisp world (outside org-mode and egg/tamago input mode). 'intangible property seems to be used by display code written in C and so we must produce something that is visible to such routines. We need to set 'intangible to non-nil or nil depending on what was set in org-mode and egg-mode (probably the LOGICAL OR of what was set previously in both modes). I have no idea if my idea above works or not. The drastic surgery of replacing 'intangible in org-mode lisp code to 'org-intangible mentioned in someone's blog is a desire to keep the operation of the particular Japanese input system intact over the possible rare misbehavior of org-mode. But if we can fix both elisp codes somehow to make them compatible as in the case of flyspell.el, that will be wonderful. Any tips will be appreciated. Here is the search for "intangible" in org-mode Emacs Lisp code. grep -n -e intangible *.el /dev/null org-colview.el:248: (overlay-put ov 'intangible t) CI's comment: this usage may be a little tricky to handle. org-macs.el:151:(defmacro org-maybe-intangible (props) org-macs.el:152: "Add '(intangible t) to PROPS if Emacs version is earlier than Emacs 22. org-macs.el:154:intangible property is needed to make sure point skips this text. org-macs.el:155:In Emacs 22, this is not necessary. The intangible text property has org-macs.el:160: `(append '(intangible t) ,props) CI's comment: the above is the org-maybe-intangible defintion. org-macs.el:239:(defconst org-rm-props '(invisible t face t keymap t intangible t mouse-face t CI's comment: org-rm-props is used in the following places, but their usage are as args to the few set of functions: grep -n -e org-rm-props ~/repos/emacs-24.3/lisp/org/*.el /dev/null ~/repos/emacs-24.3/lisp/org/org-macs.el:239:(defconst org-rm-props '(invisible t face t keymap t intangible t mouse-face t ~/repos/emacs-24.3/lisp/org/org-macs.el:247: (and s (remove-text-properties 0 (length s) org-rm-props s)) CI's comment: the above is used as an arg to remove-text-properties) ~/repos/emacs-24.3/lisp/org/org-macs.el:254:in `org-rm-props'." The above is the usage in the following: the following processing may suggest one way to deal with the subtle issue of usage conflicts. (defsubst org-no-properties (s &optional restricted) "Remove all text properties from string S. When RESTRICTED is non-nil, only remove the properties listed in `org-rm-props'." (if (fboundp 'set-text-properties) (set-text-properties 0 (length s) nil s) (if restricted (remove-text-properties 0 (length s) org-rm-props s) (set-text-properties 0 (length s) nil s))) s) ~/repos/emacs-24.3/lisp/org/org-macs.el:258: (remove-text-properties 0 (length s) org-rm-props s) ~/repos/emacs-24.3/lisp/org/org.el:8018: (remove-text-properties 0 (length s) org-rm-props s) CI's comment: the above is used as an arg to remove-text-properties) The above usages are as args to remove-text-properties. org-src.el:314: '(display nil invisible nil intangible nil)) (CI's comment: this is used as an arg to remove-text-properties) org-src.el:472: '(display nil invisible nil intangible nil)) (CI's comment: the above is used as an arg to remove-text-properties) org-table.el:1894: display t intangible t)) (CI's comment: the above is used as an arg to remove-text-properties) org-table.el:1923: intangible t)) (CI's comment: the above is used as an arg to remove-text-properties) org.el:5301: '(mouse-face highlight keymap invisible intangible help-echo org-linked-text htmlize-link)) CI's comment: the above is used in (defconst org-nonsticky-props '(mouse-face highlight keymap invisible intangible help-echo org-linked-text htmlize-link)) org.el:5328: '(display t invisible t intangible t)) (CI's comment: the above is used as an arg to remove-text-properties) org.el:5370: '(display t invisible t intangible t)) (CI's comment: the above is used as an arg to remove-text-properties) org.el:5389: '(display t invisible t intangible t))) (CI's comment: the above is used as an arg to remove-text-properties) org.el:5490: (ip (org-maybe-intangible CI's comment org-maybe-intangible does not use 'intangible in emacs 24, I think. org.el:5572: (add-text-properties s e (org-maybe-intangible '(invisible org-cwidth))) CI's comment org-maybe-intangible does not use 'intangible in emacs 24, I think. org.el:5987: invisible t intangible t CI's comment: the above is used as an arg to remove-text-properties, i.e. (remove-text-properties beg end '(mouse-face t keymap t org-linked-text t invisible t intangible t org-no-flyspell t org-emphasis t)) org.el:10194: (unless (get-text-property (match-end group) 'intangible) ; Emacs 21 CI's comment: checking with the get-text-property at the position. Igrep finished (matches found) at Thu Apr 18 16:45:43 [] Searching the usage of "intangible" in tamago/egg ./egg-cnv.el:185:(defmacro egg-bunsetsu-info () ''intangible) ./its.el:326: 'intangible 'its-part-2 CI's comment: The above is part of set-text-properties as in (set-text-properties 0 1 (list 'read-only t 'invisible 'egg 'intangible 'its-part-2 'its-cursor cursor 'point-entered 'egg-enter/leave-fence 'point-left 'egg-enter/leave-fence 'modification-hooks '(egg-modify-fence)) str) (insert str) ./its.el:350:;; intangible intangible ./its.el:354: (let ((open-props '(its-start t intangible its-part-1)) CI's comment: open-props is used subsequently as an argument to add-text-properties. (add-text-properties p p1 open-props) ./its.el:355: (close-props '(rear-nonsticky t its-end t intangible its-part-2)) CI's comment: close-props is used subsequently as an argument to add-text-properties. (add-text-properties p1 (point) close-props) ./its.el:388: (put-text-property 0 (length str) 'intangible 'its-part-1 str) CI's comment : the above is as argument to put-text-property. ./its.el:579: 'intangible 'its-part-1) CI's comment: the above is as argument to add-text-property (add-text-properties 0 (length output) (list 'its-map its-current-map 'its-syl newsyl 'egg-lang its-current-language 'read-only t 'intangible 'its-part-1) output) ./its.el:895: (put-text-property 0 (- end beg) 'intangible 'its-part-1 str) ./its.el:903: (put-text-property 0 (- end beg) 'intangible 'its-part-2 str) ./its.el:1167: (remove-text-properties 0 len '(intangible nil) source) ./its.el:1197: (add-text-properties 0 len '(read-only t intangible its-part-1) source) ./its.el:1199: (add-text-properties 0 len '(read-only t intangible its-part-2) source) ./its.el:1274: (and (eq (get-text-property (point) 'intangible) 'its-part-2) ./its.el:1527: (put-text-property 0 len 'intangible 'its-part-1 old-str) TIA