Commit e0ea6dd8a89bb6a0b8afae8da429af86810fb8ca
0 parents
Exists in
master
Clone de terminator-applauncher
plugin para terminator
Showing
3 changed files
with
196 additions
and
0 deletions
Show diff stats
README.md
| ... | ... | @@ -0,0 +1,60 @@ |
| 1 | +# AppLauncher | |
| 2 | + | |
| 3 | +I want to share this plugin, I use [Terminator](http://www.tenshu.net/p/terminator.html), and every time I wanted to set up my development environment, I had to launch Terminator and execute the commands needed. In order to avoid this repetitive sequence, I decided to write a plugin that, with just one click, launches Terminator, creates divisions in it, and executes the commands needed for every project. | |
| 4 | + | |
| 5 | +## Installation | |
| 6 | + | |
| 7 | +1. Put files in `~/.config/terminator/plugins/`: | |
| 8 | + | |
| 9 | + mkdir -p ~/.config/terminator/plugins | |
| 10 | + cp applauncher.py ~/.config/terminator/plugins/ | |
| 11 | + cp projects.py ~/.config/terminator/plugins/ | |
| 12 | + | |
| 13 | +2. Restart [Terminator](http://www.tenshu.net/p/terminator.html), go to `Context menu > Preferences > Plugins` and select `AppLauncher`. | |
| 14 | + | |
| 15 | +## Setup | |
| 16 | + | |
| 17 | +1. Edit `~/.config/terminator/plugins/projects.py`, example: | |
| 18 | + | |
| 19 | + :::python | |
| 20 | + PROJECTS = {"Project 1": {"split": "vert", | |
| 21 | + "terminal1": {"split": "horiz", | |
| 22 | + "terminal1": {"commands": ["dir"], | |
| 23 | + }, | |
| 24 | + "terminal2": {"commands": ["ls"], | |
| 25 | + } | |
| 26 | + }, | |
| 27 | + "terminal2": {"commands": ["dir"], | |
| 28 | + }, | |
| 29 | + }, | |
| 30 | + "Project 2": {"enabled": False, | |
| 31 | + "split": "vert", | |
| 32 | + "terminal1": {"split": "horiz", | |
| 33 | + "terminal1": {"commands": ["command 1", | |
| 34 | + "command 2", | |
| 35 | + "command 3"], | |
| 36 | + }, | |
| 37 | + "terminal2": {"commands": ["command"], | |
| 38 | + } | |
| 39 | + }, | |
| 40 | + "terminal2": {"split": "horiz", | |
| 41 | + "terminal1": {"commands": ["command"], | |
| 42 | + }, | |
| 43 | + "terminal2": {"commands": ["command"], | |
| 44 | + } | |
| 45 | + }, | |
| 46 | + }, | |
| 47 | + "Project 3": {"commands": ["history", ] } | |
| 48 | + } | |
| 49 | + | |
| 50 | + EDITOR = "gedit" | |
| 51 | + | |
| 52 | +2. Restart Terminator. | |
| 53 | + | |
| 54 | +## Use | |
| 55 | + | |
| 56 | +* Go to `Context menu > AppLauncher`, and select your project. | |
| 57 | + | |
| 58 | +## Autor | |
| 59 | + | |
| 60 | +* Guido Castillo Gรณmez <[gcasgo@gmail.com](https://plus.google.com/116701415230747107577)> | ... | ... |
applauncher.py
| ... | ... | @@ -0,0 +1,104 @@ |
| 1 | +#!/usr/bin/python | |
| 2 | +# Written by Guido Castillo Gomez <gcasgo@gmail.com> | |
| 3 | +# GPL v2 only | |
| 4 | + | |
| 5 | +import os | |
| 6 | +import gtk | |
| 7 | +import terminatorlib.plugin as plugin | |
| 8 | +from terminatorlib.translation import _ | |
| 9 | + | |
| 10 | +try: | |
| 11 | + from projects import PROJECTS | |
| 12 | +except ImportError: | |
| 13 | + PROJECTS = {} | |
| 14 | + | |
| 15 | +try: | |
| 16 | + from projects import EDITOR | |
| 17 | +except ImportError: | |
| 18 | + EDITOR = "gedit" | |
| 19 | + | |
| 20 | +AVAILABLE = ['AppLauncher'] | |
| 21 | + | |
| 22 | + | |
| 23 | +class AppLauncher(plugin.Plugin): | |
| 24 | + capabilities = ['terminal_menu'] | |
| 25 | + | |
| 26 | + def callback(self, menuitems, menu, terminal): | |
| 27 | + """Add our menu item to the menu""" | |
| 28 | + | |
| 29 | + item = gtk.MenuItem('AppLauncher') | |
| 30 | + menuitems.append(item) | |
| 31 | + | |
| 32 | + submenu = gtk.Menu() | |
| 33 | + item.set_submenu(submenu) | |
| 34 | + | |
| 35 | + projects = PROJECTS.keys() | |
| 36 | + projects.sort() | |
| 37 | + for project in projects: | |
| 38 | + if not PROJECTS[project].get('enabled', True): | |
| 39 | + continue | |
| 40 | + menuitem = gtk.MenuItem(project) | |
| 41 | + menuitem.connect("activate", self.launch_project, terminal, project) | |
| 42 | + submenu.append(menuitem) | |
| 43 | + | |
| 44 | + menuitem = gtk.SeparatorMenuItem() | |
| 45 | + submenu.append(menuitem) | |
| 46 | + | |
| 47 | + menuitem = gtk.ImageMenuItem(gtk.STOCK_PREFERENCES) | |
| 48 | + menuitem.connect("activate", self.configure) | |
| 49 | + submenu.append(menuitem) | |
| 50 | + | |
| 51 | + #if config.has_key("default"): | |
| 52 | + # self.launch_project("widget", terminal, DEFAULT_PROJECT) | |
| 53 | + | |
| 54 | + def launch_project(self, widget, terminal, project): | |
| 55 | + | |
| 56 | + if PROJECTS.has_key(project): | |
| 57 | + | |
| 58 | + focussed_terminal = None | |
| 59 | + widget_win = terminal.terminator.windows[0] | |
| 60 | + widget_win.set_maximised(True) | |
| 61 | + widget_win.tab_new(widget_win.get_focussed_terminal()) | |
| 62 | + visible_terminals = widget_win.get_visible_terminals() | |
| 63 | + for visible_terminal in visible_terminals: | |
| 64 | + if visible_terminal.vte.is_focus(): | |
| 65 | + focussed_terminal = visible_terminal | |
| 66 | + | |
| 67 | + project_config = PROJECTS[project] | |
| 68 | + self.split_terminal(focussed_terminal, project_config, widget_win) | |
| 69 | + | |
| 70 | + def split_terminal(self, terminal, terminal_config, window): | |
| 71 | + self.execute_command(terminal, terminal_config.get('commands')) | |
| 72 | + | |
| 73 | + if terminal_config.has_key('split'): | |
| 74 | + visible_terminals_temp = window.get_visible_terminals() | |
| 75 | + if terminal_config['split'].lower().count("vert"): | |
| 76 | + terminal.key_split_vert() | |
| 77 | + else: | |
| 78 | + terminal.key_split_horiz() | |
| 79 | + visible_terminals = window.get_visible_terminals() | |
| 80 | + | |
| 81 | + for visible_terminal in visible_terminals: | |
| 82 | + if not visible_terminal in visible_terminals_temp: | |
| 83 | + terminal2 = visible_terminal | |
| 84 | + | |
| 85 | + if terminal_config.has_key('terminal1'): | |
| 86 | + self.split_terminal(terminal, terminal_config['terminal1'], window) | |
| 87 | + if terminal_config.has_key('terminal2'): | |
| 88 | + self.split_terminal(terminal2, terminal_config['terminal2'], window) | |
| 89 | + | |
| 90 | + def execute_command(self, terminal, command): | |
| 91 | + if command: | |
| 92 | + if isinstance(command, list): | |
| 93 | + command = "\n".join(command) | |
| 94 | + else: | |
| 95 | + command = command | |
| 96 | + if command[len(command)-1] != '\n': | |
| 97 | + command = command + '\n' | |
| 98 | + terminal.vte.feed_child(command) | |
| 99 | + | |
| 100 | + def configure(self, widget): | |
| 101 | + filename = os.path.realpath(os.path.join(os.path.dirname(__file__), 'projects.py')) | |
| 102 | + editor = os.getenv('EDITOR') or EDITOR | |
| 103 | + os.system('%s %s' % (editor, filename)) | |
| 104 | + | ... | ... |
projects.py
| ... | ... | @@ -0,0 +1,32 @@ |
| 1 | +PROJECTS = {"Project 1": {"split": "vert", | |
| 2 | + "terminal1": {"split": "horiz", | |
| 3 | + "terminal1": {"commands": ["dir"], | |
| 4 | + }, | |
| 5 | + "terminal2": {"commands": ["ls"], | |
| 6 | + } | |
| 7 | + }, | |
| 8 | + "terminal2": {"commands": ["dir"], | |
| 9 | + }, | |
| 10 | + }, | |
| 11 | + "Project 2": {"enabled": False, | |
| 12 | + "split": "vert", | |
| 13 | + "terminal1": {"split": "horiz", | |
| 14 | + "terminal1": {"commands": ["command 1", | |
| 15 | + "command 2", | |
| 16 | + "command 3"], | |
| 17 | + }, | |
| 18 | + "terminal2": {"commands": ["command"], | |
| 19 | + } | |
| 20 | + }, | |
| 21 | + "terminal2": {"split": "horiz", | |
| 22 | + "terminal1": {"commands": ["command"], | |
| 23 | + }, | |
| 24 | + "terminal2": {"commands": ["command"], | |
| 25 | + } | |
| 26 | + }, | |
| 27 | + }, | |
| 28 | + "Project 3": {"commands": ["history", ] } | |
| 29 | + } | |
| 30 | + | |
| 31 | +EDITOR = "gedit" | |
| 32 | + | ... | ... |