Emacs Org Mode:用noweb调用带参数src块生成表格报错求排查
It looks like the main issue is how you're trying to pass arguments to your gdt code block using noweb—Org Mode's noweb syntax doesn't support direct argument passing like <<gdt("14-05-2018")>>. Here's why that's causing a syntax error, and how to fix it:
First, when you write <<gdt("14-05-2018")>>, Org Mode doesn't recognize this as a valid noweb reference (since reference names can't include parentheses or arguments). Instead of replacing it with your gdt block's code, it leaves that line as-is in your Ruby code. Ruby then interprets << as the left-shift operator followed by gdt("14-05-2018")—which is invalid syntax, hence the error.
Here's the correct approach to make this work:
Step 1: Define your gdt block with a parameter
First, ensure your gdt code block declares the date parameter using the :var header argument. This tells Org Mode the block accepts a variable named date that you can pass from other blocks.
Example gdt block:
#+BEGIN_SRC ruby :var date="01-01-2024" :results output org
require 'date'
parsed_date = Date.strptime(date, "%d-%m-%Y")
puts "| Date | Day of Week | Month |"
puts "|------------|-------------|-------------|"
puts "| #{parsed_date.strftime("%d-%m-%Y")} | #{parsed_date.strftime("%A")} | #{parsed_date.strftime("%B")} |"
#+END_SRC
Step 2: Call gdt from another block using noweb
To call this block and pass a specific date, use the :var header argument in your calling block to set the date value, then reference <<gdt>> (without arguments). Org Mode will automatically pass the date value from the calling block to the gdt block during evaluation.
Example calling block:
#+BEGIN_SRC ruby :noweb eval :var date="14-05-2018" :results output org
<
#+END_SRC
When you evaluate this calling block, Org Mode will run the gdt block with date set to "14-05-2018" and output the generated Org table as expected.
Alternative: Inline variable override
If you want to hardcode the date directly in the noweb context (instead of using :var), you can define a snippet that sets the date variable before calling gdt—just make sure your gdt block either doesn't have a :var date=... declaration, or that the inline assignment overrides it:
#+BEGIN_SRC ruby :noweb eval :results output org
date = "14-05-2018"
<
#+END_SRC
That should resolve the syntax error and let you generate your Org table correctly!
内容的提问来源于stack exchange,提问作者osadasami

