@@ -390,9 +390,9 @@ function Headline:get_title_with_priority()
390
390
return title
391
391
end
392
392
393
- memoize (' get_properties ' )
393
+ memoize (' get_own_properties ' )
394
394
--- @return table<string , string> , TSNode | nil
395
- function Headline :get_properties ()
395
+ function Headline :get_own_properties ()
396
396
local section = self :node ():parent ()
397
397
local properties_node = section and section :field (' property_drawer' )[1 ]
398
398
@@ -416,6 +416,33 @@ function Headline:get_properties()
416
416
return properties , properties_node
417
417
end
418
418
419
+ memoize (' get_properties' )
420
+ --- @return table<string , string> , TSNode | nil
421
+ function Headline :get_properties ()
422
+ local properties , own_properties_node = self :get_own_properties ()
423
+
424
+ if not config .org_use_property_inheritance then
425
+ -- TODO: Do we have to filter non-inherited properties here? (see `Headline:get_tags()`)
426
+ return properties , own_properties_node
427
+ end
428
+
429
+ local parent_section = self :node ():parent ():parent ()
430
+ while parent_section do
431
+ local headline_node = parent_section :field (' headline' )[1 ]
432
+ if headline_node then
433
+ local headline = Headline :new (headline_node , self .file )
434
+ for name , value in pairs (headline :get_own_properties ()) do
435
+ if properties [name ] == nil and config :use_property_inheritance (name ) then
436
+ properties [name ] = value
437
+ end
438
+ end
439
+ end
440
+ parent_section = parent_section :parent ()
441
+ end
442
+
443
+ return properties , own_properties_node
444
+ end
445
+
419
446
--- @param name string
420
447
--- @param value ? string
421
448
--- @return OrgHeadline
@@ -427,19 +454,19 @@ function Headline:set_property(name, value)
427
454
vim .fn .deletebufline (bufnr , property_node :start () + 1 )
428
455
end
429
456
self :refresh ()
430
- local properties , properties_node = self :get_properties ()
457
+ local properties , properties_node = self :get_own_properties ()
431
458
if vim .tbl_isempty (properties ) then
432
459
self :_set_node_lines (properties_node , {})
433
460
end
434
461
return self :refresh ()
435
462
end
436
463
437
- local _ , properties = self :get_properties ()
464
+ local _ , properties = self :get_own_properties ()
438
465
if not properties then
439
466
local append_line = self :get_append_line ()
440
467
local property_drawer = self :_apply_indent ({ ' :PROPERTIES:' , ' :END:' }) --[[ @as string[] ]]
441
468
vim .api .nvim_buf_set_lines (bufnr , append_line , append_line , false , property_drawer )
442
- _ , properties = self :refresh ():get_properties ()
469
+ _ , properties = self :refresh ():get_own_properties ()
443
470
end
444
471
445
472
local property = (' :%s: %s' ):format (name , value )
478
505
--- `org_use_property_inheritance`
479
506
--- @return string | nil , TSNode | nil
480
507
function Headline :get_property (property_name , search_parents )
481
- local _ , properties = self :get_properties ()
508
+ local _ , properties = self :get_own_properties ()
482
509
if properties then
483
510
for _ , node in ipairs (ts_utils .get_named_children (properties )) do
484
511
local name = node :field (' name' )[1 ]
@@ -550,6 +577,7 @@ memoize('get_tags')
550
577
function Headline :get_tags ()
551
578
local tags , own_tags_node = self :get_own_tags ()
552
579
if not config .org_use_tag_inheritance then
580
+ -- TODO: Why exclude the headline's own tags here?
553
581
return config :exclude_tags (tags ), own_tags_node
554
582
end
555
583
636
664
637
665
--- @return number
638
666
function Headline :get_append_line ()
639
- local _ , properties = self :get_properties ()
667
+ local _ , properties = self :get_own_properties ()
640
668
if properties then
641
669
local row = properties :end_ ()
642
670
return row
0 commit comments