Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

最高のターミナルを作る2019

1. ターミナルエミュレータを選ぶ

まず端末をきちんと選びましょう。どれも同じに見えますが、フォントが効かなかったり透過できなかったり、意外と違いがあります。下の画像を見れば一目瞭然です。

f:id:panda_noir:20191202115057p:plain
左: Alacritty 右: gnome-terminal

主要なターミナルエミュレータとしてはこんな感じです。

  • gnome-terminal
  • Terminal.app
  • xfce-terminal
  • Alacritty
  • terminator
  • Hyper.js
  • urxvt
  • iTerm2

チェックポイントとしてはこんなものが挙げられます。

  • 画像が表示できるか?
  • Nerd Fontを正しく表示できるか?
  • 透過設定ができるか?
  • 背景画像が設定できるか?
  • ウィンドウ枠を消せるか?
  • 日本語がちゃんとストレスなく入力できるか?

僕はPowerline系のUIを使っているので、NerdFontが効かないとちょっと表示が崩れてしまいます。ウィンドウ枠が消せるか、透過ができるか、背景画像を設定できるかは好みの問題ですね。

これらすべてを満たしていて、なおかつパフォーマンス的に問題がなかったのは今の所xfce-terminal、terminatorですね。次点でAlacrittyです(Ubuntu環境なのでMacについてはわかりません)。ほかは色々と足りなすぎます。

Xfce-terminalは設定を特にいじらなくてもまともに使えるので、かなりオススメです。設定をいじるのが苦痛でない楽しいならAlacrittyは最高です。ほかはウィンドウ枠があったり透過できなかったり、やや不格好でもいいならGNOME Terminalはなんだかんだ良い選択肢になりえます。

2. シェルを選ぶ

ぼくはシェルとしてzshを使っています。理由はいくつかあります。

  • Bash Scriptの知識を流用できる(多少差異はある)
  • 補完が有用
  • 補完の自作ができる
  • プラグインが豊富
  • Bashより使いやすい

fishなど独自のスクリプトを採用しているシェルは、どうしてもbash scriptより情報が少ないです。そのため、やりたいことを実現するのが困難なことが多いです。また、互換性がないため、部分的にbashへ切り替えなければならず、めんどうなことが多いです。

Bash scriptはクソです。しかし、いかんせん歴史が長いので、なにか問題が起こっても解決がしやすいです。また、多少難しい設定でもサラサラと書けてブラックボックス化しづらいです(全然リーダブルじゃないし、高度なことをすると地獄を見ますが)。

3. ツールを入れる

おすすめのツールを紹介します。

exa

Rust製のalternative ls。lsよりもカラフルで見やすく、オプションがわかりやすいです。また、ツリー表示といったlsにはない機能も搭載されています。

f:id:panda_noir:20191202114410p:plain

f:id:panda_noir:20191202114706p:plain

bat

Rust製alternative cat。lessの表示機能とcatの結合機能・パイプライン機能を組み合わせた感じです。シンタックスハイライト付きで表示されます。

f:id:panda_noir:20191202114438p:plain

httpie

HTTPクライアント。curlやwgetよりもオプションがわかりやすいです。カラフルで読みやすいのもNiceです。

f:id:panda_noir:20191202114448p:plain f:id:panda_noir:20191202114500p:plain

ranger

ファイラー。なんと、コマンドライン上で画像プレビューまでできます。Vimライクな操作感で使いやすいです。

f:id:panda_noir:20191202114510p:plain

Neovim

特に語るまでもない。最高のエディタ。

tty-clock

デジタル時計。ターミナル上で時間を知りたいときに便利です。僕は競プロのコンテストが始まるときに使っています。

f:id:panda_noir:20191202114520p:plain

4. カラースキーム

Nordというプロジェクトを非常に気に入って愛用しています。色合いが最高にCoolです。Vim、Tmux、各種ターミナルに対応しているので、すべてで導入しました。うえの画像のような青みがかった黒が基調のテーマになっています。

Nord

サーバーの全データをぶっ飛ばしました。

タイトル通りです。全データが吹き飛びました。

経緯

CentOS8にバージョンアップするためにサーバー再構築をしたのがミスでした。確認ダイアログも出なかったので、まさか吹き飛ぶとは思っていなくてバックアップも取っていませんでした。やらかした…

現在の状況

いかんせんNginxの設定ファイルごと吹っ飛んでいるので復旧はまあまあ時間がかかりそうです。というか完全に元には戻せないですね。サーバーにしか置いてなかったデータとかもあるので被害は結構甚大です。

とりあえず最低限の復旧は今週中にしようと思います。

11/18 追記

一応一通りの復旧は終わらせました。

TrueColor対応のはなし(端末、シェル、tmux、vim)

TrueColorで表示するのは、わりかし対応がめんどうです。なぜなら、Vim、tmux、zsh、ターミナル全てで対応しなければならないからです。今回はそれぞれどういった対応をすればいいのか紹介します。

まず: TrueColor に対応できているか確認する

TrueColor 対応をする前に、そもそも今対応できているかチェックしましょう。以下のコマンドを実行してください。

$ curl -s https://gist.githubusercontent.com/lifepillar/09a44b8cf0f9397465614e622979107f/raw/24-bit-color.sh | bash

このように継ぎ目がなければOKです。↓

下のように階段状になっていたら対応できていません。↓

上でもかなり明白に違いますが、NeoVimでTrueColor対応できていないと更に明らかになります。

TrueColor非対応
TrueColor対応

TrueColor対応をしたあと、ちゃんと反映できているか上のコマンドで確認してください。

余談: ターミナルの色の種類

まず、ターミナルの色には2種類あります。

TrueColor
いわゆる#ffffff。RGBそれぞれ8ビットを用いて表現します。24ビットカラー(RGB)と、さらに透明度8ビットを合わせた32ビットカラー(RGBA)が存在します。
8-bit color
256色まで表せる方式。256までの数字のみを用います。xtermやscreenなど、それぞれで色の割り当てが異なっています。

TrueColor に対応できていない場合、8-bit color で表示されます。8-bit color は256色しか表示できないので、当然表現力はガクッと落ちます。

続きを読む

tcomment_vimをドットリピートできるようにする

repeat.vimを併用することで対応させます。

# dein.toml
[[plugins]]
repo = 'tpope/vim-repeat'

[[plugins]]
repo = 'tomtom/tcomment_vim'
hook_add = '''
au MyAutoCmd VimEnter * nnoremap <silent> <Plug>RepeatTComment :TComment<Bar>
            \ silent! call repeat#set("\<Plug>RepeatTComment")<CR>
au MyAutoCmd VimEnter * nmap <c-_><c-_> <Plug>RepeatTComment
'''

解説

根幹となるのは「nnoremap <silent> <Plug>RepeatTComment」と「nmap <c-_><c-_> <Plug>RepeatTComment」の部分です。

前者は<Plug>RepeatTComment:TComment <Bar> ...を割り当てています。:TCommentを実行したあとにsilent! call repeat#set("\<Plug>RepeatTComment")<CR>を実行しているだけです。repeat.vimはドットを押すと、repeat#setで登録したコマンドが実行されるようになっているので、<Plug>RepeatTCommentが呼ばれた直後にrepeat#setで登録することで繰り返しを実現します。

これが大まかな部分で、残りのコード(au MyAutoCmd VimEnter *など)は読み込むタイミングを制御しているだけです。

注意

上のコードではaugroup MyAutoCmdを行っています。詳しい解説はこの記事ではしないので、以下の参考リンクなどをお読みください。

参考

競プロで使うBashテク

スペース -> 改行

  • | xargs -n1
  • | tr ' ' '\n'
  • | tr \ \\n (上のものをエスケープしたもの)

改行 -> スペース

  • | xargs
  • | tr '\n' ' '
  • | tr \\n \

行数カウント

  • | wc -l
  • | awk 'END{print NR}'
  • | awk '$0=NR' | tail -n1

これはwc -lだけで十分ですね

先頭1行だけ取り出す

  • | head -n1
  • | awk 'NR==1'

head -n1はかなり使えるのでよく覚えましょう

先頭1行だけ削除

  • read _ で受け取ってしまう
  • | tail -n +1
  • | sed -e '1d'
  • | awk 'NR!=1'

末尾1行だけ取り出す

  • | tail -n1
  • | sed -e '$p;d'
  • | awk 'END{print $0}'

sedとawkは末尾n行に対応できていないので、tailさえ覚えておけば事足りると思います

末尾1行だけ削除

これはそこそこレアケースな気がする(なぜなら上3つでだいたい事足りるため)

  • | head -n -1
  • | sed -e '$d'

重複をカウント

  • | sort | uniq -c

各行をトリムする

  • | sed -e 's/^\s*//'
  • | sed -e 's/^\s*\|\s*$//'

後ろ側のトリムが必要になることはあまりないです。

ソート関連

  • | sort -n 辞書順ではなく数値とみなして比較
  • | sort -nk1 キー指定
  • | sort -nr 降順

あまり使えないテク

  • echo {A..Z}' 半角のアルファベットを列挙する
  • zsh -c 'echo {A..Z}|tr -d " "' 全角のアルファベットを列挙する。bashはこのブレース展開をしてくれないので、zshで行う
  • ruby -ne 'puts $_.tr("0-9a-zA-Z","0-9a-zA-Z")' Rubyが使えるなら、これで全角→半角変換ができる