hagetak's blog

どうも、はげたかです。

今日の一言:カテゴリ分けをしっかりしたらPVあがるかな?

rubyでlsを拡張する(lsの文字色を可愛い色に変更する)

はじめに

自分の開発環境を改めよう(綺麗に整えよう)と考え、今zshの環境を変更している。

zsh自体の色は変更ができ、可愛くできるのだが、lsは微妙な色しか無い。少し可愛くしたいな、と思って以下のように変更をした。

f:id:hagetak:20150504000857p:plain

Github

Code

#! /usr/bin/env ruby -w
#
# ls -options[aFlh] [directory]
# ls -a: outputs all files in the directory
# ls -l, -F: outputs files in the directory (clean)
# ls -h: show help.

require 'optparse'

### sub function begin ###
def check_extension(entry)
    if entry.match(/((.lzh)|(.tgz)|(.tar)|(.zip))$/)
        return :orange
    end
    # if you want anyother, you add here.
    # e.g) .docx, doc, .ppt, .pptx, .xlsx
    # if entry.match(/((.docx)|(.doc)|(ppt)|(pptx)|(xlsx))$/)
    #   return :anyColor
    # => and add (set_color_and_reset, :anyColor)
    # end
    return :default
end

def set_color_and_reset(entry, color)
  case color
  when :red
        "\033[38;5;203m#{entry}\033[m"
  when :green
        "\033[38;5;112m#{entry}\033[m"
  when :blue
        "\033[38;5;110m#{entry}\033[m"
  when :cyan
        "\033[38;5;203m#{entry}\033[m"
    when :orange
        "\033[38;5;178m#{entry}\033[m"
  else
        "\033[38;5;224m#{entry}\033[m"
  end
end
### sub function end ###

### main start ###
options = ARGV.getopts('aFlh')
target = ARGV[0] || Dir.pwd

if options['h']
    puts '*** *** Thank you ask me. *** ***'
    puts "ls -options[aFlh] [directory]"
    puts "ls -a: outputs all files in the directory"
    puts "ls -l, -F: outputs files in the directory (clean)"
    puts "ls -h: show help."
    exit
end

entries = Dir.entries(target)

if !options['a']
    entries.select! { |entry| entry[0] != '.' }
end

entries.map! do |entry|
  fullpath = "#{target}/#{entry}"
  time =  File.ctime(fullpath)
  case
  when File.directory?(fullpath)
    dot = set_color_and_reset entry, :blue
  when File.symlink?(fullpath)
    dot = set_color_and_reset entry, :cyan
  when File.executable?(fullpath)
    dot = set_color_and_reset entry, :red
  else
    dot = set_color_and_reset entry, check_extension(entry)
  end
  entry = ""
  entry += "#{time}  " if options['l']
    entry += dot
end

if options['l'] || options['F']
    puts entries
else 
    puts entries.join("\t")
end
### main end ###

参考サイト

さいごに

コマンドの成り方が少しわかった気がする。昔C言語でtailコマンドを作ったが、より深く分かるようになった気がする。しかし、Ruby のgem、標準機能でほとんど実現できてしまったのでこれは甘えなのかな。

いろんなことに挑戦したい。

アルゴリズムの基本を「アルゴリズムとデータ構造」を読んで勉強するか!

定本 Cプログラマのためのアルゴリズムとデータ構造 (SOFTBANK BOOKS)

定本 Cプログラマのためのアルゴリズムとデータ構造 (SOFTBANK BOOKS)

プログラミングの宝箱 アルゴリズムとデータ構造 第2版

プログラミングの宝箱 アルゴリズムとデータ構造 第2版