zapashcanon
5 years ago
commit
8907a0851a
7 changed files with 123 additions and 0 deletions
@ -0,0 +1,3 @@ |
|||
_build/ |
|||
*.merlin |
|||
*.install |
@ -0,0 +1,8 @@ |
|||
The ISC License (ISC) |
|||
===================== |
|||
|
|||
Copyright © 2019, Léo Andrès |
|||
|
|||
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
@ -0,0 +1,35 @@ |
|||
# SO |
|||
|
|||
SO (Simple Open) is a small command line tool to quickly open file depending on their extension. |
|||
|
|||
## Usage |
|||
|
|||
You should have a configuration file in `${XDG_CONFIG_HOME}/so/config`. It maps extensions to programs and should look like this: |
|||
|
|||
```sh |
|||
mpv : mp4 avi |
|||
firefox : html |
|||
evince : pdf |
|||
eog : jpg png gif tif |
|||
``` |
|||
There's a default fallback set to `xdg-open`. |
|||
|
|||
Then it's as simple as: |
|||
```sh |
|||
so ~/img/hello.jpg |
|||
``` |
|||
## Build |
|||
```sh |
|||
opam update |
|||
opam install dune ocaml-xdg-basedir |
|||
dune build @all |
|||
``` |
|||
## Install |
|||
```sh |
|||
dune install |
|||
``` |
|||
## License |
|||
|
|||
See [LICENSE]. |
|||
|
|||
[LICENSE]: ./LICENSE.md |
@ -0,0 +1,5 @@ |
|||
(lang dune 1.11) |
|||
|
|||
(name so) |
|||
|
|||
(explicit_js_mode) |
@ -0,0 +1,26 @@ |
|||
opam-version: "2.0" |
|||
|
|||
synopsis: "Command line tool to quickly open file depending on their extension" |
|||
|
|||
version: "dev" |
|||
license: "ISC" |
|||
homepage: "https://git.zapashcanon.fr/zapashcanon/so" |
|||
bug-reports: "https://git.zapashcanon.fr/zapashcanon/so/issues" |
|||
|
|||
authors: "Léo Andrès (zapashcanon) <leo@ndrs.fr>" |
|||
maintainer: "Léo Andrès (zapashcanon) <leo@ndrs.fr>" |
|||
dev-repo: "git+https://git.zapashcanon.fr/zapashcanon/so.git" |
|||
|
|||
depends: [ |
|||
"ocaml" |
|||
"dune" |
|||
"ocaml-xdg-basedir" |
|||
] |
|||
|
|||
build: [ |
|||
["dune" "build" "-p" name "-j" jobs] |
|||
] |
|||
|
|||
description: """ |
|||
Command line tool to quickly open file depending on their extension. |
|||
""" |
@ -0,0 +1,3 @@ |
|||
(executable |
|||
(public_name so) |
|||
(libraries xdg-basedir)) |
@ -0,0 +1,43 @@ |
|||
let error s = |
|||
Format.eprintf "%s@." s; |
|||
exit 1 |
|||
|
|||
let _ = |
|||
|
|||
if Array.length Sys.argv <> 2 then error (Format.sprintf "usage: %s <file>" Sys.argv.(0)); |
|||
|
|||
let file = Sys.argv.(1) in |
|||
|
|||
if not (Sys.file_exists file) then error (Format.sprintf "file %s doesn't exist" file); |
|||
|
|||
let config_file = XDGBaseDir.default.config_home ^ "/so/config" in |
|||
|
|||
if not (Sys.file_exists config_file) then error (Format.sprintf "config file %s doesn't exist" config_file); |
|||
|
|||
let chan = open_in config_file in |
|||
|
|||
let tbl = Hashtbl.create 2048 in |
|||
|
|||
begin try while true do |
|||
let line = input_line chan in |
|||
match String.split_on_char ':' line with |
|||
| prog::exts::[] -> |
|||
let prog = String.trim prog in |
|||
let exts = String.split_on_char ' ' exts in |
|||
List.iter (fun el -> if el <> "" then Hashtbl.add tbl ("." ^ el) prog) exts; |
|||
| _ -> error (Format.sprintf "parse error in config file %s" config_file) |
|||
done with End_of_file -> close_in chan |
|||
end; |
|||
|
|||
let ext = Filename.extension file in |
|||
|
|||
let cmd = match Hashtbl.find tbl ext with |
|||
| exception Not_found -> "xdg-open" |
|||
| prog -> prog |
|||
in |
|||
|
|||
let cmd = Format.sprintf "setsid %s %s" cmd (Filename.quote file) in |
|||
|
|||
(* Format.printf "%s@." cmd; *) |
|||
|
|||
ignore (Sys.command cmd); |
Loading…
Reference in new issue