Colors

我怎樣才能像對貓一樣為頭部、尾部和更少的顏色著色?

  • November 18, 2013

感謝其他人,我的“彩色貓”工作得很好

(請參閱我如何為貓輸出著色,包括黑白中的未知文件類型?)。

在我的.bashrc

cdc() {
 for fn in "$@"; do
 source-highlight --out-format=esc -o STDOUT -i $fn 2>/dev/null || /bin/cat $fn;
 done
}
alias cat='cdc' # To be next to the cdc definition above.

我希望能夠將此技術用於其他功能,例如 head、tail 和 less。

我怎麼能為所有四個功能做到這一點?有什麼方法可以概括答案?

我可以選擇gd使用git diff

gd() { 
  git diff -r --color=always "$@"
}

這樣的事情應該做你想做的事:

for cmd in cat head tail; do
 cmdLoc=$(type $cmd | awk '{print $3}')
 eval "
   $cmd() { 
     for fn in \"\$@\"; do 
       source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | 
           $cmdLoc - 
     done 
   }
 "
done

你可以像這樣壓縮它:

for cmd in cat head tail; do
   cmdLoc=$(type $cmd |& awk '{print $3}')
   eval "$cmd() { for fn in \"\$@\"; do source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | $cmdLoc - ; done }"
done

例子

將上述內容放在一個名為tst_ccmds.bash.

#!/bin/bash

for cmd in cat head tail; do
   cmdLoc=$(type $cmd |& awk '{print $3}')
 eval "$cmd() { for fn in \"\$@\"; do source-highlight --failsafe --out-format=esc -o STDOUT -i \"\$fn\" | $cmdLoc - ; done }"
done

type cat
type head
type tail

當我執行它時,我會按照您的要求設置功​​能:

$ ./tst_ccmds.bash
cat () 
{ 
   for fn in "$@";
   do
       source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /bin/cat - ;
   done
}
head is a function
head () 
{ 
   for fn in "$@";
   do
       source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /usr/bin/head - ;
   done
}
tail is a function
tail () 
{ 
   for fn in "$@";
   do
       source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" 2> /dev/null | /usr/bin/tail -;
   done
}

在行動

當我在我的 shell ( source ./tst_ccmds.bash) 中使用這些函式時,它們的工作方式如下:

貓

頭部ss

尾巴

尾巴ss

純文字

txt ss

有什麼訣竅?

最大的技巧,我認為它更像是一種 hack,是使用破折號 ( -) 作為 , 的參數catheadtail通過管道強制它們輸出來自source-highlight管道的 STDIN 的內容。這一點:

...STDOUT -i "$fn" | /usr/bin/head - ....

另一個技巧是使用以下--failsafe選項source-highlight

  --failsafe
         if no language definition is found for the input, it  is  simply
         copied to the output

這意味著如果找不到語言定義,它的行為就像cat,只是將其輸入複製到標準輸出。

關於別名的注​​意事項

如果head,tailcat是別名中的任何一個,此函式將失敗,因為type呼叫的結果將不指向執行檔。如果您需要將此函式與別名一起使用(例如,如果您想使用less需要-R標誌來著色的函式),則必須刪除別名並單獨添加別名命令:

less(){
    for fn in "$@"; do 
      source-highlight --failsafe --out-format=esc -o STDOUT -i "$fn" |
         /usr/bin/less -R || /usr/bin/less -R "$fn"; done
}

引用自:https://unix.stackexchange.com/questions/100855