├── debian ├── compat ├── docs ├── source │ └── format ├── menu ├── README ├── README.source ├── control ├── rules ├── copyright └── changelog ├── rrun.gif ├── rustfmt.toml ├── src ├── ac_manager.rs ├── runner.rs ├── autocomplete.rs ├── externalrunner.rs ├── config.toml ├── execution.rs ├── rrun.glade ├── engine.rs ├── externalautocompleter.rs └── main.rs ├── .gitignore ├── install_gtk.sh ├── .vscode └── launch.json ├── .travis.yml ├── Cargo.toml ├── Makefile ├── rrun.1 ├── README.rst ├── LICENSE └── Cargo.lock /debian/compat: -------------------------------------------------------------------------------- 1 | 9 2 | -------------------------------------------------------------------------------- /debian/docs: -------------------------------------------------------------------------------- 1 | README.rst 2 | rrun.1 3 | -------------------------------------------------------------------------------- /debian/source/format: -------------------------------------------------------------------------------- 1 | 3.0 (native) 2 | -------------------------------------------------------------------------------- /rrun.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/buster/rrun/HEAD/rrun.gif -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | max_width = 120 2 | ideal_width = 80 3 | tab_spaces = 4 4 | fn_call_width = 100 5 | -------------------------------------------------------------------------------- /src/ac_manager.rs: -------------------------------------------------------------------------------- 1 | pub struct AutoCompleterManager { 2 | ac_list: Vec> 3 | } 4 | -------------------------------------------------------------------------------- /debian/menu: -------------------------------------------------------------------------------- 1 | ?package(rrun):needs="X11|text|vc|wm" section="Applications/Shells"\ 2 | title="rrun" command="/usr/bin/rrun" 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled files 2 | *.o 3 | *.so 4 | *.rlib 5 | *.dll 6 | 7 | # Executables 8 | *.exe 9 | 10 | # Generated by Cargo 11 | /target/ 12 | -------------------------------------------------------------------------------- /src/runner.rs: -------------------------------------------------------------------------------- 1 | pub trait Runner { 2 | fn get_type(&self) -> String; 3 | fn run(&self, to_run: &str, in_background: bool) -> Result; 4 | } 5 | -------------------------------------------------------------------------------- /debian/README: -------------------------------------------------------------------------------- 1 | The Debian Package rrun 2 | ---------------------------- 3 | 4 | Comments regarding the Package 5 | 6 | -- Sebastian Schulze Thu, 11 Dec 2014 13:54:06 +0100 7 | -------------------------------------------------------------------------------- /install_gtk.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -x 4 | set -e 5 | 6 | WD="$PWD" 7 | cd "$HOME" 8 | curl -LO "https://github.com/gkoz/gtk-bootstrap/releases/download/gtk-3.18.1-2/deps.txz" 9 | tar xf deps.txz 10 | cd "$WD" 11 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Debug", 6 | "type": "gdb", 7 | "request": "launch", 8 | "target": "./target/debug/rrun", 9 | "cwd": "${workspaceRoot}" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /debian/README.source: -------------------------------------------------------------------------------- 1 | rrun for Debian 2 | --------------- 3 | 4 | 6 | 7 | 8 | 9 | -- Sebastian Schulze Thu, 11 Dec 2014 13:54:06 +0100 10 | 11 | -------------------------------------------------------------------------------- /src/autocomplete.rs: -------------------------------------------------------------------------------- 1 | pub trait AutoCompleter { 2 | fn get_type(&self) -> String; 3 | fn complete(&self, cmd_string: &str) -> Box>; 4 | } 5 | 6 | #[derive(Debug,Clone,PartialEq)] 7 | pub struct Completion { 8 | pub tpe: String, 9 | pub id: String, 10 | pub text: String, 11 | } 12 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: rust 2 | sudo: false 3 | env: 4 | global: 5 | - LD_LIBRARY_PATH=/usr/local/lib 6 | rust: 7 | - nightly 8 | - stable 9 | 10 | addons: 11 | apt: 12 | packages: 13 | - libgtk-3-dev 14 | 15 | env: 16 | - PKG_CONFIG_PATH="$HOME/local/lib/pkgconfig" 17 | before_script: 18 | - ./install_gtk.sh 19 | cache: 20 | directories: 21 | - $HOME/local 22 | script: 23 | - rustc --version 24 | - cargo test 25 | - cargo build 26 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rrun" 3 | version = "0.2.3" 4 | authors = ["me@bstr.eu"] 5 | repository = "https://github.com/buster/rrun" 6 | keywords = ["gtk", "tool", "bash"] 7 | license = "GPL-3.0+" 8 | description = "minimalistic command launcher in rust similar to gmrun" 9 | exclude = [ 10 | "Makefile", 11 | "debian/*", 12 | ".travis.yml", 13 | "rrun.1", 14 | "rrun.gif", 15 | ] 16 | 17 | [dependencies.gtk] 18 | version = "0.3.0" 19 | features = ["v3_10"] 20 | 21 | [dependencies] 22 | log = "^0" 23 | env_logger = "^0" 24 | glib = "0.4.1" 25 | gdk = "0.7.0" 26 | #cairo-rs = "0.3.0" 27 | toml = "^0" 28 | itertools = "^0" 29 | regex = "^0" 30 | clap = "^2" 31 | 32 | [[bin]] 33 | name = "rrun" 34 | -------------------------------------------------------------------------------- /src/externalrunner.rs: -------------------------------------------------------------------------------- 1 | use runner::Runner; 2 | use execution::execute; 3 | 4 | #[derive(Debug)] 5 | pub struct ExternalRunner { 6 | tpe: String, 7 | command: String, 8 | } 9 | 10 | 11 | impl ExternalRunner { 12 | pub fn new(tpe: String, command: String) -> Box { 13 | return Box::new(ExternalRunner { 14 | tpe: tpe, 15 | command: command, 16 | }); 17 | } 18 | } 19 | 20 | impl Runner for ExternalRunner { 21 | fn run(&self, to_run: &str, in_background: bool) -> Result { 22 | // returns a new completion based on the passed string 23 | execute(self.command.replace("{}", to_run), in_background) 24 | } 25 | fn get_type(&self) -> String { 26 | self.tpe.to_string() 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /debian/control: -------------------------------------------------------------------------------- 1 | Source: rrun 2 | Section: utils 3 | Priority: optional 4 | Maintainer: Sebastian Schulze 5 | Build-Depends: rustc, cargo, debhelper (>= 9), libgtk-3-dev (>= 3.14), git, curl, sudo, bash (>= 4.3), ca-certificates, sed (>= 4.2.2), tar (>= 1.2.7) 6 | Standards-Version: 3.9.5 7 | Homepage: https://github.com/buster/rrun 8 | Vcs-Git: https://github.com/buster/rrun.git 9 | #Vcs-Browser: http://anonscm.debian.org/?p=collab-maint/rrun.git;a=summary 10 | 11 | Package: rrun 12 | Architecture: amd64 13 | Depends: ${shlibs:Depends}, ${misc:Depends}, bash (>= 4.3), libgtk-3-0 (>= 3.14), bash-completion 14 | Description: minimalistic command launcher in rust similar to gmrun 15 | Press Ctrl + Return to display output in window, 16 | else rrun will close after execution. 17 | Will append to ~/.bash_history. 18 | -------------------------------------------------------------------------------- /debian/rules: -------------------------------------------------------------------------------- 1 | #!/usr/bin/make -f 2 | # See debhelper(7) (uncomment to enable) 3 | # output every command that modifies files on the build system. 4 | DH_VERBOSE = 1 5 | 6 | # see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/* 7 | DPKG_EXPORT_BUILDFLAGS = 1 8 | include /usr/share/dpkg/default.mk 9 | 10 | # see FEATURE AREAS in dpkg-buildflags(1) 11 | #export DEB_BUILD_MAINT_OPTIONS = hardening=+all 12 | 13 | # see ENVIRONMENT in dpkg-buildflags(1) 14 | # package maintainers to append CFLAGS 15 | #export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic 16 | # package maintainers to append LDFLAGS 17 | #export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed 18 | 19 | 20 | # main packaging script based on dh7 syntax 21 | %: 22 | dh $@ 23 | 24 | # debmake generated override targets 25 | # This is example for Cmake (See http://bugs.debian.org/641051 ) 26 | #override_dh_auto_configure: 27 | # dh_auto_configure -- \ 28 | # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH) 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/config.toml: -------------------------------------------------------------------------------- 1 | [[completion]] 2 | type="ruby_code" 3 | trigger="rb (.*)" 4 | 5 | [[completion]] 6 | type="numeric_expression" 7 | trigger="([0-9]+.*)" 8 | 9 | [[completion]] 10 | type="url" 11 | trigger="g (.*)" 12 | command="python -c 'import urllib; print(\"https://www.google.com/search?q={0}\".format(urllib.quote(\"{}\")))'" 13 | 14 | [[completion]] 15 | type="command" 16 | trigger="cache (.*?) (.*)" 17 | command="""echo 'rrun completions {1} "{2}" > ~/.config/rrun/{1}_{2}.cache\tCache completions for {1} {2}'""" 18 | 19 | [[completion]] 20 | type="url" 21 | command="cat ~/.config/rrun/url*.cache | grep -i {}" 22 | trigger="u (.*)" 23 | 24 | # [[completion]] 25 | # type="command" 26 | # command="echo {}" 27 | 28 | [[completion]] 29 | type="command" 30 | command="compgen -A command {} | sort | uniq" 31 | 32 | [[runner]] 33 | type="command" 34 | command="bash -i -c '(history -s {}; history -a) && {}'" 35 | 36 | [[runner]] 37 | type="ruby_code" 38 | command="ruby -e 'puts {}'" 39 | 40 | [[runner]] 41 | type="numeric_expression" 42 | command="python -c 'print({})'" 43 | 44 | [[runner]] 45 | type="url" 46 | command="x-www-browser {}" 47 | -------------------------------------------------------------------------------- /src/execution.rs: -------------------------------------------------------------------------------- 1 | use std::process::Command; 2 | use std::process::Output; 3 | 4 | pub fn execute(cmd: String, in_background: bool) -> Result { 5 | if in_background { 6 | debug!("executing in background: {}", cmd); 7 | match Command::new("bash") 8 | .arg("-c") 9 | .arg(&cmd) 10 | .spawn() { 11 | Ok(_) => return Ok("".to_owned()), 12 | Err(x) => return Err(format!("failed to run command {} in the background: {}", cmd, x)), 13 | } 14 | } else { 15 | debug!("executing and getting stdout: {}", cmd); 16 | let Output { status, stdout, .. } = match Command::new("bash") 17 | .arg("-c") 18 | .arg(&cmd) 19 | .output() { 20 | Ok(output) => output, 21 | Err(x) => return Err(format!("unable to get output: {}!", x)), 22 | }; 23 | let out = String::from_utf8_lossy(&stdout).into_owned(); 24 | debug!("out: {}", out); 25 | if status.success() { 26 | return Ok(out); 27 | } 28 | } 29 | 30 | Err(format!("Something went wrong, executing {}", cmd)) 31 | } 32 | -------------------------------------------------------------------------------- /debian/copyright: -------------------------------------------------------------------------------- 1 | Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ 2 | Upstream-Name: rrun 3 | Source: https://github.com/buster/rrun 4 | 5 | Files: * 6 | Copyright: 2015 Sebastian Schulze 7 | License: GPL-3.0+ 8 | 9 | Files: debian/* 10 | Copyright: 2015 Sebastian Schulze 11 | License: GPL-3.0+ 12 | 13 | License: GPL-3.0+ 14 | This program is free software: you can redistribute it and/or modify 15 | it under the terms of the GNU General Public License as published by 16 | the Free Software Foundation, either version 3 of the License, or 17 | (at your option) any later version. 18 | . 19 | This package is distributed in the hope that it will be useful, 20 | but WITHOUT ANY WARRANTY; without even the implied warranty of 21 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 | GNU General Public License for more details. 23 | . 24 | You should have received a copy of the GNU General Public License 25 | along with this program. If not, see . 26 | . 27 | On Debian systems, the complete text of the GNU General 28 | Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". 29 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | LD_LIBRARY_PATH := $(DESTDIR)/tmp/lib 2 | PATH := $(DESTDIR)/tmp/bin:${PATH} 3 | CARGO_HOME := /build/cargo 4 | 5 | .EXPORT_ALL_VARIABLES: 6 | 7 | default: all 8 | 9 | all: clean build 10 | 11 | build: 12 | cargo build --release --verbose 13 | 14 | test: 15 | cargo test 16 | 17 | install: 18 | mkdir -p $(DESTDIR)/usr/bin 19 | install -m 0755 target/release/rrun $(DESTDIR)/usr/bin/rrun 20 | 21 | deb: 22 | gbp buildpackage --git-upstream-branch=master --git-debian-branch=master --git-ignore-new --git-pbuilder 23 | 24 | local-deb: 25 | debuild --preserve-env --prepend-path=/usr/local/bin -d binary 26 | 27 | release: 28 | gbp dch -a -c -R --full --debian-tag="v%(version)s" --git-author 29 | gbp buildpackage --git-upstream-branch=master --git-debian-branch=master --git-pbuilder --git-tag --git-debian-tag="v%(version)s" 30 | 31 | clean: 32 | rm -rf target 33 | 34 | snapshot: 35 | gbp dch -a -S --full --debian-tag="v%(version)s" --git-author 36 | gbp buildpackage --git-upstream-branch=master --git-debian-branch=master --git-ignore-new --git-pbuilder --git-debian-tag="v%(version)s" 37 | 38 | updatecowbuilder: 39 | sudo cowbuilder --update 40 | 41 | # How to install rust in pbuilder/cowbuilder: 42 | # sudo cowbuilder --login --save-after-login 43 | # apt-get update 44 | # apt-get dist-upgrade 45 | # apt-get install rustc cargo libgtk-3-dev git sudo curl debhelper ca-certificates sed tar bash 46 | # exit 47 | -------------------------------------------------------------------------------- /rrun.1: -------------------------------------------------------------------------------- 1 | .\" Hey, EMACS: -*- nroff -*- 2 | .\" (C) Copyright 2014 Sebastian Schulze , 3 | .\" 4 | .\" First parameter, NAME, should be all caps 5 | .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection 6 | .\" other parameters are allowed: see man(7), man(1) 7 | .TH RRUN SECTION "December 11, 2014" 8 | .\" Please adjust this date whenever revising the manpage. 9 | .\" 10 | .\" Some roff macros, for reference: 11 | .\" .nh disable hyphenation 12 | .\" .hy enable hyphenation 13 | .\" .ad l left justify 14 | .\" .ad b justify to both left and right margins 15 | .\" .nf disable filling 16 | .\" .fi enable filling 17 | .\" .br insert line break 18 | .\" .sp insert n+1 empty lines 19 | .\" for manpage-specific macros, see man(7) 20 | .SH NAME 21 | rrun \- program to do something 22 | .SH SYNOPSIS 23 | .B rrun 24 | .RI [ options ] " files" ... 25 | .br 26 | .B bar 27 | .RI [ options ] " files" ... 28 | .SH DESCRIPTION 29 | This manual page documents briefly the 30 | .B rrun 31 | and 32 | .B bar 33 | commands. 34 | .PP 35 | .\" TeX users may be more comfortable with the \fB\fP and 36 | .\" \fI\fP escape sequences to invode bold face and italics, 37 | .\" respectively. 38 | \fBrrun\fP is a program that... 39 | .SH OPTIONS 40 | These programs follow the usual GNU command line syntax, with long 41 | options starting with two dashes (`-'). 42 | A summary of options is included below. 43 | For a complete description, see the Info files. 44 | .TP 45 | .B \-h, \-\-help 46 | Show summary of options. 47 | .TP 48 | .B \-v, \-\-version 49 | Show version of program. 50 | .SH SEE ALSO 51 | .BR bar (1), 52 | .BR baz (1). 53 | .br 54 | The programs are documented fully by 55 | .IR "The Rise and Fall of a Fooish Bar" , 56 | available via the Info system. 57 | -------------------------------------------------------------------------------- /src/rrun.glade: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 250 7 | 1 8 | 10 9 | 10 | 11 | False 12 | False 13 | center 14 | False 15 | 16 | 17 | True 18 | False 19 | vertical 20 | 21 | 22 | -1 23 | True 24 | True 25 | True 26 | True 27 | True 28 | True 29 | True 30 | True 31 | edit-find-symbolic 32 | False 33 | False 34 | 35 | 36 | False 37 | True 38 | 0 39 | 40 | 41 | 42 | 43 | True 44 | True 45 | adjustment1 46 | never 47 | in 48 | 100 49 | 50 | 51 | True 52 | False 53 | False 54 | False 55 | False 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | False 64 | True 65 | 1 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | .. image:: https://travis-ci.org/buster/rrun.svg?branch=master 2 | :target: https://travis-ci.org/buster/rrun 3 | .. image:: https://img.shields.io/crates/v/rrun.svg 4 | :target: https://crates.io/crates/rrun 5 | .. image:: https://cdn.rawgit.com/syl20bnr/spacemacs/442d025779da2f62fc86c2082703697714db6514/assets/spacemacs-badge.svg 6 | :target: http://github.com/syl20bnr/spacemacs 7 | 8 | rrun 9 | ==== 10 | 11 | Note: Apart from the occasional fix, this project is not actively developed anymore. rrun works fine and should run/compile for the time being on rust stable. Alternatives to rrun are gmrun and rofi. 12 | Feel free to fork, request ownership or commit pull requests. 13 | 14 | rrun is a minimalistic command launcher in rust similar to gmrun. 15 | It started as a playground to learn Rust, but since i use it all day for months now, it's probably useful for others as well. 16 | It replaced gmrun and gnome-do on my laptop. 17 | rrun has few features, it can do bash completion and run commands and that's it. 18 | It will also append the commands being run to your bash history. 19 | 20 | .. image:: rrun.gif 21 | 22 | Dependencies 23 | """""""""""" 24 | 25 | GTK3.10+ 26 | 27 | Installation 28 | """""""""""" 29 | 30 | You have several options: 31 | 32 | #. download a Debian package from https://github.com/buster/rrun/releases 33 | #. install from crates.io with "cargo install rrun" 34 | #. compile yourself with "cargo build" 35 | 36 | Usage 37 | """"" 38 | 39 | - enter a command and press Return to execute it 40 | - press TAB for tab completion of available commands 41 | - Press Ctrl + Return to display the command output in the text field 42 | 43 | Set up rrun as command helper on Capslock 44 | """"""""""""""""""""""""""""""""""""""""" 45 | 46 | I have mapped the unused, needless CapsLock key to some other key and set up Gnome or whatever (i3wm in my case) to launch rrun on keypress. 47 | 48 | 49 | My ~/.Xmodmap:: 50 | 51 | remove Lock = Caps_Lock 52 | keysym Caps_Lock = XF86HomePage 53 | 54 | Don't forget to run "xmodmap ~/.Xmodmap" after login. 55 | 56 | The relevant parts of ~/.i3/config:: 57 | 58 | bindsym XF86HomePage exec rrun 59 | for_window [title="rrun"] floating enable 60 | exec --no-startup-id xmodmap ~/.Xmodmap 61 | 62 | How to build the package 63 | """""""""""""""""""""""" 64 | 65 | Creation of a cowbuilder image 66 | '''''''''''''''''''''''''''''' 67 | 68 | The build process needs pbuilder/cowbuilder installed in debian (apt-get install cowbuilder pbuilder). 69 | A Debian testing buid image can be created with:: 70 | 71 | sudo cowbuilder --create --distribution testing 72 | 73 | Eatmydata Installation 74 | '''''''''''''''''''''' 75 | 76 | Install eatmydata (on build machine and in the image) to speeding up dpkg (from https://wiki.debian.org/cowbuilder ): 77 | 78 | On the build machine:: 79 | 80 | apt-get install eatmydata 81 | 82 | In the build image:: 83 | 84 | sudo cowbuilder --login --save 85 | apt-get install eatmydata 86 | 87 | For eatmydata (>=82-2), add this /etc/pbuilderrc (on the build machine):: 88 | 89 | if [ -z "$LD_PRELOAD" ]; then 90 | LD_PRELOAD=libeatmydata.so 91 | else 92 | LD_PRELOAD="$LD_PRELOAD":libeatmydata.so 93 | fi 94 | 95 | export LD_PRELOAD 96 | 97 | Package Build Process 98 | ''''''''''''''''''''' 99 | 100 | The debian package can be built with the following commands: 101 | 102 | - `make deb` just creates the .deb file without touching the changelog 103 | - `make snapshot` creates a snapshot .deb without incrementing the version number (but updating the changelog) 104 | - `make release` creates a new release and bumps the minor version number 105 | 106 | 107 | Contributors 108 | """""""""""" 109 | 110 | @nightscape 111 | @tshepang 112 | -------------------------------------------------------------------------------- /src/engine.rs: -------------------------------------------------------------------------------- 1 | use autocomplete::AutoCompleter; 2 | use autocomplete::Completion; 3 | use runner::Runner; 4 | use externalrunner::ExternalRunner; 5 | use externalautocompleter::ExternalAutoCompleter; 6 | use std::collections::HashMap; 7 | use itertools::Itertools; 8 | use toml; 9 | 10 | pub trait Engine { 11 | fn get_completions(&self, query: &str) -> Box>; 12 | fn run_completion(&self, completion: &Completion, in_background: bool) -> Result; 13 | } 14 | 15 | pub struct DefaultEngine { 16 | pub completers: Vec>, 17 | pub runners: HashMap>>, 18 | } 19 | 20 | impl DefaultEngine { 21 | pub fn new(config: &toml::value::Table) -> DefaultEngine { 22 | DefaultEngine { 23 | completers: DefaultEngine::get_completers(config), 24 | runners: DefaultEngine::get_runners(config), 25 | } 26 | } 27 | pub fn get_completers(config: &toml::value::Table) -> Vec> { 28 | let maybe_completions = config.get("completion").expect("expect completions in config!").as_array().expect("array"); 29 | let mut completes: Vec> = Vec::new(); 30 | debug!("maybe_completions: {:?}", maybe_completions); 31 | for completion in maybe_completions { 32 | debug!("completion: {:?}", completion); 33 | let this_completer = ExternalAutoCompleter::new( 34 | completion.get("type").and_then(|c| c.as_str()).map(|c| c.to_string()).unwrap(), 35 | completion.get("command").and_then(|c| c.as_str()).map(|c| c.to_string()).unwrap_or("".to_string()), 36 | completion.get("trigger").and_then(|c| c.as_str()).map(|c| c.to_string()).unwrap_or("(.*)".to_string()) 37 | ); 38 | completes.push(this_completer); 39 | } 40 | completes 41 | } 42 | 43 | pub fn get_runners(config: &toml::value::Table) -> HashMap>> { 44 | let runner_configs = config.get("runner").expect("expected runner configs").as_array().expect("array"); 45 | let mut runners: Vec> = Vec::new(); 46 | 47 | for runner in runner_configs { 48 | println!("Runner: {:?}", runner); 49 | runners.push(ExternalRunner::new( 50 | runner.get("type").and_then(|c| c.as_str()).map(|c| c.to_string()).unwrap(), 51 | runner.get("command").and_then(|c| c.as_str()).map(|c| c.to_string()).unwrap() 52 | )); 53 | } 54 | let mut runners_by_type = HashMap::with_capacity(runners.len()); 55 | for (key, group) in runners.into_iter().group_by(|r| r.get_type()).into_iter() { 56 | runners_by_type.insert(key, group.into_iter().collect_vec()); 57 | } 58 | println!("Runners by Type: {:?}", runners_by_type); 59 | runners_by_type 60 | } 61 | } 62 | 63 | impl Engine for DefaultEngine { 64 | fn get_completions(&self, query: &str) -> Box> { 65 | let completions = self.completers 66 | .iter() 67 | .map(|completer| completer.complete(query).collect_vec().into_iter()) 68 | .fold1(|c1, c2| c1.chain(c2).collect_vec().into_iter()) 69 | .unwrap(); 70 | Box::new(completions) 71 | } 72 | 73 | fn run_completion(&self, completion: &Completion, in_background: bool) -> Result { 74 | let ref runner = match self.runners.get(&completion.tpe) { 75 | Some(values) if values.len() >= 1 => &values[0], 76 | Some(_) => return Err("Runner returned zero sized completions".to_owned()), 77 | None => return Err("Runner returned None".to_owned()), 78 | }; 79 | debug!("Running {:?} {:?} with {:?}", completion.tpe, completion, runner); 80 | runner.run(&completion.id, in_background) 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/externalautocompleter.rs: -------------------------------------------------------------------------------- 1 | use autocomplete::AutoCompleter; 2 | use autocomplete::Completion; 3 | use execution::execute; 4 | use regex::Regex; 5 | 6 | #[derive(Debug)] 7 | pub struct ExternalAutoCompleter { 8 | tpe: String, 9 | command: String, 10 | trigger: String, 11 | } 12 | 13 | 14 | impl ExternalAutoCompleter { 15 | pub fn new(tpe: String, command: String, trigger: String) -> Box { 16 | debug!("Instantianting ExternalAutoCompleter(tpe={}, command={}, trigger={})", tpe, command, trigger); 17 | Box::new(ExternalAutoCompleter { 18 | tpe: tpe, 19 | command: command, 20 | trigger: trigger, 21 | }) 22 | } 23 | } 24 | 25 | impl AutoCompleter for ExternalAutoCompleter { 26 | fn complete(&self, query: &str) -> Box> { 27 | let re = Regex::new(&self.trigger).unwrap(); 28 | let trigger_match = re.captures_iter(query).collect::>(); 29 | let is_applicable = trigger_match.len() > 0; 30 | debug!("Query {} applicable for {}: {}", query, self.trigger, is_applicable); 31 | let completion_vec = if is_applicable { 32 | // returns a new completion based on the passed string 33 | let query_string = query.to_string(); 34 | let matches = trigger_match[0].iter().map(|c| c.unwrap()).collect::>().into_iter(); 35 | let sub_query = if trigger_match[0].len() > 1 { 36 | trigger_match[0].get(1).unwrap().as_str() 37 | } else { 38 | "{}" 39 | }; 40 | let out; 41 | if self.command.len() > 0 { 42 | let expanded_command = matches.enumerate() 43 | .fold(self.command.replace("{}", sub_query), (|a, (i, e)| a.replace(&format!("{{{}}}", i), e.as_str()))); 44 | debug!("Expanded: {}", expanded_command); 45 | out = match execute(expanded_command, false) { 46 | Ok(x) => x, 47 | Err(x) => { 48 | debug!("Error executing query {}", x); 49 | "".to_owned() 50 | } 51 | } 52 | } else { 53 | out = query_string; 54 | }; 55 | out.lines() 56 | .map(|l| l.to_owned()) 57 | .map(|c| { 58 | let cells = c.split("\t").collect::>(); 59 | if cells.len() == 1 { 60 | let c = Completion { 61 | tpe: self.tpe.to_owned(), 62 | text: cells[0].to_string(), 63 | id: cells[0].to_string(), 64 | }; 65 | debug!("Generated completion with only text: {:?}", c); 66 | c 67 | } else if cells.len() == 2 { 68 | let c = Completion { 69 | tpe: self.tpe.to_owned(), 70 | text: cells[1].to_string(), 71 | id: cells[0].to_string(), 72 | }; 73 | debug!("Generated completion with text and id: {:?}", c); 74 | c 75 | } else { 76 | panic!("Unexpected completion format {:?}", cells) 77 | } 78 | }) 79 | .collect::>() 80 | } else { 81 | vec![] as Vec 82 | }; 83 | Box::new(completion_vec.into_iter()) 84 | } 85 | fn get_type(&self) -> String { 86 | self.tpe.to_owned() 87 | } 88 | } 89 | 90 | #[test] 91 | fn test_external_completion() { 92 | let completer = ExternalAutoCompleter::new("command".to_string(), 93 | "echo -e 'the {}\tyes, that {}'".to_string(), 94 | "(.*)".to_string()); 95 | let mut new_completion = completer.complete("foo"); 96 | assert_eq!(new_completion.next(), 97 | Some(Completion { 98 | tpe: "command".to_owned(), 99 | text: "yes, that foo".to_owned(), 100 | id: "the foo".to_owned(), 101 | })); 102 | assert!(new_completion.next() == None); 103 | // Test that we didn't break something with mutation 104 | let mut second_completion = completer.complete("bar"); 105 | assert_eq!(second_completion.next().map(|c| c.text), Some("yes, that bar".to_owned())); 106 | assert!(second_completion.next() == None); 107 | } 108 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #![crate_type = "bin"] 2 | #[macro_use] 3 | extern crate log; 4 | extern crate env_logger; 5 | extern crate gtk; 6 | extern crate gdk; 7 | extern crate glib; 8 | extern crate toml; 9 | extern crate itertools; 10 | extern crate regex; 11 | #[macro_use] 12 | extern crate clap; 13 | 14 | use gtk::prelude::*; 15 | use gtk::{TreePath, StyleContext, CellRendererText, Builder, CssProvider, SearchEntry, ListStore, TreeView, 16 | TreeViewColumn, Window, GtkWindowExt}; 17 | 18 | use std::rc::Rc; 19 | use std::io::prelude::*; 20 | use std::fs; 21 | use std::fs::File; 22 | use std::error::Error; 23 | use std::path::{Path, PathBuf}; 24 | use std::env; 25 | use itertools::Itertools; 26 | use std::cell::{Cell, RefCell}; 27 | use std::str::FromStr; 28 | use gdk::enums::key; 29 | use gdk::keyval_to_unicode; 30 | use autocomplete::Completion; 31 | use engine::DefaultEngine; 32 | use engine::Engine; 33 | 34 | #[macro_export] 35 | macro_rules! trys {($e: expr) => {match $e { 36 | Ok (ok) => ok, 37 | Err (err) => { 38 | return Err (format! ("{}:{}] {}", file!(), line!(), err)); 39 | } 40 | } 41 | } 42 | } 43 | mod engine; 44 | mod autocomplete; 45 | mod externalautocompleter; 46 | mod runner; 47 | mod externalrunner; 48 | mod execution; 49 | 50 | 51 | fn append_text_column(tree: &TreeView) { 52 | let column = TreeViewColumn::new(); 53 | let cell = CellRendererText::new(); 54 | 55 | column.pack_start(&cell, true); 56 | column.add_attribute(&cell, "text", 0); 57 | tree.append_column(&column); 58 | } 59 | fn get_config_dir() -> PathBuf { 60 | // Create a path to the desired file 61 | let config_directory = match env::home_dir() { 62 | Some(dir) => dir.join(Path::new(".config/rrun")), 63 | None => panic!("Unable to get $HOME"), 64 | }; 65 | if fs::create_dir_all(&config_directory).is_err() { 66 | panic!("Unable to create config directory {:?}", config_directory); 67 | }; 68 | config_directory 69 | } 70 | 71 | fn get_or_create(file_path: &Path, initial_content: &str) -> Result { 72 | match File::open(&file_path) { 73 | Err(why) => { 74 | info!("couldn't open {}: {}", file_path.display(), Error::description(&why)); 75 | println!("Initializing {:?} with default content. Edit it to your liking :D", file_path); 76 | let mut f = trys!(File::create(&file_path)); 77 | trys!(f.write_all(initial_content.as_bytes())); 78 | trys!(f.flush()); 79 | drop(f); 80 | Ok(trys!(File::open(&file_path))) 81 | } 82 | Ok(file) => Ok(file), 83 | } 84 | } 85 | 86 | fn read_config(config_file: &mut File) -> toml::value::Table { 87 | let mut toml = String::new(); 88 | match config_file.read_to_string(&mut toml) { 89 | Err(why) => panic!("couldn't read Configfile ~/.config/rrun/config.toml: {}", Error::description(&why)), 90 | Ok(_) => (), 91 | } 92 | 93 | let config = toml::from_str(&toml).unwrap_or_else(|x| panic!("Unable to parse config file TOML! {}", x)); 94 | debug!("config.toml contains the following configuration\n{:?}", config); 95 | config 96 | } 97 | 98 | fn create_builder_from_file(mut file: &File) -> Builder { 99 | let mut content = String::new(); 100 | match file.read_to_string(&mut content) { 101 | Err(why) => panic!("couldn't read file {:?}: {}", file, Error::description(&why)), 102 | Ok(_) => (), 103 | } 104 | Builder::new_from_string(&content) 105 | } 106 | 107 | #[allow(dead_code)] 108 | fn main() { 109 | const VERSION: Option<&'static str> = option_env!("CARGO_PKG_VERSION"); 110 | let matches = clap_app!(rrun => 111 | (version: VERSION.unwrap_or("unknown")) 112 | (about: "Extensible Quick-Launcher") 113 | (@subcommand completions => 114 | (about: "List completions matching the given query") 115 | (@arg type: "The type of the completion in config.toml (e.g. url, command, ...)") 116 | (@arg query: "The query for which to list completions") 117 | ) 118 | ) 119 | .get_matches(); 120 | 121 | let config_directory = get_config_dir(); 122 | let config_path = config_directory.join(Path::new("config.toml")); 123 | let mut file = get_or_create(&config_path, include_str!("config.toml")) 124 | .unwrap_or_else(|x| panic!("Unable to read configuration! {}", x)); 125 | let config = read_config(&mut file); 126 | let engine = DefaultEngine::new(&config); 127 | 128 | if let Some(ref matches) = matches.subcommand_matches("completions") { 129 | if let (Some(tpe), Some(query)) = (matches.value_of("type"), matches.value_of("query")) { 130 | let completions = engine.get_completions(&query).filter(|c| c.tpe == tpe); 131 | let completion_tsv = completions.map(|c| format!("{}\t{}", c.id, c.text)).join("\n"); 132 | println!("{}", completion_tsv); 133 | } else { 134 | panic!("If you call completions, you need to provide type and query\nIf unsure, run 'rrun completions \ 135 | --help'") 136 | } 137 | } else { 138 | run_ui(&config_directory, engine); 139 | } 140 | } 141 | 142 | fn run_ui(config_directory: &Path, engine: DefaultEngine) { 143 | gtk::init().unwrap_or_else(|_| panic!("Failed to initialize GTK.")); 144 | debug!("Major: {}, Minor: {}", gtk::get_major_version(), gtk::get_minor_version()); 145 | let ui_path = config_directory.join(Path::new("rrun.glade")); 146 | let ui_file = get_or_create(&ui_path, include_str!("rrun.glade")) 147 | .unwrap_or_else(|x| panic!("Unable to read configuration! {}", x)); 148 | let builder = create_builder_from_file(&ui_file); 149 | let window: Window = builder.get_object("rrun").unwrap(); 150 | let css_path = config_directory.join(Path::new("style.css")); 151 | let css_provider = CssProvider::new(); 152 | if css_provider.load_from_path(css_path.to_str().unwrap()).is_err() { 153 | debug!("unable to load CSS!"); 154 | }; 155 | let screen = window.get_screen().unwrap(); 156 | StyleContext::add_provider_for_screen(&screen, &css_provider, 1); 157 | let completion_list: TreeView = builder.get_object("completion_view").unwrap(); 158 | let entry: SearchEntry = builder.get_object("search_entry").unwrap(); 159 | window.connect_delete_event(|_, _| { 160 | gtk::main_quit(); 161 | Inhibit(false) 162 | }); 163 | window.set_border_width(0); 164 | window.set_decorated(false); 165 | window.show_all(); 166 | let column_types = [glib::Type::String]; 167 | let completion_store = ListStore::new(&column_types); 168 | 169 | completion_list.set_model(Some(&completion_store)); 170 | completion_list.set_headers_visible(false); 171 | 172 | append_text_column(&completion_list); 173 | 174 | let last_pressed_key: Rc> = Rc::new(Cell::new(0)); 175 | let current_completion_index: Rc> = Rc::new(Cell::new(0)); 176 | 177 | env_logger::init(); 178 | 179 | let current_completions: Rc>> = Rc::new(RefCell::new(vec![])); 180 | let selected_completion: Rc>> = Rc::new(RefCell::new(None)); 181 | let current_and_selected_completions = (current_completions.clone(), selected_completion.clone()); 182 | completion_list.get_selection().connect_changed(move |tree_selection| { 183 | if let Some((completion_model, iter)) = tree_selection.get_selected() { 184 | if let Some(path) = completion_model.get_path(&iter) { 185 | let selected_number = usize::from_str(path.to_string().trim()).unwrap(); 186 | let (ref current_completions, ref selected_completion) = current_and_selected_completions; 187 | *selected_completion.borrow_mut() = Some(current_completions.borrow()[selected_number].clone()); 188 | } 189 | } 190 | }); 191 | 192 | window.connect_key_release_event(move |_, key| { 193 | let keyval = key.get_keyval(); 194 | let keystate = key.get_state(); 195 | // let keystate = (*key).state; 196 | debug!("key pressed: {}", keyval); 197 | match keyval { 198 | key::Escape => gtk::main_quit(), 199 | key::Return => { 200 | debug!("keystate: {:?}", keystate); 201 | debug!("Controlmask == {:?}", gdk::ModifierType::CONTROL_MASK); 202 | let ref compls_vec = *current_completions; 203 | let compls = compls_vec.borrow(); 204 | 205 | let the_completion = if let Some(completion) = selected_completion.borrow().clone() { 206 | completion 207 | } else if compls.len() > 0 { 208 | compls[0].clone() 209 | } else { 210 | let query = entry.get_text().unwrap_or_else(|| panic!("Unable to get string from Entry widget!")); 211 | engine.get_completions(&query).next().unwrap().to_owned() 212 | }; 213 | 214 | if keystate.intersects(gdk::ModifierType::CONTROL_MASK) { 215 | let output = engine.run_completion(&the_completion, false) 216 | .unwrap_or_else(|x| panic!("Error while executing the command {:?}", x)); 217 | debug!("ctrl pressed!"); 218 | if output.len() > 0 { 219 | entry.set_text(output.trim()); 220 | entry.set_position(-1); 221 | } 222 | } else { 223 | let _ = engine.run_completion(&the_completion, true) 224 | .unwrap_or_else(|x| panic!("Error while executing {:?} in the background!", x)); 225 | gtk::main_quit(); 226 | } 227 | 228 | } 229 | key::Tab => { 230 | if last_pressed_key.get() == key::Tab { 231 | current_completion_index.set(current_completion_index.get() + 1); 232 | if let Some(ref c) = current_completions.borrow().get(current_completion_index.get() as usize) { 233 | entry.set_text(&c.id); 234 | } 235 | } else { 236 | // if last pressed key wasn't tab, we fill the entry with the most likely completion 237 | if let Some(ref c) = current_completions.borrow().get(0) { 238 | entry.set_text(&c.id); 239 | current_completion_index.set(0); 240 | } 241 | } 242 | } 243 | _ => { 244 | let is_text_modifying = keyval_to_unicode(key.get_keyval()).is_some() || keyval == key::BackSpace || 245 | keyval == key::Delete; 246 | if is_text_modifying { 247 | let query = 248 | entry.get_text().unwrap_or_else(|| panic!("Unable to get string from Entry widget!")).clone(); 249 | let completions = engine.get_completions(query.trim()).collect_vec(); 250 | completion_store.clear(); 251 | // debug!("Found {:?} completions", completions.len()); 252 | for (i, cmpl) in completions.iter().enumerate().take(20) { 253 | let iter = completion_store.append(); 254 | completion_store.set(&iter, &[0], &[&format!("{}. {}", i + 1, cmpl.text).trim()]); 255 | } 256 | *current_completions.borrow_mut() = completions; 257 | let tree_selection = completion_list.get_selection(); 258 | let select_path = TreePath::new_first(); 259 | tree_selection.select_path(&select_path); 260 | } 261 | } 262 | } 263 | last_pressed_key.set(key.get_keyval()); 264 | Inhibit(false) 265 | }); 266 | 267 | gtk::main(); 268 | } 269 | -------------------------------------------------------------------------------- /debian/changelog: -------------------------------------------------------------------------------- 1 | rrun (0.2.3) unstable; urgency=medium 2 | 3 | [ buster ] 4 | * Add deprecation hint to readme 5 | * Update readme 6 | * update crate version 7 | * update cargo dependencies 8 | * update cargo dependencies 9 | 10 | -- Sebastian Schulze Sun, 18 Feb 2018 21:34:34 +0100 11 | 12 | rrun (0.2.2) unstable; urgency=medium 13 | 14 | * update dependencies 15 | * updates gtk deps 16 | * updates clap 17 | * updates env_logger 18 | * updates regex 19 | * update toml 20 | * updates clap 21 | * fix regex update 22 | * update changelog 23 | 24 | -- Sebastian Schulze Tue, 06 Feb 2018 11:22:55 +0100 25 | 26 | rrun (0.2.1) unstable; urgency=medium 27 | 28 | [ Sebastian Schulze ] 29 | * Update dependencies 30 | * update Makefile 31 | * update changelog 32 | * define CARGO_HOME so that the build (hopefully) succeeds in cowbuilder 33 | * Update changelog for 0.2.0 release 34 | 35 | -- Sebastian Schulze Sat, 25 Jun 2016 21:52:12 +0200 36 | 37 | rrun (0.2.0) unstable; urgency=medium 38 | 39 | [ Sebastian Schulze ] 40 | * describe package build process 41 | * updated Cargo.toml 42 | * Update README.rst 43 | * update installation instructions 44 | * reformatting source 45 | * add some error messages 46 | * remove unnecessary variable 47 | * refactoring to use more Results 48 | * refactoring to remove unused variables 49 | the match has been unecessary 50 | * additional error messages 51 | 52 | [ Martin Mauch ] 53 | * Use containerized Travis build. 54 | Let's see if we get newer GTK packages there 55 | * Replace hard-coded UI by Glade designed XML 56 | * Use non-containerized Trusty in Travis build. 57 | This reverts commit aa9d7ce7ddd5f30076bf959b092ded9bc360acb7. 58 | * Another shot at a containerized Travis build 59 | using pre-compiled GTK binaries like they do in gtk-rs. 60 | This reverts commit 608858bc523d357e5e08d14199bccaddff4b022f. 61 | 62 | [ Sebastian Schulze ] 63 | * lower dependencey to GTK 3.14 (tracking Debian stable) 64 | 65 | [ Martin Mauch ] 66 | * Completions can be selected from a list 67 | * Remove feature for using Entry instead of SearchEntry 68 | 69 | [ Sebastian Schulze ] 70 | * ignore errors in completion commands 71 | 72 | [ Martin Mauch ] 73 | * Factor out creation and reading of config directory 74 | * Apply CSS styling if it exists 75 | under ~/.config/rrun/style.css 76 | * Create and use external Glade UI file 77 | under ~/.config/rrun/rrun.glade 78 | * Listen for key releases to handle backspace properly 79 | 80 | [ Sebastian Schulze ] 81 | * complete entry field on tab 82 | 83 | [ Martin Mauch ] 84 | * Pressing TAB stays in input box and cycles through completions in list 85 | * Completion list only appears when there are completions 86 | 87 | [ Sebastian Schulze ] 88 | * complete on key press instead of key release 89 | makes pressing TAB much more convenient.. 90 | * show only 5 completions at once 91 | showing a mostly empty list of 20 entries fills up my screen 92 | unnecessarily, i think 5 is much nicer.. 93 | * wrap the completion list in a scrollable list 94 | * revert change to key press event. 95 | When we trigger on key_release, the edit box is not yet updated and the 96 | completion will read the text from the previous completion -> so the 97 | completion list always lacks behind one character 98 | * revert key_release event 99 | when triggering on key_release, the edit box is not yet filled with the 100 | new character and the completion will be the last one. 101 | Need to find a better solution here 102 | * update Cargo.lock 103 | 104 | [ Martin Mauch ] 105 | * Revert order of completions, first id then text. 106 | We always need an id, so it should be the first argument. 107 | The following arguments then are optional and can later be used to include e.g. icons or longer descriptions 108 | 109 | [ Sebastian Schulze ] 110 | * Revert "revert key_release event" 111 | This reverts commit 38bca006482238912fe83eaf4f8ef31dff5439ab. 112 | 113 | [ Martin Mauch ] 114 | * Query and print completions to stdout 115 | * Allow multiple match groups in regexes 116 | * Add cache command completion 117 | 118 | [ Sebastian Schulze ] 119 | * bump Version to 0.2.0, prepare new release 120 | * UNRELEASED 121 | * update Makefile 122 | 123 | [ Martin Mauch ] 124 | * Bump to 0.2.0 125 | 126 | [ Sebastian Schulze ] 127 | * update Makefile 128 | * update changelog 129 | * define CARGO_HOME so that the build (hopefully) succeeds in cowbuilder 130 | 131 | -- Sebastian Schulze Tue, 02 Feb 2016 22:37:10 +0100 132 | 133 | rrun (0.1.0) unstable; urgency=medium 134 | 135 | [ Tshepang Lekhonkhobe ] 136 | * README: typo 137 | 138 | [ Sebastian Schulze ] 139 | * begin work on ac_manager 140 | * update for new rust versions and dependencies. 141 | Let's see what travis says nowadays to gtk 3.16 142 | * revert to old travis setup 143 | 144 | [ Martin Mauch ] 145 | * Update dependencies to make build work 146 | * Replace class mutation with Iterator 147 | 148 | [ Sebastian Schulze ] 149 | * add test for 'wh' which should find something starting with 'wh' 150 | * remove unused variable 151 | * fix bashgen usage 152 | bashgen returns the best match on the last line, so the vector needs to 153 | be reversed 154 | * reformatting sourcecode with rustfmt 155 | and adding rustfmt.toml 156 | 157 | [ Martin Mauch ] 158 | * Only call completion when TAB is pressed 159 | 160 | [ Sebastian Schulze ] 161 | * remove unused dependencies 162 | * fix some clippy complaints 163 | 164 | [ Martin Mauch ] 165 | * Completions can be configured via .toml file 166 | located in ~/.config/rrun/config.toml 167 | 168 | [ Sebastian Schulze ] 169 | * panic when not able to create config directory 170 | * don't panic on initial start 171 | * move GTK 172 | * silence debug output and give feedback about config file 173 | * read config file in get_config_file() 174 | * move creation of completers to function 175 | * panic when $HOME is not found 176 | * created contributors section 177 | * Update README.rst 178 | 179 | [ Martin Mauch ] 180 | * Runners can be configured via .toml file 181 | located in ~/.config/rrun/config.toml 182 | * Issuing a command without hitting TAB performs completion 183 | * Completion can specify a trigger that determines its applicability 184 | * Move running of completions into a closure and run by id 185 | * External completers can specify an id after a TAB 186 | * More debug info 187 | * Fix running of completions to use currently selected completion 188 | * Move completion and running logic into new Engine trait 189 | * Add completion and runner for numeric expressions to config 190 | * fixup! Completions can be configured via .toml file 191 | * Add completion for Google search and Chrome runner 192 | * Sort and uniq bash completions 193 | 194 | [ Sebastian Schulze ] 195 | * removed "echo" completion 196 | if this is configured, completion only works on the second TAB as expected 197 | * I actually have chromium, and not google-chrome 198 | plus i am using dwb (which is x-www-browser) and others might use 199 | firefox.. 200 | I think on linux "x-www-browser" is the standard way to do this 201 | * replaced ruby with python for general purpose scripts 202 | i think all major distributions come with python in the base 203 | installation, but not ruby. Users might not have ruby, 204 | so it looks like using python (or even perl, ugh..) would be better 205 | * add error message 206 | * output completion in debug 207 | * update Cargo.lock 208 | * debug output if cmd runs in background 209 | * run commands in background unless CTRL is pressed 210 | * fix url completion for google search 211 | * Update changelog for 0.0.7 release 212 | 213 | -- Sebastian Schulze Sat, 09 Jan 2016 11:14:04 +0100 214 | 215 | rrun (0.0.7) unstable; urgency=medium 216 | 217 | [ Sebastian Schulze ] 218 | ** SNAPSHOT build @9376e818708971859ed6f0e50566cfcf8223aeda ** 219 | 220 | * UNRELEASED 221 | * Use GTK SearchEntry per default, but disable on Travis (which has an outdated GTK version) 222 | * remove unused rustup.sh from Makefile 223 | * remove space in Makefile 224 | * Update README.rst 225 | * Update README.rst 226 | 227 | [ Tshepang Lekhonkhobe ] 228 | * README: typo 229 | 230 | [ Sebastian Schulze ] 231 | * begin work on ac_manager 232 | * update for new rust versions and dependencies. 233 | Let's see what travis says nowadays to gtk 3.16 234 | * test sudo stuff removal on travis 235 | * revert to non container travis 236 | * test new travis containers 237 | * try libgtk... 238 | * add deps 239 | * new deps 240 | * use debian unstable? 241 | * typo in dep 242 | * add deps 243 | * and another try 244 | * hi there 245 | * yep. 246 | * masdsadwqe 247 | * asödjk 248 | * sadöljasödljk 249 | * asd 250 | * revert to old travis setup 251 | * try#2 252 | 253 | [ Martin Mauch ] 254 | * Update dependencies to make build work 255 | * Replace class mutation with Iterator 256 | 257 | [ Sebastian Schulze ] 258 | * add test for 'wh' which should find something starting with 'wh' 259 | * remove unused variable 260 | * fix bashgen usage 261 | bashgen returns the best match on the last line, so the vector needs to 262 | be reversed 263 | * reformatting sourcecode with rustfmt 264 | and adding rustfmt.toml 265 | 266 | [ Martin Mauch ] 267 | * Only call completion when TAB is pressed 268 | 269 | [ Sebastian Schulze ] 270 | * remove unused dependencies 271 | * fix some clippy complaints 272 | 273 | [ Martin Mauch ] 274 | * Completions can be configured via .toml file 275 | located in ~/.config/rrun/config.toml 276 | 277 | [ Sebastian Schulze ] 278 | * panic when not able to create config directory 279 | * don't panic on initial start 280 | * move GTK 281 | * silence debug output and give feedback about config file 282 | * read config file in get_config_file() 283 | * move creation of completers to function 284 | * panic when $HOME is not found 285 | * created contributors section 286 | * Update README.rst 287 | 288 | [ Martin Mauch ] 289 | * Runners can be configured via .toml file 290 | located in ~/.config/rrun/config.toml 291 | * Issuing a command without hitting TAB performs completion 292 | * Completion can specify a trigger that determines its applicability 293 | * Move running of completions into a closure and run by id 294 | * External completers can specify an id after a TAB 295 | * More debug info 296 | * Fix running of completions to use currently selected completion 297 | * Move completion and running logic into new Engine trait 298 | * Add completion and runner for numeric expressions to config 299 | * fixup! Completions can be configured via .toml file 300 | * Add completion for Google search and Chrome runner 301 | * Sort and uniq bash completions 302 | 303 | [ Sebastian Schulze ] 304 | * removed "echo" completion 305 | if this is configured, completion only works on the second TAB as expected 306 | * I actually have chromium, and not google-chrome 307 | plus i am using dwb (which is x-www-browser) and others might use 308 | firefox.. 309 | I think on linux "x-www-browser" is the standard way to do this 310 | * replaced ruby with python for general purpose scripts 311 | i think all major distributions come with python in the base 312 | installation, but not ruby. Users might not have ruby, 313 | so it looks like using python (or even perl, ugh..) would be better 314 | * add error message 315 | * output completion in debug 316 | * update Cargo.lock 317 | * debug output if cmd runs in background 318 | * run commands in background unless CTRL is pressed 319 | * fix url completion for google search 320 | 321 | -- Sebastian Schulze Sat, 09 Jan 2016 11:13:14 +0100 322 | 323 | rrun (0.0.6) unstable; urgency=medium 324 | 325 | * update description and gif 326 | * update for rust-gnome, rust beta and make compatible with GTK <3.10 327 | * remove test for history completer 328 | * remove history completion for now 329 | * silence test warning of unused code 330 | * prepare for 0.0.6 331 | * disable sudo for rust install 332 | * remove rust installation from Makefile 333 | just takes too long to build a .deb. 334 | Rust needs to be installed in the build chroot 335 | 336 | -- Sebastian Schulze Fri, 08 May 2015 17:26:11 +0200 337 | 338 | rrun (0.0.5) unstable; urgency=medium 339 | 340 | * add buildpackage commands to Makefile 341 | * change tag version format 342 | * Update README.rst 343 | * UNRELEASED 344 | * repair travis image 345 | which is still red anyway.. 346 | * add debian package files 347 | * update to latest rust 348 | * add build dependency versions 349 | * updater copyright 350 | * remove examples 351 | * add build dependency versions 352 | * updater copyright 353 | * remove examples 354 | * update changelog 355 | 356 | -- Sebastian Schulze Fri, 27 Mar 2015 09:58:20 +0100 357 | 358 | rrun (0.0.4) unstable; urgency=medium 359 | 360 | * tag v0.0.3 append commands to bash history add cargo.lock 361 | * Added blank Debian package template 362 | * first Makefile and debian package files 363 | * point to usr/local for cargo 364 | * verbose build with cargo 365 | * install rust/cargo in /usr 366 | * remove path from cargo call 367 | * sudo rust install 368 | * add sudo to build-depends 369 | * fix Makefile to use DESTDIR 370 | * try with new cargo install in git-buildpackage 371 | * update for latest rust 372 | * update to latest rust 373 | * catch errors on appending to history 374 | * get rid of all warnings 375 | * try with new cargo install in git-buildpackage 376 | * update for latest rust 377 | * update to latest rust 378 | * catch errors on appending to history 379 | * get rid of all warnings 380 | * add bash to build dependency 381 | * remove cargo dependency from Makefile clean step 382 | * Remove clean step from makefile 383 | * use bash 384 | * fix bin dir 385 | * destdir added 386 | * Update to latest rust 387 | * update cargo lock 388 | * Append history with "bash -c" instead of manual writing into bash history 389 | * prevent warning of unused main() in tests 390 | * Make fixes for .deb builds 391 | 392 | -- Sebastian Schulze Thu, 12 Mar 2015 15:40:25 +0100 393 | 394 | rrun (0.0.3) unstable; urgency=low 395 | 396 | * Initial Release. 397 | 398 | -- Sebastian Schulze Thu, 11 Dec 2014 13:54:06 +0100 399 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | {description} 294 | Copyright (C) {year} {fullname} 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | {signature of Ty Coon}, 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | 341 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "aho-corasick" 3 | version = "0.6.4" 4 | source = "registry+https://github.com/rust-lang/crates.io-index" 5 | dependencies = [ 6 | "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 7 | ] 8 | 9 | [[package]] 10 | name = "ansi_term" 11 | version = "0.10.2" 12 | source = "registry+https://github.com/rust-lang/crates.io-index" 13 | 14 | [[package]] 15 | name = "atk-sys" 16 | version = "0.5.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | dependencies = [ 19 | "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 20 | "glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 21 | "gobject-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 22 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 23 | "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 24 | ] 25 | 26 | [[package]] 27 | name = "atty" 28 | version = "0.2.6" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | dependencies = [ 31 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 32 | "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 33 | "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 34 | ] 35 | 36 | [[package]] 37 | name = "bitflags" 38 | version = "1.0.1" 39 | source = "registry+https://github.com/rust-lang/crates.io-index" 40 | 41 | [[package]] 42 | name = "c_vec" 43 | version = "1.2.1" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | 46 | [[package]] 47 | name = "cairo-rs" 48 | version = "0.3.0" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | dependencies = [ 51 | "c_vec 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 52 | "cairo-sys-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 53 | "glib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 54 | "glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 55 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 56 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 57 | ] 58 | 59 | [[package]] 60 | name = "cairo-sys-rs" 61 | version = "0.5.0" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | dependencies = [ 64 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 65 | "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 66 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 67 | ] 68 | 69 | [[package]] 70 | name = "cfg-if" 71 | version = "0.1.2" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | 74 | [[package]] 75 | name = "chrono" 76 | version = "0.4.0" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | dependencies = [ 79 | "num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 80 | "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", 81 | ] 82 | 83 | [[package]] 84 | name = "clap" 85 | version = "2.30.0" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | dependencies = [ 88 | "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", 89 | "atty 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 90 | "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 91 | "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 92 | "textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 93 | "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 94 | "vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 95 | ] 96 | 97 | [[package]] 98 | name = "either" 99 | version = "1.4.0" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | 102 | [[package]] 103 | name = "env_logger" 104 | version = "0.5.3" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | dependencies = [ 107 | "atty 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 108 | "chrono 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 109 | "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 110 | "regex 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 111 | "termcolor 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 112 | ] 113 | 114 | [[package]] 115 | name = "gdk" 116 | version = "0.7.0" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | dependencies = [ 119 | "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 120 | "cairo-rs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 121 | "cairo-sys-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 122 | "gdk-pixbuf 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 123 | "gdk-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 124 | "gio 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 125 | "glib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 126 | "glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 127 | "gobject-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 128 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 129 | "pango 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 130 | ] 131 | 132 | [[package]] 133 | name = "gdk-pixbuf" 134 | version = "0.3.0" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | dependencies = [ 137 | "gdk-pixbuf-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 138 | "glib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 139 | "glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 140 | "gobject-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 141 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 142 | ] 143 | 144 | [[package]] 145 | name = "gdk-pixbuf-sys" 146 | version = "0.5.0" 147 | source = "registry+https://github.com/rust-lang/crates.io-index" 148 | dependencies = [ 149 | "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 150 | "gio-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 151 | "glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 152 | "gobject-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 153 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 154 | "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 155 | ] 156 | 157 | [[package]] 158 | name = "gdk-sys" 159 | version = "0.5.0" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | dependencies = [ 162 | "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 163 | "cairo-sys-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 164 | "gdk-pixbuf-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 165 | "gio-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 166 | "glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 167 | "gobject-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 168 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 169 | "pango-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 170 | "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 171 | ] 172 | 173 | [[package]] 174 | name = "gio" 175 | version = "0.3.0" 176 | source = "registry+https://github.com/rust-lang/crates.io-index" 177 | dependencies = [ 178 | "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 179 | "gio-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 180 | "glib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 181 | "glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 182 | "gobject-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 183 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 184 | ] 185 | 186 | [[package]] 187 | name = "gio-sys" 188 | version = "0.5.0" 189 | source = "registry+https://github.com/rust-lang/crates.io-index" 190 | dependencies = [ 191 | "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 192 | "glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 193 | "gobject-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 194 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 195 | "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 196 | ] 197 | 198 | [[package]] 199 | name = "glib" 200 | version = "0.4.1" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | dependencies = [ 203 | "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 204 | "glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 205 | "gobject-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 206 | "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 207 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 208 | ] 209 | 210 | [[package]] 211 | name = "glib-sys" 212 | version = "0.5.0" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | dependencies = [ 215 | "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 216 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 217 | "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 218 | ] 219 | 220 | [[package]] 221 | name = "gobject-sys" 222 | version = "0.5.0" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | dependencies = [ 225 | "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 226 | "glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 227 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 228 | "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 229 | ] 230 | 231 | [[package]] 232 | name = "gtk" 233 | version = "0.3.0" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | dependencies = [ 236 | "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 237 | "cairo-rs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 238 | "cairo-sys-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 239 | "gdk 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 240 | "gdk-pixbuf 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 241 | "gdk-pixbuf-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 242 | "gdk-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 243 | "gio 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 244 | "gio-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 245 | "glib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 246 | "glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 247 | "gobject-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 248 | "gtk-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 249 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 250 | "pango 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 251 | ] 252 | 253 | [[package]] 254 | name = "gtk-sys" 255 | version = "0.5.0" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | dependencies = [ 258 | "atk-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 259 | "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 260 | "cairo-sys-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 261 | "gdk-pixbuf-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 262 | "gdk-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 263 | "gio-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 264 | "glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 265 | "gobject-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 266 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 267 | "pango-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 268 | "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 269 | ] 270 | 271 | [[package]] 272 | name = "itertools" 273 | version = "0.7.6" 274 | source = "registry+https://github.com/rust-lang/crates.io-index" 275 | dependencies = [ 276 | "either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 277 | ] 278 | 279 | [[package]] 280 | name = "lazy_static" 281 | version = "1.0.0" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | 284 | [[package]] 285 | name = "libc" 286 | version = "0.2.36" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | 289 | [[package]] 290 | name = "log" 291 | version = "0.4.1" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | dependencies = [ 294 | "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 295 | ] 296 | 297 | [[package]] 298 | name = "memchr" 299 | version = "2.0.1" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | dependencies = [ 302 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 303 | ] 304 | 305 | [[package]] 306 | name = "num" 307 | version = "0.1.42" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | dependencies = [ 310 | "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", 311 | "num-iter 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", 312 | "num-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 313 | ] 314 | 315 | [[package]] 316 | name = "num-integer" 317 | version = "0.1.36" 318 | source = "registry+https://github.com/rust-lang/crates.io-index" 319 | dependencies = [ 320 | "num-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 321 | ] 322 | 323 | [[package]] 324 | name = "num-iter" 325 | version = "0.1.35" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | dependencies = [ 328 | "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", 329 | "num-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 330 | ] 331 | 332 | [[package]] 333 | name = "num-traits" 334 | version = "0.2.0" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | 337 | [[package]] 338 | name = "pango" 339 | version = "0.3.0" 340 | source = "registry+https://github.com/rust-lang/crates.io-index" 341 | dependencies = [ 342 | "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 343 | "glib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 344 | "glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 345 | "gobject-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 346 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 347 | "pango-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 348 | ] 349 | 350 | [[package]] 351 | name = "pango-sys" 352 | version = "0.5.0" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | dependencies = [ 355 | "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 356 | "glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 357 | "gobject-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 358 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 359 | "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 360 | ] 361 | 362 | [[package]] 363 | name = "pkg-config" 364 | version = "0.3.9" 365 | source = "registry+https://github.com/rust-lang/crates.io-index" 366 | 367 | [[package]] 368 | name = "redox_syscall" 369 | version = "0.1.37" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | 372 | [[package]] 373 | name = "redox_termios" 374 | version = "0.1.1" 375 | source = "registry+https://github.com/rust-lang/crates.io-index" 376 | dependencies = [ 377 | "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", 378 | ] 379 | 380 | [[package]] 381 | name = "regex" 382 | version = "0.2.6" 383 | source = "registry+https://github.com/rust-lang/crates.io-index" 384 | dependencies = [ 385 | "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", 386 | "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 387 | "regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 388 | "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", 389 | "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 390 | ] 391 | 392 | [[package]] 393 | name = "regex-syntax" 394 | version = "0.4.2" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | 397 | [[package]] 398 | name = "rrun" 399 | version = "0.2.3" 400 | dependencies = [ 401 | "clap 2.30.0 (registry+https://github.com/rust-lang/crates.io-index)", 402 | "env_logger 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 403 | "gdk 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 404 | "glib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 405 | "gtk 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 406 | "itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", 407 | "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 408 | "regex 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 409 | "toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 410 | ] 411 | 412 | [[package]] 413 | name = "serde" 414 | version = "1.0.27" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | 417 | [[package]] 418 | name = "strsim" 419 | version = "0.7.0" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | 422 | [[package]] 423 | name = "termcolor" 424 | version = "0.3.4" 425 | source = "registry+https://github.com/rust-lang/crates.io-index" 426 | dependencies = [ 427 | "wincolor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 428 | ] 429 | 430 | [[package]] 431 | name = "termion" 432 | version = "1.5.1" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | dependencies = [ 435 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 436 | "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", 437 | "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 438 | ] 439 | 440 | [[package]] 441 | name = "textwrap" 442 | version = "0.9.0" 443 | source = "registry+https://github.com/rust-lang/crates.io-index" 444 | dependencies = [ 445 | "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 446 | ] 447 | 448 | [[package]] 449 | name = "thread_local" 450 | version = "0.3.5" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | dependencies = [ 453 | "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 454 | "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 455 | ] 456 | 457 | [[package]] 458 | name = "time" 459 | version = "0.1.39" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | dependencies = [ 462 | "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 463 | "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", 464 | "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 465 | ] 466 | 467 | [[package]] 468 | name = "toml" 469 | version = "0.4.5" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | dependencies = [ 472 | "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", 473 | ] 474 | 475 | [[package]] 476 | name = "unicode-width" 477 | version = "0.1.4" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | 480 | [[package]] 481 | name = "unreachable" 482 | version = "1.0.0" 483 | source = "registry+https://github.com/rust-lang/crates.io-index" 484 | dependencies = [ 485 | "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 486 | ] 487 | 488 | [[package]] 489 | name = "utf8-ranges" 490 | version = "1.0.0" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | 493 | [[package]] 494 | name = "vec_map" 495 | version = "0.8.0" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | 498 | [[package]] 499 | name = "void" 500 | version = "1.0.2" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | 503 | [[package]] 504 | name = "winapi" 505 | version = "0.2.8" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | 508 | [[package]] 509 | name = "winapi" 510 | version = "0.3.4" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | dependencies = [ 513 | "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 514 | "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 515 | ] 516 | 517 | [[package]] 518 | name = "winapi-i686-pc-windows-gnu" 519 | version = "0.4.0" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | 522 | [[package]] 523 | name = "winapi-x86_64-pc-windows-gnu" 524 | version = "0.4.0" 525 | source = "registry+https://github.com/rust-lang/crates.io-index" 526 | 527 | [[package]] 528 | name = "wincolor" 529 | version = "0.1.6" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | dependencies = [ 532 | "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 533 | ] 534 | 535 | [metadata] 536 | "checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" 537 | "checksum ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6b3568b48b7cefa6b8ce125f9bb4989e52fbcc29ebea88df04cc7c5f12f70455" 538 | "checksum atk-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "33a67fd81e1922dddc335887516f2f5254534e89c9d39fa89bca5d79bd150d34" 539 | "checksum atty 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8352656fd42c30a0c3c89d26dea01e3b77c0ab2af18230835c15e2e13cd51859" 540 | "checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" 541 | "checksum c_vec 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6237ac5a4b1e81c213c24c6437964c61e646df910a914b4ab1487b46df20bd13" 542 | "checksum cairo-rs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6b5695f59fd036fe5741bc5a4eb20c78fbe42256e3b08a2af26bbcbe8070bf3" 543 | "checksum cairo-sys-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c6e18fecaeac51809db57f45f4553cc0975225a7eb435a7a7e91e5e8113a84d" 544 | "checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" 545 | "checksum chrono 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c20ebe0b2b08b0aeddba49c609fe7957ba2e33449882cb186a180bc60682fa9" 546 | "checksum clap 2.30.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1c07b9257a00f3fc93b7f3c417fc15607ec7a56823bc2c37ec744e266387de5b" 547 | "checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3" 548 | "checksum env_logger 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f15f0b172cb4f52ed5dbf47f774a387cd2315d1bf7894ab5af9b083ae27efa5a" 549 | "checksum gdk 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e51db95be6565011bcd5cd99f9b17fdd585001057a999b21e09f1e8c28deb9" 550 | "checksum gdk-pixbuf 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "16160d212ae91abe9f3324c3fb233929ba322dde63585d15cda3336f8c529ed1" 551 | "checksum gdk-pixbuf-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "798f97101eea8180da363d0e80e07ec7ec6d1809306601c0100c1de5bc8b4f52" 552 | "checksum gdk-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4ee916f5f25c5f4b21bd9dcb12a216ae697406940ff9476358c308a8ececada" 553 | "checksum gio 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "84ba5a2beb559059a0c9c2bd3681743cdede8d9a36c775840bca800333b22867" 554 | "checksum gio-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a303bbf7a5e75ab3b627117ff10e495d1b9e97e1d68966285ac2b1f6270091bc" 555 | "checksum glib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9b0452824cc63066940f01adc721804919f0b76cdba3cfab977b00b87f16d4a" 556 | "checksum glib-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9693049613ff52b93013cc3d2590366d8e530366d288438724b73f6c7dc4be8" 557 | "checksum gobject-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60d507c87a71b1143c66ed21a969be9b99a76df234b342d733e787e6c9c7d7c2" 558 | "checksum gtk 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0847c507e52c1feaede13ef56fb4847742438602655449d5f1f782e8633f146f" 559 | "checksum gtk-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "905fcfbaaad1b44ec0b4bba9e4d527d728284c62bc2ba41fccedace2b096766f" 560 | "checksum itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b07332223953b5051bceb67e8c4700aa65291535568e1f12408c43c4a42c0394" 561 | "checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" 562 | "checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" 563 | "checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" 564 | "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" 565 | "checksum num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e" 566 | "checksum num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f8d26da319fb45674985c78f1d1caf99aa4941f785d384a2ae36d0740bc3e2fe" 567 | "checksum num-iter 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "4b226df12c5a59b63569dd57fafb926d91b385dfce33d8074a412411b689d593" 568 | "checksum num-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e7de20f146db9d920c45ee8ed8f71681fd9ade71909b48c3acbd766aa504cf10" 569 | "checksum pango 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e81c404ab81ea7ea2fc2431a0a7672507b80e4b8bf4b41eac3fc83cc665104e" 570 | "checksum pango-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34f34a1be107fe16abb2744e0e206bee4b3b07460b5fddd3009a6aaf60bd69ab" 571 | "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903" 572 | "checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd" 573 | "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" 574 | "checksum regex 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "5be5347bde0c48cfd8c3fdc0766cdfe9d8a755ef84d620d6794c778c91de8b2b" 575 | "checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e" 576 | "checksum serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "db99f3919e20faa51bb2996057f5031d8685019b5a06139b1ce761da671b8526" 577 | "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" 578 | "checksum termcolor 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "73e83896da740a4541a6f21606b35f2aa4bada5b65d89dc61114bf9d6ff2dc7e" 579 | "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" 580 | "checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693" 581 | "checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" 582 | "checksum time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "a15375f1df02096fb3317256ce2cee6a1f42fc84ea5ad5fc8c421cfe40c73098" 583 | "checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e" 584 | "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" 585 | "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" 586 | "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" 587 | "checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c" 588 | "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 589 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 590 | "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" 591 | "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 592 | "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 593 | "checksum wincolor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eeb06499a3a4d44302791052df005d5232b927ed1a9658146d842165c4de7767" 594 | --------------------------------------------------------------------------------