イケてる開発環境を作りたい(zsh + neovim + tmux)

こんにちは。42tokyo Advent Calendar 2021の23日目を担当する在校生のrsudoです。

今回の記事では、自分の開発環境の一部を「見た目」という観点で紹介したいと思います。各ツールのインストール方法やキーバインド等の説明は割愛させてもらいます。

見た目は人によって好みが別れると思うので、あくまで参考程度に見てください。 自分のターミナル環境は下の画像のようになっています。 f:id:rio_1:20211210230756p:plain

実行環境

f:id:rio_1:20211208154713p:plain

(このコマンド使いたかっただけです。)

ターミナル

Alacritty

github.com

AlacrittyはRust製で、GPUレンダリングを用いた描画を行う高速なターミナルです。元々はiTermを使っていたのですが、vimのカーソル移動の遅さが気になってAlactittyを使うようになりました。

メリット

  • 描画が高速
  • 設定を.config/ ディレクトリ内のファイルに記述するため管理しやすい。

デメリット

  • 日本語をインライン入力できない。(エンターを押すまで日本語は見えない)

設定ファイルはGitHubにテンプレやカラーテーマなどの書き方が載っているので、それを参考に作成しました。 自分はGruvboxというテーマを使用しています。

シェル(zsh)

oh-my-zsh

ohmyz.sh

oh-my-zshzshの設定フレームワークです。

メリット

  • 入れるだけでとりあえずいい感じになる。

デメリット

  • カスタマイズが盛り込まれすぎていて重たい。

よく分からないものを色々入れられるのが嫌な人や、自分でカスタマイズしたい人は向いてないかもしれないです。

正直、覚え切れない量のエイリアスが設定されるなど、機能を持て余している感覚があります。 似たものとして、preztoがありますがこちらはoh-my-zshと比較すると軽く、評判が良さそうです。

参考 : zshフレームワークの起動速度&設定の楽さ比較! - Qiita

zshrc

manの色付け

f:id:rio_1:20211208171440p:plain

zshrcに以下の記述をするとmanにシンタックスハイライトをつけることができます。 lessコマンドやmanコマンドを使用する際に参照される環境変数をmanが呼ばれるときに定義しています。

man() {
        env \
            LESS_TERMCAP_mb=$(printf "\e[1;33m") \
            LESS_TERMCAP_md=$(printf "\e[1;33m") \
            LESS_TERMCAP_me=$(printf "\e[0m") \
            LESS_TERMCAP_se=$(printf "\e[0m") \
            LESS_TERMCAP_so=$(printf "\e[1;44;33m") \
            LESS_TERMCAP_ue=$(printf "\e[0m") \
            LESS_TERMCAP_us=$(printf "\e[1;32m") \
            man "$@"
}

参考 : manコマンドで表示されるドキュメントの色付けをカスタマイズ - Steel Dragon 14106

gitコマンドのエイリアス

前述したoh-my-zshでgitのプラグインを設定すると登録されるエイリアスの一部を紹介します。

詳しくはこちら : ohmyzsh/git.plugin.zsh at master · ohmyzsh/ohmyzsh · GitHub

alias glol
glol='git log --graph --pretty='\''%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'\'

❯ glol
* dbad735 - (HEAD -> rsudo, origin/rsudo) add 42header (3 months ago) <rsudo>
*   2203d7c - Merge pull request #134 from r-i0/rakiyama (3 months ago) <rsudo>
|\  
| * 6e91a59 - support ft_strdoll (3 months ago) <rakiyama>
* | 65e8621 - Update github-actions-demo.yml (3 months ago) <rsudo>
* | 2219cde - Update github-actions-demo.yml (3 months ago) <rsudo>
|/  
*   b71af52 - Merge pull request #133 from r-i0/rakiyama (3 months ago) <rsudo>
|\  
| * 3317b80 - mod exit (3 months ago) <rakiyama>
alias glols
glols='git log --graph --pretty='\''%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'\'' --stat'

❯ glols
* dbad735 - (HEAD -> rsudo, origin/rsudo) add 42header (3 months ago) <rsudo>
| 
|  srcs/clear_list.c                  | 12 ++++++++++++
|  srcs/command_builtin1.c            | 12 ++++++++++++
|  srcs/command_builtin2.c            | 12 ++++++++++++
|  srcs/command_builtin3.c            | 12 ++++++++++++
|  srcs/command_nonbuiltin.c          | 12 ++++++++++++
|  srcs/delimit_fd.c                  | 12 ++++++++++++
alias gsb
gsb='git status -sb'

❯ gsb
## main...origin/main
 M philo/srcs/main.c
?? a.out
?? philo_bonus/
?? test.c

zsh-syntax-highlighting

github.com

コマンドラインを色付けして、見やすくしてくれます。実行前に存在するコマンド・ファイルかどうか分かるので、タイポを防ぐ効果があります。

有効なコマンドの場合は緑色に表示され、存在するファイルの場合下線が表示されます。 f:id:rio_1:20211209120853p:plain

無効なコマンドの場合、赤く表示されます。

f:id:rio_1:20211209120937p:plain

powerlevel10k

github.com

質問に答えていく形式で簡単にプロンプトをアレンジすることができます。 oh-my-zshのプロンプトテーマも色々あったのですが、個人的にあまり気に入らず、自分でアレンジするのも面倒だったので導入しました。

参考 : Zshに「Powerlevel10k」を導入する

tmux

tmuxは複数のターミナルを開いて平行作業ができるソフトウェアです。iTermでは画面分割等が備わっていたので必要なかったのですが、Alacrittyを使うタイミングでtmuxも使用するようになりました。

ステータスラインを変更

  • 様々な情報を表示させることができるが、個人的に必要ないと思ったので、最小限の情報のみ表示させます
## ステータスラインの見た目の変更

# 256色モードを有効にする
set-option -g default-terminal screen-256color
set -g terminal-overrides 'xterm:colors=256'

# ステータスラインの色を変更
setw -g status-style fg=colour255,bg=colour234

# status-leftを非表示にする
set -g status-left ""

# status-rightを非表示にする
set -g status-right ""

# 中央揃えにする
set -g status-justify centre

# 上部にステータスを表示
set-option -g status-position top

set -g status-fg white
set -g status-bg default
set -g renumber-windows on
set -g automatic-rename on
set-option -g -q mouse on

# window-statusの見た目を変更
setw -g window-status-current-format "#[bg=default,fg=colour10,reverse]▓▒░ #W ░▒▓"
setw -g window-status-format "#[bg=default,fg=colour8,reverse]▓▒░ #W ░▒▓"

こんな感じになりました。 f:id:rio_1:20211208172119p:plain 1つ目のタブでvimを開いてファイルを編集、二つ目のタブでコマンドを実行することが多いです。

neovim

続いてneovimの紹介です。自分のneovim環境は下のようになっています。 f:id:rio_1:20211208154901p:plain

基本設定

見た目に関係する設定はあんまりないですね。プラグイン管理はdeinを使用しています。

" タブ幅
set tabstop=4
set shiftwidth=4

" 常にタブラインを表示
set showtabline=2 

" スペース、タブ、改行を可視化
set list
set listchars=tab:\▸\ ,trail:-,eol:,extends:»,precedes:«,nbsp:%

おすすめプラグイン

テーマ

今はgruvboxを使用しています。 github.com

nerdtree

github.com

左側にファイルツリーを表示してくれるプラグインです。ついでにvim-deviconsというプラグインも入れてアイコンも表示させました。

nvim-treesitter

github.com

vimシンタックスvscode等のエディターと比較してシンタックスが物足りないのでプラグインを入れました。これはneovimを使用している必要があるので、ノーマルのvimを使っている方は別のプラグインを探す必要があります。

参考 : nvim-treesitterを勧めたい

lightline

ステータスラインをいじれるプラグインはたくさんあるのですが、自分はlightlineというプラグインを入れました。設定を書いて表示を変更することもできます。

github.com

下の設定でやってること

let g:lightline = {
   \ 'colorscheme': 'wombat',
   \ 'active': {
   \    'left': [ [ 'mode', 'paste' ],
   \            [ 'fugitive', 'filename' ] ]
   \ },
   \ 'component': {
   \    'lineinfo': ' %3l:%-2v',
   \ },
   \ 'component_function': {
   \    'fugitive': 'MyFugitive',
   \    'gitbranch': 'fugitive#head',
   \ },
   \ 'separator': { 'left': "\ue0b0", 'right': "\ue0b2" },
   \ 'subseparator': { 'left': "\ue0b1", 'right': "\ue0b3" },
   \ }

function! MyFugitive()
  try
    if &ft !~? 'vimfiler\|gundo' && exists('*fugitive#head') && strlen(fugitive#head())
      return ' ' . fugitive#head()
    endif
  catch
  endtry
  return ''
endfunction

参考 : lightline.vimを使ってVimのステータスラインを有効活用する - yuhei.kagaya

vim-gitgutter

github.com

ファイルの左側にgitの差分を表す記号を表示してくれます。

おすすめコマンド

bat

github.com

catの進化系コマンドで、シンタックスを付けて見やすく出力してくれます。

コピペするときに行数が邪魔になる場合は、-pオプションをつけると行数を表示せず出力できます。

設定ファイルに記述して、テーマや出力形式を変更することもできます。

❯ bat ~/.config/bat/config
       File: /Users/sudourio/.config/bat/config
   1   --theme="gruvbox-dark"
   2   
   3   # Show line numbers, Git modifications and file header (but no grid)
   4   --style="numbers,changes,header"
   5   

exa

github.com

f:id:rio_1:20211208175223p:plain

lsの進化系コマンドです。 上の画像のように、--iconsオプションを付けると出力されるアイコンが可愛いので最近導入しました。-Tオプションでtree形式で出力することもできます。 以下のエイリアスを設定しています。

alias e='exa --icons'

GoのソースファイルのアイコンがGopher君なのがポイント高いですね。

f:id:rio_1:20211221225544p:plain

まとめ

ひたすらリンクと画像を貼るだけの雑な紹介になってしまいましたが、少しでも参考になれば幸いです。 一応自分のdotfileを以下に公開しておきますが、全く整理していないので可読性は期待しないでください。

github.com

明日は、@tacomeaさんが「LINEボットにオススメ機能を付けてみた」という記事を書いてくれる予定ですので、そちらの記事もお楽しみに!