How to escape double quote?

后端 未结 4 1347
盖世英雄少女心
盖世英雄少女心 2020-12-19 10:45

In org mode, if I want to format text a monospace verbatim, i.e. ~...~, if it is inside quotes: ~\"...\"~, it is not formatted (left as is).

<
相关标签:
4条回答
  • 2020-12-19 11:01

    For small amounts of characters which have some unwanted effect in Emacs org-mode (because being metacharacters) it may be helpful to have a look at special symbols in org-mode (org-entities.el).

    So for example " can be encoded by \quot{} (where the braces pair at the end is not mandatory, but needed if no whitespace follows).

    So instead ="..."= you would write =\quot{}...\quot{}=.

    That is some typing more and looks pretty ugly. But for the latter org-mode has a solution: by C-c C-x \ you can toggle a display magic for those symbols. If the magic is active, so directly after typing \quot{} resp. \quot{} a " will be displayed.

    Besides, this symbols list can easily be extended, f.e.

    (add-to-list 'org-entities
    '("backslash" "\\textbackslash" nil "\\" "\\" "\\" "\\"))
    

    Nevertheless I am heavily missing easier escaping in org-mode, besides the above solution and besides escaping a whole line by a : at its beginning.

    I'd be happy if =verbatim= in all cases would leave the text between the ='s unchanged. Not =this*bold*text=, but =this *bold* text=. Like we know that from each well-designed markup/-down language.

    But, of course, this is better placed at the org-mode development pages. Ideally with a fitting patch... :-)

    0 讨论(0)
  • 2020-12-19 11:05

    Finally, I found a solution from http://comments.gmane.org/gmane.emacs.orgmode/82571

    According to that thread, the regexp for verbatim is built from variable org-emphasis-regexp-components, which defines legal characters before, after, at the border of, or in the body of emphasis; and verbatim is one of the emphasis environment in org mode.

    A workable setting given by that thread:

    (setcar (nthcdr 2 org-emphasis-regexp-components) " \t\n,")
    (custom-set-variables `(org-emphasis-alist ',org-emphasis-alist))
    
    0 讨论(0)
  • 2020-12-19 11:10

    I've met similar problem, and thanks @chaiko for a basic solution. However, @chaiko's solution only work for org-mode's fontification, it doesn't affect org-export. To get correct exported document, you need to do some more extra hack to org-mode's parser by (org-element--set-regexps).

    So the full code snippets should be something like:

    (setcar (nthcdr 2 org-emphasis-regexp-components) " \t\n\r")
    (custom-set-variables `(org-emphasis-alist ',org-emphasis-alist))
    (org-element--set-regexps)
    

    I've integrated this to my oh-my-emacs project: https://github.com/xiaohanyu/oh-my-emacs/blob/e82fce10d47f7256df6d39e32ca288d0ec97a764/core/ome-org.org#code-block-fontification .

    0 讨论(0)
  • 2020-12-19 11:16

    The culprit in this case is the regular expression in org-emph-re org-verbatim-re, responsible for determining if a sequence of characters in the document is to be set verbatim or not.

    org-verbatim-re is a variable defined in `org.el'. Its value is "\([ ('\"{]\|^\)\(\([=~]\)\([^
    \n,\"']\|[^
    \n,\"'].?\(?:\n.?\)\{0,1\}[^
    \n,\"']\)\3\)\([- .,:!?;'\")}\]\|$\)"

    quotes and double quotes are explicitly forbidden inside verbatim characters =~ by

    [^ 
    \n,\"']\|[^ 
    \n,\"']
    

    I found discussions dating back 3 years comming to the conclusion that you have to tinker with this regular expression and set the variable org-emph-re/org-verbatim-re to something that matches your wishes in your emacs setup (maybe a file local variable works as well). You can experiment by excluding double quotes from the excluding character classes and outside matches as in

    "\([ ('{]\|^\)\(\([*/_=~+]\)\([^
    \n,']\|[^
    \n,'].?\(?:\n.?\)\{0,1\}[^
    \n,']\)\3\)\([- .,:!?;')}\]\|$\)"

    but looking at that regex, heaven knows what happens to complex documents -- you have to try...

    Edit: as it happens, if I evalute the following as region, quotes inside = are exported correctly, but nothing else is :-), I investigate further when I have more time.

    (setq org-emph-re "\([ ('{]\|^\)\(\([*/_=~+]\)\([^ \n,']\|[^ \n,'].?\(?:\n.?\)\{0,1\}[^ \n,']\)\3\)\([- .,:!?;')}]\|$\)")

    Edit 2:: Got it to work by changing org.el directly:

    Change the line following (defvar org-emphasis-regexp-components from '(" \t('\"{" "- \t.,:!?;'\")}\\" " \t\r\n,\"'" "." 1) to '(" \t('{" "- \t.,:!?;')}\\" " \t\r\n,'" "." 1) and recompile org then restart emacs.

    This was a defcustom prior to the 8.0 release, it isn't anymore, so you have to live with this manual modification.

    regards, Tom

    0 讨论(0)
提交回复
热议问题