# ============================================================================== # ModeStringInterpret(default_language): looks for mode strings in the current # document, and interprets them. # ============================================================================== define ModeStringInterpret { settings = $empty_array if ($n_args >= 1) settings["defaultlang"] = $1 # what sort of mode string do we have? vistr = "(?<=(?:^|\\s))vi:\\s*.*" emacsstr = "(?<=(?:^|\\s))-\\*-\\s*.*-\\*-" pos = 0 for (beg = search(vistr, 0, "regex"); \ beg >= 0; \ beg = search(vistr, pos, "regex")) { # interpret vi settings pos = $search_end # dialog("Found vi mode string\n" get_range(beg, pos)) settings = ModeStringInterpret_vi(get_range(beg, pos), settings) } for (beg = search(emacsstr, 0, "regex"); \ beg >= 0; \ beg = search(emacsstr, pos, "regex")) { # interpret emacs settings pos = $search_end # dialog("Found emacs mode string\n" get_range(beg, pos)) settings = ModeStringInterpret_emacs(get_range(beg, pos), settings) } if (!("lang" in settings) && ("defaultlang" in settings)) set_language_mode(settings["defaultlang"]) } # ============================================================================== # ModeStringInterpret_vi(string, settings): augments the editor settings # information in settings[] with values taken from string, a "mode line". # This is used internally by ModeStringInterpret() for vi-style mode # lines. # ============================================================================== define ModeStringInterpret_vi { str = $1 settings = $2 # tab settings re = ".*:\\s*set\\s+(?:ts|tabstop)\\s*=\\s*(\\d+)\\s*:.*" ts = replace_in_string(str, re, "\\1", "regex") if (ts != "") { n = ts if ("tab_dist" in settings && n != settings["tab_dist"]) return ModeStringInterpret_vi_redefinedTabStop() else if (0 > n || n > 20) return ModeStringInterpret_vi_badTabStopNumber() else { set_em_tab_dist(-1) # turn off emulated tabs set_tab_dist(n) # use vi's tab spacing set_use_tabs(1) # allow use of tabs in auto padding settings["tab_dist"] = n } } return settings } # ============================================================================== # ModeStringInterpret_vi(string, settings): augments the editor settings # information in settings[] with values taken from string, a "mode line". # This is used internally by ModeStringInterpret() for EMACS-style mode # lines. # ============================================================================== define ModeStringInterpret_emacs { str = $1 settings = $2 # language mode re = ".*(?i[:;-]\\s*(?:(? n || n > 20) return ModeStringInterpret_emacs_badTabStopNumber() else { set_em_tab_dist(-1) # turn off emulated tabs set_tab_dist(n) # use vi's tab spacing set_use_tabs(1) # allow use of tabs in auto padding settings["tab_dist"] = n } } return settings }