aboutsummaryrefslogtreecommitdiff
path: root/autoload/orgmode/orgmode.kak
blob: 15e3ba3d702b8863da1ae8102027dd2f4246f3fc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
hook global BufCreate .*[.]org %{
  set-option buffer filetype org
}

declare-user-mode org
hook global WinSetOption filetype=org %{
  add-highlighter window/org ref org
  require-module orgmode-highlight

  map window normal <ret> ': orgmode-jump-link<ret>'
  map window user o ': enter-user-mode org<ret>' -docstring 'Org mode'
  map window org <tab> ': orgmode-toggle<ret>' -docstring 'Toggle checkbox/task'
}

define-command orgmode-toggle %{
  evaluate-commands -save-regs '#/' %{
    try %{ orgmode-toggle-checkbox } catch %{ orgmode-toggle-task-state } catch %{ }
  }
}

define-command orgmode-jump-link %{
  # TODO: support multiple links in single line
  evaluate-commands -draft %{ try %{
    execute-keys ',xs\[\[([^\n\]]+)\]<ret>'
    set-register a %reg{1}
  } }
  evaluate-commands %sh{
    [ -z "$kak_reg_a" ] && exit 0
    case "$kak_reg_a" in
      https://*|http://*) xdg-open "$kak_reg_a" >/dev/null 2>&1 ;;
      /*|~/*) echo "edit %{$kak_reg_a}" ;;
      *)
        current_path="${kak_buffile:-"$kak_bufname"}"
        path="$(realpath -s "$(dirname "$kak_buffile")/$kak_reg_a")"
        echo "edit %{$path}"
      ;;
    esac
  }
}

define-command orgmode-toggle-checkbox %{
  evaluate-commands %{
    execute-keys ',xs^(\h*-\h+)\[([Xx\- ])\]<ret>'
    evaluate-commands %sh{
      next="$kak_reg_2"
      case "$kak_reg_2" in
        X|x) next=" " ;;
        -) next="X" ;;
        *) next="-" ;;
      esac
      echo "execute-keys 'c<c-r>1[$next]<esc>'"
    }
  }
}

define-command orgmode-toggle-task-state %{
  evaluate-commands %{
    execute-keys ',xs^(\*+\h+)(TODO|ACTIVE|DONE)?<ret>'
    evaluate-commands %sh{
      next="TODO " # Add space at end when no state
      case "$kak_reg_2" in
        TODO) next="ACTIVE" ;;
        ACTIVE) next="DONE" ;;
        DONE) next="TODO" ;;
      esac
      echo "execute-keys 'c<c-r>1$next<esc>'"
    }
  }
}

provide-module orgmode-highlight %{
  add-highlighter shared/org regions
  add-highlighter shared/org/inline default-region regions
  add-highlighter shared/org/inline/text default-region group

  add-highlighter shared/org/inline/text/ regex \*[^\n*]+\* 0:inlineBold
  add-highlighter shared/org/inline/text/ regex /[^\n/]+/ 0:inlineItalic
  add-highlighter shared/org/inline/text/ regex _[^\n_]+_ 0:inlineUnderline
  add-highlighter shared/org/inline/text/ regex \+[^\n+]+\+ 0:inlineStrikethrough
  add-highlighter shared/org/inline/text/ regex ~[^\n~]+~ 0:inlineCode
  add-highlighter shared/org/inline/text/ regex \[\[[^\n]+\]\] 0:inlineLink
  add-highlighter shared/org/codeblock region -match-capture \
    ^\h*#\+(?:begin|BEGIN)_([a-zA-Z]*)[^\n]*$ \
    ^\h*#\+(?:end|END)_([a-zA-Z]*)[^\n]*$ \
    regions
  add-highlighter shared/org/codeblock/ default-region fill orgCodeBlock

  add-highlighter shared/org/inline/text/ regex ^[*]{1}[^\n]* 0:header1
  add-highlighter shared/org/inline/text/ regex ^[*]{2}[^\n]* 0:header2
  add-highlighter shared/org/inline/text/ regex ^[*]{3}[^\n]* 0:header3
  add-highlighter shared/org/inline/text/ regex ^[*]{4}[^\n]* 0:header4
  add-highlighter shared/org/inline/text/ regex ^[*]{5}[^\n]* 0:header5
  add-highlighter shared/org/inline/text/ regex ^[*]{6}[^\n]* 0:header6

  add-highlighter shared/org/inline/text/ regex ^[*]*\s+(TODO) 1:orgTaskStateTodo
  add-highlighter shared/org/inline/text/ regex ^[*]*\s+(DONE) 1:orgTaskStateDone
  add-highlighter shared/org/inline/text/ regex ^[*]*\s+(ACTIVE) 1:orgTaskStateActive

  add-highlighter shared/org/inline/text/ regex ^\s*-\s*(\[[xX]\])\h([^\n]+)$ 1:checkboxChecked 2:checkboxCheckedText
  add-highlighter shared/org/inline/text/ regex ^\s*-\s*(\[[\s]\]) 1:checkboxTodo
  add-highlighter shared/org/inline/text/ regex ^\s*-\s*(\[[-]\]) 1:checkboxPending
}