Cambiar el tamaño de la pestaña del comando "gato"

15

Cuando estoy dentro vim, puedo cambiar el tamaño de la pestaña con el siguiente comando:

:set ts=4

¿Es posible establecer el tamaño de la pestaña para la catsalida del comando también?

Meysam
fuente

Respuestas:

21

El primer comando aquí emula el formato que ve en vim. Expande de manera inteligente las pestañas al número equivalente de espacios, en función de una configuración de tabulación (STOP) de cada 4 columnas.

printf "ab\tcd\tde\n" |expand -t4   

Salida

ab  cd  de

Para mantener las pestañas como pestañas y tener las posiciones de DETENCIÓN de pestañas establecidas en cada cuarta columna, debe cambiar la forma en que el entorno funciona con un tab-char (tal como lo hace vim con el :set ts=4comando)

Por ejemplo, en el terminal, puede establecer la pestaña STOP en 4 con este comando;

tabs 4; printf "ab\tcd\tde\n" 

Salida

ab  cd  de
Peter.O
fuente
Es bueno saberlo (1). expand(desde el paquete coreutils) y el tabscomando (desde el paquete ncurses), (2). y el significado de ts es [ T ] ab [ S ] top
LiuYan 刘 研
10

Solo usa el siguiente código:

tabs -n

Donde n es el número de espacios que desea que las pestañas correspondan también. Con el fin de no tener que hacer esto cada vez que se inicia el shell, simplemente editar su .bash_profileen ~/y añadir la línea anterior al final del archivo.

Para obtener más información sobre el comando de pestañas, consulte:

man tabs
Gustavo Bezerra
fuente
2
Solo tenga en cuenta que cambiar permanentemente el ancho predeterminado de sus pestañas puede arruinar otros comandos (por ejemplo, lsout puede parecer que no está alineado correctamente).
Gustavo Bezerra
9

No hay noción de pestañas o tabulaciones cat; el programa simplemente canaliza las entradas a la salida y trata las pestañas como cualquier otro personaje. Si el dispositivo de salida es un terminal, las pestañas se manejarán de acuerdo con el comportamiento que el terminal esté configurado para proporcionar.

Los sistemas que implementan POSIX.1 tienen un comando llamado tabs(1)que ajustará el concepto del terminal de cómo se deben mostrar las pestañas. Dependiendo de un diseño de pestaña en particular, no se considera una buena idea, ya que alguien puede enviar su archivo a otro dispositivo como una impresora que no hará lo que usted pretendía.

Cuando ajuste tsen vim(o simple vi), todo lo que está haciendo es regular cómo el editor interpreta los caracteres de tabulación cuando se muestre. No tiene relación con lo que termina en el archivo.

Blrfl
fuente
Gracias por la explicación. ¿Cómo se configura la impresora para tratar las pestañas?
Meysam
La mayoría de las impresoras las tratan de la misma manera que la mayoría de los terminales por defecto: el margen izquierdo y cada ocho caracteres después.
Blrfl
5

Basado en las respuestas y ejemplos anteriores, parece que el comando real que el OP quería es ...

cat somefile | expand -t4

Esto funciona para mí en Red Hat 6.4.

ScotlynHatt
fuente
2

Para ampliar las respuestas ya dadas, expandtambién puede tomar una lista de posiciones de tabulación. Esto es útil si la longitud del contenido de las diversas columnas varía mucho.

Encontré este requisito hoy cuando quería hacer que la salida fuera openssl ciphersmás legible:

$ openssl ciphers -v 'HIGH'|tr -s ' ' '\t'|expand -t31,41,57,70,90
ECDHE-RSA-AES256-GCM-SHA384    TLSv1.2   Kx=ECDH         Au=RSA       Enc=AESGCM(256)     Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384  TLSv1.2   Kx=ECDH         Au=ECDSA     Enc=AESGCM(256)     Mac=AEAD
ECDHE-RSA-AES256-SHA384        TLSv1.2   Kx=ECDH         Au=RSA       Enc=AES(256)        Mac=SHA384
ECDHE-ECDSA-AES256-SHA384      TLSv1.2   Kx=ECDH         Au=ECDSA     Enc=AES(256)        Mac=SHA384
...
ECDH-ECDSA-AES128-SHA          SSLv3     Kx=ECDH/ECDSA   Au=ECDH      Enc=AES(128)        Mac=SHA1
AES128-GCM-SHA256              TLSv1.2   Kx=RSA          Au=RSA       Enc=AESGCM(128)     Mac=AEAD
AES128-SHA256                  TLSv1.2   Kx=RSA          Au=RSA       Enc=AES(128)        Mac=SHA256
AES128-SHA                     SSLv3     Kx=RSA          Au=RSA       Enc=AES(128)        Mac=SHA1

CAMELLIA128-SHA                SSLv3     Kx=RSA          Au=RSA       Enc=Camellia(128)   Mac=SHA1
PSK-AES128-CBC-SHA             SSLv3     Kx=PSK          Au=PSK       Enc=AES(128)        Mac=SHA1

Usar solo expand -t31aumentaría el ancho de la salida de alrededor de 100 caracteres a más de 160 caracteres.

Alexander Stumpf
fuente
1
Una forma más fácil de hacerlo es usar column:openssl ciphers -v 'HIGH' | column -t
muru
0

Muchas terminales admiten la configuración de tabulaciones variables. Los que son vt100, linux y / o son compatibles con el estándar EMCA-48 sí, la mayoría de los términos en el tamaño de la pestaña de configuración de soporte de linux: xterm y family (uxterm, urxvt) xfce4-terminal, luit, Terminal, SecureTTY, entre otros.

Así que escribí una secuencia de comandos hace unos años para configurar mis pestañas al iniciar sesión en cada 2 espacios: solía usar 4, luego 3 por un momento, y ahora en 2 ...

Entonces, si 'gato' un archivo, las pestañas en el archivo se expandirán a la configuración de mi terminal.

Si pasé por vim o más, hacen su propia expansión de pestañas, pero muchas utilidades usan pestañas.

Incluirá el script aquí para referencia, y / o uso personal:

#!/bin/bash  -u
#console_codes(4) man page... vt100/2 et && EMCA-48 standard
# (c) la walsh (2013) -- free to use and modify for personal use.
#                     -- optionally licenced under Gnu v3 license.

# v0.0.3    - try to reduce tabcols to minimal set to reproduce.
# v0.0.2    - set tabs for full terminal width (try to get term width)

shopt -s expand_aliases extglob
alias my=declare        
alias int='my -i'       array='my -a' intArray='my -ia'   string=my

my _Pt=$(type -t P)
[[ $_Pt && $_Pt == function ]] && unset -f P
alias P=printf
unset _Pt

P -v clrallts  "\x1b[3g"    #Clear All TabStops
P -v hts       "\033H"      #Horizontal TabStop
P -v cpr       "\x1b[6n"    #Current Position Report


getcols() {                 # try to read terminal width
  local sttyout="$(stty size </dev/tty)"
  int default_cols=80
  if [[ -n ${COLUMNS:-""} && $COLUMNS =~ ^[0-9]+$ ]]; then 
    default_cols=$COLUMNS; fi
  [[ -z ${sttyout:-""} ]] && { echo $default_cols; return 0; } 
  int cols="${sttyout#*\ }"
  echo -n $[cols<2?default_cols:cols]
  return 0
}

getpos () {
  string ans    wanted=${1:-xy}
  int attempt=0 max_attempt=1   # in case of rare failure case
                                # use 'attempt' value as additional
                                # time to wait for response
  while : ; do
    ( ( P "\x1b[6n" >/dev/tty) & 2>/dev/null )  
    read  -sd R -r -t $[2 + attempt] ans </dev/tty; 
    ans=${ans:2}; 
    int x=0-1 y=0-1
    if ! x="${ans#*;}" y="${ans%;*}" 2>/dev/null  || 
      ((x==-1||y==-1)); then
      ((attempt+=1 < max_attempt)) && continue
    fi
  break; done
  string out=""
  [[ $wanted =~ x ]] && out="$x"
  [[ $wanted =~ y ]] && out="${out:+$x }$y"
  [[ $out ]] && echo -n "$out"
}

declare -ia tabs


get_tabs () {
  P "\r"
  tabs=()
  int pos=0 oldpos=0-1
  while ((oldpos!=pos));do
    ((pos)) && tabs+=($pos)
    oldpos=pos
    P "\t"
    pos=$(getpos x)
  done
  P "\r"
  return 0
}

# Note: this func uses ability to _read_ tabstops as _proxy_ for setting them
# (i.e. it makes no sense to be able to read them if you can't set them)

test_tabset_ability () {
  string prompt="tty_tab:"
  int newcol=${#prompt}+1
  P "\r$prompt"
  int mycol=$(getpos x)
  ((mycol && mycol==newcol)) && return 0    ## return OK

  { P " Term tabset ability not detected mycol=${mycol:-''},"
    P " promptlen=$newcol)\n"; } >&2
  exit -1 
}

do_help_n_display_curtabs () {
  P " <n>   - set tab stop to N\r"
  intArray diffs;
  int last=1  cur i
  string eol=""
  get_tabs && {
    for ((i=0; i<${#tabs[@]}; ++i)); do
      cur=${tabs[i]}
      diffs[i]=cur-last
      last=cur
    done
    intArray reverse_tabs_set=()
    int prevtab=0-1
    for ((i=${#diffs[@]}-2; i>0; --i)); do
      int thistab=${diffs[i]}
      if ((thistab!= prevtab)) ;then 
        reverse_tabs_set+=($thistab)
        prevtab=thistab
      fi
    done
    P "current value: tty_tab "
      for ((i=${#reverse_tabs_set[@]}-1; i>=0; --i)); do
        P "%d " "${reverse_tabs_set[i]}"; done
    P "\r";
  }
  get_tabs  && {
    P "(from 1, tabs skip to column: "
    P "%s " "${tabs[@]}"
    P "\r\n"
  }
}

set_tabs () {
  int max_col=${1:=0-80}
  int tabstop=${2:-?"need a param for tabstop"}
  int tab=$tabstop        pos=0
  string str=""
  P $clrallts               ## reset old tabs
  while ((++pos<cols)) ;do  ## move across screen setting tabs
    str+=" "
    ((pos%tab)) || str+="$hts"
  done
  P "\r$str\r"
}


int cols=$(getcols)

test_tabset_ability         ## exits if no ability


if (($#==0)) ; then
  do_help_n_display_curtabs
  exit 1
else
  set_tabs "$cols" "$@"
fi

# vim: ts=2 sw=2

Espero eso ayude...

Astara
fuente
-2

Según la página de manual, cat no puede hacerlo solo. Pero puede, por ejemplo, ejecutar la salida de cat a través del trfiltro para reemplazar las pestañas con cualquier cantidad de espacios que desee:

cat somefile | tr '\t' '  '

reemplazará el carácter de tabulación con dos espacios.

Actualización: como se señaló en los comentarios a esta publicación, esto en realidad no funciona. Sin embargo, mantengo la respuesta como un ejemplo de cómo no hacerlo.

Petr Uzel
fuente
3
En realidad, se está reemplazando '\t'con un solo espacio, sin importar cuántos espacios haya entre el segundo par de citas' '
Meysam
3
trno funciona de esa manera ... cada byte de arg 1 se sustituye por cada byte correspondiente de arg 2 ..... Por lo tanto, printf '\t' |tr '\t' 'ळ' imprime un solo byte cuyo valor hexadecimal es \xE0... que es el primer byte de los tres UTF-8 bytes codificados que forman el carácter (cuyo valor Unicode CodePoint es U + 0933)
Peter.O
Ah, por supuesto. Gracias por atrapar mi error tonto!
Petr Uzel