Inicio

Traducción al Español que hice sobre la Wiki publicada en el repositorio del navegador.


Aumente su productividad

nnn (n3) un completo gestor de archivos de terminal. Es diminuto, casi 0-configurado e increíblemente rápido. Está diseñado para ser discreto con flujos de trabajo inteligentes para adaptarse a los trenes de pensamiento.

nnn puede analizar el uso del disco, renombrar por lotes, lanzar aplicaciones y seleccionar archivos. El repositorio de plugins tiene toneladas de plugins para ampliar las capacidades aún más, por ejemplo, Previsualización en directo (vista previa), (des)montar discos, buscar y listar, archivo/dir diff, subir archivos. Un marco de parches aloja un número considerable de parches enviados por los usuarios, que son de naturaleza subjetiva.

Plugins (neo)vim independientes - nnn.vim, vim-floaterm nnn wrapper y nnn.nvim (neovim exclusive).

Se ejecuta en el Pi, Termux (Android), Linux, macOS, BSD, Haiku, Cygwin, WSL, a través de DEs o un entorno estrictamente CLI.

(hay más)

Características

  • Calidad
    • Respetuoso con la privacidad (no recopila datos del usuario sin confirmar)
    • Compatible con POSIX, sigue el estilo de codificación del núcleo Linux
    • Código altamente optimizado e integrado con análisis estático
  • Sobrio
    • Normalmente necesita menos de 3,5 MB de memoria residente
    • Funciona con 8 colores (y xterm 256 colores)
    • Sensible a Disk-IO (pocas lecturas y escrituras de disco)
    • No usa FPU (todas las matemáticas son enteras, incluso para tamaño de fichero)
    • Minimiza el refresco de pantalla con rápidos redibujados de líneas
    • Binario pequeño (normalmente alrededor de 100 KB)
    • Modo de 1 columna para terminales y factores de forma más pequeñosnnnnn
    • Hackable - compilar dentro / fuera características y dependencias
  • Portable
    • Plugins independientes del idioma
    • Binario estático disponible (sin necesidad de instalación)
    • Bibliotecas mínimas, fácil de compilar
    • Sin archivo de configuración, configuración mínima con valores predeterminados razonables
    • Plugin de copia de seguridad de la configuración
    • Ampliamente disponible en muchos empaquetadores
    • Accesos directos táctiles para dispositivos portátiles
    • Compatible con Unicode
  • Modos
    • Ligero (por defecto), detallado
    • Analizador de uso de disco (bloque/aparente)
    • Selector de archivos, plugin (neo)vim
  • Navegación
    • Filtro con entrada dir automática en caso de coincidencia única
    • Modo Type-to-nav (turbo navegación/siempre filtro)
    • Contextos (pestañas/espacios de trabajo) con colores personalizados
    • Sesiones, marcadores, marcar y visitar un dir
    • Montajes remotos (necesita sshfs, rclone)
    • Atajos familiares (flechas, ~, -, @), búsqueda rápida
    • cd al salir (fácil integración con shell)
    • Pasar al archivo siguiente al abrir y seleccionar un archivo
  • Búsqueda
    • Filtrado instantáneo con búsqueda por tipo
    • Filtros Regex (POSIX/PCRE) y de cadena (por defecto)
    • Complemento de búsqueda en subárboles para abrir o editar archivos
  • Ordenar
    • Ordenación de nombres puramente numéricos por defecto (visita /proc)
    • Ordenación por versión insensible a mayúsculas y minúsculas (aka natural)
    • Por nombre, access/change/mod (por defecto) time, size, extn
    • Ordenación inversa
    • Ordenación específica por directorio
  • Mimes
    • Vista previa de los archivos sobre los que se pasa el ratón en un previsualizador basado en FIFO
    • Abrir con el abridor del escritorio o especificar un abridor personalizado
    • Colores específicos para archivos (o dirs mínimos en color de contexto)
    • Compatibilidad con iconos y emojis (personalización y compilación)
    • Plugin para miniaturas de imagen, vídeo y audio
    • Crear, listar, extraer (a), montar (basado en FUSE) archivos comprimidos
    • Opción de abrir todos los archivos de texto en $EDITOR
  • Cómodo
    • Estadísticas detalladas de archivos e información mime
    • Ejecución de plugins y comandos personalizados con teclas de acceso rápido
    • Integración de la utilidad de papelera compatible con FreeDesktop
    • Selección cruzada de archivos/todos/rangos
    • Crear (con padres), renombrar, duplicar archivos y directorios
    • Creación de un nuevo archivo o directorio (árbol) al inicio
    • Renombrador por lotes para selección o directorio
    • Listar flujo de entrada de rutas de archivos desde stdin o plugin
    • Copiar (as), mover (as), borrar, archivar, enlazar selección
    • Actualizaciones de directorio, notificación de finalización de cp, mv, rm
    • Copiar rutas de archivos al portapapeles del sistema al seleccionar
    • Iniciar aplicaciones, ejecutar comandos, generar un intérprete de comandos, alternar exe
    • Acceso a rutas/archivos contextuales en el prompt o en el shell generado
    • Bloqueo del terminal tras un tiempo de inactividad configurable
    • Capturar y mostrar la salida de un programa en la pantalla de ayuda
    • Soporte básico para lectores de pantalla y pantallas braille

Inicio Rápido

  1. Instale nnn y las dependencias que necesite.
  2. El abridor de escritorio es el predeterminado. Use -e para abrir archivos de texto en el terminal. Opcionalmente abralo de forma independiente (vea Texto aparte).
  3. Configurar cd al salir.
  4. Sincronizar subshell $PWD a nnn.
  5. Instalación de Complementos nnn.
  6. Use -x para sincronizar la selección al portapapeles, mostrar notificaciones en cp, mv, rm y configurar el título de xterm.
  7. Para un entorno sólo CLI, establezca NNN_OPENER (vea Configuración) a nuke. Use la opción -c.
  8. Despídase de ls, alias ls='nnn -de'
  9. Visita las páginas Previsualización en directo y "Solución de problemas" (Vea la sección con ese nombre en el índice de la izquierda)

¡No memorice!. Flechas, /, q son suficientes. Tab: crea y/o cicla contextos. ?: lista los atajos.

Desarrolladores



Dependencias

Una biblioteca curses con soporte de caracteres anchos (por ejemplo, ncursesw), libc y libreadline (opcional).

Utilidad que depende de ¿Instalar? Operación
xdg-open (Linux)/open(1) (macOS)/cygstart (Cygwin)/open (Haiku) base Apertura por defecto
file, coreutils (cp, mv, rm), xargs, sed base tipo de archivo, copiar, (re)mover
GNU sed (non-Linux) requerido copiar, (re)mover
tar, (un)zip [bsdtar/atool/(un)rar for more formats] base administrador archivo
archivemount, fusermount(3)/umount (macOS) opcional (des)montar archivos
sshfs/rclone, fusermount(3)/umount (macOS) opcional (des)montar unidades remotas
gio trash/trash-cli opcional papelera [por defecto: rm -rf]
vlock (Linux)/bashlock (macOS)/lock(1) (BSD)/peaclock (Haiku) opcional bloqueo de terminal
advcpmv (Linux) (integración) opcional copiar, mover, indicador de progreso
$VISUAL/$EDITOR, $PAGER, $SHELL opcional alternativa a: vi, less, sh


Instalación

¿No puede instalar los paquetes? Obtenga el binario enlazado estáticamente de la última versión.

Liberación de paquetes

Distribución RPM mantenida oficialmente + un paquete Arch está disponible en Openbuildservice.
Los paquetes para Debian y Ubuntu y un binario estático se generan con la última versión.

Desde el gestor de paquetes de su Distribución

Aquí se puede consultar la versión de nnn según el gestor de paquetes correspondiente a cada Distribución.

Desde el código fuente

Descargue la última versión o clone este repositorio (arriesgado), instale las dependencias y compile. En Ubuntu 18.04:

	sudo apt-get install pkg-config libncursesw5-dev libreadline-dev
	sudo make strip install

Se admite PREFIX, en caso de que desee instalar en una ubicación diferente.

Consulte las guías del desarrollador para la verificación del código fuente, notas específicas de la plataforma y otros consejos.

Compleción de Shell

Existen scripts de finalización para Bash, Fish y Zsh. Consulte el manual de su shell para instalarlos.

Complementos

Visite la página de complementos.



Configuración

00_esq-colores.pngEl nuevo esquema de colores (config NNN_FCOLORS): ¡un festín para los ojos!

No hay archivo de configuración. Los archivos asociados se encuentran en

${XDG_CONFIG_HOME:-$HOME/.config}/nnn/

Use el plugin nbak para hacer una copia de seguridad de la configuración.

nnn admite algunas variables de entorno opcionales (que puede configurar si lo necesita).

Ejemplo export Descripción
NNN_OPTS="cEnrx"opciones binarias a nnn
NNN_OPENER="/path/to/custom/opener"abridor personalizado (vea plugin nuke)
NNN_BMS="d:$HOME/Documents;D:$HOME/Docs archive/" 1 pares clave-marca
NNN_PLUG='o:fzopen;m:nmount;x:!chmod +x $nnn'1 pares clave-plugin (o cmd)
NNN_ORDER='t:/home/user/Downloads;S:/usr/bin' 2 pedidos a directorios específicos
NNN_ARCHIVE="\\.(7z|bz2|gz|tar|tgz|zip)$" 3 archivos: [por defecto: bzip2, (g)zip, tar]
NNN_ARCHMNT='fuse-archive' montador de archivos [por defecto: archivemount]
NNN_COLORS='1234' (/'#0a1b2c3d'/'#0a1b2c3d;1234') 4 6 colores de contexto: [por defecto: '4444' (blue)]
NNN_FCOLORS='c1e2272e006033f7c6d6abc4' 5 colores específicos de cada archivo
NNN_SSHFS='sshfs -o reconnect,idmap=user' 6 SSHFS cmd personalizado
NNN_TRASH=n (n=1: trash-cli, n=2: gio trash) usar la papelera del escritorio [por defecto: delete]
NNN_SEL='/tmp/.sel' archivo de selección personalizada
NNN_FIFO='/tmp/nnn.fifo' 7 FIFO en el que escribir la ruta del archivo sobrevolado
NNN_LOCKER='saidar -c' espacio de terminales
NNN_TMPFILE='/tmp/.lastd' siempre cd al salir
NNN_HELP='pwy paris' cuando se corre cmd, mostrar o/p en la página de ayuda
NNN_MCLICK='^R' (/'m') 8 tecla que emula el botón del medio del ratón
NO_COLOR=1 9 desactivar salida de color ANSI
  1. Los pares clave-marca y clave-plugin aparecen en la ayuda y en la pantalla de configuración (clave ?).
  2. Las teclas de ordenación pueden ser a/d/e/r/s/t/v (véase la opción del programa -T). Mayúsculas para invertir (excepto r). La ruta debe ser absoluta.
    Las marcas de tiempo de las entradas creadas/modificadas en menos de 5 minutos se muestran al revés.
  3. Con atool o bsdtar y (un)rar instalado puede tener:
    export NNN_ARCHIVE="\\.(7z|a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|rar|rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip)$"
    	
    bsdtar puede extraer, listar y archivemount puede montar imágenes cdrom ISO 9660 (extn: iso).
  4. Comprende 8 colores, xterm 256 colores o ambos. 01_colores-xterm.png Números hexadecimales que representan xterm 256 colores, tenga en cuenta que la anchura tiene que ser 2, por ejemplo "5" se convierte en "05"
    1. 8 números de colores:
      1. 0-negro
      2. 1-rojo
      3. 2-verde
      4. 3-amarillo
      5. 4-azul (por defecto)
      6. 5-magenta
      7. 6-cian
      8. 7-blanco
    2. Para especificar números hexadecimales de 256 colores de xterm, anteponga # (2 símbolos por contexto).
    3. Para especificar ambos, exporte números hexadecimales de 256 colores seguidos de un número de 8 colores como alternativa, separados por ;.
  5. Especifique los colores específicos del archivo en números hexadecimales de 256 colores xterm (2 símbolos hexadecimales por color).
    El pedido es estricto, use 00 para omitir/usar el color terminal predeterminado. Valores predeterminados:
    Orden Hex Color
    Dispositivo de bloque c1 Verde marino oscuro 1
    Dispositivo de caracter e2 Amarillo 1
    Directorio 27 Azul cielo profundo 1
    Ejecutable 2e Verde 1
    Regular 00 Normal
    Enlace duro 60 Ciruela 4
    Enlace simbólico 33 Cyan 1
    No presente OR (o) detalles de archivo f7 Gris 62
    Enlace simbólico huérfano c6 Rosa profundo 1
    FIFO d6 Naranja 1
    Socket ab Orquídea media 1
    Desconocido O archivo regular/ejecutable c4 Rojo 1
    1. Si el terminal soporta xterm 256 colores o más, se renderizarán los colores específicos del archivo.
    2. Para forzar el esquema de 8 colores use la opción -C.
    3. Si xterm no soporta 256 colores, se usará el esquema de 8 colores.
    4. Más temas.
  6. nnn y versiones anteriores tienen: NNN_CONTEXT_COLORS, NNN_SSHFS_OPTS y NNN_RCLONE_OPTS
  7. Si el archivo FIFO no existe, se creará, pero nunca se eliminará.
  8. Sólo se tiene en cuenta el primer carácter si no es una combinación Ctrl-tecla.
  9. Anulado por NNN_COLORS.


Opciones del programa

uso: nnn [opciones] [ruta]
El poco ortodoxo gestor de archivos del terminal.

posición de los argumentos:
 RUTA directorio_de_inicio/archivo [por defecto: .]

argumentos opcionales:
 -a auto NNN_FIFO
 -A no entrar automáticamente al directorio durante el filtro
 -b abrir clave de marcador (prevalece sobre -s/S)
 -B usar bsdtar para archivos
 -c un clic NNN_OPENER (prevalece sobre -e)
 -C esquema de 8 colores
 -d modo detalle
 -D directorios en color de contexto
 -e texto en $VISUAL/$EDITOR/vi
 -E ediciones internas en EDITOR
 -f use readline para el archivo histórico
 -F valor modo FIFO [0:vista previa 1:explorar]
 -g filtros de expresiones regulares
 -H mostrar archivos ocultos
 -i mostrar información del archivo actual
 -J no avanzar automáticamente al seleccionar
 -K detectar colisión de teclas
 -l valor para establecer cantidad líneas de desplazamiento
 -n modo escribir para navegar
 -o abrir archivos sólo con Enter
 -p archivo, selección archivo [-:stdout]
 -P clave, ejecutar clave plugin
 -Q no pedir confirmación para salir
 -r usar advcpmv (cp, mv parcheado) 
 -R sin rollover en los bordes
 -s nombre, cargar sesión por nombre
 -S sesión persistente
 -t segundos tiempo de espera para bloquear
 -T orden de clasificación por clave [a/d/e/r/s/t/v] -u usar selección (no prompt)
 -u usar selección (no prompt)
 -U mostrar usuario y grupo
 -V mostrar versión
 -x notis, selecciona sync, título de xterm
 -h mostrar ayuda

Nota

  1. nnn abre el directorio de trabajo actual si no se especifica una ruta (PATH).
  2. Si se especifica una ruta (PATH) y existe, nnn lo abrirá.
  3. Si la ruta (PATH) no existe y termina con /, nnn intentará crear el árbol de directorios y abrirlo. En caso contrario, PATH se considera una ruta a un fichero normal y nnn intenta crear el árbol de directorios completo hasta el fichero, abrir el directorio padre y solicitar la creación del nuevo fichero en él con el nombre de fichero base.
  4. Las claves para la opción -T son uso aparente del disco / uso del disco / extensión / revisión / tamaño (size) / tiempo / versión. Mayúsculas para invertir (excepto r).



Teclado, Ratón

NAVEGACIÓN
         Up k Arriba              PgUp ^U Página arriba
         Dn j Abajo               PgDn ^D Página abajo
         Lt h Padre               ~ ` @ - ~, /, unicio, previo
     Ret Rt l Abrir                     ' Primer archivo/partida
         g ^A Arriba                    J Saltar a entrada/desplazamiento
         G ^E Fin                      ^J Alternar avance automático al abrir
        B (,) Reservar(marcar)       b ^/ Seleccionar marcador
          1-4 Contexto            (Sh)Tab Ciclo/nuevo contexto
      2Esc ^Q Salir                     q Salir de contexto
           ^G SalirCD                   Q Elegir/err, salir
 
 FILTER & PROMPT
            / Filtro                   ^N Cambiar tipo a navegación
          Esc Salir del prompt         ^L Cambiar último filtro
            .  Alternar oculto    Alt+Esc Desfiltrar, salir de contexto
 
 ARCHIVOS
         o ^O Abrir con...              n Crear nuevo/vincular
         f ^F Detalles del archivo      d Conmutación del modo detallado
           ^R Renombrar/copiar          r Renombrar por lotes
            z Archivar                  e Editar archivo
            * Alternar exe              > Exportar lista
      Espacio + (Des)seleccionar      m-m Seleccionar rango/borrar
            a Seleccionar todo          A Invertir sel
         p ^P Copiar aquí            w ^W Cp/mv sel as
         v ^V Mover aquí                E Editar lista sel
         x ^X Borrar                    S Lista sel tamaño
          Esc Enviar a FIFO
 
 MISC
        Alt ; Seleccionar plugin        = Lanzar aplicación
         ¡! ^]  Shell                   ]  Cmd prompt
            c Conectar remoto           u Desmontar remoto/archivo
         t ^T Ordenar conmutadores      s Gestionar sesión
            T Establecer tipo de tiempo 0 Bloquear
           ^L Redibujar                 ?  Ayuda, conf

Nota

  1. Shift-Tab intenta crear un nuevo contexto, e invierte el ciclo cuando todos los contextos están activos.
  2. B añade un nuevo marcador en el directorio de marcadores (bookmark), , marca una ubicación en la memoria
  3. En el indicador de filtro, ^L alterna entre último filtro y desfiltro. Si no hay último filtro, sale del modo de filtro y vuelve a dibujar.
  4. Q finaliza con EXIT_FAILURE si no hay selección, o imprime la selección en stdout y finaliza con EXIT_SUCCESS.
  5. S muestra el tamaño total de los archivos seleccionados no filtrados que aparecen en un directorio. En el caso de los directorios, por defecto sólo se añade el tamaño del directorio. Para añadir el tamaño del contenido de un directorio, cambie al modo du.
  6. La ayuda y la configuración, los detalles del archivo y el listado de archivos se muestran en el $PAGER.
  7. Para cambiar los accesos directos, modifique los atajos de teclado en nnn.h y compile. La opción -K detecta las colisiones.
  8. Repita la ordenación con la tecla ^T para aplicar la ordenación por tiempo, tamaño y por defecto en el mismo orden.
  9. Hay parches de mapas de teclado disponibles para las distribuciones de teclado Colemak y Colemak-DH en marco de parches de usuarios de nnn.

Mapa gráfico

02_teclado.png Imagen de Léo Villeveygoux.

Aquí hay una versión del mapa de teclado en formato SVG.

Ratón

Clic Función
Un clic con . Visita el contexto.
Un clic con en la ruta actual. Visita directorio padre.
Uno o doble clic con en las dos últimas filas. Conmuta tipo de navegación.
Un clic con . Selecciona contexto o entrada.
Doble clic con . Selecciona contexto o abre entrada.
Un clic con . Añade entrada a la selección.
Un clic con . User configured with NNN_MCLICK

Combinación de teclas de control rota

Algunas combinaciones de teclas de control pueden no funcionar si están asignadas por stty. Para confirmarlo, ejecute stty -a y busque conflictos de combinación de teclas. Algunas de las más comunes son: ^Q start, ^S (stop), ^V (lnext).

Para eliminar la asignación de stty:

stty start undef
stty stop undef
stty lnext undef


Símbolos

Indicadores de archivos

Listado 1 Listado 2
IndicadorTipo de Archivo
/Directorio
*Ejecutable
|FIFO
=Socket
IndicadorTipo de Archivo
@Enlace simbólico a archivo
bDispositivo de bloque
cDispositivo de caracter
?Desconocido

Nota

Todos los enlaces (hard/sym, duros y blandos) están atenuados.

Símbolos de la barra de estado

SímbooSignificado
x/yNúmero/s de archivo/s actuales/total
+/*(n)Modo de selección activado/selección de rango activada (recuento seleccionado con buffer) [invertido].
HSe enumeran los archivos ocultos.
MTiempo de modificación ordenado.
ATiempo de acceso ordenado.
CCambio de hora ordenado.
STamaño ordenado
EExtensión de archivo ordenada.
VVersioń ordenada.
RClasificación inversa.
duUso de disco.
auUso aparente de disco.
->Destino del enlace simbólico.
n-nNúmero de enlaces duros - Número de inodo.



Tamaño de archivo

La unidad mínima de tamaño de archivo es el byte (B). El resto son K, M, G, T, P, E, Z, Y (potencias de 1024), igual que las unidades por defecto en ls.



Ayuda

Desde terminal

nnn -h
man nnn

Para buscar atajos de teclado en tiempo de ejecución, pulse ?.

usuario1: ¿Cómo se compara con Midnight Commander?.
usuario2: También funciona a la luz del día.
         - de una conversación en reddit


Contextos

Previsualización en directo (vista previa) de un directorio de proyecto como ejemplo.

Abrir varias ubicaciones con 4 contextos. El estado se muestra en la esquina superior izquierda:

  • El contexto actual aparece en vídeo inverso.
  • Los demás contextos activos aparecen subrayados.
  • El resto están inactivos.

Crea y cicla contextos usando Tab o Mayús+Tab. Un nuevo contexto copia el estado del contexto anterior.

Use colores específicos para cada contexto (consulte la configuración NNN_COLORS) para identificarlos fácilmente.

Panel dual

03_dual-pane.png

nnn puede trabajar con múltiples contextos usando Tab o Shift+Tab.

Otras soluciones:

  1. Multiplexadores de terminal (tmux, GNU Screen, dvtm, SplitVT).
  2. Emuladores de terminal que permitan dividir su propia ventana (split).

Por ejemplo, para abrir 2 instancias en dvtm, ejecute: dvtm n n.

También puede tener un alias: alias 2="dvtm n n".

o una función Bash (con Ctrl-\ (^\) como modificador dvtm) para manejar los argumentos:

2 ()
{
    dvtm -m '^\' "nnn -nr $@" "nnn -nr $@"
}


Sesiones

Las sesiones son una forma de guardar y restaurar estados de trabajo. Una sesión almacena los ajustes y contextos. Las sesiones pueden cargarse en tiempo de ejecución o con una opción del programa.

Importante

  1. Cuando se carga una sesión en tiempo de ejecución, el último estado de trabajo se guarda automáticamente en un archivo de sesión dedicado, la "sesión automática". La opción restaurar sesión restauraría la "sesión automática".
  2. La opción de sesión persistente es global. Si se utiliza, la última sesión activa se actualizará con el estado final al salir del programa.
  3. La "sesión automática" se utiliza en el modo de sesión persistente si no hay ninguna sesión activa.
  4. Listar el flujo de entrada y abrir un marcador por tecla tienen mayor prioridad que las opciones de sesión (-s/-S).

Todos los archivos de sesión se encuentran por nombre de sesión en el directorio:

${XDG_CONFIG_HOME:-$HOME/.config}/nnn/sessions

"@" es el archivo de "auto sesión".



Filtros

Los filtros son cadenas (o patrones regex) para encontrar instantáneamente entradas coincidentes en el directorio actual (búsqueda por tipo). Por defecto, las coincidencias no distinguen entre mayúsculas y minúsculas. El último filtro de cada contexto se mantiene en tiempo de ejecución o en las sesiones guardadas.

Cuando hay una coincidencia única y se trata de un directorio, nnn entra automáticamente en el directorio. La opción -A del programa desactiva esta opción.

Teclas especiales del filtro

TeclaFunción
^charFunciones habituales de combinación de teclas.
EscSalir del filtro pero omitir la actualización del directorio
Alt+EscQuitar el filtro, salir del contexto.

Teclas especiales en el indicador de filtro vacío:

TeclaFunción
?Mostrar ayuda y pantalla de configuración
/Alternar entre cadena y expresión regular.
:Alternar entre mayúsculas y minúsculas.
^LBorrar filtro (si no está vacío) O aplicar el último filtro
BkspcPermanecer en el filtro y actualizar directorio.
DelPermanecer en el filtro y actualizar directorio.

Casos comunes de uso de expresiones regulares

  • Para listar todas las coincidencias que empiecen por la expresión del filtro, empiece por ^ (signo de intercalación).
  • Escriba \.mkv para listar todos los archivos MKV.
  • Use .* para buscar cualquier carácter (una especie de búsqueda difusa).
  • Excluir nombres de archivo que tengan nnn con PCRE (vea Compilar con PCRE): ^(?!nnn).

Limitación

Use expresión regular (regex) para el filtrado sensible a mayúsculas y minúsculas con caracteres anchos, ya que la función strcasestr (utilizada para filtros de cadena) no funciona con locales multibyte (ref1, ref2).



Teclear para navegar

En este modo, los directorios se abren en modo filtro, lo que permite una navegación continua.

Para iniciar en modo escribir para navegar (type-to-nav), utilice la opción del programa -n o pulse ^N.

Teclas especiales adicionales en el indicador de filtro vacío en modo escribir para navegar:

Listado 1Listado 2
TeclaFunción
'Ir al primer archivo o coincidencia.
+Alternar la selección de archivos.
´Marca CWD.
-Ir al último directorio visitado.
.Mostrar archivos ocultos.
;Ejecutar un complemento por su clave.
TeclaFunción
=Inicia una aplicación con GUI.
>Exportar lista de archivos.
@Visita el directorio de inicio.
]Muestra símbolo de sistema.
`Visita / (raíz del sistema de archivos ).
~Visita la carpeta $HOME.


Selección

nnn permite seleccionar archivos en distintos directorios y contextos.

Hay 3 grupos de combinaciones de teclas (ver Teclado, Ratón) para añadir archivos a la selección:

  • Conmutador de selección de archivos.
    • Anula la selección si + está visible antes de la entrada, de lo contrario añade a la selección.
  • Añade un rango de archivos a la selección.
    • Repita dos veces la tecla de rango en la misma entrada para borrar la selección por completo.
  • Añadir todos los archivos del directorio actual a la selección.

Una selección se puede editar, copiar, mover, eliminar, archivar o enlazar. Ejemplo de flujo de trabajo para copiar o mover algunos archivos:

  • Añadir archivos de los directorios de origen (puede seleccionar archivos de varios directorios en nnn) a la selección.
  • Navegar hasta un directorio de destino.
  • Utilice ^P (cp) o ^V (mv) para copiar o mover los archivos seleccionados.

Las rutas absolutas de los archivos seleccionados se copian en el archivo .selection del directorio config. El archivo de selección se comparte entre varias instancias del programa. Las selecciones de varias instancias no se fusionan. La última instancia que escribe en el archivo sobrescribe el contenido anterior. Si tiene 2 instancias de nnn abiertas en 2 paneles de un multiplexor de terminal, puede seleccionar en un panel y utilizar la selección en el otro panel. La selección se borra en la instancia de nnn donde se hizo la selección en mv/rm (pero no en cp).

nnn borra la selección después de una operación exitosa con la selección. Los plugins pueden definir el comportamiento individualmente.

Editar la selección

Para editar la selección use la tecla editar selección. La edición no finaliza el modo de selección. Puede añadir más archivos a la selección y volver a editar la lista. Si no hay ningún fichero seleccionado en la sesión actual, esta opción intenta listar el fichero de selección.

Rutas de archivos en la selección al portapapeles del sistema

Use la opción -x del programa para copiar la selección en el portapapeles del sistema. Debe tener instalados los plugins.

Obtener manualmente las rutas de los archivos en la selección

Muchos plugins utilizan este método. Las rutas de los archivos están terminadas en NUL, por lo que se requiere un procesamiento adicional para hacerlas utilizables.

Para ejecutar ls -l en las rutas de archivos de la selección:

xargs -0 ls -l < "${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection"

Una variable especial puede ser útil:

export sel=${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection

Para que pueda manejar fácilmente archivos juntos (¡incluso en el símbolo del sistema nnn!):

xargs -0 ls -l < $sel


Buscar y listar

Hay dos formas de buscar y listar:

  • Introducir una lista de rutas de archivos.
  • Buscar utilizando un plugin (por ejemplo, finder) y listar los resultados.

Las rutas de los archivos deben estar separadas por NUL ('\0'). Las rutas pueden ser relativas al directorio actual o absolutas. Las rutas no válidas en la entrada se ignoran. El límite de procesamiento de entrada es de 16.384 rutas o 64 MiB (max_rutas * max_len_rutas) de datos.

Para listar el flujo de entrada, inicie nnn escribiendo en su entrada estándar. Por ejemplo, para listar archivos en el directorio actual mayores de 1M:

find -maxdepth 1 -size +1M -print0 | nnn
# fd -d 2 -S +1M -0 | nnn

o redirigir una lista desde un archivo:

nnn < files.txt

Práctica función del shell bash/zsh para listar archivos por tipo mime en el directorio actual:

1
2
3
4
5
6
# para mostrar los archivos de vídeo, ejecute: list video list () { find . -maxdepth 1 | file -if- | grep "$1" | awk -F: '{printf "%s\0", $1}' | nnn # fd -d 1 | file -if- | grep "$1" | awk -F: '{printf "%s\0", $1}' | nnn }

Se creará un directorio temporal que contendrá enlaces simbólicos a las rutas dadas. Cualquier acción realizada sobre estos enlaces simbólicos se realizará sólo sobre sus destinos, después de lo cual podrían dejar de ser válidos.

Pulse la tecla derecha () o l sobre un enlace simbólico dentro del directorio de listado para acceder al archivo de destino. Pulse - para volver al directorio de listado. Pulse Intro para abrir el enlace simbólico.

El flujo de entrada del listado se puede programar. Puede ampliarse para seleccionar (opción -p) entradas de los resultados del listado.



Prompt

Los indicadores (excepto el indicador de filtro) admiten atajos de línea de comandos similares a los de la línea de lectura. Intro o ^D en el indicador vacío (excepto el indicador de filtro) sale del indicador.

La tecla Ctrl-L (^L) borra y Esc sale de todos los avisos.

Símbolo de Sistema nativo

La práctica línea de comandos REPL (se muestra en ]) entiende las variables de entorno (como $PWD). Consulte la documentación de su shell (por ejemplo, BASH_ENV para bash, ~/.zshenv para zsh) para usar alias y funciones. Para seleccionar comandos del historial de tu shell en el símbolo del sistema y emitirlos después de editarlos (como fc), copia el plugin fzhist (¿como h quizás?) en su $PATH.

El símbolo del sistema nativo sólo recuerda el último comando ejecutado en la sesión actual. Para acceder y utilizar el historial del intérprete de comandos añada una función del intérprete de comandos similar a:

1
2
3
4
h () { fzf <~/shell-specific_history_file | tr -d '\n' | xsel -bi }

Pegue el comando seleccionado en el prompt utilizando Ctrl-Shift-V, opcionalmente edite y ejecute.

Todas las preguntas binarias se confirman con y o Y.

Variables especiales

Se puede acceder a las siguientes variables especiales desde el símbolo del sistema o desde un intérprete de comandos generado:

VariableSubstitución
$nnnNombre de archivo en el contexto actual cuando se pasa el puntero del ratón.
$dNRuta abierta en contexto N [N=1/2/3/4].
$fNLa ruta del archivo aparece en el contexto.

Por ejemplo, para copiar el archivo sobre el que se pasa el cursor en el contexto 1 al directorio abierto en el contexto 3, ejecute cp "$f1" "$d3".

Se puede acceder a la selección desde el símbolo del sistema nativo:

VariableSubstitución
%jRepetir cmd con todos los %j sustituidos por cada ruta de archivo seleccionada
%JEjecutar el comando una sola vez con %J como últimos caracteres sustituidos por todas las rutas de archivo seleccionadas

Ejemplo: buscar una cadena en cada fichero de la selección:

printf "Buscar cadena en %s\n" "%j"; grep "string" "%j"

Archivar todos los ficheros de la selección:

tar uvf archive.tar %J

Importante

  1. Sólo puede utilizar %j o %J dentro de un mismo comando. Si se encuentran ambos el prompt se cerrará. No se ejecutará ningún comando.
  2. Al usar %J nnn automáticamente escapará caracteres especiales. Cualquier %J que no esté al final del comando se dejará sin sustituir.

Copiar comando del intérprete de comandos generado al símbolo del sistema nativo

El prompt (no readline nnn-internal one) puede recordar el último comando ejecutado. A veces puede ser deseable copiar un comando del historial del shell al prompt. Se pueden configurar combinaciones de teclas para copiar un comando desde el prompt bash/zsh al portapapeles del sistema. Puede usarlos en el prompt del subshell y pegar el comando en el prompt con Ctrl-Shift-V.

1
2
3
4
5
6
7
8
9
# bash: Copiar las líneas siguietnes en ~/.bashrc # Copiar la línea actual al portapapeles con ^] if [[ -n $DISPLAY ]]; then copy_line_to_x_clipboard () { printf %s "$READLINE_LINE" | xsel -ib } bind -x '"\C-]": copy_line_to_x_clipboard' fi
1
2
3
4
5
6
7
8
9
10
11
# zsh: Copiar las líneas siguientes en ~/.zshrc # Copiar la línea actual al portapapeles con ^U if [[ -n $DISPLAY ]]; then x-kill-whole-line () { zle kill-whole-line print -rn -- "$CUTBUFFER" | xsel -ib } zle -N x-kill-whole-line bindkey '\C-u' x-kill-whole-line fi


Diseño

nnn (el núcleo de la utilidad C) es, en términos generales, de características restringidas. Incluye características que realmente necesita para que pueda seguir siendo lo suficientemente ligero como para terminar su flujo de trabajo con precisión antes de que su tren de pensamiento se pierda.

nnn admite plugins para ampliar sus capacidades.

Listado

He aquí una lista de los principios de diseño que rigen el núcleo del programa nnn:

  • nnn complementa a X, no lo sustituye
    • Aporta lo mejor de la CLI al usuario de GUI.
    • No espera que el usuario abandone la GUI (la GUI está bien establecida por una razón).
    • Zona de confort de configuración cero para los usuarios de GUI.
  • Flujos de trabajo rápidos y sin distracciones.
  • Vista de ventana única limpia y sin desorden centrada en el contenido.
    • Cambie fácilmente de contexto/pestañas con (Sh)TAB
  • Sólo directorios en color, sin iconos.
    • Para buscar/agrupar por extensión, utilice la opción de filtrar u ordenar por extensión.
  • Soporta previsualizadores externos o basados en plugins escribiendo la ruta del archivo sobre el que se pasa el ratón en un FIFO personalizado.
  • Una utilidad en lugar de múltiples utilidades para tareas relacionadas, p. ej.
      Gestión de archivos, renombrado por lotes, análisis de uso de disco, lanzamiento de aplicaciones, etc.
  • Sin archivos de configuración y con pocas variables de entorno.
  • Portabilidad: dependencias de bibliotecas muy limitadas.
    • Admite la compilación de funciones.
  • Usa un abridor de escritorio estándar para gestionar las asociaciones de archivos.
  • Analiza el uso del disco dentro del mismo sistema de archivos, no sigue enlaces simbólicos.
  • Listado de contenido alfabético insensible a mayúsculas y minúsculas en lugar de todo en mayúsculas primero.
  • Directorios primero en todos los modos (incluso en el modo analizador de uso de disco).
  • Sin restricción de navegación con rutas relativas (deje que los permisos se encarguen de ello).
  • Las actualizaciones de directorios están desactivadas en los siguientes modos:
    • Uso de disco: se emiten reexploraciones en cada cambio en dir.
    • Modo filtro: la actualización del contenido es muy disruptiva en el flujo de trabajo.
  • Número limitado (4) de contextos; para más, consulte la opción de make O_CTX8t.
    • Copiar y pegar rutas de archivos debería funcionar sin problemas entre contextos e instancias de nnn.
  • Escanea cada directorio en cada visita (incluso en modo analizador de uso de disco) en lugar de almacenar toda la información del primer escaneo. Esto mantiene la información actualizada. Para compensar, utilice la reexploración rápida con algoritmos altamente optimizados.


Casos prácticos de uso

nnn se despliega al usarlo. Algunas cosas que puede hacer:

  • Cargar, ordenar y filtrar al instante miles de archivos.
  • Filtrar y escribir para navegar con entrada dir de coincidencia automática.
  • Listar flujo de entrada y recoger las entradas a stdout o archivo como lista.
  • Escribir un plugin en cualquier idioma y hablar con nnn.
  • find/fd/grep/ripgrep/fzf desde nnn y lista en nnn.
  • Nunca pierde el contexto: empieza donde lo dejó
  • Montar cualquier servicio de almacenamiento en la nube con sólo pulsar unas teclas.
  • Seleccionar archivos de cualquier lugar (no sólo de un directorio).
  • Marcadores ilimitados, plugins, cmds con teclas de acceso rápido personalizadas.
  • Editar y previsualizar markdown, man page, HTML.
  • Abrir un archivo y avanzar automáticamente al siguiente.
  • Filtrar las entradas ya filtradas, exportar la lista de archivos visibles.
  • Configurar el botón central del ratón para hacer cualquier cosa.
  • Búsqueda difusa en varias ubicaciones (o subárboles) y visita de un archivo.
  • Carga cuatro dirs con configuraciones personalizadas a la vez.
  • Notificaciones al finalizar cp, mv, rm.
  • Sincronización automática de la selección con el portapapeles del sistema.
  • Acceder a la selección desde otra instancia de nnn.
  • Abrir archivos de texto separados en otro panel/pestaña/ventana.
  • Montar y modificar archivos.
  • Crear archivos/directorios/duplicados con padres (como mkdir -p).
  • Alternar oculto con ., visitar $HOME con ~, último directorio con -.
  • Marcar un directorio visitado frecuentemente en tiempo de ejecución.
  • Ordenar por modificación, acceso y tiempo de cambio de inodo.
  • Compilar características out/in con variables make.
  • Ver texto de matriz volar o leer mensajes de fortuna.
  • Configurar en 5 minutos!.


Añadir marcadores

Hay 2 formas (que pueden usarse juntas) de gestionar los marcadores.

Variable de entorno NNN_BMS

Establece la variable de entorno NNN_BMS como una cadena de pares clave_carácter:ubicación separados por punto y coma (;):

export NNN_BMS="d:$HOME/Documentos;u:/home/usuario/Cam Uploads;D:$HOME/Descargas/"

Los marcadores se enumeran en la pantalla de ayuda y configuración (tecla ?).

La tecla de selección de marcadores b enumera todas las teclas de marcadores configuradas en NNN_BMS en el indicador de marcadores.

Marcadores con enlaces simbólicos

Se puede crear un marcador con un enlace simbólico al directorio actual con la tecla B (o manualmente en ~/.config/nnn/bookmarks).

Al pulsar Enter en el indicador de marcadores, se accede a este directorio. Si NNN_BMS no está configurado, la tecla select bookmark (seleccionar marcador) lo abre directamente.

Pulse - para volver al directorio original justo después de introducir un marcador con enlace simbólico.

Directorio de marcas

Para saltar adelante y atrás a un directorio específico durante una sesión, puede marcar el directorio (tecla ,). Visítelo en cualquier momento utilizando la tecla Marcador seguida de ,. Si un directorio está marcado, la tecla Marcador también muestra ,.



Configurar cd al salir

Elija el archivo apropiado para su shell de misc/quitcd y añade el contenido al archivo rc de su shell. Tendrá que crear un nuevo intérprete de órdenes para que el cambio surta efecto. Deberá iniciar nnn como n (o su nombre de función/alias preferido).

Por defecto, cuando se pulsa ^G, nnn escribe el último directorio de trabajo en

${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.lastd

Para usar cd on quit siempre, exporte la variable de entorno NNN_TMPFILE a su ruta de archivo preferida.

La tecla extra ^G para cd on quit es para evitar escribir en un fichero cada vez que nnn sale y permite cd on quit bajo demanda.



Sincronizar subshell $PWD

Para configurar nnn para cd al $PWD del subshell bash salido, agregue lo siguiente en .bashrc:

1
2
3
4
5
6
7
8
nnn_cd() { if ! [ -z "$NNN_PIPE" ]; then printf "%s\0" "0c${PWD}" > "${NNN_PIPE}" !& fi } trap nnn_cd EXIT

Añada un plugin con el siguiente contenido:

1
2
3
4
5
6
# !/usr/bin/env bash # Descripción: Inicia una shell bash interactiva. export nnn="$1" bash -i

También puede usar el método de ejecutar cmd como plugin:

s:!bash -i*


Unidades conectadas en caliente

El estado de montaje de los dispositivos de almacenamiento externo se puede cambiar en un REPL utilizando el plugin nmount.

Para auto-montar unidades de almacenamiento externo use reglas udev o envoltorios udisks.



Imagen, video, pdf

04_imagen-video-pdf.png

Además de Live Previews, hay un plugin independiente imgview para explorar imágenes/ miniaturas de archivos de imagen, vídeo o audio en el terminal. Entre otras utilidades de visualización, soporta sxiv (abre su propia ventana) que es particularmente útil para navegar por las imágenes en un directorio, establecer el fondo de pantalla o copiar la ruta de la imagen al portapapeles (instrucciones).

Examinar, renombrar imágenes

Mientras que el usuario puede previsualizar la imagen sobre la que pasa el ratón en vista previa (preview-tabbed) y cambiarle el nombre, el siguiente procedimiento es un enfoque alternativo. Requiere el plugin imgview (con sxiv) y dmenu (zenity puede reemplazar a dmenu).

Guarde sxiv key-handler ~/.config/sxiv/exec/key-handler con el siguiente contenido:

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
#!/usr/bin/env sh # ^X-^R: pide el nombre de la nueva imagen (necesita `dmenu`) y `mv` # ^X-^C: copiar la ruta de la imagen al portapapeles X (necesita `xclip`). # Ejemplo de prompt de zenity: # name="$(zenity --entry --display=:0.0 --text "rename $file to")" 2> /dev/null while read -r file do case "$1" in "C-r") name="$(dmenu -p "rename $file to: ")" 2> /dev/null if [ -n "$name" ]; then mv "$file" "$name" fi ;; "C-c") printf "%s" "$file" | xclip -selection clipboard ;; *) printf "Sorry, I don't understand" exit 1 ;; esac done

Ahora pasa el ratón sobre una imagen o directorio y ábrelo con el plugin imgsxiv. Navega por las imágenes y pulse ^X seguido de ^R para renombrar una imagen.

Para las operaciones de archivo visite sxiv tema # 228.

Leer pdf como texto

El plugin pdfview puede convertir y renderizar archivos PDF como texto en el terminal.

Tiene 2 métodos para convertir PDF a texto. Por favor, vaya a través de la secuencia de comandos para los detalles.



Texto aparte

  1. Configure un script (digamos ewrap) para abrir el editor en un nuevo panel dividido tmux o en una nueva pestaña/ventana de terminal xfce4 (xfce4-terminal, puede que desee cambiar el terminal y el editor en el fragmento de ejemplo de abajo):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/env sh if [ -n "$TMUX" ] ; then # Sesión tmux en ejecución tmux split-window -h "vim \"$*\"" else # Quitar la opción --tab for new window xfce4-terminal --tab -e "vim \"$*\"" fi
  2. Haga que ewrap sea ejecutable y colóquelo en algún lugar de su $PATH.
  3. Establezca $VISUAL (o $EDITOR si no tiene $VISUAL) en ewrap:
    1
    2
    export VISUAL=ewrap
  4. Inicie nnn con la opción de programa -e.

Importante

  • IMPORTANTE: Utilice la opción -E del programa con la edición de texto independiente activada. Las operaciones internas de nnn que necesitan esperar al editor (como renombrar por lotes, copiar/mover como) no funcionarían como de costumbre porque el control vuelve a nnn después de que se genere el emulador de terminal. Para evitar esto, establezca $VISUAL como arriba y $EDITOR a un editor CLI (como vim). La opción program fuerza a $EDITOR a ser usado para operaciones internas (anulando $VISUAL que toma precedencia en caso contrario).
  • Si ya está usando nuke como abridor modifíquelo para usar ewrap para archivos de texto. También puede mejorar ewrap (reutilizando código de nuke) para manejar archivos de texto por tipo de archivo y utilizar el programa adecuado (por ejemplo, w3m para html, man para páginas man). De esta forma no tendrá que cambiar el abridor.
  • Si está usando un gestor de ventanas en mosaico, la nueva ventana de terminal con el editor se abriría al lado de su ventana actual. En el caso de gestores de ventanas tradicionales, la nueva ventana se colocará según la configuración de colocación del gestor de ventanas, por ejemplo, inteligente o centrada en XFCE4.

Otra opción es combinar y utilizar nnn con un multiplexor como dvtm:

05_nnn-dvtm.png


Ejecutar comandos

Hay varias formas de ejecutar comandos desde nnn:

  1. Inicie un intérprete de comandos dentro del directorio actual. Esta es su shell normal.
  2. Use la tecla prompt para mostrar el Prompt de comandos nativo e introduzca su comando. Los comandos se invocan usando $SHELL por lo que puede usar comandos, alias (en ~/.zshenv para zsh), variables de entorno, tuberías, redirecciones.
  3. También puede asignar claves a comandos cli arbitrarios no de fondo (no interpretados por shell) que use frecuentemente e invocar como plugins. (instrucciones).

Indicador de profundidad del shell

Si usa ! para generar un shell en el directorio actual y su shell es bash o zsh, estaría bien añadir:

1
[ -n "$NNNLVL" ] && PS1="N$NNNLVL $PS1"

al rc de su shell. Esto hará que su prompt indique que está dentro de un shell que le devolverá a nnn cuando haya terminado.

Esto junto con cd al salir (vea Configurar cd al salir) se convierte en una poderosa combinación. Además, los scripts quitcd comprueban $NNNLVL para evitar el anidamiento.



Lanzar aplicaciones

Las aplicaciones GUI pueden lanzarse mediante un menú desplegable utilizando el plugin launch. nnn lo recoge de la ubicación del plugin. Si no se encuentra launch, nnn muestra un prompt normal para el nombre ejecutable de la aplicación.

Para configurar launch como un lanzador de aplicaciones independiente, añada una combinación de teclas para abrir launch en un terminal, p. ej,

xfce4-terminal -e "${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins/launch

Las aplicaciones GUI también pueden lanzarse desde el prompt. Utilice & para iniciar en segundo plano para que nnn no se bloquee.

  • También puede lanzar una instancia de su terminal favorito en el directorio actual (abrir terminal aquí...) de esta manera.


Abrir como superusuario (root)

Si usted es un sudoer, abra una nueva instancia de nnn desde el prompt incorporado con sudo nnn.

También puede tener un alias corto y dulce (pero poderoso) (que también funciona en el prompt nnn):

1
alias N='sudo -E nnn -dH'


Selector de archivos

Para utilizar como selector de archivos y redirigir la salida a otros programas, use la opción -p. La opción toma como argumento un fichero de salida (use - para imprimir la lista en stdout).

Formas de seleccionar archivos:

  • Para seleccionar un único archivo y salir, sitúese sobre él y pulse Enter
  • Para elegir una selección y salir, seleccione uno o varios ficheros y pulse Enter o q.

Importante

  1. Al pulsar Enter en un directorio, se entra en él; al intentar elegir un directorio, por ejemplo, para pasar a cd, utilice la selección de archivo único.
  2. Para descartar la selección y salir, pulse Ctrl-g (^G).

Ejemplos de casos de uso del modo selector:

// listar algunos archivos
ls -l $(nnn -p -)
-rw-rw-r-- 1 vaio vaio 14722 Jul 10 07:24 /home/vaio/GitHub/nnn/CHANGELOG
-rw-rw-r-- 1 vaio vaio  1472 Jul  7 21:49 /home/vaio/GitHub/nnn/LICENSE
-rw-rw-r-- 1 vaio vaio  1697 Jul 10 07:24 /home/vaio/GitHub/nnn/Makefile
// Adjuntar algunos archivos y enviar un correo
neomutt -a $(nnn -p -) ...
// Añadir algunos archivos a la lista de reproducción MOC
mocp -a $(nnn -p -)


Punto de montajes remotos

nnn se integra con sshfs y rclone para soportar montajes remotos. Los puntos de montaje (tanto para remotos como para archivos) se crean dentro de:

${XDG_CONFIG_HOME:-$HOME/.config}/nnn/mounts

Al desmontar con éxito, se eliminan los puntos de montaje.

La clave para montar una carpeta remota es c (para conectar).

Nota

El directorio montado también puede ser un enlace simbólico. El directorio de destino debe tener permisos para montar.

sshfs

Ejemplo de configuración primaria: conectarse al servidor SSH desde el escritorio.

Para conectarse y montar recursos compartidos remotos usando sshfs, nnn requiere que el archivo de configuración ssh ~/.ssh/config tenga las entradas host. sshfs lee este archivo.

Ejemplo de entrada de host para un entorno Termux en un dispositivo Android:

Host *
    ServerAliveInterval 300
    ServerAliveCountMax 2

Host phone
    HostName 192.168.43.1
    User u0_a117
    Port 8022
    Compression no
    # Ciphers chacha20-poly1305@openssh.com
    # ProxyJump jumphost

Una vez que intente conectarse usando sshfs, nnn le pedirá el nombre del host (phone en el ejemplo anterior). Escriba el nombre exacto (tal y como aparece en este archivo) opcionalmente seguido de la ruta en el host remoto que desea montar.

phone         <----- Monte la carpeta $HOME de su usuario remoto en `phone`
phone:/tmp    <----- Monte la carpeta remota `tmp` en `phone`

El host phone se montará en ${XDG_CONFIG_HOME:-$HOME/.config}/nnn/mounts/phone.

Si necesita pasar opciones al comando sshfs, puede hacerlo:

1
export NNN_SSHFS='sshfs -o reconnect,idmap=user,cache_timeout=3600'

Las opciones deben ir precedidas de sshfs y separadas por comas sin espacios entre ellas.

rclone

El remoto necesita ser configurado y autenticado de antemano (actividad única). El nombre utilizado para configurar es todo lo que nnn necesita para conectarse y montar (así como desmontar) el servicio remoto localmente.

Si necesita pasar opciones, utilice la variable de entorno dedicada para rclone:

1
export NNN_RCLONE='rclone mount --read-only --no-checksum'

Se puede pasar un máximo de 5 banderas.

Consejo: Para listar todas las remotas en el fichero de configuración de rclone: rclone listremotes.

Desmontar remotos

La opción de desmontaje (que también desmonta archivos montados, por cierto) funciona de dos maneras:

La opción de desmontaje (que también desmonta archivos montados, por cierto) funciona de dos maneras:

  1. Pase el ratón sobre el punto de montaje, pulse u (para desmontar). Esto funciona tanto para remotos como para archivos.
  2. Si la entrada actual no es un punto de montaje, nnn pide el nombre del host remoto.

Nota

  • nnn abre el punto de montaje en un contexto inteligente tras un montaje correcto.
  • Aquí más información sobre sshfs.



Sincronización de notas rápidas

Abra su archivo de notas O directorio (si su editor soporta la apertura de un dir como vim) en su editor favorito como un plugin (ver documentación del plugin para más información):

1
export NNN_PLUG=n:-!vim /home/usuario/Dropbox/Publico/Docs/Notes/note*

Para mantener el archivo sincronizado en todos los sistemas, es posible que desee especificar un archivo sincronizado por un servicio de almacenamiento en la nube o almacenado en un recurso compartido de red.



Arrastrar y soltar

Use el plugin dragdrop.



Archivos duplicados

Para duplicar la entrada actual:

  • Pulse Ctrl-R (^R).
  • Mantenga el nombre sin cambios y pulse Enter.
  • En la siguiente pregunta ("nombre de la copia"), indique el nombre que prefiera (y, opcionalmente, la ruta al archivo duplicado) para el duplicado y pulse Enter.

Nota

Para cancelar las operaciones de renombrado o duplicado, pulse Enter en ambas indicaciones sin cambiar el nombre del fichero.



Crear enlaces por lotes

Para crear enlaces simbólicos o duros por lotes:

  • Seleccione el archivo o archivos que desea vincular.
  • Vaya al directorio de destino.
  • Pulse n.
  • Pulse s para enlace simbólico o h para enlace duro.
  • Introduzca el prefijo del enlace (o @ si no hay prefijo).

Las razones sólo se permite el prefijo (y no el nombre completo):

  • Evita pedir los nombres de los enlaces uno a uno para una selección.
  • Un mismo prefijo agrupa los enlaces recién creados.


Desactivar fuentes en negrita

Importante

La mayoría de los emuladores de terminal modernos tienen la opción de desactivar las fuentes en negrita.



Temas

Nord

Testeado con nord-dircolors y nord-kitty.

1
2
BLK="0B" CHR="0B" DIR="04" EXE="06" REG="00" HARDLINK="06" SYMLINK="06" MISSING="00" ORPHAN="09" FIFO="06" SOCK="0B" OTHER="06" export NNN_FCOLORS="$BLK$CHR$DIR$EXE$REG$HARDLINK$SYMLINK$MISSING$ORPHAN$FIFO$SOCK$OTHER"

OneDark

Testeado con One Dark dircolors y One for GNOME Terminal.

1
2
BLK="04" CHR="04" DIR="04" EXE="00" REG="00" HARDLINK="00" SYMLINK="06" MISSING="00" ORPHAN="01" FIFO="0F" SOCK="0F" OTHER="02" export NNN_FCOLORS="$BLK$CHR$DIR$EXE$REG$HARDLINK$SYMLINK$MISSING$ORPHAN$FIFO$SOCK$OTHER"


Previsualización en directo

Una vista previa en vivo es una ventana que muestra información sobre la entrada sobre la que se pasa el cursor. A medida que el cursor se mueve, la ventana de vista previa se actualiza automáticamente.

Hay dos formas de activar las vistas previas en vivo en nnn:

  1. Usando un plugin de previsualización.
  2. Usando un wrapper/previewer script personalizado.

Ambos utilizan la ruta en NNN_FIFO para obtener actualizaciones hover.

Plugins de previsualización

Configurar NNN_FIFO

Depende de cuántas instancias nnn simultáneas necesite:

  1. Instancia única: exporte una ruta FIFO global en, por ejemplo, .profile:
    1
    2
    export NNN_FIFO=/tmp/nnn.fifo
  2. Varias instancias: utilice la opción -a para crear una nueva ruta FIFO para cada instancia.

Uso de los plugins

Siga las instrucciones de la documentación del plugin para su instalación y configuración general.

Existen 2 plugins de previsualización para nnn, que utilizan diversos mecanismos para mostrar la ventana de previsualización:

  • preview-tabbed: la ventana de vista previa es una ventana X con pestañas, los archivos se ven usando programas capaces de Xembed (mpv para audio/video, sxiv para imágenes, zathura para PDF, xterm/urxvt/st + nuke plugin text preview para otros archivos).
  • preview-tui: la ventana de previsualización es un panel tmux, una nueva ventana de terminal o un panel kitty (necesita la opción allow_remote_control de kitty activada), y los archivos se previsualizan usando herramientas como tree, less, file, mediainfo, kitty's icat, ueberzug, etc. En WSL utilizará QuickLook para previsualizar los archivos. También puede usar scope.sh de ranger o pistol. Siéntase libre de enviar una solicitud para cualquier previsualizador que crea que falta.

Para ejecutar un previsualizador (o cualquier plugin en general) al iniciar nnn, use la opción -P.

  • nnn no vigila el archivo sobre el que se pasa el cursor ni actualiza la ruta si se modifica durante la vista previa. Pulse Esc o haga clic con en la entrada para actualizar la vista previa sin cambiar la entrada sobre la que se encuentra.
  • Para cerrar las ventanas de vista previa tui (preview-tui) ejecuta el plugin de nuevo o pulse Ctrl-C (^C) en la ventana de vista previa.

Ejemplo de configuración de script personalizado

La creación de una vista previa en directo tiene dos aspectos:

  1. Un comando de previsualización.
  2. Un comando de configuración.

Ejemplo de comando de vista previa

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
#!/usr/bin/env sh # ############################################################################# # Archivo: preview_cmd.sh # Descripción: Ejemplo mínimo para previsualizar ficheros y directorios # Sin dependencias externas # Se puede ampliar fácilmente # Sale automáticamente cuando el NNN_FIFO se cierra # Imprime un `árbol` si es un directorio o `cabecera` si es un fichero # Shell: compatible con POSIX # Autor: Todd Yamakawa # Hacer: # 1. Añadir soporte para más tipos de ficheros # p.ej. archivos binarios, no deberíamos intentar `encabezar` esos # Checquear FIFO NNN_FIFO=${NNN_FIFO:-$1} if [ ! -r "$NNN_FIFO" ]; then echo "Unable to open \$NNN_FIFO='$NNN_FIFO'" | less exit 2 fi # Leer selección desde $NNN_FIFO while read -r selection; do clear lines=$(($(tput lines)-1)) cols=$(tput cols) # Imprimer árbol de directorios if [ -d "$selection" ]; then cd "$selection" || continue tree | head -n $lines | cut -c 1-"$cols" continue fi # Imprime cabecera de archivo if [ -f "$selection" ]; then head -n $lines "$selection" | cut -c 1-"$cols" continue fi # Algo salió mal echo "Unknown type: '$selection'" done < "$NNN_FIFO"

Ejemplo de comando de configuración

Para crear su propio comando de configuración, necesita seguir los siguientes pasos:

  • Cree un NNN_FIFO.
  • Ejecute su comando de previsualización en segundo plano.
  • Ejecute nnn.
  • Borre su NNN_FIFO.

He aquí un ejemplo de función bash/zsh. Para utilizar este ejemplo, tendrá que establecer el comando de vista previa. Para la ventana de vista previa:

  • Use tmux split si actualmente está ejecutando en un entorno tmux.
    • Se requiere tmux 3.0 para establecer variables de entorno en un nuevo panel.
  • De lo contrario utiliza una ventana xterm.
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
nnn-preview () { # Block nesting of nnn in subshells if [ -n "$NNNLVL" ] && [ "${NNNLVL:-0}" -ge 1 ]; then echo "nnn is already running" return fi # El comportamiento por defecto es cd al salir (nnn comprueba si NNN_TMPFILE está configurado) # Si NNN_TMPFILE se establece en una ruta personalizada, debe ser exportada para que nnn la vea. # Para cd on quit solo en ^G, quite el "export" y ponga NNN_TMPFILE *exactamente* asi: # NNN_TMPFILE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.lastd" # Esto creará un fifo en el que se escribirán todas las selecciones nnn NNN_FIFO="$(mktemp --suffix=-nnn -u)" export NNN_FIFO (umask 077; mkfifo "$NNN_FIFO") # Comando de previsualización preview_cmd="/path/to/preview_cmd.sh" # Use `tmux` split como vista previa if [ -e "${TMUX%%,*}" ]; then tmux split-window -e "NNN_FIFO=$NNN_FIFO" -dh "$preview_cmd" # Usar `xterm` como ventana de previsualización elif (which xterm &> /dev/null); then xterm -e "$preview_cmd" & # Deshabilitar la búsqueda de un programa para utilizar como ventana de vista previa else echo "unable to open preview, please install tmux or xterm" fi nnn "$@" rm -f "$NNN_FIFO" }


Iconos de archivos

nnn soporta múltiples formas de mostrar iconos. Están desactivados por defecto y no se proporcionan en la distribución por defecto para evitar el envío de recursos de terceros. Actualmente soportamos iconos-en-terminal para aquellos que deseen utilizar iconos junto con una fuente de código normal. Alternativamente, puede utilizar las fuentes parcheadas de Nerdfont para añadir iconos a la propia fuente. Esto último es más común para los usuarios de Vim que necesitan fuentes para varios plugins de línea de energía. Independientemente del método, cada método producirá experiencias similares dentro de nnn.

Si su distro y terminal lo soportan, también puede usar Emojis.

Los iconos se pueden personalizar en icons.h.

Necesitará recompilar nnn en lugar de usar la versión por defecto. O puede tomar uno de los binarios estáticos con iconos auto-generados en cada versión.

Tenga en cuenta que su $TERM debe soportar 256 colores para que se muestren los iconos.

Para activar los iconos en terminal

  • Instalar icons-in-terminal.
  • Clonar el repositorio de nnn.
  • Compilar nnn con make O_ICONS=1.

Para activar los iconos de Nerdfont

  • Descargue e instale una Nerdfont parcheada (v3.0.0 o posterior).
  • Aplique esa fuente como fuente de su emulador de terminal. Esto variará de emulador a emulador, pero normalmente implica editar un archivo de configuración o cambiar un ajuste dentro de un sistema de menú GUI.
  • Clone el repositorio de nnn.
  • Compile nnn con make O_NERD=1.

Para habilitar Emojis

  • Clone el repo nnnn.
  • Compile nnn con make O_EMOJI=1.

Nota

Los usuarios de Arch Linux pueden consultar los paquetes AUR nnn-icons y nnn-nerd.

Mueva el nnn recién compilado al lugar donde normalmente van sus programas

Una vez compilado, notará que ahora hay un ejecutable nnn en su raíz. Copie este archivo en el lugar donde normalmente se almacenan estos programas. Una buena forma de comprobarlo es hacer un which nnn en el lugar donde se instaló la versión empaquetada. Simplemente reemplazando ese archivo debería ser suficiente.



Atajos de teclado personalizados

Los atajos de teclado están definidos en la estructura bindings en nnn.h. Los usuarios pueden modificarlos para establecer sus atajos preferidos. Después de modificar, nnn necesita ser compilado (vea Instalación Desde el código fuente).

Aunque es fácil de compilar debido a las pocas dependencias de librerías, personalizar los atajos puede ser complicado debido al número de funciones. Para simplificar el proceso, nnn tiene una opción para detectar colisiones de teclas. Después de cambiar las teclas, compile nnn y ejecútelo:

nnn -K

Nota

Existe una combinación de teclas alternativa con el modificador CONTROL (Ctrl, ^) para muchas operaciones. Estos son para los usuarios que prefieren ejecutar nnn en el modo type-to-nav.



Operadores solo para CLI

Si tiene un abridor personalizado (como nuke) que invoca sólo utilidades CLI, puede indicar lo mismo a nnn:

export NNN_OPENER=/ruta/absoluta/a/nuke
# En caso contrario, si nuke está en $PATH
# export NNN_OPENER=nuke
nnn -c

Integración con el escritorio

Para que esté disponible en un entorno de escritorio compatible con XDG como GNOME, KDE, XFCE, etc. se proporciona un fichero nnn.desktop. Para instalarlo, ejecute:

make install-desktop

O copie nnn.desktop a ~/.local/share/applications/.

Esto mostrará una entrada nnn en el menú de aplicaciones de su escritorio, en la búsqueda, en el menú Abrir con de las aplicaciones gráficas, etc.

Tenga en cuenta que cuando se inicia desde un gestor de pantalla (GDM, ...) el entorno de escritorio puede iniciar nnn en un terminal sin llamar a ningún shell de inicio de sesión. Así que si las variables NNN_* se exportan en, por ejemplo, .bashrc, .zshrc, .bash_profile, y no en .profile o .xprofile puede que nunca se obtengan, y por tanto nunca estén disponibles para nnn.

Mantenga sus exportaciones de variables en .bashrc

Si quiere mantener sus exportaciones de variables en .bashrc y su gestor de pantalla nunca lo hace, puede cambiar la línea Exec= en nnn.desktop de la siguiente manera:

1
Exec=bash -lc "nnn %f"

Usar un script como interface para exportar variables

O también puede llamar a nnn en un script de interface con las exportaciones necesarias, ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh # Si usa pywal, tiene que restaurar el esquema aquí # (cat ~/.cache/wal/sequences &) export NNN_BMS="D:$HOME/Downloads;v:$HOME/Videos" export NNN_COLORS="5236" alias nsel="cat ${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection | tr '\0' '\n'" # Para usar un abridor CLI, especifique la opción `-c` a `nnn`. # exportar NNN_OPENER="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins/nuke" # Desenmascare ^Q (if required, see `stty -a`) para quitar nnn stty start undef stty stop undef # Arranque nnn con sus opciones preferidas nnn "$@"

Llámelo, por ejemplo, nwrap, hágalo ejecutable con chmod +x nwrap y colóquelo en su PATH.

Mayor integración con GNOME

1
2
3
4
5
6
7
8
9
10
11
12
13
[Desktop Entry] Name=NNN for gnome GenericName=NNN Comment=Supercute cli Keywords=shell;prompt;command;commandline;cmd;nnn; Exec=gnome-terminal --class "NNN" -- bash -ilc "nnn %f" Icon=org.gnome.Terminal Type=Application Categories=GNOME;GTK;System;TerminalEmulator; StartupNotify=true X-GNOME-SingleWindow=false OnlyShowIn=GNOME;Unity; StartupWMClass=NNN

--class "NNN" se utiliza para agrupar todas las instancias nnn y StartupWMClass=NNN para indicar al lanzador qué ventanas deben asociarse a este icono.

Integración del navegador

Para usar nnn como el cuadro de diálogo de selección de archivos de su navegador, siga las instrucciones del navegador de su elección.

Chromium

Cree un script kdialog en su PATH del tipo:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh while :; do case $1 in --getsavefilename) file="$2" break ;; --version) printf ""; exit ;; --*) shift ;; *) break ;; esac done file="${file##/*/}" st -c picker sh -c "nnn -J -p - '$file' | awk '{ print system(\"[ -d '\''\"\$0\"'\'' ]\") ? \$0 : \$0\"/$file\" }' > /proc/$$/fd/1"

Este ejemplo establece la clase para st a picker y nnn usa un picker de sesión con nombre. Esto le permite, por ejemplo, tener la ventana del selector flotando por defecto en su gestor de ventanas y nnn recuerda dónde estaba su anterior objetivo "Guardar como...". La opción -J se asegura de que la sesión guardada guarde la posición del cursor en el fichero/directorio seleccionado. Sustitúyalo por su terminal preferido y las opciones nnn si procede.

Luego cree una envoltura de navegador que lance su navegador con XDG_CURRENT_DESKTOP=KDE:

#!/bin/sh
XDG_CURRENT_DESKTOP=KDE <browser binary> "$@"

Esto hará que chromium busque kdialog para abrir archivos, asegúrese de que el script kdialog viene en su PATH antes que el binario del paquete kdialog si lo tiene instalado.

Chromium ahora abrirá nnn en modo selector para operaciones "Guardar como/Subir archivo", permitiéndole:

  • Seleccione un directorio(Space) y salga(q) para guardar el archivo con su nombre en el directorio de destino.
  • Cree un nuevo archivo(n) y selecciónelo(Enter) para guardar el archivo con un nombre diferente.

Para restaurar la funcionalidad xdg-open dentro de chromium, necesitará un wrapper (una interface) xdg-open que restaure XDG_CURRENT_DESKTOP al valor correcto para tu entorno:

#!/bin/sh
XDG_CURRENT_DESKTOP='' /usr/bin/xdg-open "$@"

Firefox

Instale xdg-desktop-portal-termfilechooser y cree su archivo de configuración en $XDG_CONFIG_HOME/xdg-desktop-portal-termfilechooser/config:

1
2
[filechooser] cmd=/home/<user>/.local/bin/ffnnn

Cree el script wrapper ffnnn especificado (el nombre y la ubicación no importan) en su PATH de la forma siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh guardar="$3" sugerencia="$4" salida="$5" file="${sugerencia##/*/}" if [ "$guardar" = 1 ]; then touch "$sugerencia" fi st -c picker sh -c "nnn -p - '$sugerencia' | awk '{ print system(\"[ -d '\''\"\$0\"'\'' ]\") ? \$0 : \$0\"/$file\" }' > '$salida'" if [ "$guardar" = 1 ]; then if [ ! -s "$salida" ] || [ ! -s "$sugerencia" ]; then rm "$sugerencia" fi fi

Entonces asegúrese de que widget.use-xdg-desktop-portal.file-picker == 1 en about:config y firefox debería usar nnn como diálogo selector de archivos.



Iniciar nnn con un atajo de teclado

En un Entorno de Escritorio (KDE, Gnome, Xfce)

Método de apliación XDG

Si su DE soporta la configuración de keybindings para aplicaciones, simplemente instale nnn.desktop, como se explicó anteriormente. A continuación, establezca una combinación de teclas desde la configuración de su DE.

Método de script como interface

Es posible que desee crear un script envoltorio para lanzar nnn en un terminal, por ejemplo con xfce4-terminal:

#!/bin/sh

xfce4-terminal -e "nnn \"$*\""

Pongale un nombre, por ejemplo, nnnfm, hagalo ejecutable y colóquelo en su PATH.

Ahora puede establecer una combinación de teclas para ejecutar nnnfm desde la configuración de su DE.

Establecer como gestor de archivos por defecto en XFCE

Ahora vaya al menú de aplicaciones preferidas desde Configuración (o ejecute exo-preferred-applications -c) y seleccione nnnfm como gestor de archivos predeterminado.

En un gestor de ventanas X vacío (i3wm, bspwm, awesomewm ...)

En la sección de atajos de teclado de su archivo de configuración de WM, necesita añadir un atajo para lanzar nnn en una terminal. Este es un ejemplo para sxhkd, necesita cambiar xfce4-terminal por la terminal que quiera usar:

# Gestor de archivos
super + n
       xfce4-terminal -e "nwrap $*"


Progreso de cp mv

Esta sección es específica de Linux. Los usuarios de BSD y macOS pueden pulsar Ctrl-T (^T) para comprobar el progreso.

advcpmv se usa para mostrar el progreso de cp y mv en Linux.

Para habilitar la función, copie los binarios avdcpmv-patched en su PATH. Tenga en cuenta que es importante renombrar los binarios como cpg y mvg.

sudo cp src/cp /usr/local/bin/cpg
sudo cp src/mv /usr/local/bin/mvg

Use la opción -r del programa para mostrar el progreso de las operaciones.

Control del directorio activo

Puede controlar el directorio activo de nnn desde un plugin. Encuentre las instrucciones aquí.



Pager como abridor

Descargo de responsabilidad: Esto es un abuso grave de su pager, pero le enriquece la vida.

Sería conveniente que su pager eligiera cómo ver los archivos que no son de texto.

Puede crear su propio manejador de pager personalizado o puede empezar descargándolo:

$ curl -OL https://github.com/0xACE/lesspipe/raw/personal/lesspipe.sh

o git clone https://github.com/0xACE/lesspipe y luego asegúese de cambiar a la rama personal donde se han hecho algunas actualizaciones.

y luego tener el archivo en alguna ruta, digamos:

~/git/lesspipe/lesspipe.sh

y luego añada:

export PAGER=less
[ -r "$HOME/git/lesspipe/lesspipe.sh" ] && export LESSOPEN="| $HOME/git/lesspipe/lesspipe.sh %s"
export LESS='-Ri '

a su ~/.bashrc o a su rc de shell.

Esto le permitirá ver archivos en nnn pulsando la tecla Abrir en PAGER (Open in Pager, p), también abrirá su archivo canalizado a través de lesspipe.sh que ha canalizado el archivo a otros intérpretes.

Tenga en cuenta que es posible que desee instalar los siguientes paquetes:

antiword - soporte para archivos word
cabextract - soporte para archivos cab
cdrkit (cdrtools) - soporte para archivos iso
fastjar - soporte para archivos jar
html2text (python-html2text, python2-html2text) - soporte para archivos html
mediainfo - soporte para algunos metadatos de archivos multimedia
viu - soporte para algunos archivos de imagen
imagemagick - soporte para algunos archivos de imagen
p7zip - soporte para archivos 7za
perl 
rpmextract - soporte para archivos rpm
unrar - soporte para archivos rar
unrtf - soporte para archivos rtf
unzip - soporte para archivos zip
source-highlight - soporta resaltado de sintaxis

En el futuro ese enlace lesspipe.sh podría cambiar para usar atool en lugar de estos gestores de archivos separados.



Trabajar con lftp

En términos generales, cualquier utilidad de terminal puede integrarse fácilmente con nnn. Para transferencias remotas de archivos, lftp es la herramienta preferida. Vamos a discutir cómo el flujo de trabajo se puede simplificar con las capacidades de nnn y lftp combinadas.

Automatización mediante un script lftp

Use la tecla Abrir con (Open witch) y escriba lftp -f para conectarse y transferir archivos a/desde un sistema remoto utilizando un archivo de script lftp. Tenga en cuenta que debe pulsar la tecla c en el prompt press 'c' for cli mode (presione 'c' para modo cli).

Archivo de ejemplo:

# lftp script_file para transferir ficheros a/desde un servidor
# server has sshd service running and support scp

# abrir conexión
open -u user,password -p port sftp://ip_servidor

# listar archivos en el servidor
ls

# crear un directorio
mkdir subidas

# subir algunos archivos al directorio creado
put -O subidas archivo1 archivo2

# descargar algunos archivos desde el directorio actual
pget -O descargas archivo3 archivo4

Conectarse al servidor y copiar la selección manualmente

Usaremos un ejemplo genérico de configuración lftp usando alias lftp que puede seguir para conectarse a un servidor SSH y transferirle su selección nnn.

  1. Crear un alias para este servidor en ~/.lftprc:
    alias mob open -u username,password sftp://direccion_ip_servidor:puerto
    	
  2. Crear alias en ~/.lftprc para transferir archivos:
    # obtener nnn selección y escribir el comando `put` en un fichero
    alias lst "!cat ${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection | xargs -0 -I fname echo "put" \'fname\' > files.lftp"
    
    # subir los archivos al directorio subidas
    alias mv "source files.lftp; !rm files.lftp"
    	
  3. Use la tecla de símbolo del sistema (command prompt) y escriba lftp para conectarse a este servidor.
  4. Use los alias para obtener la lista de selección y transferir los archivos. Ejemplo de operación:
    lftp :~> mob
    lftp :~> lst
    lftp :~> mv
    lftp :~> bye
    	

Más ayuda en el prompt de lftp

Lista de comandos admitidos: lftp :~> ?.

Ayuda de un comando en particular: lftp :~> help put.



Juguete de Poder

Fijar un directorio visitado con frecuencia

Si necesita usar un directorio con frecuencia, puede anclarlo durante una sesión utilizando el atajo de teclado ,. Cuando tenga un directorio anclado, al pulsar la tecla de favoritos (b o Ctrl-/ (^/)) aparecerá , como primera tecla:

Teclas de marcadores: , w t m i d v n

Pulse , después de la tecla de favoritos para visitar el directorio anclado.

Puede anclar un directorio cada vez.

Filtrar entradas filtradas

El filtrado es la manera en que nnn busca archivos en un directorio. ¿Sabía que es posible aplicar un nuevo filtro sobre resultados ya filtrados?

  1. Vaya a un directorio.
  2. Pulse la tecla de filtro (/) y escriba un filtro.
  3. Pulse Esc o (Arriba) o (Abajo) (el filtro desaparecerá de la barra de estado).
  4. Vuelva a pulsar la tecla de filtro.
  5. Escriba un nuevo filtro para encontrar coincidencias en los resultados filtrados anteriormente.

Montar y modificar archivos

nnn le ofrece una opción para montar archivos al pulsar Enter en un archivo. Pulse m para montar el archivo y nnn montará el archivo y le llevará al punto de montaje del archivo montado.

Añada algunos ficheros en el archivo montado, vuelva al directorio de configuración de nnn (${XDG_CONFIG_HOME:-$HOME/.config}/nnn) y pase el ratón sobre el punto de montaje del archivo. Pulse u para desmontar el archivo y generar un paquete con los nuevos ficheros. El paquete original se guarda con la extensión .orig.

Ruta de archivo en el punto sobre $nnn

nnn exporta la ruta del archivo sobrevolado como $nnn cuando se pulsa el símbolo del sistema o se generan accesos directos del shell. Puede utilizar la variable para ejecutar un comando en el archivo sobrevolado:

ls -l "$nnn"

Previsualizar y editar archivos

En nnn puede editar y ver fácilmente los cambios en Markdown, páginas man, etc. Para ello es necesario utilizar un abridor de archivos CLI. Puede utilizar el plugin nuke, un abridor de ejemplo personalizable para especificar sus aplicaciones preferidas. Para establecer nuke como el abridor por defecto:

export NNN_OPENER=/ruta/absoluta/a/nuke

e inicie nnn como nnn -c.

La opción -c indica a nnn que el abridor es un abridor sólo CLI (ten en cuenta que nuke también puede abrir archivos en aplicaciones GUI; lee la documentación del archivo).

Ahora, cuando pulse Enter en un archivo Markdown, nuke intentará abrirlo en glow o una página de manual en el paginador man.

Para editar el archivo en $VISUAL (o $EDITOR, o vi), pasa el ratón sobre el archivo y pulse e.

Redirigir la selección a un comando

nnn permite a los usuarios seleccionar un fichero cada vez, un rango de ficheros o todos los ficheros de un directorio juntos. Una vez que haya terminado de seleccionar, puede ejecutar un comando en todos los archivos utilizando el archivo de selección como entrada:

xargs -0 ls -l < "${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection"

Si usa esto con frecuencia, tenga un acceso directo en su archivo rc:

export sel=${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection

y simplifique el comando como:

xargs -0 ls -l < $sel
¡Muchas extensiones funcionan así!.

Atajos de teclado

Incluso si compila nnn sin libreadline, los indicadores de entrada nativos soportan varias teclas similares a readline - Ctrl-A (^A), Ctrl-B (^B), Ctrl-D (^D), Ctrl-E (^E), Ctrl-F (^F), Ctrl-K (^K), Ctrl-U (^U), Ctrl-W (^W).

Ejecutar comandos personalizados con teclas de acceso rápido

nnn le permite ejecutar comandos personalizados como si fueran plugins. Por ejemplo, para abrir un archivo de registro en lnav, añada un par clave:comando tipo plugin en su variable de entorno NNN_PLUG:

export NNN_PLUG='l:-_lnav $nnn*'

Pulse ; (seleccionar acceso directo a complemento) seguido de l para abrir un archivo de registro en lnav.

Puede controlar varios aspectos al ejecutar comandos y plugins (por ejemplo, omitir la actualización del directorio tras ejecutar un plugin, omitir la confirmación del usuario tras ejecutar un comando) e incluso ejecutar aplicaciones GUI como un plugin. Visite plugins para más detalles.

Nota: lnav se tomó como ejemplo, puede abrir fácilmente archivos de registro en lnav editando el abridor de ejemplo personalizable nuke.



Abridor de archivos incorrecto

Si sus archivos de texto se abren en el navegador, compruebe la opción -e del programa.

Use el siguiente comando para establecer aplicaciones predeterminadas para mimetypes cuando use xdg-open como abridor:

xdg-mime default application mimetype(s)
e.g.
xdg-mime default sxiv.desktop image/jpeg image/png

Si su sistema utiliza mimeopen, es posible que tenga que instalar perl-file-mimeinfo.

Más en aplicaciones y abridores por defecto.



Nombres de archivo defectuosos

Si los caracteres unicode no se muestran correctamente, compruebe lo siguiente:



Configuración Tmux

Teclado

puede no manejar correctamente la pulsación de teclas cuando se usa con tmux (ver problema #104 para más detalles). Establezca TERM=xterm-256color para solucionarlo.

Por defecto tmux anuncia soporte para 8 colores. Para mostrar iconos en tmux añada lo siguiente al fichero de configuración de tmux:

set -g default-terminal "screen-256color"

Si se compila con netbsd-curses (vea Compilar con soporte para musl libc/) ajústelo a:

set -g default-terminal "xterm-256color"

Si la tecla Esc no funciona como se espera, añada lo siguiente en .tmux.conf:

set -g escape-time 0

Para iniciar nnn dentro de tmux use una función shell:

1
2
3
4
5
6
7
8
n () { if [ -n "$TMUX" ]; then nnn -a $@ else tmux new-session nnn -a $@ fi }

Nueva ventana/panel usando cwd

nnn no establece el cwd del terminal mientras se navega. Así que lo siguiente puede no funcionar:

tmux new-window -c "#{pane_current_path}"

Una posible solución es extraer la ruta del comando cwd que usa nnn:

lsof -c nnn | grep cwd

Para obtener la ruta del último comando cwd ejecutado:

lsof -w -c nnn | grep cwd | tail -n 1 | awk '{print $9}'

Un ejemplo de script tmux_split_curdir.sh:

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env sh cwd= cc=$(tmux display -p '#{pane_current_command}') if [ $cc == "nnn" ] ; then cwd=$(lsof -w -c nnn | grep cwd | tail -n 1 | awk '{print $9}') else cwd=$(tmux display -p '#{pane_current_path}') fi tmux split-window -c "$cwd"

Si añade este script a la ruta de tmux, podra ejecutarlo con run-shell:

bind -n KEYS run-shell "tmux_split_curdir.sh"


Tecla de control rota

Si una combinación de teclas Ctrl no funciona, compruebe si está enmascarada debido a la configuración de la línea del terminal:

stty -a

Si ese es el caso, borre (undef) la configuración. Ej:

stty start undef
stty stop undef
stty lwrap undef
stty lnext undef

Puede hacerlo al iniciar nnn. Consulte los scripts quitcd.



No se muestra la ayuda

Si su PAGER es less, elimine la opción -F (sale automáticamente si se puede mostrar todo el archivo en la primera pantalla). Hay otras pantallas que también usan less.

Tenga en cuenta que el comando less toma sus parámetros por defecto de la variable de entorno $LESS, por lo que puede que necesite eliminar -F de la inicialización de su shell.



Límites por defecto del renombrado por lotes

TL;DR: Si necesita un renombrador por lotes completo, instale plugins. nnn autodetecta e invoca el plugin interno .nmv (un script bash) que es completo.

El renombrador por lotes incorporado implementado en nnn es muy simplificado. Es de una sola pasada - lee el nombre/ruta de los ficheros de forma iterativa (desde una lista de ficheros fuente) y los renombra/desplaza (como se especifica en el número de línea correspondiente en una lista de ficheros renombrados/destino). No maneja eliminaciones ni realiza ningún análisis previo para tener en cuenta bucles de renombrado, intercambios, sustituciones, etc.

Tenga en cuenta que la instancia del editor debe esperar a que finalice la edición y se guarden los cambios (por ejemplo, use -w con VSCode).



Columna de Tamaño Desalineada

Hemos visto este problema con WSL y Putty, donde a veces los caracteres de espacio repetidos no se imprimen correctamente.

Para solucionarlo:

export TERM=rxvt-unicode
// OR
export TERM=rxvt-unicode-256color

Explicación detallada.



No se puede listar dentro de la lista

La vista de lista es una vista temporal de enlaces simbólicos. Para evitar recordar las rutas temporales a todas las vistas de lista, la ruta actual se elimina cuando se carga la siguiente lista. Esto también está en línea con el hecho de que find no busca dentro de enlaces simbólicos a directorios. Si necesita buscar las entradas dentro de una lista cargada, visite el directorio original y ejecute la búsqueda refinada.



Problema con el terminal BSD

TL;DR: En versiones anteriores a la v2.7, use la combinación de teclas k para alternar la selección si tiene problemas con Ctrl-y (^Y).

En OpenBSD y FreeBSD (y probablemente también en macOS) stty asigna Ctrl-y (^Y) a DSUSP por defecto. Esto significa que teclear Ctrl-y suspenderá nnn como si tecleara Ctrl-z (^Z) (puede traer nnn de vuelta al primer plano emitiendo fg) en lugar de entrar en modo multiselección. Puede comprobarlo con stty -a. Si incluye el texto dsusp = ^Y, emitiendo stty dsusp undef desactivará este DSUSP y dejará que nnn reciba el Ctrl-y (^Y) en su lugar.



Amethyst WM

Existe un problema conocido con el gestor de ventanas Amethyst en macOS: los redibujos no funcionan correctamente y la pantalla se rompe. Consulte el problema #521 para más detalles.



Ejecutar dentro de contenedores docker

Cuando se ejecuta dentro de un contenedor docker, nnn sale instantáneamente. La solución es crear el contenedor con la bandera --init.



Los iconos no funcionan correctamente

Asegúrese de que la fuente primaria de su terminal es la adecuada (por ejemplo, si utiliza O_NERD, la fuente primaria debe ser una fuente nerd). Asegúrese también de que la configuración regional de su sistema es la adecuada.

Al usar ST, algunos iconos pueden aparecer truncados. Hay un parche disponible para solucionar este problema en un hilo de reddit aquí.



Orden de clasificación incorrecto/mal

LC_COLLATE

nnn respeta el valor de la variable de ambiente LC_COLLATE - el efecto de esto depende de su libc. Pruebe a establecerlo en algo estándar/bien soportado como "C" o "C.UTF8" y compruebe si se soluciona el problema o no (vea #1652).



Técnicas de optimización

Factores importantes

  • Ordenamiento rápido con prefiltros para ordenar por nombre de archivo, hora, tamaño, etc.
  • 0 fragmentación - sin pérdida de bytes al almacenar el nombre de archivo de las entradas de directorio.
  • No se copian las cadenas de nombres de archivo durante la clasificación/filtrado.
  • Las entradas que no coinciden con un filtro se mueven a las ranuras más bajas para ignorarlas más tarde.
  • Las entradas que no coinciden con un filtro se mueven a las ranuras más bajas para ignorarlas más tarde.
  • Manejo de la selección mediante manipulación optimizada de la memoria masiva.
  • Mayor número de descriptores de archivo abiertos.
  • Redibujado rápido sólo de las líneas afectadas para evitar el refresco completo.
  • Todos los búferes grandes están alineados.
  • Estructuras de uso frecuente optimizadas para facilitar el soporte de instrucciones cuádruples SSE.
  • Solicitud de lectura anticipada (para los núcleos compatibles con esta función).
  • Rutinas rápidas para calcular y renderizar el tamaño del archivo.
  • Desplazamientos en lugar de div y mul (los compiladores modernos ya lo hacen).
  • Uso optimizado de memoria en todas partes, reutilización de búferes.
  • Sin aritmética de coma flotante.
  • Rutinas estáticas.
  • Tamaño binario controlado.
  • Optimización del compilador a nivel O3.
  • Código analizado estáticamente con 0 advertencias (forzado -Wall -Wextra -Werror en CI).
  • Tabla hash generada estáticamente para búsquedas de iconos de extensión O(1) garantizadas.

Opciones rechazadas

  • Sustituir ordenacion rápida (quicksort) por un algoritmo más agresivo (favorecer la complejidad espacial frente a la temporal).
    • La diferencia no suele ser perceptible por los seres humanos.
    • La opción de carga aleatoria también se elimina para enfatizar esto.
  • Llamadas no estándar como statx()/getdents()/getdents64().
    • Específico de la plataforma, nnn es compatible con POSIX.
    • La descripción de la página de manual comienza con "Éstas no son las interfaces que le interesan".
  • Optimizar la gestión de más de 10.000 entradas en un directorio.
    • No es un caso de uso masivo.
    • El rendimiento con 10K archivos es suficientemente bueno hoy en día.
    • SSD/NVMe son el futuro.
  • Usar lazy/background/threaded load.
    • Las opciones du, sort y type-to-nav del programa requieren una stat() en todas las entradas para que sean correctas.

Selección

Soportar la selección multi-directorio es técnicamente desafiante; nnn usa muchas optimizaciones para hacerlo imperceptible en la mayoría de los casos, pero seleccionar-todo (incluyendo filtrado) o inversión mientras ya se tienen muchos archivos seleccionados puede tomar algún tiempo.

Cuando se probó en el Motorola Photon Q (CPU ARM con 13,54 bogomips) y un directorio con 10K ficheros, incluso los casos más complicados que se nos ocurrieron terminaron en 10 segundos. Si la selección anterior era pequeña o continua, tanto seleccionar todo (completo como en filtro) como invertir fueron instantáneos.

Comparación

GNU libc + ncursesw vainilla

Tamaño del binario (o script) y uso de memoria de nnn y algunos otros FMs populares (que existían antes que nnn) mientras se visualiza un directorio con 13.5K archivos (0 directorios), ordenados por tamaño/du:

 BINSZ    VIRT    RES    SHR S  %MEM   COMMAND
  650K  139720  91220   8460 S   1.1   ranger
    1M   50496  15328   4076 S   0.2   vifm
    1M   72152  12468   7336 S   0.2   mc
  110K   15740   4348   2460 S   0.1   nnn -t d

GNU libc + ncursesw + upx personalizado

Resultados con opciones make agresivas, binario estático y compresión upx:

$ make O_NORL=1 O_NOMOUSE=1 O_NOLC=1 O_NOBATCH=1 O_NOSSN=1 O_NOFIFO=1 O_QSORT=1 O_NOUG=1 static strip
$ upx nnn-static
$ top
 BINSZ    VIRT    RES    SHR S  %MEM   COMMAND
  582K    3136   3056      4 S   0.0   nnn-static -cdDEnQrux -t d ~/images // 11K files
  582K    2428   2240      4 S   0.0   nnn-static -cdDEnQrux -t d /usr/bin // 1.5K files

musl libc + netbsd-curses vainilla

Resultados con 1950 archivos:

$ musl-gcc -O3 -DNORL -I../netbsd-curses/libcurses -o nnn-shared src/nnn.c -Wl,-Bsymbolic-functions -L/opt/netbsd-curses -lcurses -lterminfo
$ strip nnn-shared
$ musl-gcc -O3 -DNORL -I../netbsd-curses/libcurses -o nnn-static src/nnn.c -Wl,-Bsymbolic-functions -L/opt/netbsd-curses -lcurses -lterminfo -static
$ strip nnn-static
 BINSZ    VIRT    RES    SHR S  %MEM   COMMAND
  102K    1952   1580    868 S   0.0   nnn-shared -dn
  354K    1164    824    348 S   0.0   nnn-static -dn

nnn vs. ls

El tamaño binario despojado de ls es de 130,7K.

nnn tarda menos del 50% del tiempo en listar un directorio con 2083 ficheros:

$ time nnn /usr/bin
0.00user 0.01system 0:00.02elapsed 42%CPU (0avgtext+0avgdata 3540maxresident)k
1608inputs+0outputs (3major+325minor)pagefaults 0swaps

$ export LS_COLORS='ex=00:su=00:sg=00:ca=00:'
$ time ls -l /usr/bin
0.01user 0.01system 0:00.05elapsed 47%CPU (0avgtext+0avgdata 3800maxresident)k
784inputs+0outputs (0major+303minor)pagefaults 0swaps

nnn realiza aproximadamente un tercio de las llamadas al sistema realizadas por ls (todas las lecturas se tomaron en el arranque en frío).

$ time strace -c nnn -d /usr/bin | wc -l
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 92.56    0.014030           7      1989           newfstatat
  4.95    0.000751         188         4           getdents
  1.19    0.000180           3        57         1 stat
  0.53    0.000081          81         1           inotify_add_watch
  0.15    0.000023           2        15           close
  0.11    0.000017           2        10           brk
  0.10    0.000015           1        14           openat
  0.08    0.000012           2         6           write
  0.07    0.000010           0        23         3 ioctl
  0.05    0.000007           0        15           fstat
  0.05    0.000007           7         1         1 unlink
  0.04    0.000006           1         8           read
  0.04    0.000006           0        14           mmap
  0.04    0.000006           6         1           inotify_rm_watch
  0.03    0.000005           5         1           sysinfo
  0.01    0.000002           2         1           lseek
  0.00    0.000000           0         2           lstat
  0.00    0.000000           0        10           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         9           rt_sigaction
  0.00    0.000000           0         9         7 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         1           inotify_init1
------ ----------- ----------- --------- --------- ----------------
100.00    0.015158                  2194        12 total
0.01user 0.05system 0:00.08elapsed 84%CPU (0avgtext+0avgdata 3524maxresident)k
4576inputs+0outputs (10major+545minor)pagefaults 0swaps
0

$ export LS_COLORS='ex=00:su=00:sg=00:ca=00:'
$ time strace -c ls -l /usr/bin | wc -l
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 42.88    0.011274           6      1989           lstat
 27.69    0.007281           4      1989      1989 lgetxattr
 20.74    0.005454           4      1548      1548 getxattr
  5.82    0.001529           3       442           readlink
  1.35    0.000355          89         4           getdents
  0.38    0.000100           3        31           write
  0.24    0.000064           2        33         5 openat
  0.18    0.000048           1        34           close
  0.17    0.000046           3        17           lseek
  0.16    0.000042           1        40           mmap
  0.16    0.000041           4        11           munmap
  0.11    0.000030           1        30           fstat
  0.04    0.000011           2         5           brk
  0.04    0.000011          11         1           mremap
  0.03    0.000007           0        17           read
  0.00    0.000000           0        20           mprotect
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         2         2 ioctl
  0.00    0.000000           0        12        12 access
  0.00    0.000000           0         4           socket
  0.00    0.000000           0         4         4 connect
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         2         2 statfs
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         1           futex
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
  0.00    0.000000           0         1           prlimit64
------ ----------- ----------- --------- --------- ----------------
100.00    0.026293                  6244      3562 total
0.02user 0.12system 0:00.13elapsed 106%CPU (0avgtext+0avgdata 3728maxresident)k
3752inputs+0outputs (7major+526minor)pagefaults 0swaps
1989

C vs. otros lenguajes

  • Punto de referencia: Python3 vs. C gcc.
  • Punto de referencia: Go vs. C gcc.
  • Bash script vs. C gcc.
    /* compare.c */
    
    int main(void)
    {
      for (int i = 0; i < 1000000; i++)
        printf("hello\n");
    
      return 0;
    }
    
    $ time -p ./compare
    real 1.89
    user 0.20 <<
    sys 1.25
    ---------------------------------
    # compare.sh
    #!/bin/bash
    
    for (( i = 0; i < 1000000; i++ ))
    do
      echo hello
    done
    
    exit 0
    
    $ time -p ./compare.sh
    real 5.88
    user 4.66 <<
    sys 1.21
    	


De noice a nnn

¿Por qué la bifurcación?

nnn se bifurcó inicialmente de noice, pero hoy es significativamente diferente. Decidí bifurcarlo porque.

  • Se puede argumentar que mi enfoque se desvía del objetivo del proyecto original: mantener la utilidad suckless. noice era rudimentario. En mi opinión la evolución es el sabor del tiempo.
  • Me gustaría tener un poco de control sobre qué características se añaden en nombre de la integración de escritorio. Una característica inflada es la última cosa en mi mente. Ver las notas de Diseño para más detalles.

v1.0 fue lanzado el 13 Abr, 2017.

nnn vs. noice

Funciones originales (noice)

  • Navegación superfácil.
  • Asociaciones predefinidas para distintos tipos de archivos.
  • Saltar al directorio principal.
  • Filtrar el contenido del directorio actual.
  • Hacer visibles o no archivos ocultos.
  • Ordenar las entradas por tiempo de modificación (de más reciente a más antiguo).
  • Crear un SHELL en el directorio actual (sh alternativo).
  • Ejecutar top.
  • Editar un archivo con EDITOR (fallback vi).
  • Recorrer un fichero con PAGER (fallback less).

nnn está en desarrollo activo y se añaden nuevas capacidades continuamente. Para tener una visión más reciente de las características actuales por favor visite la lista de características en la página principal del proyecto y la lista ToDo.



Guía para Desarrolladores

Lista de comprobación

  1. Ejecutar pruebas con los archivos outdir generados.
  2. Actualizar las opciones del programa y la ayuda en Wiki, si es necesario.
  3. Actualizar los scripts de autocompletado, si es necesario.
  4. Actualizar VERSION en el código fuente.
  5. Actualice la sección app_version dentro de misc/haiku/nnn.rdef. Además, asegúrese de cambiar la variedad de B_APPV_DEVELOPMENT a B_APPV_FINAL.
  6. Actualizar la fecha en la página de manual.
  7. Revisar lista de paquetes autogenerados.
  8. Actualizar CHANGELOG (registro de cambios).
  9. Crear etiqueta firmada y empujar a GitHub.
  10. Ejecutar make O_NOUG=1 upload-local (requiere libgpm-dev, upx, jq) para subir la firma del paquete fuente y el binario estático.
  11. Crear una versión de GitHub y rellenar las notas de la versión de CHANGELOG.
  12. Revertir la variedad a B_APPV_DEVELOPMENT en /misc/haiku/nnn.rdef.
  13. Notificar a los mantenedores de paquetes aguas abajo.


Verificar fuentes

El archivo de fuentes (tarball) está firmado con una clave PGP, que puede verificar de la siguiente manera.

$ gpg --verify nnn-<VERSION>.tar.gz.sig nnn-<VERSION>.tar.gz
gpg: Signature made ...
gpg:                using RSA key BBAD0B2F3093A7C3377A8F6BA75979F35C080412
gpg: Good signature from "Arun Prakash Jana <...>"
Primary key fingerprint: BBAD 0B2F 3093 A7C3 377A  8F6B A759 79F3 5C08 0412


Opciones de make

nnn proporciona varias variables make para personalizar las características a incluir o excluir. Esto también ayuda a reducir aún más el tamaño del binario.

Compilar con PCRE

POSIX regex es la opción por defecto. Para habilitar PCRE, instale la biblioteca de desarrollo PCRE y establezca O_PCRE.

En Ubuntu 18.04:

sudo apt install libpcre3-dev
make O_PCRE=1

En macOS

brew install pcre  # if you're using Homebrew
sudo port install pcre  # if you're using MacPorts
make O_PCRE=1

Compilar con Readline

make O_NORL=1

Compilar con Soporte para Ratón

make O_NOMOUSE=1

Compilar con renombrador por lotes integrado con funciones limitadas

make O_NOBATCH=1

Úselo si tiene plugin .nmv (script bash).

Compilar con soporte para FIFO

make O_NOFIFO=1

Compilar con soporte para sesión

make O_NOSSN=1

Compilar con detalles de usuario y grupo en la barra de estado

make O_NOUG=1

El almacenamiento y descodificación de la información de usuarios y grupos aumenta considerablemente el uso de memoria residente.

Compilar para incluir íconos en terminal

make O_ICONS=1

Más detalles aquí. Esta variable no es compatible con O_NERD=1, O_EMOJI=1 y O_NOLC=1.

Compilar con soporte para fuente nerdfont

make O_NERD=1

Más detalles aquí. Esta variable no es compatible con O_ICONS=1, O_EMOJI=1 y O_NOLC=1.

Compilar con soporte para emojis

make O_EMOJI=1

Más detalles aquí. Esta variable no es compatible con O_ICONS=1, O_NERD=1 y O_NOLC=1.

Compilar con soporte Configuración Regional

make O_NOLC=1

Los caracteres no admitidos en los nombres de archivo se sustituyen por ?. Las operaciones con archivos funcionan sin problemas.

Compilar con integración X11

make O_NOX11=1

Desactiva las notificaciones de finalización de cp, mv, rm, la sincronización de la selección con el portapapeles del sistema y el anuncio del título de xterm al cambiar de directorio.

Compilar con soporte para QSORT de Alexey Tourbin

make O_QSORT=1

Compilar con soporte para 8 contextos

make O_CTX8=1

Atención: Las sesiones guardadas pueden dejar de ser utilizables cuando se cambia el número de contextos.

Sólo filtros de coincidencia

make O_MATCHFLTR=1

Descarta la clave de filtro cuando no hay coincidencias.

Compilar con opción Cargar Directorios Sin Ordenar

make O_NOSORT=1

Esta opción es útil en el modo type-to-nav (tipo para navegación). Carga los directorios más rápido en la entrada inicial. Cualquier filtro ordena el listado. Utilizable sólo con xterm 256 colores.



Compilación estática

Instala la librería de desarrollo GPM y establece la variable O_STATIC del Makefile.

En Ubuntu 16.04/18.04:

sudo apt install libgpm-dev
make O_STATIC=1 strip

En macOS: Por el momento no es posible compilar con -static en macOS. Así que por favor ignore esta opción si está en macOS.

Advertencia

Esta opción no funcionará en Mac OS X a menos que todas las bibliotecas (incluida libgcc.a) se hayan compilado también con -static. Dado que no se proporciona una versión estática de libSystem.dylib ni de crt0.o, esta opción no es útil para la mayoría de la gente.

Verificar el binario

file nnn
nnn: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=1be54d27687f83cf42393dd59dba2723798956de, stripped
20


Consejos de optimización

Un uso cuidadoso de las variables make, la compilación estática y la compresión upx pueden hacer maravillas.

$ make CFLAGS+=-march=native O_NORL=1 O_NOMOUSE=1 O_NOLC=1 O_NOBATCH=1 O_NOSSN=1 O_NOFIFO=1 O_QSORT=1 O_NOUG=1 static
$ upx nnn-static
$ ls -l nnn-static
-rwxrwxr-x 1 user user 593808 Nov  2 00:45 nnn-static

# top output (/usr/bin has 1544 files)

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                             
  31953 user      20   0    2428   2244      4 S   0.0   0.0   0:00.02 ./nnn-static -cdDEnQrux /usr/bin


Compilar para MacOS

En macOS la librería ncurses por defecto es demasiado antigua y puede causar problemas. Instale una versión más actualizada desde homebrew y enlaza con ella añadiendo la ruta de la librería a $LDLIBS.

$ LDLIBS="-L/opt/homebrew/opt/ncurses/lib/" make


Compilar para Pi

La versión de nnn disponible como paquete estable de Raspbian está muy desactualizada (v2.2), lo que significa que la única forma de obtener una versión reciente de nnn es compilar desde el código fuente.

Como ejemplo, para compilar nnn v3.5 para una Raspberry Pi ejecutando Raspbian Buster, obtenga nnn-v3.5.tar.gz de los activos de lanzamiento, ponga el archivo tarball en la Pi, y luego haga lo siguiente:

Instalar dependencias requeridas

sudo apt install pkg-config libncursesw5-dev libreadline-dev

Extraer el tarball listo para la compilación

tar -zxvf nnn-v3.5.tar.gz
cd nnn-3.5

Compilar e instalar en el directorio por defecto (/usr/local/bin)

sudo make strip install

Lo anterior fue probado en una Raspberry Pi Zero W ejecutando Buster y funcionó sin problemas.



Instrucciones para Cygwin

Copiar al portapapeles de Windows desde Cygwin

Instale los plugins y utilice la opción -x del programa.

Editor externo para Cygwin

Vea jarun/nnn#1200



Compilar con soporte para musl libc

Aquí, hilo de discusión. Consulte este parche para ahorrar un poco más en terminfo.

Script de compilación para Ubuntu siguiendo de cerca este procedimiento.

Instalar musl

sudo apt install musl musl-dev musl-tools

Obtener netbsd-curses y compilar las bibliotecas compartidas y estáticas

git clone https://github.com/sabotage-linux/netbsd-curses
cd netbsd-curses
git checkout v0.3.2
make CC=musl-gcc CFLAGS="-O3 -Wall -fPIC" -j$(($(nproc)+1)) all
sudo mkdir /opt/nnn-libs
sudo cp libcurses/libcurses.so libterminfo/libterminfo.so /opt/nnn-libs/
make clean
make CC=musl-gcc CFLAGS=-O3 LDFLAGS=-static all-static
sudo cp libcurses/libcurses.a libterminfo/libterminfo.a /opt/nnn-libs/

Obtenga musl-fts y compile los binarios compartidos y estáticos

git clone https://github.com/void-linux/musl-fts --depth=1
cd musl-fts
./bootstrap.sh
./configure
make CC=musl-gcc CFLAGS=-O3 LDFLAGS=-static -j$(($(nproc)+1))
sudo cp .libs/libfts.a /opt/nnn-libs/
make clean
make CC=musl-gcc CFLAGS=-O3 -j$(($(nproc)+1))
sudo cp .libs/libfts.so.0.0.0 /opt/nnn-libs/libfts.so

Obtenga pcre y compile los binarios compartidos y estáticos

wget https://downloads.sourceforge.net/pcre/pcre-8.45.tar.bz2
./configure --enable-unicode-properties --enable-pcre16 --enable-pcre32
make CFLAGS=-O3 CC=musl-gcc LDFLAGS=-static
sudo cp .libs/libpcre.a /opt/nnn-libs
make CFLAGS=-O3 CC=musl-gcc
sudo cp .libs/libpcre.so.1.2.13 /opt/nnn-libs

Compilar nnn

# compartida
musl-gcc -O3 -DNORL -DNOMOUSE -std=c11 -Wall -Wextra -Wshadow -I/path_to/netbsd-curses/libcurses -I/path_to/musl-fts -o nnn src/nnn.c -Wl,-Bsymbolic-functions -lpthread -L/opt/nnn-libs -lcurses -lterminfo -lfts

# personalizada compartida
musl-gcc -O3 -DNORL -DNOLC -DNOMOUSE -DNOBATCH -DNOFIFO -DTOURBIN_QSORT -DNOSSN -DNOUG -DNOX11 -std=c11 -Wall -Wextra -Wshadow -I/path_to/netbsd-curses/libcurses -I/path_to/musl-fts -o nnn src/nnn.c -Wl,-Bsymbolic-functions -lpthread -L/opt/nnn-libs -lcurses -lterminfo -lfts

# Nota 1: Para la compilación estática añada `-static` a los comandos anteriores
# Nota 2: Para activar pcre, añada `-I./pcre-8.45` y `-lpcre`.

# la librería strip
strip nnn

Ejecute

# Para lib compartida
export LD_LIBRARY_PATH=/opt/nnn-libs:$LD_LIBRARY_PATH

# ./nnn


Compilación Cruzada para Android

Esta sección se aplica a Linux como host, Android en arm64 target y un terminal xterm-256color.

Vamos a enlazar estáticamente contra libreadline y libncursesw por lo que no necesitaremos instalarlos por separado en el teléfono.

Para cualquier otra cosa, por favor ajuste en consecuencia.

Preparación

  • Descarge ncurses y readline
  • Extraiga ncurse y readline.
  • Configure el NDK de Android y asegúrese de exportar todas las variables necesarias para GNU Autoconf.
  • export ANDROID_ENV para que sea la ubicación donde instalemos nuestras dependencias de compilación cruzada

Compilación Cruzada para ncurses

  • cd dentro del directorio ncurses.
  • Configure:
    ./configure --enable-widec --enable-termcap --with-fallbacks=xterm-256color --disable-stripping --host=aarch64-linux-android --prefix=$ANDROID_ENV
    	
  • Construya (make) e instale (install):
    make && make install
    	
  • Compilación cruzada nnn

    • cd al directorio nnn.
    • Ejecute export CFLAGS="$CFLAGS -I$ANDROID_ENV/include/ncursesw -I$ANDROID_ENV/include".
    • Ejecute export LDFLAGS="$LDFLAGS -L$ANDROID_ENV/lib".
    • Ejecute make.

    Validar

    Al escribir file nnn, se debería ver:

    nnn: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /system/bin/linker64, not stripped
    

    Obtener nnn-ing

    Mueva el binario a su teléfono y ejecútelo con su emulador de terminal favorito.



Depurar nnn

Para depurar (debugging) nnn ejecútelo en modo debug:

make O_DEBUG=1

Para ejecutar el binario depurado, ejecute:

./nnn

En el modo de depuración nnn genera información de depuración adicional que se registra en el archivo nnndbg ubicado (por prioridad) en:

/tmp/nnndbg or,
the directory in which nnn is run

Para registrar información adicional, utilice la opción DPRINTF_*.