Thay đổi kích thước tab của lệnh mèo mèo


15

Khi tôi ở trong vimtôi có thể thay đổi kích thước tab bằng lệnh sau:

:set ts=4

Có thể đặt kích thước tab cho catđầu ra lệnh quá không?

Câu trả lời:


21

Lệnh đầu tiên ở đây mô phỏng định dạng bạn nhìn thấy vim. Nó mở rộng thông minh các tab thành số lượng không gian tương đương, dựa trên cài đặt tab-STOP (ts) của mỗi 4 cột.

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

Đầu ra

ab  cd  de

Để giữ các tab dưới dạng các tab và đặt các vị trí STOP của tab thành mỗi cột thứ 4, thì bạn phải thay đổi cách môi trường hoạt động với tab-char (giống như vim làm với :set ts=4lệnh)

Ví dụ: trong thiết bị đầu cuối, bạn có thể đặt tab STOP thành 4 bằng lệnh này;

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

Đầu ra

ab  cd  de

tốt để biết (1). expand(từ gói coreutils) và tabs(từ gói ncurses), (2). và ý nghĩa của ts là [ T ] ab [ S ] hàng đầu
LiuYan

10

Chỉ cần sử dụng mã sau đây:

tabs -n

Trong đó n là số lượng khoảng trắng bạn muốn các tab tương ứng. Để không phải thực hiện điều này mỗi khi bạn khởi động vỏ, chỉ cần chỉnh sửa của bạn .bash_profiletrong ~/và thêm dòng trên vào cuối của tập tin.

Để biết thêm thông tin về lệnh tab, tham khảo:

man tabs

2
Chỉ cần lưu ý rằng thay đổi vĩnh viễn chiều rộng các tab mặc định của bạn có thể làm lshỏng các lệnh khác (ví dụ: đặt ngoài có thể trông không được căn chỉnh chính xác).
Gustavo Bezerra

9

Không có khái niệm về các tab hoặc tab dừng trong cat; chương trình chỉ đưa các đầu vào vào đầu ra và xử lý các tab như bất kỳ ký tự nào khác. Nếu thiết bị đầu ra tình cờ là một thiết bị đầu cuối, các tab sẽ được xử lý theo bất kỳ hành vi nào mà thiết bị đầu cuối được cấu hình để cung cấp.

Các hệ thống triển khai POSIX.1 có một lệnh được gọi tabs(1)sẽ điều chỉnh khái niệm của thiết bị đầu cuối về cách hiển thị các tab. Tùy thuộc vào bố cục tab cụ thể không được coi là một ý tưởng hay, vì ai đó có thể gửi tệp của bạn đến một số thiết bị khác, chẳng hạn như máy in sẽ không làm những gì bạn dự định.

Khi bạn điều chỉnh tstrong vim(hoặc đồng bằng vi), tất cả các bạn đang làm là điều chỉnh cách các nhân vật tab diễn giải editor khi hiển thị. Nó không có liên quan đến những gì kết thúc trong tập tin.


Cám ơn vì sự giải thích. Máy in được cấu hình như thế nào để xử lý các tab?
Meysam

Hầu hết các máy in đối xử với chúng giống như hầu hết các thiết bị đầu cuối theo mặc định: lề trái và cứ sau tám ký tự.
Blrfl

5

Dựa trên các câu trả lời và ví dụ trên, có vẻ như lệnh thực tế mà OP muốn là ...

cat somefile | expand -t4

Điều này làm việc cho tôi trên Red Hat 6.4.


2

Để mở rộng các câu trả lời đã cho, expandcũng có thể lấy danh sách các vị trí dừng tab. Điều này rất hữu ích nếu độ dài nội dung của các cột khác nhau thay đổi rất nhiều.

Tôi đã vượt qua yêu cầu này ngày hôm nay khi tôi muốn làm cho đầu ra openssl ciphersdễ đọc hơn:

$ 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

Chỉ sử dụng expand -t31sẽ làm tăng chiều rộng của đầu ra từ khoảng 100 ký tự đến hơn 160 ký tự.


1
Một cách dễ dàng hơn để làm điều đó là sử dụng column:openssl ciphers -v 'HIGH' | column -t
muru

0

Nhiều thiết bị đầu cuối hỗ trợ thiết lập các tab biến dừng. Những điều đó là vt100, linux và hoặc hỗ trợ tiêu chuẩn EMCA-48, hầu hết các điều khoản về kích thước tab cài đặt hỗ trợ linux: xterm và gia đình (uxterm, urxvt) xfce4-terminal, luit, Terminal, SecureTTY, trong số các thuật ngữ khác.

Vì vậy, đã viết một kịch bản vài năm trước để đặt các tab của tôi khi đăng nhập vào mỗi 2 khoảng trắng - được sử dụng để sử dụng 4, sau đó 3 cho một chút và bây giờ là 2 ....

Vì vậy, bây giờ, nếu tôi 'cat' một tệp, các tab trong tệp sẽ mở rộng sang cài đặt của thiết bị đầu cuối của tôi.

Nếu tôi đã thông qua vim trở lên, họ sẽ tự mở rộng tab, nhưng rất nhiều dụng cụ sử dụng các tab.

Sẽ bao gồm tập lệnh ở đây để tham khảo và hoặc sử dụng cá nhân:

#!/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

Hy vọng nó giúp...


-2

Theo trang web, con mèo không thể tự làm điều đó. Nhưng bạn có thể ví dụ chạy đầu ra từ cat thông qua trbộ lọc để thay thế các tab bằng bất kỳ số lượng khoảng trống nào bạn muốn:

cat somefile | tr '\t' '  '

sẽ thay thế ký tự tab bằng hai khoảng trắng.

Cập nhật: như đã chỉ ra trong các bình luận cho bài viết này, điều này thực sự không hoạt động. Tuy nhiên, tôi đang giữ câu trả lời là một ví dụ về cách không làm điều đó.


3
Nó thực sự thay thế '\t'chỉ bằng một khoảng trắng, bất kể có bao nhiêu khoảng trống ở giữa cặp dấu ngoặc kép thứ hai' '
Meysam

3
trkhông hoạt động theo cách đó .. mỗi byte của arg 1 được thay thế bằng từng byte tương ứng của arg 2 ..... Do đó printf '\t' |tr '\t' 'ळ' in ra một byte duy nhất có giá trị hex là \xE0.. đó là byte đầu tiên trong ba UTF-8 byte được mã hóa tạo nên ký tự (có giá trị Unicode CodePoint là U + 0933)
Peter.O

À, tất nhiên rồi. Cảm ơn đã bắt lỗi lầm ngớ ngẩn của tôi!
Petr Uzel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.