aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/preview-kitty
blob: af51cee0bd51d2b05d3206b5d07ec1e8e6148d2d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/env sh

# Description: File previewer for kitty term using NNN_FIFO
#
# Dependencies:
#   - kitty (https://sw.kovidgoyal.net/kitty/) with allow_remote_control on
#   - file
#   - exa (https://github.com/ogham/exa) (fallback: ls)
#   - bat (https://github.com/sharkdp/bat) (fallback: cat)
#   - mediainfo (fallback: file)
#
# Usage:
#   This plugin only works in kitty (https://sw.kovidgoyal.net/kitty/),
#   and with kitty's 'allow_remote_control' option turned on.
#   You need to set a NNN_FIFO path and set a key for the plugin,
#   then start `nnn`:
#
#     $ NNN_FIFO=/tmp/nnn.fifo nnn
#
#   Then in `nnn`, launch the `preview-kitty` plugin.
#
#   If you provide the same NNN_FIFO to all nnn instances, there will be a
#   single common preview window. If you provide different FIFO path, they
#   will be independent.
#
# Shell: POSIX compliant
# Authors: Léo Villeveygoux

preview_file () {
    kill %% 2>/dev/null
    clear
    lines=$(($(tput lines)-1))
    cols=$(tput cols)
    mime="$(file -b --mime-type "$1")"
    encoding="$(file -b --mime-encoding "$1")"

    if [ -d "$1" ]; then
        # Print directory tree
        # shellcheck disable=SC2015
        cd "$1" && \
        (COLUMNS=$cols exa -G --colour=always 2>/dev/null ||\
        ls --color=alway) | head -n $lines &
    # remove second clause to preview SVG files (but this is slow)
    elif [ "${mime%%/*}" = "image" ] && [ "$encoding" = "binary" ] ; then
        kitty +kitten icat --silent --transfer-mode=stream --stdin=no "$1" &
    elif [ "$encoding" = "binary" ] ; then
        # Binary file: show file info
        printf -- "-------- \033[1;31mBinary file\033[0m --------\n"
        (mediainfo "$1" 2>/dev/null || file -b "$1") | head -n $((lines - 1)) &
    else
        # Text file: print colored file content
        (bat --terminal-width="$cols" --paging=never --decorations=always \
            --color=always "$1" 2>/dev/null || cat) | head -n $lines &
    fi
}

if [ "$PREVIEW_MODE" ] ; then
    if [ ! -r "$NNN_FIFO" ] ; then
        echo "No FIFO available! (\$NNN_FIFO='$NNN_FIFO')" >&2
        read -r
        exit 1
    fi

    preview_file "$1"

    # use cat instead of 'exec <' to avoid issues with dash shell
    # shellcheck disable=SC2002
    cat "$NNN_FIFO" |\
    while read -r selection ; do
        preview_file "$selection"
    done
    exit 0
fi

kitty @ launch --no-response --title "nnn preview" --keep-focus \
      --cwd="$PWD" --env "NNN_FIFO=$NNN_FIFO" --env "PREVIEW_MODE=1" \
      "$0" "$1" > /dev/null