kakoune/rc/base/markdown.kak
Tim Allen e640e6d859 Consecutive markdown list bullets are not a valid list prefix.
Previously, if you opened a new line after an underlined heading (what
the CommonMark spec calls a "Setext heading") or inserted a newline into
a line that started with `**strong emphasis**` the Markdown autoindent
hook would assume the leading symbols were list bullets and paste them
at the beginning of the new line.

However, the CommonMark specification says that list bullets must be
followed by at least one horizontal whitespace character, so Setext
heading underlines and strong emphasis are not valid list bullets and
should not be matched by the autoindent pattern.

This commit changes the regex that selects the pastable prefix of the
previous line so that it must match either:

  - One or more `>` characters with optional whitespace between them
    (a blockquote prefix), optionally followed by a list bullet; or
  - An optional blockquote prefix and a list bullet

Since we don't strictly need either the blockquote prefix nor the list
bullet, we could concievably just make both optional... but for lines
without either, the regex would find a zero-length match, and for the
purposes of copy/paste Kakoune treats that as a one-character match.
Therefore, the regex is written to fail if neither pattern is found.
2017-08-01 20:36:40 +10:00

152 lines
6.9 KiB
Plaintext

# http://daringfireball.net/projects/markdown
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
# Detection
# ‾‾‾‾‾‾‾‾‾
hook global BufCreate .*[.](markdown|md|mkd) %{
set buffer filetype markdown
}
# Highlighters
# ‾‾‾‾‾‾‾‾‾‾‾‾
add-highlighter -group / regions -default content markdown \
c ```\h*c ``` '' \
cabal ```\h*cabal ``` '' \
clojure ```\h*clojure ``` '' \
coffee ```\h*coffee ``` '' \
cpp ```\h*cpp ``` '' \
css ```\h*css ``` '' \
cucumber ```\h*cucumber ``` '' \
d ```\h*d ``` '' \
diff ```\h*diff ``` '' \
dockerfile ```\h*dockerfile ``` '' \
fish ```\h*fish ``` '' \
gas ```\h*gas ``` '' \
go ```\h*go ``` '' \
haml ```\h*haml ``` '' \
haskell ```\h*haskell ``` '' \
html ```\h*html ``` '' \
ini ```\h*ini ``` '' \
java ```\h*java ``` '' \
javascript ```\h*javascript ``` '' \
json ```\h*json ``` '' \
julia ```\h*julia ``` '' \
kak ```\h*kak ``` '' \
kickstart ```\h*kickstart ``` '' \
latex ```\h*latex ``` '' \
lisp ```\h*lisp ``` '' \
lua ```\h*lua ``` '' \
makefile ```\h*makefile ``` '' \
moon ```\h*moon ``` '' \
objc ```\h*objc ``` '' \
perl ```\h*perl ``` '' \
pug ```\h*pug ``` '' \
python ```\h*python ``` '' \
ragel ```\h*ragel ``` '' \
ruby ```\h*ruby ``` '' \
rust ```\h*rust ``` '' \
sass ```\h*sass ``` '' \
scala ```\h*scala ``` '' \
scss ```\h*scss ``` '' \
sh ```\h*sh ``` '' \
swift ```\h*swift ``` '' \
tupfile ```\h*tupfile ``` '' \
yaml ```\h*yaml ``` '' \
code ``` ``` '' \
code `` `` '' \
code ` ` ''
add-highlighter -group /markdown/code fill meta
add-highlighter -group /markdown/c ref c
add-highlighter -group /markdown/cabal ref cabal
add-highlighter -group /markdown/clojure ref clojure
add-highlighter -group /markdown/coffee ref coffee
add-highlighter -group /markdown/cpp ref cpp
add-highlighter -group /markdown/css ref css
add-highlighter -group /markdown/cucumber ref cucumber
add-highlighter -group /markdown/d ref d
add-highlighter -group /markdown/diff ref diff
add-highlighter -group /markdown/dockerfile ref dockerfile
add-highlighter -group /markdown/fish ref fish
add-highlighter -group /markdown/gas ref gas
add-highlighter -group /markdown/go ref go
add-highlighter -group /markdown/haml ref haml
add-highlighter -group /markdown/haskell ref haskell
add-highlighter -group /markdown/html ref html
add-highlighter -group /markdown/ini ref ini
add-highlighter -group /markdown/java ref java
add-highlighter -group /markdown/javascript ref javascript
add-highlighter -group /markdown/json ref json
add-highlighter -group /markdown/julia ref julia
add-highlighter -group /markdown/kak ref kakrc
add-highlighter -group /markdown/kickstart ref kickstart
add-highlighter -group /markdown/latex ref latex
add-highlighter -group /markdown/lisp ref lisp
add-highlighter -group /markdown/lua ref lua
add-highlighter -group /markdown/makefile ref makefile
add-highlighter -group /markdown/moon ref moon
add-highlighter -group /markdown/objc ref objc
add-highlighter -group /markdown/perl ref perl
add-highlighter -group /markdown/pug ref pug
add-highlighter -group /markdown/python ref python
add-highlighter -group /markdown/ragel ref ragel
add-highlighter -group /markdown/ruby ref ruby
add-highlighter -group /markdown/rust ref rust
add-highlighter -group /markdown/sass ref sass
add-highlighter -group /markdown/scala ref scala
add-highlighter -group /markdown/scss ref scss
add-highlighter -group /markdown/sh ref sh
add-highlighter -group /markdown/swift ref swift
add-highlighter -group /markdown/tupfile ref tupfile
add-highlighter -group /markdown/yaml ref yaml
# Setext-style header
add-highlighter -group /markdown/content regex (\A|\n\n)[^\n]+\n={2,}\h*\n\h*$ 0:title
add-highlighter -group /markdown/content regex (\A|\n\n)[^\n]+\n-{2,}\h*\n\h*$ 0:header
# Atx-style header
add-highlighter -group /markdown/content regex ^(#+)(\h+)([^\n]+) 1:header
add-highlighter -group /markdown/content regex ^\h?+((?:[\s\t]+)?[-\*])\h+[^\n]*(\n\h+[^-\*]\S+[^\n]*\n)*$ 0:list 1:bullet
add-highlighter -group /markdown/content regex ^([-=~]+)\n[^\n\h].*?\n\1$ 0:block
add-highlighter -group /markdown/content regex \B\+[^\n]+?\+\B 0:mono
add-highlighter -group /markdown/content regex \B\*[^\n]+?\*\B 0:italic
add-highlighter -group /markdown/content regex \b_[^\n]+?_\b 0:italic
add-highlighter -group /markdown/content regex \B\*\*[^\n]+?\*\*\B 0:bold
add-highlighter -group /markdown/content regex \B__[^\n]+?__\B 0:bold
add-highlighter -group /markdown/content regex <(([a-z]+://.*?)|((mailto:)?[\w+-]+@[a-z]+[.][a-z]+))> 0:link
add-highlighter -group /markdown/content regex ^\h*(>\h*)+ 0:comment
add-highlighter -group /markdown/content regex \H\K\h\h$ 0:PrimarySelection
# Commands
# ‾‾‾‾‾‾‾‾
def -hidden markdown-indent-on-new-line %{
eval -draft -itersel %{
# copy block quote(s), list item prefix and following white spaces
try %{ exec -draft k <a-x> s ^\h*\K((>\h*)+([*+-]\h)?|(>\h*)*[*+-]\h)\h* <ret> y gh j P }
# preserve previous line indent
try %{ exec -draft \; K <a-&> }
# remove trailing white spaces
try %{ exec -draft -itersel %{ k<a-x> s \h+$ <ret> d } }
}
}
# Initialization
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾
hook -group markdown-highlight global WinSetOption filetype=markdown %{ add-highlighter ref markdown }
hook global WinSetOption filetype=markdown %{
hook window InsertChar \n -group markdown-indent markdown-indent-on-new-line
}
hook -group markdown-highlight global WinSetOption filetype=(?!markdown).* %{ remove-highlighter markdown }
hook global WinSetOption filetype=(?!markdown).* %{
remove-hooks window markdown-indent
}