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の設定を整えてみたのでまとめておく。
プロンプトを変更する
シンプルにカレントディレクトリだけ表示するようにした。プロンプトが長いのはあまり好きじゃない。
.bashrc に以下を記述
PS1="\[\e[1;34m\]\w\[\e[m\] "
\[\e[1;34m\]
で青色指定、\w
でカレントディレクトリを絶対パスで表示、\[\e[m\]
で先の色指定を解除。最後に半角スペース。
大文字小文字を無視
ディレクトリやファイル補完の際にストレスを感じないように。
~/.inputrc を作成し以下を記述
set completion-ignore-case on
PROMPT_DIRTRIMを設定
深い階層のディレクトリにいるときにプロンプトが長くなってしまわないように。
Before
After
.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を使っていると、逆にEmacsやVimといったエディタにどのような機能があれば快適にコードが書けるのかといったことが自分の中でまとまっていく気がする。
それらをEmacsで実現すれば同様に快適なエディタが出来上がるのではないかと、今胸を踊らせている。
Emacsで画面分割のキーバインドを変えた
環境
本題
Emacsで画面分割(ウィンドウ分割)をするショートカットはデフォルトではC-x 2
とC-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