Linuxコマンドの実装コードを手に入れる方法

mvコマンドの実装が気になったので実装のコードを手に入れた。

今後また別のコマンドの実装も見たくなると思われるので、手順を残しておく。

環境はCentOS 7.3。

提供パッケージを調べる

まずはmvコマンドがどのRPMパッケージから提供されているか調べていく

$ rpm -qf /usr/bin/mv
coreutils-8.22-18.el7.x86_64

coreutilsパッケージがmvコマンドを提供してくれてるみたい。 バージョンは8.22。

パッケージ提供元のサイトURLを調べる

coreutilsパッケージを提供しているサイトのURLを調べる。

$ rpm -qi coreutils
Name        : coreutils
Version     : 8.22
URL         : http://www.gnu.org/software/coreutils/

出力は要点以外は割愛している。 URLはhttp://www.gnu.org/software/coreutils/だとわかった。

ソースを取りに行く

http://www.gnu.org/software/coreutils/ にアクセスする。

アクセスしたらDownloadsの見出しの下にある「Stable source releases can be found at …..」のトコロに書いてあるftp.gnu.orgへのリンクをクリック。coreutilsの場合は ここ(Index of /gnu/coreutils)

するとソースのアーカイブファイルがずらっと並んでいるので好きなバージョンを選んでダウンロードすればよい。

今回は8.22が欲しいので http://ftp.gnu.org/gnu/coreutils/coreutils-8.2.tar.gz をクリックしてダウンロードした。

解凍・展開

あとは手に入れたtarballを解凍・展開するのみ

tar zxvf coreutils-8.2.tar.gz

展開したディレクトリの中からmv.cファイルを見つけた。

手に入ったはいいけどC言語わかんなくて全然読めないw

C言語の勉強してから再度読解に挑戦することにする。

参考

zshからbashに乗り換えた

これまで zsh + prezto を使っていて、シェルの起動が遅いのが気になっていた。ターミナルでウィンドウ開いてから2,3秒待つくらい。流石に遅い。

というわけでシェルの起動を早くしたいのと、そもそもbashで十分じゃないかと思っていたということでbashの設定を整えてみたのでまとめておく。

プロンプトを変更する

シンプルにカレントディレクトリだけ表示するようにした。プロンプトが長いのはあまり好きじゃない。

f:id:syo_t_2:20170107052144p:plain

.bashrc に以下を記述

PS1="\[\e[1;34m\]\w\[\e[m\] " 

\[\e[1;34m\] で青色指定、\w でカレントディレクトリを絶対パスで表示、\[\e[m\] で先の色指定を解除。最後に半角スペース。

参考:Bashのプロンプト変更 - Qiita

大文字小文字を無視

ディレクトリやファイル補完の際にストレスを感じないように。

~/.inputrc を作成し以下を記述

set completion-ignore-case on

PROMPT_DIRTRIMを設定

深い階層のディレクトリにいるときにプロンプトが長くなってしまわないように。

Before

f:id:syo_t_2:20170107053247p:plain

After

f:id:syo_t_2:20170107053241p:plain

.bashrc に以下を記述

export PROMPT_DIRTRIM=2 # カレントディレクトリから数えて2つ表示。それ以降は省略記号

なお、この設定はbash4以上でないと使えない。(参考:Shortening paths in the Bash prompt with PROMPT_DIRTRIM - Season of Code

Macにデフォルトで入ってる /bin/bash のバージョンは3.2.57 と古かったので、Homebrewで新しいbashを入れた。

brew install bash
sudo sh -c "echo '/usr/local/bin/bash' >> /etc/shells"
chsh -s /usr/local/bin/bash

/usr/local/bin/bash --version #=> 4.4.5

fzf

fzfはzsh使っているときから使ってたけどね。 あまりに快適なのでbashにも導入。 プラグイン入れすぎて重くしないように気をつけないとね。

.bashrc

# fzf初期化。入っていない場合はインストール
if which fzf > /dev/null 2>&1; then
  [ -f ~/.fzf.bash ] && source ~/.fzf.bash
else
  git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf > /dev/null
  ~/.fzf/install > /dev/null
  source ~/.bashrc
fi

fzfインストール済みなら初期化、未インストールならGithubからインストールするように書いてみた。

以下のコマンドを気に入っている。

C-r : コマンド履歴検索。デフォルトではあいまい検索。^ とか$ を使って検索もできる。詳しくはREADMEのココを参照。

C-t: ファイル名補完。再帰的にファイルを検索して、選択するとパスを補完してくれる。emacsとかcatとか、ファイル名を引数に取るコマンドの後にC-tを押すと便利。

Alt-C: ディレクトリ移動補助。再帰的にディレクトリを検索して選択すると移動する。これが一番気に入ってる。

キーバインドをカスタマイズするならココを参照。

所感

シェルの起動がめちゃ早くなった。とても快適。

設定少なめだけど十分快適な気がします。 とりあえずしばらく様子見。

EmacsでPHPStormライクな一行コピー、一行カット、一行複製のキーバインドを書いた

環境

本題

ここ1年ほどは専らPHPStormを使っている。 最近MacBookAirの元気がなくなってきて、GB単位でメモリを喰うPHPStormに対して若干怖れの念を抱くようになってきたので、Emacsを使い始めたという話である。

さて、PHPStormの一行コピー、一行カット、一行複製を好んで使っていたのでEmacsでも実現させてみようと思った。

以下のelispを書いた。

;;----------------------------------------------------------------------------
;; # デフォルトのキーマップ無効化
;;----------------------------------------------------------------------------
(global-unset-key "\C-j") ;; 今回は関係ない
(global-unset-key "\C-q")
(global-unset-key "\C-t")  ;; 今回は関係ない

;;----------------------------------------------------------------------------
;; # 編集まわり
;;----------------------------------------------------------------------------
;; C-q c で一行コピー
(define-key global-map (kbd "C-q c") (kbd "C-a TAB C-SPC C-e M-w"))
;; C-q x で一行カット
(define-key global-map (kbd "C-q x") (kbd "C-a TAB C-SPC C-e C-w"))
;; C-q d で一行複製
(define-key global-map (kbd "C-q d") (kbd "C-a TAB C-SPC C-e M-w C-e RET C-y"))

C-q cで一行コピーである。これはPHPStormのCmd-cに該当する。

C-q xで一行カット。これはPHPStormのCmd-xに該当する。

C-q dで一行複製。これはPHPStormのCmd-dに該当する。

ちなみに、C-j, C-q, C-t は今後任意のキーバインドを当てるためにデフォルトのバインドを解除している。(参考: Emacsでキーバインドの割当変更について - Boost Your Programming!)

今回は C-qを利用した。

所感

PHPStormは非常に良く出来ていてこのうえなく使いやすいIDEである。年間1万円するだけあるね。

そしてPHPStormを使っていると、逆にEmacsVimといったエディタにどのような機能があれば快適にコードが書けるのかといったことが自分の中でまとまっていく気がする。

それらをEmacsで実現すれば同様に快適なエディタが出来上がるのではないかと、今胸を踊らせている。

Emacsで画面分割のキーバインドを変えた

環境

本題

Emacsで画面分割(ウィンドウ分割)をするショートカットはデフォルトではC-x 2C-x 3に割り当てられているが、これは直感的じゃないし覚えづらいので自分でキーバインドを当てた。

以下のelispを書いた。

;;----------------------------------------------------------------------------
;; # 画面分割
;;----------------------------------------------------------------------------
;; C-x | で右にウィンドウを開いてカーソル移動
(define-key global-map (kbd "C-x |") (kbd "C-x 3 C-x o"))
;; C-x - で下にウィンドウを開いてカーソル移動
(define-key global-map (kbd "C-x -") (kbd "C-x 2 C-x o"))
;; C-x l で右のウィンドウに移動
(define-key global-map (kbd "C-x l") 'windmove-right)
;; C-x h で左のウィンドウに移動
(define-key global-map (kbd "C-x h") 'windmove-left)
;; C-x j で下のウィンドウに移動
(define-key global-map (kbd "C-x j") 'windmove-down)
;; C-x k で上のウィンドウに移動
(define-key global-map (kbd "C-x k") 'windmove-up)
;; C-x w で現在カーソルがあるウィンドウを削除
(define-key global-map (kbd "C-x w") (kbd "C-x 0"))
;; C-x q で現在カーソルがあるウィンドウ以外のウィンドウを全て削除
(define-key global-map (kbd "C-x q") (kbd "C-x 1"))

C-x | で画面を縦に分割、C-x -で横に分割するようにした。さらに分割後に分割したウィンドウにカーソルを移動するようにした。

さらにC-x lで右のウィンドウに移動、C-x hで左のウィンドウに移動、C-x jで下のウィンドウに移動、C-x kで上のウィンドウに移動するようにした。Vimライクなキーバインドになっているのは、かつてVimを使っていた自分にはわかりやすいから。

そして、C-x w でカレントウィンドウを消し、C-x q でカレントウィンドウ以外を全て消すようにした。

所感

elispよくわからないまま書いているせいで手探り感半端ない。自然と少しずつ慣れていければいいなあ。

参考

Mac / Linux でフォルダを容量が大きい順にソートする

OSX10.11 と CentOS6.4 で確認済み。

カレントディレクトリ以下のフォルダを容量が大きい順に20個表示します。

du -m | sort -rn | head -20

Permission Denied が出たら、先頭にsudo を付けて実行してください。

出力はこんな感じ

34204    .
19613   ./Library
5566    ./Library/Developer
5183    ./Library/Developer/Xcode
4601    ./Library/Application Support
4525    ./Library/Developer/Xcode/iOS DeviceSupport
4438    ./Dropbox
3254    ./Library/Caches
3069    ./Library/Containers
2805    ./Dropbox/Workspaces
2801    ./Library/Containers/com.docker.docker/Data
2801    ./Library/Containers/com.docker.docker
2800    ./Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux
2655    ./.dropbox/instance2
2655    ./.dropbox
2289    ./Library/Developer/Xcode/iOS DeviceSupport/9.3.2 (13F69)/Symbols
2289    ./Library/Developer/Xcode/iOS DeviceSupport/9.3.2 (13F69)
2237    ./Library/Developer/Xcode/iOS DeviceSupport/9.3.5 (13G36)/Symbols
2237    ./Library/Developer/Xcode/iOS DeviceSupport/9.3.5 (13G36)
2166    ./Library/Developer/Xcode/iOS DeviceSupport/9.3.2 (13F69)/Symbols/System/Library

各行の1列目の数値が容量、2列目がフォルダのパスです。
容量の単位はMB(メガバイト)です。
容量の単位はduコマンドのオプションで変えることができます。(参考: Linuxコマンド集 - 【 du 】 ディレクトリ内のファイル容量を表示する:ITpro)

表示する行数はheadのオプションで指定します。

100行表示する場合は

du -m | sort -rn | head -100

Macが容量不足になったとき、容量を喰っているフォルダ/ファイルを探すのに重宝しています。

参考

Linuxコマンド集 - 【 du 】 ディレクトリ内のファイル容量を表示する:ITpro

Linuxコマンド集 - 【 sort 】 行を並び替える:ITpro

head コマンド | コマンドの使い方(Linux) | hydroculのメモ