From 888469b90a95f89453e1cecde5a4c644766e2d2c Mon Sep 17 00:00:00 2001 From: Roberto Ostinelli Date: Sat, 13 Oct 2012 15:56:24 -0700 Subject: [PATCH] add man functionality --- README.md | 5 +- SublimErl.sublime-settings | 5 +- bindings/Default (Linux).sublime-keymap | 3 +- bindings/Default (OSX).sublime-keymap | 3 +- sublimerl_core.py | 18 +++-- sublimerl_formatter.py | 2 +- sublimerl_man.py | 101 ++++++++++++++++++++++++ 7 files changed, 125 insertions(+), 12 deletions(-) create mode 100644 sublimerl_man.py diff --git a/README.md b/README.md index 92bd0db..5de4f75 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ SublimErl is a plugin for the text editor [Sublime Text 2](http://www.sublimetex * Run **Common Tests** ( all tests for module / single test ) * Run **Dialyzer** tests ( single module ) * **Goto any exported function** of your project easily +* Access **man pages** from the text editor All within your test editor. @@ -39,7 +40,8 @@ Usage * Run **Dialyzer** on file: view the file and hit `Command-Shift-F9` * Re-Run the **previous test**: hit `Command-F8` ( you do not need to be viewing the test to launch it ) * View **Common Tests results** in browser: hit `Command-Option-F8` (OSX) | `Command-Alt-F8` (Linux/Win) -* **Goto any exported function** of your project easily: hit `Command-Option-P` (OSX) | `Command-Alt-P` (Linux/Win) and select a function +* **Goto any exported function** of your project easily: hit `Command-Option-p` (OSX) | `Command-Alt-p` (Linux/Win) and select a function +* To access **man pages**: hit `Command-Option-i` (OSX) | `Command-Alt-i` (Linux/Win) and select a module A brief introduction video can be seen [here](http://www.youtube.com/watch?v=T0rD0CQM4Yg): @@ -83,6 +85,7 @@ To use SublimErl, you need to have: * The editor [Sublime Text 2](http://www.sublimetext.com/2). * [Erlang](http://www.erlang.org/download.html) ( ..obviously ^^_ ). * Basho's [Rebar](https://github.com/basho/rebar) built after September 13th, 2012 (which has support for the `tests=` option). +* (optional) [Erlang man pages](http://www.erlang.org/download.html) if you use this functionality. To unleash the full power of the plugin, you will also need to comply to: diff --git a/SublimErl.sublime-settings b/SublimErl.sublime-settings index 6c2e3c1..64d8710 100644 --- a/SublimErl.sublime-settings +++ b/SublimErl.sublime-settings @@ -1,10 +1,11 @@ { /* - * SublimErl tries to detect automatically the paths for rebar, erl, escript and dialyzer. + * SublimErl tries to detect automatically the paths for erl, escript, rebar and dialyzer. * If it doesn't succeed or you prefer to manually configure these, you can do so by inputting the paths here. * - * "rebar_path": "/usr/local/bin/rebar", + * "erl_path": "/usr/local/bin/erl", * "escript_path": "/usr/local/bin/escript", + * "rebar_path": "/usr/local/bin/rebar", * "dialyzer_path": "/usr/local/bin/dialyzer" */ diff --git a/bindings/Default (Linux).sublime-keymap b/bindings/Default (Linux).sublime-keymap index f6c2fbf..cf58db1 100644 --- a/bindings/Default (Linux).sublime-keymap +++ b/bindings/Default (Linux).sublime-keymap @@ -4,5 +4,6 @@ { "keys": ["ctrl+f8"], "command": "sublim_erl_redo" }, { "keys": ["ctrl+alt+f8"], "command": "sublim_erl_ct_results" }, { "keys": ["ctrl+alt+l"], "command": "sublim_erl_auto_format", "context": [{ "key": "selector", "operator": "equal", "operand": "source.erlang" }] }, - { "keys": ["ctrl+alt+p"], "command": "sublim_erl_function_search", "context": [{ "key": "selector", "operator": "equal", "operand": "source.erlang" }] } + { "keys": ["ctrl+alt+p"], "command": "sublim_erl_function_search", "context": [{ "key": "selector", "operator": "equal", "operand": "source.erlang" }] }, + { "keys": ["ctrl+alt+i"], "command": "sublim_erl_man", "context": [{ "key": "selector", "operator": "equal", "operand": "source.erlang" }] } ] diff --git a/bindings/Default (OSX).sublime-keymap b/bindings/Default (OSX).sublime-keymap index 272f665..36c8205 100644 --- a/bindings/Default (OSX).sublime-keymap +++ b/bindings/Default (OSX).sublime-keymap @@ -4,5 +4,6 @@ { "keys": ["super+f8"], "command": "sublim_erl_redo" }, { "keys": ["super+alt+f8"], "command": "sublim_erl_ct_results" }, { "keys": ["super+alt+l"], "command": "sublim_erl_auto_format", "context": [{ "key": "selector", "operator": "equal", "operand": "source.erlang" }] }, - { "keys": ["super+alt+p"], "command": "sublim_erl_function_search", "context": [{ "key": "selector", "operator": "equal", "operand": "source.erlang" }] } + { "keys": ["super+alt+p"], "command": "sublim_erl_function_search", "context": [{ "key": "selector", "operator": "equal", "operand": "source.erlang" }] }, + { "keys": ["super+alt+i"], "command": "sublim_erl_man", "context": [{ "key": "selector", "operator": "equal", "operand": "source.erlang" }] } ] diff --git a/sublimerl_core.py b/sublimerl_core.py index aca3495..7f6db65 100644 --- a/sublimerl_core.py +++ b/sublimerl_core.py @@ -45,8 +45,9 @@ def __init__(self): self.completions_path = None self.support_path = None - self.rebar_path = None + self.erl_path = None self.escript_path = None + self.rebar_path = None self.dialyzer_path = None self.erlang_libs_path = None @@ -115,16 +116,21 @@ def log(message): def test_path(path): return path != None and os.path.exists(path) - # rebar - self.rebar_path = self.settings.get('rebar_path', self.get_exe_path('rebar')) - if test_path(self.rebar_path) == False: - log("Rebar cannot be found, please download and install from .") - return False + # erl check + self.erl_path = self.settings.get('erl_path', self.get_exe_path('erl')) + if test_path(self.erl_path) == False: + log("Erlang binary (erl) cannot be found.") # escript check self.escript_path = self.settings.get('escript_path', self.get_exe_path('escript')) if test_path(self.escript_path) == False: log("Erlang binary (escript) cannot be found.") + + # rebar + self.rebar_path = self.settings.get('rebar_path', self.get_exe_path('rebar')) + if test_path(self.rebar_path) == False: + log("Rebar cannot be found, please download and install from .") + return False return False # dialyzer check diff --git a/sublimerl_formatter.py b/sublimerl_formatter.py index 3f282b3..e43f6b0 100644 --- a/sublimerl_formatter.py +++ b/sublimerl_formatter.py @@ -63,7 +63,7 @@ def format(self): self.view.show(current_region) -# repeat last test +# format command class SublimErlAutoFormatCommand(SublimErlTextCommand): def run_command(self, edit): formatter = SublimErlAutoFormat(self.view, edit) diff --git a/sublimerl_man.py b/sublimerl_man.py new file mode 100644 index 0000000..cc6dcf8 --- /dev/null +++ b/sublimerl_man.py @@ -0,0 +1,101 @@ +# ========================================================================================================== +# SublimErl - A Sublime Text 2 Plugin for Erlang Integrated Testing & Code Completion +# +# Copyright (C) 2012, Roberto Ostinelli . +# All rights reserved. +# +# BSD License +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided +# that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this list of conditions and the +# following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and +# the following disclaimer in the documentation and/or other materials provided with the distribution. +# * Neither the name of the authors nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ========================================================================================================== + + +# imports +import sublime +import os +from sublimerl_core import SUBLIMERL, SublimErlTextCommand, SublimErlGlobal + + +# show man +class SublimErlMan(): + + def __init__(self, view): + # init + self.view = view + self.window = view.window() + self.module_names = [] + + self.panel_name = 'sublimerl_man' + self.panel_buffer = '' + # setup panel + self.setup_panel() + + def setup_panel(self): + self.panel = self.window.get_output_panel(self.panel_name) + self.panel.settings().set("syntax", os.path.join(SUBLIMERL.plugin_path, "theme", "SublimErlAutocompile.hidden-tmLanguage")) + self.panel.settings().set("color_scheme", os.path.join(SUBLIMERL.plugin_path, "theme", "SublimErlAutocompile.hidden-tmTheme")) + + def update_panel(self): + if len(self.panel_buffer): + panel_edit = self.panel.begin_edit() + self.panel.insert(panel_edit, self.panel.size(), self.panel_buffer) + self.panel.end_edit(panel_edit) + self.panel.show(self.panel.size()) + self.panel_buffer = '' + self.window.run_command("show_panel", {"panel": "output.%s" % self.panel_name}) + + def hide_panel(self): + self.window.run_command("hide_panel") + + def log(self, text): + self.panel_buffer += text + sublime.set_timeout(self.update_panel, 0) + + def show(self): + # set modules + self.set_module_names() + # open quick panel + sublime.active_window().show_quick_panel(self.module_names, self.on_select) + + def set_module_names(self): + # load file + modules_filepath = os.path.join(SUBLIMERL.plugin_path, "completion", "Erlang-libs.sublime-completions") + f = open(modules_filepath, 'r') + contents = eval(f.read()) + f.close() + # strip out just the module names to be displayed + module_names = [] + for t in contents['completions']: + module_names.append(t['trigger']) + self.module_names = module_names + + def on_select(self, index): + # get file and line + module_name = self.module_names[index] + # open man + retcode, data = SUBLIMERL.execute_os_command("%s -man %s | col -b" % (SUBLIMERL.erl_path, module_name)) + if retcode == 0: self.log(data) + + +# man command +class SublimErlManCommand(SublimErlTextCommand): + def run_command(self, edit): + man = SublimErlMan(self.view) + man.show() \ No newline at end of file