# s

[![License][License-Image]][License-URL] [![Build][Build-Status-Image]][Build-Status-URL] [![Release][Release-Image]][Release-URL] [![🧪 Snap Builds][Snap-Build-Image]][Snap-Build-URL] [![Snap Status][Snap-Image]][Snap-URL]

Web search from the terminal. Just opens in your browser.

```text
Usage:
  s <query> [flags]

Flags:
  -b, --binary string       binary to launch search URI
  -c, --cert string         path to cert.pem for TLS
      --completion string   completion script for bash, zsh, fish or powershell
  -h, --help                help for s
  -j, --json                json output for --list-providers and --list-tags
  -k, --key string          path to key.pem for TLS
  -l, --list-providers      list supported providers
      --list-tags           list available tags
  -o, --output              output only mode
      --port int            server port (default 8080)
  -p, --provider string     search provider (default "presearch")
  -s, --server              launch web server
  -t, --tag string          search tag
  -v, --verbose             verbose mode
      --version             display version
```

## Install

Make sure that `GOPATH` and `GOBIN` env vars are set. Then run:

```zsh
go install github.com/zquestz/s@latest
```

Alternatively, you can use Homebrew:

```zsh
brew install s-search
```

Arch Linux users can install from the AUR:

```zsh
yay -S s
```

## Examples

Search for puppies on presearch.

```zsh
s puppies
```

Search for dragonflies on google.

```zsh
s -p google dragonflies
```

Search for a wifi router on amazon

```zsh
s -p amazon wifi router
```

Search for rhinos on wikipedia

```zsh
s -p wikipedia rhinos
```

Search providers tagged "video" for muppets.

```zsh
s -t video muppets
```

## Provider/Tag Expansion

We can do partial matching of provider and tag names. This searches Facebook for hamsters.

```zsh
s -p fa hamsters
```

Or toasters on amazon.

```zsh
s -p am toasters
```

This searches "tech-news" tagged providers for ssd info.

```zsh
s -t te ssd
```

Or shopping sites for blankets.

```zsh
s -t sh blankets
```

## Provider/Tag Autocompletion

Autocompletion is supported for providers and tags. To set up autocompletion:

### Bash Linux

```bash
sudo bash -c "s --completion bash > /etc/bash_completion.d/s"
```

### Bash MacOS

```bash
sudo bash -c "s --completion bash > /usr/local/etc/bash_completion.d/s"
```

### Zsh

Generate a `_s` completion script and put it somewhere in your `$fpath`:

```zsh
sudo zsh -c "s --completion zsh > /usr/local/share/zsh/site-functions/_s"
```

### Fish

```zsh
s --completion fish > ~/.config/fish/completions/s.fish
```

### Powershell

```powershell
(& s --completion powershell) | Out-String | Invoke-Expression
```

## Advanced

Setup an alias in your `.profile` for your favorite providers.

```bash
alias sa="s -p amazon"
alias sw="s -p wikipedia"
```

Use w3m to find cats instead of just your default browser.

```zsh
s -b w3m cats
```

Search for conspiracy theories in incognito mode.

```zsh
s -b "chromium --incognito" conspiracy theories
s -b "firefox --private-window" conspiracy theories
```

Use a browser with spaces in its path. Quotes are only needed when passing extra flags.

```zsh
s -b "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" kittens
s -b '"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --incognito' kittens
```

Search in a specific subreddit.

```zsh
s -p reddit /r/cscareerquestions best startups.
```

## JSON Output

Need machine readable output for scripting? Just pass the `-j` flag to any of the list commands.

List all supported providers as JSON.

```zsh
s -l -j
```

List all available tags as JSON.

```zsh
s --list-tags -j
```

Adding the verbose flag includes the tags for each provider, and vice versa.

```zsh
s -l -v -j
s --list-tags -v -j
```

To always output JSON for list commands, add `json: true` to your configuration file.

## Server Mode

A web interface is also provided. Just pass the `-s` flag.

Start a server on port 8080 (default).

```zsh
s -s
```

Start a server with TLS on port 8443.

```zsh
s -s -c /path/to/cert.pem -k /path/to/key.pem --port 8443
```

Feel free to try it out at [https://jumps.io/](https://jumps.io/).

## Configuration

To setup your own default configuration just create `~/.config/s/config`. The configuration file is in UCL format.

For more information about UCL visit:
[https://github.com/vstakhov/libucl](https://github.com/vstakhov/libucl)

The following keys are supported:

- blacklist (array of providers to exclude)
- binary (binary to launch search URI)
- cert (path to cert.pem for TLS)
- customProviders (array of custom providers)
- json (json output for --list-providers and --list-tags)
- key (path to key.pem for TLS)
- output (output only mode)
- port (server port)
- provider (search provider)
- tag (search tag)
- verbose (verbose mode)
- whitelist (array of providers to include)

NOTE: You must include a trailing newline in the configuration file or it may fail to parse correctly.

Set your default provider to duckduckgo:

```ucl
provider: duckduckgo
```

To only search a few providers:

```ucl
whitelist: [google, amazon, wikipedia]
```

To exclude providers you don't need:

```ucl
blacklist: [dumpert]
```

To add a custom provider:

```ucl
customProviders [
  {
    name: example
    url: "https://example.com?q=%s"
    tags: [example]
  }
]
```

Custom providers require a few things:

- An alphanumeric name. `^[a-zA-Z0-9_]*$`
- A `%s` token for the query string.
- A valid URL scheme.

## Supported Providers

- 500px
- aliexpress
- allocine
- amazon
- archpkg
- archwiki
- ardmediathek
- arstechnica
- arxiv
- atmospherejs
- aur
- baidu
- bandcamp
- bgr
- bigbasket
- bing
- brave
- buzzfeed
- caniuse
- cnn
- codepen
- coursera
- cplusplus
- crates
- crunchyroll
- debianpkg
- dict
- diigo
- dockerhub
- dribbble
- duckduckgo
- dumpert
- ecosia
- engadget
- explainshell
- facebook
- flake8rules
- flathub
- flickr
- flipkart
- foursquare
- freebsdman
- freshports
- gibiru
- giphy
- gist
- github
- gmail
- go
- godoc
- goodreads
- google
- googledocs
- googlemaps
- hackernews
- idealo
- ietf
- ifttt
- imdb
- imgur
- instagram
- kagi
- kaufda
- libgen
- linkedin
- macports
- mdn
- medium
- metacpan
- msdn
- naver
- netflix
- nhaccuatui
- npm
- npr
- nvd
- openbsdman
- overstock
- packagist
- perplexity
- presearch
- protondb
- phandroid
- php
- pinterest
- postgresql
- pydoc
- pypi
- python
- quora
- qwant
- reddit
- regex
- rottentomatoes
- rubygems
- shodan
- soundcloud
- spotify
- stackoverflow
- steam
- taobao
- thepiratebay
- theregister
- twitchtv
- twitter
- ultimateguitar
- unity3d
- unsplash
- vimeo
- wikipedia
- wolframalpha
- yahoo
- yandex
- youtube
- zdf

## Contributors

- [Josh Ellithorpe (zquestz)](https://github.com/zquestz/)
- [Christian Petersen (fnky)](https://github.com/fnky/)
- [Preet Bhinder (mbhinder)](https://github.com/mbhinder/)
- [Robert-Jan Keizer (KeizerDev)](https://github.com/KeizerDev/)
- [Vitor Cortez (vekat)](https://github.com/vekat/)
- [David Liu (tw4dl)](https://github.com/tw4dl/)
- [Lex Broner (akb)](https://github.com/akb/)
- [Diego Jara (djap96)](https://github.com/djap96/)
- [Luvsandondov Lkhamsuren (lkhamsurenl)](https://github.com/lkhamsurenl/)
- [Eray Aydın (erayaydin)](https://github.com/erayaydin/)
- [Murilo Santana (mvrilo)](https://github.com/mvrilo/)
- [Jun He (knarfeh)](https://github.com/knarfeh/)
- [Xavier Bruhiere (hackliff)](github.com/hackliff)

## License

s is released under the MIT license.

[License-URL]: https://opensource.org/licenses/MIT
[License-Image]: https://img.shields.io/npm/l/express.svg
[Build-Status-URL]: https://github.com/zquestz/s/actions/workflows/ci.yml
[Build-Status-Image]: https://github.com/zquestz/s/actions/workflows/ci.yml/badge.svg
[Release-URL]: https://github.com/zquestz/s/releases/tag/v0.8.0
[Release-Image]: https://img.shields.io/badge/release-v0.8.0-1eb0fc.svg
[Snap-Build-URL]: https://github.com/zquestz/s/actions/workflows/test-snap-builds.yml
[Snap-Build-Image]: https://github.com/zquestz/s/actions/workflows/test-snap-builds.yml/badge.svg
[Snap-Image]: https://snapcraft.io/s-search/badge.svg
[Snap-URL]: https://snapcraft.io/s-search
