diff --git a/code_getter/getter.py b/code_getter/getter.py index 07d4e5c..5ef884e 100644 --- a/code_getter/getter.py +++ b/code_getter/getter.py @@ -53,6 +53,8 @@ def initialize(cls, view): return PythonCodeGetter(view) elif syntax == "julia": return JuliaCodeGetter(view) + elif syntax == "matlab": + return MatlabCodeGetter(view) else: return CodeGetter(view) @@ -375,6 +377,68 @@ def expand_line(self, s): s = sublime.Region(s.begin(), line.end()) break + elif re.match(r"\s*#=", thiscmd) and not re.match(r".*=#\s*$", thiscmd): + indentation = re.match(r"^(\s*)", thiscmd).group(1) + endline = view.find(r"^" + indentation + r"=#", s.begin()) + s = sublime.Region(s.begin(), view.line(endline.end()).end()) + + elif re.match(r"\s*#>>", thiscmd) and not re.match(r".*#<<\s*$", thiscmd): + indentation = re.match(r"^(\s*)", thiscmd).group(1) + endline = view.find(r"^" + indentation + r"#<<", s.begin()) + s = sublime.Region(s.begin(), view.line(endline.end()).end()) + + else: + s = self.forward_expand(s, pattern=r"[+\-*/](?=\s*$)") + + return s + + +class MatlabCodeGetter(CodeGetter): + + def expand_line(self, s): + view = self.view + if view.score_selector(s.begin(), "string"): + return s + + s_block = self.block_expand(s) + if s_block != s: + return s_block + + thiscmd = view.substr(s) + row = view.rowcol(s.begin())[0] + lastrow = view.rowcol(view.size())[0] + + keywords = [ + "for", "while", "switch", "try", "if", "parfor", + "function" + ] + if (re.match(r"\s*\b(?:{})\b".format("|".join(keywords)), thiscmd) and + not re.match(r".*\bend\b\s*$", thiscmd)): + indentation = re.match(r"^(\s*)", thiscmd).group(1) + endline = view.find(r"^" + indentation + r"\bend\b", s.begin()) + s = sublime.Region(s.begin(), view.line(endline.end()).end()) + + elif re.match(r"\s*\bimport\b", thiscmd): + row = view.rowcol(s.begin())[0] + lastrow = view.rowcol(view.size())[0] + while row <= lastrow: + line = view.line(view.text_point(row, 0)) + if re.match(r".*[:,]\s*$", view.substr(line)): + row = row + 1 + else: + s = sublime.Region(s.begin(), line.end()) + break + + elif re.match(r"^\s*%{\s*$", thiscmd): + indentation = re.match(r"^(\s*)", thiscmd).group(1) + endline = view.find(r"^" + indentation + r"%}", s.begin()) + s = sublime.Region(s.begin(), view.line(endline.end()).end()) + + elif re.match(r"\s*%>>", thiscmd) and not re.match(r".*%<<\s*$", thiscmd): + indentation = re.match(r"^(\s*)", thiscmd).group(1) + endline = view.find(r"^" + indentation + r"%<<", s.begin()) + s = sublime.Region(s.begin(), view.line(endline.end()).end()) + else: s = self.forward_expand(s, pattern=r"[+\-*/](?=\s*$)") diff --git a/code_sender/sender.py b/code_sender/sender.py index 102d344..9934223 100644 --- a/code_sender/sender.py +++ b/code_sender/sender.py @@ -39,6 +39,8 @@ def initialize(cls, view, **kwargs): return PythonCodeSender(view, **kwargs) elif syntax == "julia": return JuliaCodeSender(view, **kwargs) + elif syntax == "matlab": + return MatlabCodeSender(view, **kwargs) else: return CodeSender(view, **kwargs) @@ -288,3 +290,7 @@ def send_to_terminus(self, cmd): class JuliaCodeSender(CodeSender): pass + +class MatlabCodeSender(CodeSender): + + pass diff --git a/settings.py b/settings.py index 2f9ba9e..34cf195 100644 --- a/settings.py +++ b/settings.py @@ -8,7 +8,8 @@ class Settings: "text.html.markdown.rmarkdown": "rmd", "text.html.markdown": "md", "source.python": "python", - "source.julia": "julia" + "source.julia": "julia", + "source.matlab": "matlab" } def __init__(self, view):