Introducción

Traducción al Español que llevé a cabo sobre lo citado en su repositorio.

Los plugins amplían las capacidades de nnn. Son scripts ejecutables (o binarios) con los que nnn puede comunicarse y activar. Este mecanismo encaja perfectamente con el diseño fundamental para mantener el núcleo del gestor de archivos ligero y rápido, delegando tareas repetitivas (pero no necesariamente específicas del gestor de archivos) a los plugins que se pueden ejecutar con teclas de acceso rápido personalizadas.

nnn es agnóstico en cuanto al lenguaje de los plugins. Puede escribir un plugin en cualquier lenguaje (de scripting) en el que se sienta cómodo.

Listado de Complementos

Complemento [a-z]DescripciónLengDependencias
autojumpNavega hasta dir/rutashjump, autojump, zoxide, z, z.lua
boomReproduce música aleatoria del dirshmoc
bulknewCrea varios archivos/directorios a la vezbashsed, xargs, mktemp
cdpathcd al directorio desde CDPATHshfzf
chksumCrea y verifica sumas de comprobaciónshmd5sum, sha256sum
cmusqPone en cola/reproducir archivos/directorios en el reproductor cmusshcmus pgrep
diffDiff para la selección (limitado a 2 para los directorios)shvimdiff, mktemp
dragdropArrastrar/soltar archivos desde/hacia nnnshdragon
dupsLista de archivos duplicados no vacíos en el directorio actualbashfind, md5sum, sort uniq xargs
finderEjecuta comando find personalizado (almacenado en histfile) y lista.sh-
fixnameLimpia el nombre del archivo para que sea más fácil de usar.bashsed
fzcdBúsqueda difusa en varios directorios (o $PWD) y visita al archivoshfzf, (find)
fzhistSelecciona un cmd del historial, edítalo en $EDITOR y ejecútaloshfzf, mktemp
fzopenBúsqueda difusa de archivos en el subárbol para editarlos/abrirlos/elegirlos.sh fzf, xdg-open/open
fzplugFuzzy encuentra, previsualiza y ejecuta otros pluginsshfzf
getplugActualiza plugins a la versión nnn instaladashcurl
gitrootCambia a la raíz del repositorio git actualshgit
gpgeCifrar/descifrar archivos mediante GPGshgpg
gutenreadNavega, descarga, lee desde el Proyecto Gutenbergshcurl, unzip, w3m epr (opcional)
gsconnectImplementación de kdeconnect en GNOME.shgsconnectp
imgresizeRedimensiona por lotes las imágenes en dir a la resolución de pantalla.sh imgp
imgurSube una imagen a imgur (desde imgur-screenshot).bash-
imgviewVer imágenes (en miniatura), establece fondos de pantalla, renombra y mucho más.shConsulte la documentación del archivo.
ipinfoObtiene la dirección IP externa y la información whoisshcurl, whois
kdeconnectEnvía los archivos seleccionados a un dispositivo Android.shkdeconnect-cli
launchLanzador de aplicaciones GUI.shfzf
mimelistListar archivos por mime en el subárbol.sh-
moclyricsMostrar la letra de la canción que se reproduce en el mocshddgr, moc
mocqCola/reproducir selección/dir/archivo en moc.shmoc
mp3convExtraer audio de multimedia como mp3shffmpeg
mtpmountAlternar montaje de dispositivo MTP (ej. Android)shgvfs-tmp
nbackRealiza una copia de seguridad de nnn config.shtar, awk, mktemp
nmountConmutar el estado de montaje de un dispositivo como usuario normal.shpmount, udisks2
nukeAbridor de archivos de ejemplo (sólo CLI por defecto).shVéase la documentación del archivo
oldbigfileListar archivos grandes por tiempo de acceso.shfind, sort
openallAbre los archivos seleccionados. juntos o uno a uno.bash-
organizeOrganizar automáticamente los archivos en directorios por tipo de archivo.sh file
pdfreadLee en voz alta un PDF o un archivo de texto.shpdftotext, mpv, pico2wave
preview-tabbedVista previa de archivos con Tabbed/xembed.bash Véase la documentación del archivo.
preview-tuiVista previa con Tmux. kitty, QuickLook, xterm, $TERMINAL.shVéase la documentación del archivo.
pskillLista difusa por nombre y matar proceso o zombi.shfzf, ps, sudo/doas
renamerRenombra por lotes una selección o archivos en dir.shqmv/vidir
ringtoneCrea un tono de llamada mp3 con tasa de bits variable a partir de un archivo.shdate, ffmpeg
rsynccpProporciona el porcentaje de progreso en modo verboso de acciones copiar y pegar.shrsync
splitjoinDividir archivo o unir selección.shsplit, cat
sueditEditar archivo con permisos de superusuarioshsudoedit, sudo, doas
togglexConmuta el modo ejecutable para la selecciónshchmod2
umounttreeDesmonta un punto de montaje remoto desde.shfusermount
uploadSube a Firefox Send o ix.io (texto) o file.io (bin).shffsend, curl, jq, tr
x2selCopia lista de archivos del portapapeles del sistema a la selección.shConsulte la documentación del archivo.
xdgdefaultEstablece la aplicación predeterminada para el tipo de archivo sobre el que se pasa el cursor.shxdg-utils, fzf, dmenu

Nota

  1. Un plugin tiene que solicitar explícitamente a nnn que borre la selección, por ejemplo, después de operar con los archivos seleccionados.
  2. Los archivos que comienzan con un punto en el directorio de plugins son archivos internos y no deben utilizarse como plugins.



Instalación

El siguiente comando instala o actualiza (después de la copia de seguridad) todos los plugins:

1
sh -c "$(curl -Ls https://raw.githubusercontent.com/jarun/nnn/master/plugins/getplugs)"

Los complementos se instalan en ${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins.



Configuración

Configure la variable de entorno NNN_PLUG para asignar combinaciones de teclas e invocar plugins directamente utilizando el atajo de teclado del plugin (;) seguido del carácter de tecla asignado. Por ejemplo, con la siguiente configuración:

1
export NNN_PLUG='f:finder;o:fzopen;p:mocq;d:diffs;t:nmount;v:imgview'

plugin finder puede invocarse con la combinación de teclas ;f, fzopen puede ejecutarse con ;o y así sucesivamente... Los pares de teclas y plugins se muestran en la ayuda y en la pantalla de configuración.

Alternativamente, se puede combinar con Alt (es decir, Alt+tecla).

Para seleccionar y ejecutar un complemento no asignado, pulse Enter (para entrar en el directorio del plugin) en el indicador del plugin.

Para ejecutar un plugin al inicio, utilice la opción -P seguida de la tecla del complemento.

Si la lista de plugins es demasiado larga, pruebe a dividirlos en secciones:

NNN_PLUG_PERSONAL='g:personal/convert2zoom;p:personal/echo'
NNN_PLUG_TRABAJO='j:trabajo/prettyjson;d:trabajo/foobar'
NNN_PLUG_ENLINEA='e:!go run "$nnn"*'
NNN_PLUG_PORDEFECTO='1:ipinfo;p:preview-tui;o:fzz;b:nbak'
NNN_PLUG="$NNN_PLUG_PERSONAL;$NNN_PLUG_TRABAJO;$NNN_PLUG_PORDEFECTO;$NNN_PLUG_ENLINEA"
export NNN_PLUG

Nota

  • 'g:personal/convert2zoom' buscará en la subcarpeta personal dentro de la carpeta del complemento.
  • 'b:boom;b:bulknew' hará que sólo se use la primera definición de b (b:boom).
  • Una definición de keybinding de más de 1 carácter impedirá que se inicie nnn.

Omitir la actualización del directorio después de ejecutar un complemento [-]

nnn actualiza el directorio después de ejecutar un plugin para reflejar cualquier cambio realizado por el plugin. Para desactivarlo, añada un - antes del nombre del complemento:

1
export NNN_PLUG='p:-plugin'


Ejecutando comandos como plugin [!]

Para asignar claves a comandos cli arbitrarios que no estén en segundo plano e invocarlos como plugins, añada ! antes del comando.

1
export NNN_PLUG='x:!chmod +x "$nnn";g:!git log;s:!smplayer "$nnn"'

Ahora ;x puede usarse para hacer ejecutable un archivo, ;g puede usarse para el git log de un directorio de proyecto git, ;s puede usarse para previsualizar un archivo multimedia parcialmente descargado.

Omitir la confirmación del usuario tras la ejecución del comando [*]

nnn espera la confirmación del usuario (el prompt Press Enter to Continue (Pulse Enter para continuar)) después de ejecutar un comando como complemento (a diferencia de los complementos que pueden añadir un read para esperar). Para omitir esto, añada un * después del comando.

1
export NNN_PLUG='s:!smplayer "$nnn"*;n:-!vim /home/tano/Dropbox/Publico/nota_sincronizada*'

Ahora no habrá prompt después de ;s y ;n.

Nota

No use * con programas que se ejecutan y salen, por ejemplo, cat.

Ejecutar una aplicación GUI como complemento [&]

¡Para ejecutar una aplicación GUI como complemento, añada & después de !.

1
export NNN_PLUG='m:-!&mousepad "$nnn"'

Página de salida de comandos no interactivos [|]

¡Para mostrar la salida de comandos de ejecución y salida que no necesitan la entrada del usuario, añada | (pipe, tubería) después de !.

1
export NNN_PLUG='m:-!|mediainfo "$nnn";t:-!|tree -ps;l:-!|ls -lah --group-directories-first'

Esta opción es incompatible con & (la salida del terminal se enmascara para los programas GUI) e ignora * (la salida ya está paginada para el usuario).

Importante

  1. Coloque $nnn (o las variables exportadas) entre comillas dobles ("$nnn").
  2. Use comillas simples para $NNN_PLUG para que no se interprete "$nnn".
  3. (De nuevo) añada ! antes del comando.
  4. ¡Para desactivar la actualización de directorios después de ejecutar un comando como plugin, anteponga -!

Algunos ejemplos útiles de comandos de teclado

tecla:comandoDescripción
c:!convert "$nnn" png:- | xclip -sel clipboard -t image/png*Copiar imagen al portapapeles.
C:!cp -rv "$nnn" "$nnn".cpCrear una copia del archivo cuando el puntero pasa sobre él.
e:-!sudo -E vim "$nnn"*Editar archivo con vim como superusuario.
g:-!git diffMuestra diferencias en el estado de un repositorio git.
h:-!hx "$nnn"* Muestra archivo sobrevolado en el editor hexadecimal hx.
k:-!fuser -kiv "$nnn"*Matar proceso interactivamente usando el archivo sobre el que se desplaza el puntero del mouse.
l:-!git logMuestra log de repositorio git.
n:-!vi /home/usuario/Dropbox/dir/nota*Toma notas rápidas en un archivo/directorio de notas sincronizado.
p:-!less -iR "$nnn"*Navega el archivo sobre el que se pasa el puntero del mouse usando el paginador less.
s:-!&smplayer -minigui "$nnn" Reproducir archivos multimedia sobrevolados, incluso descargas inacabadas.
x:!chmod +x "$nnn"Hacer ejecutable el archivo sobrevolado.
y:-!sync*Vaciar/limpiar escrituras en caché.


Nivel de acceso de los complementos

Cuando nnn ejecuta un complemento, hace lo siguiente:

  • Cambia el directorio donde se va a ejecutar el complemento ($PWD apunta al directorio activo).
  • Pasa tres argumentos al script:
    • $1: El nombre del fichero sobre el que se pasa el cursor.
    • $2: El directorio de trabajo (puede diferir de $PWD en caso de rutas con enlaces simbólicos; no canónico).
    • $3: El archivo de salida del modo selector (- para stdout (salida estándar)) si nnn se ejecuta como selector de archivos.
  • Establece la variable de entorno NNN_PIPE usada para controlar el directorio nnn activo.
  • Establece la variable de entorno NNN_INCLUDE_HIDDEN a 1 si los archivos ocultos están activos, 0 en caso contrario.
  • Establece la variable de entorno NNN_PREFER_SELECTION a 1 si el usuario prefiere utilizar la selección (véase la bandera -u de nnn), 0 en caso contrario.
  • Exporta las Variables Especiales.

Los complementos también pueden leer el archivo .selection en el directorio config.



Cree sus propios complementos

Los complementos pueden escribirse en cualquier lenguaje de programación. Sin embargo, se prefieren los scripts de shell compatibles con POSIX ejecutables en sh.

Haga que el archivo sea ejecutable. Colóquelo en el directorio de complementos. Opcionalmente, añada una tecla de acceso rápido en $NNN_PLUG para uso frecuente.

Envío de datos a nnnn

nnn proporciona un mecanismo para que los complementos envíen datos a nnn para controlar su directorio activo o invocar el modo lista. La forma de hacerlo es escribiendo en la tubería apuntada por la variable de entorno NNN_PIPE. El complemento debe escribir una única cadena en el formato (<->)<ctxcode><opcode><data> sin una nueva línea al final. Por ejemplo, 1c/etc.

El caracter - opcional al principio de la cadena indica a nnn que borre la selección. En los casos en que la transferencia de datos a nnn tenga que ocurrir mientras se lee el archivo de selección (por ejemplo, en un bucle), el complemento debe crear una copia tmp del archivo de selección, informar a nnn para que borre la selección y luego hacer el procesamiento subsiguiente con el archivo tmp. Un cmd paginado [|] o GUI [&] ejecutado como complemento no puede borrar la selección.

El ctxcode indica el contexto para cambiar el directorio activo de.

Código de contextoSignificado
+Contexto inteligente (próximo inactivo si no actual).
0Contexto actual.
1-4Número de contexto.

El opcode indica el tipo de operación.

OpcodeOperación
cCambia de directorio.
lMuestra archivos en modo lista.
pArchivo de selección sobrescrito.

Para facilitar el proceso, hemos creado un script de ayuda llamado .nnn-plugin-helper y una función llamada nnn_cd. nnn_cd recibe la ruta a la que se va a cambiar como primer argumento y el contexto como segundo argumento opcional. Si no se proporciona un contexto, se solicita explícitamente. Para saltarse esto y elegir el contexto actual, establezca la variable CUR_CTX en .nnn-plugin-helper (o en el complemento específico después de obtener .nnn-plugin-helper) a 1. Puede encontrar ejemplos de uso en la sección Ejemplos.

Recibir una notificación al pasar el ratón por encima de un archivo

Si se establece NNN_FIFO, nnn lo abrirá y escribirá todos los archivos sobre los que se pase el ratón. Esto se puede utilizar en complementos y scripts externos, por ejemplo, para implementar vistas previas de archivos.

No olvide bifurcar en segundo plano para evitar el bloqueo de nnn.

Para más detalles sobre la configuración y uso de los complementos de previsualización, visite Live Previews.



Ejemplos

Hay muchos plugins proporcionados por nnn que se pueden utilizar como ejemplos. He aquí algunos ejemplos sencillos seleccionados.

Muestra el registro git de los cambios realizados en el archivo concreto junto con el código para una revisión rápida y sencilla.

1
2
3
#!/usr/bin/env sh git log -p -- "$1"

Cambio de directorio en el portapapeles mediante script de ayuda

1
2
3
4
5
#!/usr/bin/env sh . $(dirname $0)/.nnn-plugin-helper nnn_cd "$(xsel -ob)"

Cambiar el directorio a la ubicación de un enlace utilizando un script de ayuda con un contexto específico (actual)

1
2
3
4
5
#!/usr/bin/env sh . $(dirname $0)/.nnn-plugin-helper nnn_cd "$(dirname $(readlink -fn $1))" 0

Cambiar a un directorio arbitrario sin script de ayuda

1
2
3
4
5
6
#!/usr/bin/env sh printf "cd to: " read -r dir printf "%s" "0c$dir" > "$NNN_PIPE"

Enviar todos los archivos sobre los que se pase el ratón a la selección X

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env sh if [ -z "$NNN_FIFO" ] ; then exit 1 fi while read FILE ; do printf "%s" "$FILE" | xsel done < "$NNN_FIFO" & disown

Búsqueda (find) rápida de la primera coincidencia en el subárbol y abrir en nuke

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env sh NUKE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins/nuke" printf "file name: " read -r pattern entry=$(find . -type f -iname "$pattern" -print -quit 2>/dev/null) if [ -n "$entry" ]; then "$NUKE" "$entry" fi

Búsqueda rápida (usando fd)

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env sh . "$(dirname "$0")"/.nnn-plugin-helper printf "pattern: " read -r pattern if [ -n "$pattern" ]; then printf "%s" "+l" > "$NNN_PIPE" eval "fd -HI $pattern -0" > "$NNN_PIPE" fi

Búsqueda rápida con grep usando gr

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env sh . "$(dirname "$0")"/.nnn-plugin-helper printf "pattern: " read -r pattern if [ -n "$pattern" ]; then printf "%s" "+l" > "$NNN_PIPE" eval "rg -l0 --hidden -S $pattern" > "$NNN_PIPE" fi


Contribuyendo plugins

  1. Añada secciones informativas como Descripción, Notas, Dependencias, Shell, Autor, etc. en el plugin.
  2. Añada una entrada en la tabla anterior. Tenga en cuenta que la lista está ordenada alfabéticamente por el nombre del plugin.
  3. Mantenga los comandos no portables (como notify-send) comentados para que los usuarios de cualquier otro SO/DE no se sorprendan.
  4. El archivo del plugin debe ser ejecutable.
  5. Si su plugin almacena datos, use ${XDG_CACHE_HOME:-$HOME/.cache}/nnn. Documéntelo en el archivo.