aboutsummaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorGravatar Arun Prakash Jana <engineerarun@gmail.com>2019-04-18 20:27:35 +0530
committerGravatar Arun Prakash Jana <engineerarun@gmail.com>2019-04-18 20:32:53 +0530
commit5cf34717161bd866a634d8a9ad209afb4004857b (patch)
treee63a1f4849c7ebb7658725a4369caa48a0710af4 /plugins
parent12ce9451ee1c24ad245d33e8944ba77a1108b5b2 (diff)
downloadnnn-5cf34717161bd866a634d8a9ad209afb4004857b.tar.gz
Plugins!
Diffstat (limited to 'plugins')
-rw-r--r--plugins/README.md29
-rwxr-xr-xplugins/edit8
-rwxr-xr-xplugins/fzy8
-rwxr-xr-xplugins/hexview11
-rwxr-xr-xplugins/imgresize32
-rwxr-xr-xplugins/imgur557
-rwxr-xr-xplugins/kdeconnect15
-rwxr-xr-xplugins/ndiff8
-rwxr-xr-xplugins/nwal16
-rwxr-xr-xplugins/paste13
-rwxr-xr-xplugins/picker26
-rwxr-xr-xplugins/pywal16
-rwxr-xr-xplugins/sxiv8
-rwxr-xr-xplugins/transfer16
-rwxr-xr-xplugins/upgrade24
15 files changed, 787 insertions, 0 deletions
diff --git a/plugins/README.md b/plugins/README.md
new file mode 100644
index 0000000..be8aa4c
--- /dev/null
+++ b/plugins/README.md
@@ -0,0 +1,29 @@
+| Plugin (a-z) | Lang | Deps | Description |
+| --- | --- | --- | --- |
+| edit | sh | fzy | Fuzzy find a file in directory subtree and edit in vim |
+| fzy | sh | fzy | Fuzzy find a file in directory subtree and open using xdg-open |
+| hexview | sh | xxd, $PAGER | view a file in hex |
+| imgresize | sh | [imgp](https://github.com/jarun/imgp) | Resize images in directory to screen resolution |
+| imgur | bash | [imgur](https://github.com/jomo/imgur-screenshot) | Upload an image to imgur |
+| kdeconnect | sh | kdeconnect-cli | Send selected files to an Android device |
+| ndiff | sh | vimdiff | File and directory diff for selection |
+| nwal | sh | nitrogen | Set the selected image as wallpaper using nitrogen |
+| paste | sh | [pastebinit](https://launchpad.net/pastebinit) | Paste contents of current (text) file to paste.ubuntu.com |
+| picker | sh | nnn | Pick files and pipe the newline-separated list to another utility |
+| pywal | sh | pywal | Set selected image as wallpaper, change terminal color scheme |
+| sxiv | sh | sxiv | Open images in a dir in sxiv, set wallpaper, copy path ([tips](https://wiki.archlinux.org/index.php/Sxiv#Assigning_keyboard_shortcuts))|
+| transfer | sh | curl | Upload current file to transfer.sh |
+| upgrade | sh | wget | Upgrade to latest nnn version manually on Debian 9 Stretch |
+
+### File access from plugins
+
+The design is flexible so a plugin can access:
+- all files in the directory (`nnn` switches to the dir where the plugin is to be run so the dir is `$PWD` for the plugin)
+- the currently highlighted file (the file name is passed as the argument to a plugin)
+- the current selection (by reading the file .nnncp, see the plugin `ndiff`)
+
+### Contributing plugins
+
+Plugins are scripts and all scripting languages should work. However, POSIX-compliant shell scripts runnable in `sh` are preferred. If that's too rudimentary for your use case, use Python, Perl or Ruby. Please keep non-portable commands (like `notify-send`) commented so users from any other OS/DE aren't surprised.
+
+The plugins should be executable. Please add an entry in the table above.
diff --git a/plugins/edit b/plugins/edit
new file mode 100755
index 0000000..6155250
--- /dev/null
+++ b/plugins/edit
@@ -0,0 +1,8 @@
+#!/usr/bin/env sh
+
+# Description: Fuzzy find a file in directory subtree with fzy and edit in vim
+#
+# Shell: POSIX compliant
+# Author: Arun Prakash Jana
+
+vim "$(find -type f | fzy)"
diff --git a/plugins/fzy b/plugins/fzy
new file mode 100755
index 0000000..0ddd229
--- /dev/null
+++ b/plugins/fzy
@@ -0,0 +1,8 @@
+#!/usr/bin/env sh
+
+# Description: Fuzzy find a file in directory subtree with fzy and open using xdg-open
+#
+# Shell: POSIX compliant
+# Author: Arun Prakash Jana
+
+xdg-open "$(find -type f | fzy)" >/dev/null 2>&1
diff --git a/plugins/hexview b/plugins/hexview
new file mode 100755
index 0000000..5125fa3
--- /dev/null
+++ b/plugins/hexview
@@ -0,0 +1,11 @@
+#!/usr/bin/env sh
+
+# Description: View a file in hex
+# Requires: xxd and $PAGER
+#
+# Shell: POSIX compliant
+# Author: Arun Prakash Jana
+
+if ! [ -z "$1" ]; then
+ xxd "$1" | "$PAGER"
+fi
diff --git a/plugins/imgresize b/plugins/imgresize
new file mode 100755
index 0000000..6d016f1
--- /dev/null
+++ b/plugins/imgresize
@@ -0,0 +1,32 @@
+#!/usr/bin/env sh
+
+# Description: Resize images in a directory to screen resolution with imgp
+# imgp homepage: https://github.com/jarun/imgp
+#
+# Notes:
+# 1. Set res if you don't want to be prompted for desktop resolution every time
+# 2. minsize is set to 1MB by default, adjust it if you want
+# 3. imgp options used:
+# a - adaptive mode
+# c - convert PNG to JPG
+# k - skip images matching specified hres/vres
+#
+# Shell: POSIX compliant
+# Author: Arun Prakash Jana
+
+# set resolution (e.g. 1920x1080)
+res=
+
+# set minimum image size (in bytes) to resize (default: 1MB)
+minsize=1048576
+
+if [ -z "$res" ]; then
+ echo -n "desktop resolution (hxv): "
+ read res
+fi
+
+if ! [ -z "$res" ]; then
+ if ! [ -z "$minsize" ]; then
+ imgp -ackx "$res" -s "$minsize"
+ fi
+fi
diff --git a/plugins/imgur b/plugins/imgur
new file mode 100755
index 0000000..0a660fc
--- /dev/null
+++ b/plugins/imgur
@@ -0,0 +1,557 @@
+#!/usr/bin/env bash
+# https://github.com/jomo/imgur-screenshot
+# https://imgur.com/tools
+#
+# Slightly modified for `nnn` integration
+#
+# Shell: bash
+# Description: Upload an image file to imgur
+
+if [ "${1}" = "--debug" ]; then
+ echo "########################################"
+ echo "Enabling debug mode"
+ echo "Please remove credentials before pasting"
+ echo "########################################"
+ echo ""
+ uname -a
+ for arg in ${0} "${@}"; do
+ echo -n "'${arg}' "
+ done
+ echo -e "\n"
+ shift
+ set -x
+fi
+
+current_version="v1.7.4"
+
+function is_mac() {
+ uname | grep -q "Darwin"
+}
+
+### IMGUR-SCREENSHOT DEFAULT CONFIG ####
+
+# You can override the config in ~/.config/imgur-screenshot/settings.conf
+
+imgur_anon_id="ea6c0ef2987808e"
+imgur_icon_path="${HOME}/Pictures/imgur.png"
+
+imgur_acct_key=""
+imgur_secret=""
+login="false"
+album_title=""
+album_id=""
+credentials_file="${HOME}/.config/imgur-screenshot/credentials.conf"
+
+file_name_format="imgur-%Y_%m_%d-%H:%M:%S.png" # when using scrot, must end with .png!
+file_dir="${HOME}/Pictures"
+
+upload_connect_timeout="5"
+upload_timeout="120"
+upload_retries="1"
+
+if is_mac; then
+ screenshot_select_command="screencapture -i %img"
+ screenshot_window_command="screencapture -iWa %img"
+ screenshot_full_command="screencapture %img"
+ open_command="open %url"
+else
+ screenshot_select_command="scrot -s %img"
+ screenshot_window_command="scrot %img"
+ screenshot_full_command="scrot %img"
+ open_command="xdg-open %url"
+fi
+open="true"
+
+mode="select"
+edit_command="gimp %img"
+edit="false"
+exit_on_album_creation_fail="true"
+
+log_file="${HOME}/.imgur-screenshot.log"
+
+auto_delete=""
+copy_url="true"
+keep_file="true"
+check_update="true"
+
+# NOTICE: if you make changes here, also edit the docs at
+# https://github.com/jomo/imgur-screenshot/wiki/Config
+
+# You can override the config in ~/.config/imgur-screenshot/settings.conf
+
+############## END CONFIG ##############
+
+settings_path="${HOME}/.config/imgur-screenshot/settings.conf"
+if [ -f "${settings_path}" ]; then
+ source "${settings_path}"
+fi
+
+# dependency check
+if [ "${1}" = "--check" ]; then
+ (which grep &>/dev/null && echo "OK: found grep") || echo "ERROR: grep not found"
+ if is_mac; then
+ if which growlnotify &>/dev/null; then
+ echo "OK: found growlnotify"
+ elif which terminal-notifier &>/dev/null; then
+ echo "OK: found terminal-notifier"
+ else
+ echo "ERROR: growlnotify nor terminal-notifier found"
+ fi
+ (which screencapture &>/dev/null && echo "OK: found screencapture") || echo "ERROR: screencapture not found"
+ (which pbcopy &>/dev/null && echo "OK: found pbcopy") || echo "ERROR: pbcopy not found"
+ else
+ (which notify-send &>/dev/null && echo "OK: found notify-send") || echo "ERROR: notify-send (from libnotify-bin) not found"
+ (which scrot &>/dev/null && echo "OK: found scrot") || echo "ERROR: scrot not found"
+ (which xclip &>/dev/null && echo "OK: found xclip") || echo "ERROR: xclip not found"
+ fi
+ (which curl &>/dev/null && echo "OK: found curl") || echo "ERROR: curl not found"
+ exit 0
+fi
+
+
+# notify <'ok'|'error'> <title> <text>
+function notify() {
+ if is_mac; then
+ if which growlnotify &>/dev/null; then
+ growlnotify --icon "${imgur_icon_path}" --iconpath "${imgur_icon_path}" --title "${2}" --message "${3}"
+ else
+ terminal-notifier -appIcon "${imgur_icon_path}" -contentImage "${imgur_icon_path}" -title "imgur: ${2}" -message "${3}"
+ fi
+ else
+ if [ "${1}" = "error" ]; then
+ notify-send -a ImgurScreenshot -u critical -c "im.error" -i "${imgur_icon_path}" -t 500 "imgur: ${2}" "${3}"
+ else
+ notify-send -a ImgurScreenshot -u low -c "transfer.complete" -i "${imgur_icon_path}" -t 500 "imgur: ${2}" "${3}"
+ fi
+ fi
+}
+
+function take_screenshot() {
+ echo "Please select area"
+ is_mac || sleep 0.1 # https://bbs.archlinux.org/viewtopic.php?pid=1246173#p1246173
+
+ cmd="screenshot_${mode}_command"
+ cmd=${!cmd//\%img/${1}}
+
+ shot_err="$(${cmd} &>/dev/null)" #takes a screenshot with selection
+ if [ "${?}" != "0" ]; then
+ echo "Failed to take screenshot '${1}': '${shot_err}'. For more information visit https://github.com/jomo/imgur-screenshot/wiki/Troubleshooting" | tee -a "${log_file}"
+ notify error "Something went wrong :(" "Information has been logged"
+ exit 1
+ fi
+}
+
+function check_for_update() {
+ # exit non-zero on HTTP error, output only the body (no stats) but output errors, follow redirects, output everything to stdout
+ remote_version="$(curl --compressed -fsSL --stderr - "https://api.github.com/repos/jomo/imgur-screenshot/releases" | egrep -m 1 --color 'tag_name":\s*".*"' | cut -d '"' -f 4)"
+ if [ "${?}" -eq "0" ]; then
+ if [ ! "${current_version}" = "${remote_version}" ] && [ ! -z "${current_version}" ] && [ ! -z "${remote_version}" ]; then
+ echo "Update found!"
+ echo "Version ${remote_version} is available (You have ${current_version})"
+ notify ok "Update found" "Version ${remote_version} is available (You have ${current_version}). https://github.com/jomo/imgur-screenshot"
+ echo "Check https://github.com/jomo/imgur-screenshot/releases/${remote_version} for more info."
+ elif [ -z "${current_version}" ] || [ -z "${remote_version}" ]; then
+ echo "Invalid empty version string"
+ echo "Current (local) version: '${current_version}'"
+ echo "Latest (remote) version: '${remote_version}'"
+ else
+ echo "Version ${current_version} is up to date."
+ fi
+ else
+ echo "Failed to check for latest version: ${remote_version}"
+ fi
+}
+
+function check_oauth2_client_secrets() {
+ if [ -z "${imgur_acct_key}" ] || [ -z "${imgur_secret}" ]; then
+ echo "In order to upload to your account, register a new application at:"
+ echo "https://api.imgur.com/oauth2/addclient"
+ echo "Select 'OAuth 2 authorization without a callback URL'"
+ echo "Then, set the imgur_acct_key (Client ID) and imgur_secret in your config."
+ exit 1
+ fi
+}
+
+function load_access_token() {
+ token_expire_time=0
+ # check for saved access_token and its expiration date
+ if [ -f "${credentials_file}" ]; then
+ source "${credentials_file}"
+ fi
+ current_time="$(date +%s)"
+ preemptive_refresh_time="$((10*60))"
+ expired="$((current_time > (token_expire_time - preemptive_refresh_time)))"
+ if [ ! -z "${refresh_token}" ]; then
+ # token already set
+ if [ "${expired}" -eq "0" ]; then
+ # token expired
+ refresh_access_token "${credentials_file}"
+ fi
+ else
+ acquire_access_token "${credentials_file}"
+ fi
+}
+
+function acquire_access_token() {
+ check_oauth2_client_secrets
+ # prompt for a PIN
+ authorize_url="https://api.imgur.com/oauth2/authorize?client_id=${imgur_acct_key}&response_type=pin"
+ echo "Go to"
+ echo "${authorize_url}"
+ echo "and grant access to this application."
+ read -rp "Enter the PIN: " imgur_pin
+
+ if [ -z "${imgur_pin}" ]; then
+ echo "PIN not entered, exiting"
+ exit 1
+ fi
+
+ # exchange the PIN for access token and refresh token
+ response="$(curl --compressed -fsSL --stderr - \
+ -F "client_id=${imgur_acct_key}" \
+ -F "client_secret=${imgur_secret}" \
+ -F "grant_type=pin" \
+ -F "pin=${imgur_pin}" \
+ https://api.imgur.com/oauth2/token)"
+ save_access_token "${response}" "${1}"
+}
+
+function refresh_access_token() {
+ check_oauth2_client_secrets
+ token_url="https://api.imgur.com/oauth2/token"
+ # exchange the refresh token for access_token and refresh_token
+ response="$(curl --compressed -fsSL --stderr - -F "client_id=${imgur_acct_key}" -F "client_secret=${imgur_secret}" -F "grant_type=refresh_token" -F "refresh_token=${refresh_token}" "${token_url}")"
+ if [ ! "${?}" -eq "0" ]; then
+ # curl failed
+ handle_upload_error "${response}" "${token_url}"
+ exit 1
+ fi
+ save_access_token "${response}" "${1}"
+}
+
+function save_access_token() {
+ if ! grep -q "access_token" <<<"${1}"; then
+ # server did not send access_token
+ echo "Error: Something is wrong with your credentials:"
+ echo "${1}"
+ exit 1
+ fi
+
+ access_token="$(egrep -o 'access_token":".*"' <<<"${1}" | cut -d '"' -f 3)"
+ refresh_token="$(egrep -o 'refresh_token":".*"' <<<"${1}" | cut -d '"' -f 3)"
+ expires_in="$(egrep -o 'expires_in":[0-9]*' <<<"${1}" | cut -d ':' -f 2)"
+ token_expire_time="$(( $(date +%s) + expires_in ))"
+
+ # create dir if not exist
+ mkdir -p "$(dirname "${2}")" 2>/dev/null
+ touch "${2}" && chmod 600 "${2}"
+ cat <<EOF > "${2}"
+access_token="${access_token}"
+refresh_token="${refresh_token}"
+token_expire_time="${token_expire_time}"
+EOF
+}
+
+function fetch_account_info() {
+ response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -H "Authorization: Bearer ${access_token}" https://api.imgur.com/3/account/me)"
+ if egrep -q '"success":\s*true' <<<"${response}"; then
+ username="$(egrep -o '"url":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
+ echo "Logged in as ${username}."
+ echo "https://${username}.imgur.com"
+ else
+ echo "Failed to fetch info: ${response}"
+ fi
+}
+
+function delete_image() {
+ response="$(curl --compressed -X DELETE -fsSL --stderr - -H "Authorization: Client-ID ${1}" "https://api.imgur.com/3/image/${2}")"
+ if egrep -q '"success":\s*true' <<<"${response}"; then
+ echo "Image successfully deleted (delete hash: ${2})." >> "${3}"
+ else
+ echo "The Image could not be deleted: ${response}." >> "${3}"
+ fi
+}
+
+function upload_authenticated_image() {
+ echo "Uploading '${1}'..."
+ title="$(echo "${1}" | rev | cut -d "/" -f 1 | cut -d "." -f 2- | rev)"
+ if [ -n "${album_id}" ]; then
+ response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -F "title=${title}" -F "image=@\"${1}\"" -F "album=${album_id}" -H "Authorization: Bearer ${access_token}" https://api.imgur.com/3/image)"
+ else
+ response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -F "title=${title}" -F "image=@\"${1}\"" -H "Authorization: Bearer ${access_token}" https://api.imgur.com/3/image)"
+ fi
+
+ # JSON parser premium edition (not really)
+ if egrep -q '"success":\s*true' <<<"${response}"; then
+ img_id="$(egrep -o '"id":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
+ img_ext="$(egrep -o '"link":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4 | rev | cut -d "." -f 1 | rev)" # "link" itself has ugly '\/' escaping and no https!
+ del_id="$(egrep -o '"deletehash":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
+
+ if [ ! -z "${auto_delete}" ]; then
+ export -f delete_image
+ echo "Deleting image in ${auto_delete} seconds."
+ nohup /bin/bash -c "sleep ${auto_delete} && delete_image ${imgur_anon_id} ${del_id} ${log_file}" &
+ fi
+
+ handle_upload_success "https://i.imgur.com/${img_id}.${img_ext}" "https://imgur.com/delete/${del_id}" "${1}"
+ else # upload failed
+ err_msg="$(egrep -o '"error":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
+ test -z "${err_msg}" && err_msg="${response}"
+ handle_upload_error "${err_msg}" "${1}"
+ fi
+}
+
+function upload_anonymous_image() {
+ echo "Uploading '${1}'..."
+ title="$(echo "${1}" | rev | cut -d "/" -f 1 | cut -d "." -f 2- | rev)"
+ if [ -n "${album_id}" ]; then
+ response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -H "Authorization: Client-ID ${imgur_anon_id}" -F "title=${title}" -F "image=@\"${1}\"" -F "album=${album_id}" https://api.imgur.com/3/image)"
+ else
+ response="$(curl --compressed --connect-timeout "${upload_connect_timeout}" -m "${upload_timeout}" --retry "${upload_retries}" -fsSL --stderr - -H "Authorization: Client-ID ${imgur_anon_id}" -F "title=${title}" -F "image=@\"${1}\"" https://api.imgur.com/3/image)"
+ fi
+ # JSON parser premium edition (not really)
+ if egrep -q '"success":\s*true' <<<"${response}"; then
+ img_id="$(egrep -o '"id":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
+ img_ext="$(egrep -o '"link":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4 | rev | cut -d "." -f 1 | rev)" # "link" itself has ugly '\/' escaping and no https!
+ del_id="$(egrep -o '"deletehash":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
+
+ if [ ! -z "${auto_delete}" ]; then
+ export -f delete_image
+ echo "Deleting image in ${auto_delete} seconds."
+ nohup /bin/bash -c "sleep ${auto_delete} && delete_image ${imgur_anon_id} ${del_id} ${log_file}" &
+ fi
+
+ handle_upload_success "https://i.imgur.com/${img_id}.${img_ext}" "https://imgur.com/delete/${del_id}" "${1}"
+ else # upload failed
+ err_msg="$(egrep -o '"error":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
+ test -z "${err_msg}" && err_msg="${response}"
+ handle_upload_error "${err_msg}" "${1}"
+ fi
+}
+
+function handle_upload_success() {
+ echo ""
+ echo "image link: ${1}"
+ echo "delete link: ${2}"
+
+ if [ "${copy_url}" = "true" ] && [ -z "${album_title}" ]; then
+ if is_mac; then
+ echo -n "${1}" | pbcopy
+ else
+ echo -n "${1}" | xclip -selection clipboard
+ fi
+ echo "URL copied to clipboard"
+ fi
+
+ # print to log file: image link, image location, delete link
+ echo -e "${1}\t${3}\t${2}" >> "${log_file}"
+
+ notify ok "Upload done!" "${1}"
+
+# if [ ! -z "${open_command}" ] && [ "${open}" = "true" ]; then
+# open_cmd=${open_command//\%url/${1}}
+# open_cmd=${open_cmd//\%img/${2}}
+# echo "Opening '${open_cmd}'"
+# eval "${open_cmd}"
+# fi
+}
+
+function handle_upload_error() {
+ error="Upload failed: \"${1}\""
+ echo "${error}"
+ echo -e "Error\t${2}\t${error}" >> "${log_file}"
+ notify error "Upload failed :(" "${1}"
+}
+
+function handle_album_creation_success() {
+ echo ""
+ echo "Album link: ${1}"
+ echo "Delete hash: ${2}"
+ echo ""
+
+ notify ok "Album created!" "${1}"
+
+ if [ "${copy_url}" = "true" ]; then
+ if is_mac; then
+ echo -n "${1}" | pbcopy
+ else
+ echo -n "${1}" | xclip -selection clipboard
+ fi
+ echo "URL copied to clipboard"
+ fi
+
+ # print to log file: album link, album title, delete hash
+ echo -e "${1}\t\"${3}\"\t${2}" >> "${log_file}"
+}
+
+function handle_album_creation_error() {
+ error="Album creation failed: \"${1}\""
+ echo -e "Error\t${2}\t${error}" >> "${log_file}"
+ notify error "Album creation failed :(" "${1}"
+ if [ ${exit_on_album_creation_fail} ]; then
+ exit 1
+ fi
+}
+
+while [ ${#} != 0 ]; do
+ case "${1}" in
+ -h | --help)
+ echo "usage: ${0} [--debug] [-c | --check | -v | -h | -u]"
+ echo " ${0} [--debug] [option]... [file]..."
+ echo ""
+ echo " --debug Enable debugging, must be first option"
+ echo " -h, --help Show this help, exit"
+ echo " -v, --version Show current version, exit"
+ echo " --check Check if all dependencies are installed, exit"
+ echo " -c, --connect Show connected imgur account, exit"
+ echo " -o, --open <true|false> Override 'open' config"
+ echo " -e, --edit <true|false> Override 'edit' config"
+ echo " -i, --edit-command <command> Override 'edit_command' config (include '%img'), sets --edit 'true'"
+ echo " -l, --login <true|false> Override 'login' config"
+ echo " -a, --album <album_title> Create new album and upload there"
+ echo " -A, --album-id <album_id> Override 'album_id' config"
+ echo " -k, --keep-file <true|false> Override 'keep_file' config"
+ echo " -d, --auto-delete <s> Automatically delete image after <s> seconds"
+ echo " -u, --update Check for updates, exit"
+ echo " file Upload file instead of taking a screenshot"
+ exit 0;;
+ -v | --version)
+ echo "${current_version}"
+ exit 0;;
+ -s | --select)
+ mode="select"
+ shift;;
+ -w | --window)
+ mode="window"
+ shift;;
+ -f | --full)
+ mode="full"
+ shift;;
+ -o | --open)
+ open="${2}"
+ shift 2;;
+ -e | --edit)
+ edit="${2}"
+ shift 2;;
+ -i | --edit-command)
+ edit_command="${2}"
+ edit="true"
+ shift 2;;
+ -l | --login)
+ login="${2}"
+ shift 2;;
+ -c | --connect)
+ load_access_token
+ fetch_account_info
+ exit 0;;
+ -a | --album)
+ album_title="${2}"
+ shift 2;;
+ -A | --album-id)
+ album_id="${2}"
+ shift 2;;
+ -k | --keep-file)
+ keep_file="${2}"
+ shift 2;;
+ -d | --auto-delete)
+ auto_delete="${2}"
+ shift 2;;
+ -u | --update)
+ check_for_update
+ exit 0;;
+ *)
+ upload_files=("${@}")
+ break;;
+ esac
+done
+
+if [ "${login}" = "true" ]; then
+ # load before changing directory
+ load_access_token
+fi
+
+
+if [ -n "${album_title}" ]; then
+ if [ "${login}" = "true" ]; then
+ response="$(curl -fsSL --stderr - \
+ -F "title=${album_title}" \
+ -H "Authorization: Bearer ${access_token}" \
+ https://api.imgur.com/3/album)"
+ else
+ response="$(curl -fsSL --stderr - \
+ -F "title=${album_title}" \
+ -H "Authorization: Client-ID ${imgur_anon_id}" \
+ https://api.imgur.com/3/album)"
+ fi
+ if egrep -q '"success":\s*true' <<<"${response}"; then # Album creation successful
+ echo "Album '${album_title}' successfully created"
+ album_id="$(egrep -o '"id":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
+ del_id="$(egrep -o '"deletehash":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
+ handle_album_creation_success "http://imgur.com/a/${album_id}" "${del_id}" "${album_title}"
+
+ if [ "${login}" = "false" ]; then
+ album_id="${del_id}"
+ fi
+ else # Album creation failed
+ err_msg="$(egrep -o '"error":\s*"[^"]+"' <<<"${response}" | cut -d "\"" -f 4)"
+ test -z "${err_msg}" && err_msg="${response}"
+ handle_album_creation_error "${err_msg}" "${album_title}"
+ fi
+fi
+
+if [ -z "${upload_files}" ]; then
+ upload_files[0]=""
+fi
+
+for upload_file in "${upload_files[@]}"; do
+
+ if [ -z "${upload_file}" ]; then
+ cd "${file_dir}" || exit 1
+
+ # new filename with date
+ img_file="$(date +"${file_name_format}")"
+ take_screenshot "${img_file}"
+ else
+ # upload file instead of screenshot
+ img_file="${upload_file}"
+ fi
+
+ # get full path
+ img_file="$(cd "$( dirname "${img_file}")" && echo "$(pwd)/$(basename "${img_file}")")"
+
+ # check if file exists
+ if [ ! -f "${img_file}" ]; then
+ echo "file '${img_file}' doesn't exist !"
+ exit 1
+ fi
+
+ # open image in editor if configured
+ if [ "${edit}" = "true" ]; then
+ edit_cmd=${edit_command//\%img/${img_file}}
+ echo "Opening editor '${edit_cmd}'"
+ if ! (eval "${edit_cmd}"); then
+ echo "Error for image '${img_file}': command '${edit_cmd}' failed, not uploading. For more information visit https://github.com/jomo/imgur-screenshot/wiki/Troubleshooting" | tee -a "${log_file}"
+ notify error "Something went wrong :(" "Information has been logged"
+ exit 1
+ fi
+ fi
+
+ if [ "${login}" = "true" ]; then
+ upload_authenticated_image "${img_file}"
+ else
+ upload_anonymous_image "${img_file}"
+ fi
+
+ # delete file if configured
+ if [ "${keep_file}" = "false" ] && [ -z "${1}" ]; then
+ echo "Deleting temp file ${file_dir}/${img_file}"
+ rm -rf "${img_file}"
+ fi
+
+ echo ""
+done
+
+
+if [ "${check_update}" = "true" ]; then
+ check_for_update
+fi
diff --git a/plugins/kdeconnect b/plugins/kdeconnect
new file mode 100755
index 0000000..0fbafbb
--- /dev/null
+++ b/plugins/kdeconnect
@@ -0,0 +1,15 @@
+#!/usr/bin/env sh
+
+# Description: Send the selected files to your Android device using kdeconnect-cli. You must have installed and configured kdeconnect both on the Android device and on the PC.
+#
+# Shell: POSIX compliant
+# Author: juacq97
+
+id=$(kdeconnect-cli -a --id-only | awk '{print $1}')
+if [ "$(find ~/.nnncp)" ]; then
+ kdeconnect-cli -d "$id" --share "$(cat ~/.nnncp)"
+# If you want a system notification, uncomment the next 3 lines.
+# notify-send -a "Kdeconnect" "Sending $(cat ~/.nnncp)"
+#else
+# notify-send -a "Kdeconnect" "No file selected"
+fi
diff --git a/plugins/ndiff b/plugins/ndiff
new file mode 100755
index 0000000..10af0b3
--- /dev/null
+++ b/plugins/ndiff
@@ -0,0 +1,8 @@
+#!/usr/bin/env sh
+
+# Description: File and directory diff using vimdiff
+#
+# Shell: POSIX compliant
+# Author: Arun Prakash Jana
+
+vimdiff $(cat ~/.nnncp | tr '\0' '\n')
diff --git a/plugins/nwal b/plugins/nwal
new file mode 100755
index 0000000..2f18b08
--- /dev/null
+++ b/plugins/nwal
@@ -0,0 +1,16 @@
+#!/usr/bin/env sh
+
+# Description: Set the selected image as wallpaper using nitrogen. Just put the cursor on a image and run the script.
+#
+# Shell: POSIX Compliant
+# Author: juacq97
+
+if ! [ -z "$1" ]; then
+ if [ $(mimetype --output-format %m $1 | awk -F '/' '{print $1}') == "image" ]; then
+ nitrogen --set-zoom-fill --save $1
+# If you want a system notification, uncomment the next 3 lines.
+# notify-send -a "nnn" "Wallpaper changed!"
+# else
+# notify-send -a "nnn" "No image selected"
+ fi
+fi
diff --git a/plugins/paste b/plugins/paste
new file mode 100755
index 0000000..de130e4
--- /dev/null
+++ b/plugins/paste
@@ -0,0 +1,13 @@
+#!/usr/bin/env sh
+
+# Description: Paste contents of a text a file to paste.ubuntu.com using pastebinit
+#
+# pastebinit: https://launchpad.net/pastebinit
+#
+# Shell: POSIX compliant
+# Author: Arun Prakash Jana
+
+if ! [ -z "$1" ]; then
+ pastebinit "$1"
+ read input
+fi
diff --git a/plugins/picker b/plugins/picker
new file mode 100755
index 0000000..a500435
--- /dev/null
+++ b/plugins/picker
@@ -0,0 +1,26 @@
+#!/usr/bin/env sh
+
+# Description: Pick files and pipe the newline-separated list to another utility
+#
+# Shell: POSIX compliant
+# Author: Arun Prakash Jana
+#
+# Usage:
+# Copy this file in your $PATH, make it executable and preferably name it to picker.
+# Run commands like:
+# ls -l `picker`
+# cd `picker`
+# vimdiff `picker`
+# or, in fish shell:
+# ls -l (picker)
+# cd (picker)
+# vimdiff (picker)
+#
+# NOTE: This use case is limited to picking files, other functionality may not work as expected.
+
+nnn -p /tmp/picked
+
+if [ -f /tmp/picked ]; then
+ cat /tmp/picked | tr '\0' '\n'
+ rm /tmp/picked
+fi
diff --git a/plugins/pywal b/plugins/pywal
new file mode 100755
index 0000000..161bbb5
--- /dev/null
+++ b/plugins/pywal
@@ -0,0 +1,16 @@
+#!/usr/bin/env sh
+
+# Description: Set the selected image as wallpaper using pywal and change the terminal color schemes. Just put the cursor on a image and run the script.
+#
+# Shell: POSIX Compliant
+# Author: juacq97
+
+if ! [ -z "$1" ]; then
+ if [ $(mimetype --output-format %m $1 | awk -F '/' '{print $1}') == "image" ]; then
+ wal -i $1
+# If you want a system notification, uncomment the next 3 lines.
+# notify-send -a "nnn" "Wallpaper changed!"
+# else
+# notify-send -a "nnn" "No image selected"
+ fi
+fi
diff --git a/plugins/sxiv b/plugins/sxiv
new file mode 100755
index 0000000..ef21cf7
--- /dev/null
+++ b/plugins/sxiv
@@ -0,0 +1,8 @@
+#!/usr/bin/env sh
+
+# Description: Open images in current directory in sxiv
+#
+# Shell: POSIX compliant
+# Author: Arun Prakash Jana
+
+sxiv -q * >/dev/null 2>&1 &
diff --git a/plugins/transfer b/plugins/transfer
new file mode 100755
index 0000000..7201b0b
--- /dev/null
+++ b/plugins/transfer
@@ -0,0 +1,16 @@
+#!/usr/bin/env sh
+
+# Description: Upload a file to transfer.sh
+#
+# Shell: POSIX compliant
+# Author: Arun Prakash Jana
+
+if ! [ -z "$1" ]; then
+ # Upload the file, show the download link and wait till user presses any key
+ curl -s --upload-file "$1" https://transfer.sh/`basename "$1"`
+ echo
+ read input
+
+ # To write download link to "$1".loc and exit
+ # curl -s --upload-file "$1" https://transfer.sh/`basename "$1"` -o `basename "$1"`.loc
+fi
diff --git a/plugins/upgrade b/plugins/upgrade
new file mode 100755
index 0000000..83b9949
--- /dev/null
+++ b/plugins/upgrade
@@ -0,0 +1,24 @@
+#!/usr/bin/env sh
+
+# Description: Check and update to latest version of nnn manually on Debian 9 Stretch
+#
+# Shell: POSIX-compliant
+# Author: Arun Prakash Jana
+# NOTE: This script installs a package, should be issued with admin privilege
+
+cur=`nnn -v`
+new=`curl -s "https://github.com/jarun/nnn/releases/latest" | grep -Eo "[0-9]+\.[0-9]+"`
+
+if [ $cur_ver == $new_ver ]; then
+ echo 'Already at latest version'
+ exit 0
+fi
+
+# get the package
+wget "https://github.com/jarun/nnn/releases/download/v$new/nnn_$new-1_debian9.amd64.deb"
+
+# install it
+sudo dpkg -i nnn_$new-1_debian9.amd64.deb
+
+# remove the file
+rm -rf nnn_$new-1_debian9.amd64.deb