birakiのLinux環境構築 一年間の軌跡

これは みす53代 Advent Calender 2020 の初日の記事です. 三度のメシより環境構築が嫌いな53代birakiです.

皆さん, オフラインで会うことが少なくなり, 日常のほとんどをPCやスマホの前で暮らしていると思います. ならせめてオレオレ作業環境で快適に過ごしたいと思いませんか!

僕はそう思ってしまったので, 人の見よう見真似で揃えてきた今のリビングルームと言える(貧相な)Linux環境を適当に紹介していこうと思います.

最後の方は最近便利だなと思ったコマンド&Vim Tips集担っています

  • 第一部: Ubuntu18.04で生きていくことについて
  • 第二部: ターミナル上で生きていくことについて
  • 第三部: Vimで生きていくことについて
  • 第四部: dotfileについて

第一部: 一年間 Ubuntu18.04 に引きこもった話

この一年間強お世話になってきたUbuntuについて振り返っていこうと思います!

Ubuntuとは

Ubuntuは一番有名であろうLinuxディストリビューションです.

Ubuntu(ウブントゥ[6]、[ʊˈbʊntuː] ( 音声ファイル); oo-BOON-too[7])はDebian GNU/Linuxを母体としたオペレーティングシステム(OS)である。Linuxディストリビューションの1つであり、フリーソフトウェアとして提供されている。概念はディストリビューションも参照。カノニカルから支援を受けて開発されている。開発目標は「誰にでも使いやすい最新かつ安定したOS」を提供することである。 wikipediaより

ウブントゥって読むんですね初めて知りました.

その出会い

もともとWSLでコマンドラインだけ使っていたんですが, 去年2019/10/21にサークル員Linuxヤクザであるところのカエルム氏

「君も"L"のものにならないか??」

と言われて, 「多少興味はある」と答えたところ, "ホストOSがLinuxでないと生きられなくなっていたoguni氏"が, 即座に常備していたUbuntu18.04のUSBを僕のWindowsラップトップに刺し, デュアルブートの形でinstallが始まるのでした... たしかSUANさんも居たような気がする.

↓ たしかに2019年10月21日にinstallされてた.

$ls -lt /var/log/installer
total 1468
-rw-r--r-- 1 root   root    650 10月 21  2019 telemetry
-rw-rw-r-- 1 root   root 468332 10月 21  2019 initial-status.gz
-rw-r--r-- 1 root   root     61 10月 21  2019 media-info
-rw------- 1 syslog adm  595250 10月 21  2019 syslog
-rw------- 1 root   root  15254 10月 21  2019 debug
-rw------- 1 root   root 398546 10月 21  2019 partman
-rw------- 1 root   root     21 10月 21  2019 version
-rw------- 1 root   root   1715 10月 21  2019 casper.log

そのときはお試しということでわずか512GBのSSDのうち, 割かれたのはわずか50GB程度...

にもかかわらず!! あれから早一年+1ヶ月, Windowsを起動することはほとんどなくなり, Ubuntu18.04に引きこもることになってしまったのでした...

感想

ターミナルとChromeさえあれば生きていけることが分かりました. もちろん絵を書くのにクリスタがいるだとか, 作曲するのにDAWが必要だとかだったら辛いでしょうけど僕の主なPCの用途は以下で完結してしまっていたので, さほど問題はありませんでした.

唯一学校生活に必須と思われるものにて動かないのはOfficeだけですが, 普通のレポートはLaTeXで書いて, ファイル形式指定されているものはLibreOfficeとグーグルスプレッドシート等でなんとかなりましたね.

ホストUbuntuのいいところ

ストレスフリー

Windows Updateが起こらず, またWindowsのように"何か知らんけどマウスカーソルくるくるしてる"が起こらなくて快適です.

また, 最初はUbuntu関係のアプリはよくワカラナイものも多数入っていますが, 明らかにWindowsに比べて無駄なアプリはそんなに多くないと思っています.

いいことです.

なんで俺Linux使いたいはずのなのにわざわざWindows起動してるの?? ってならない

結局WindowsでもWSLの中に篭ってしまう人はもういっそホストOSにしてもいいかもしれませんね. コンテナ開発に使うDockerもネイティブで動いて爆速です.

たいていのことはできる.

Chromiumブラウザさえあれば, 基本何でも出来ます.

OfficeはないけどGoogleスプレッドシート等使えばいいし, そりゃもちろんWindowsにしかないアプリはたくさんありますけど, 図や絵を書きたい時はGimpを使えばよくて, ゲーム制作方面でもunityやblenderlinux版が存在しているのでなんとかなる.

その他

  • ホスト環境の設定を全て.bashrcを中心としてファイルとinstallコマンド郡で管理できて, もしいまの環境が吹っ飛んでも復帰できる(dotfiles)
  • デュアルブートのやり方次第で, UbuntuからWindowsのファイルにアクセスできる
    • これはWindowsのファイルの暗号化をオフにしているからなんですけど, セキュリティ的にどうなのだろう

ホストUbuntuの悪いとこ

  • 無数に存在するWindowsにしかないアプリを使おうとする度にOSを切り替えなければならない.
    • わざわざ起動するためにWindowsに赴くアプリ一覧

第二部: Terminal生活での便利コマンド, アプリのご紹介

fzf

これです. https://github.com/junegunn/fzf これはなにかと申しますとfuzzy finderというもので, コマンドライン上であいまい検索ができるすぐれものです! つまり, 完全一致じゃなくてもそれっぽいアルファベットをちょっとだけタイピングしてenterを押すだけでファイルを指定できます!

ctrl + t

f:id:WBeLucky:20201130235701g:plain

使い方としては, installするとおそらくctrl + tが勝手にfzfに割り当てられると思うので, ファイル名を入力したいところでctrl + t. そこでいい感じにFuzzy Findしましょう!

Ubuntuでinstallするなら以下

sudo apt install fzf

pet コマンドラインスニペットツール

たくさんいい感じのコマンドを見つけても覚えきれないので導入しました. これです. https://github.com/knqyf263/pet

pet newコマンドから覚えさせたいコマンドとその説明を書くと, tomlの設定ファイルに記述されます. そして, pet searchコマンドやpet execでコマンド一覧を上記のfzfで探して, 検索/実行が出来ます.

deb版なら以下でインストール

wget https://github.com/knqyf263/pet/releases/download/v0.3.0/pet_0.3.0_linux_amd64.deb
sudo dpkg -i pEt_0.3.0_linux_amd64.deb

直近ダウンロードしたものを持ってくるシェルスクリプト

ls -td ~/Downloads/* | head -n 1

以上のシェルスクリプトで直近にダウンロードしたものを表示します. これをfishのabbreviation(略語)として登録して, ダウンロードしたものを特定フォルダに持ってきたりとかが楽です.

第3部 最近試したVim Pluginとか, Vim機能

テキストエディタVimの後継プロジェクトであるところのNeoVimを使用しています!! GitHubのスター数が圧倒的ですね... これです. https://github.com/neovim/neovim

かなり忠実にVimと同じインターフェースにこだわっているっぽく, Vimを使ったことがある方は, そのままVimの設定ファイル.vimrcを引き継げます. (NeoVimの設定ファイルは, .config/nvim/init.vimにあります.)

最近はbuilt-inのLSPクライアント(Language Server Protcol: VSCode拡張機能みたいに補完とかエラー表示してくれるやつ)が開発されているらしく, その他プラグイン開発界隈も活発っぽいです. (あくまでにわか

ここから紹介する便利Tipsは多分Vimでも動きます.

gx と gf

例えば, Vimでtodoリストを書くとします.

webページリンクの上にカーソルを置いてgxで規定のブラウザでリンクを開きます!

また, ローカルのパスの上でgfでその場所をVimで開きます.

f:id:WBeLucky:20201201003709g:plain

todoリストから各作業場所に写ったり, 関連資料を開くのに重宝しています.

vim-plug & vim-lsp-settings

Vimプラグインマネジャーは無数にありますが, 最近個人的に注目しているのはvim-plugです! インストール設定ともに簡単!!

今まではvim-plugではなくdeinを使っていましたが, 設定さえできればどっちも変わらないという印象です.

GitHubのスター数に流されやすいのでvim-plugに移りました. よく見たらfzfを作っている人と同じレポジトリですね.

https://github.com/junegunn/vim-plug

neovim & linuxだったら以下のコマンドをターミナルに貼って, 上のレポジトリのexampleをinit.vimや.vimrcに貼って, :PlugInstallすれば終了!!

sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
       https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'

これであなたもプラグインのあるVim生活ができます.

vim-lsp-settingsで簡単にバリバリ補完.

なんかすごそうなVim Plugin日本人開発者のmattnさんが最近開発しているvim-lsp-settingsを試してみました!!

https://github.com/mattn/vim-lsp-settings

おそらく下記がvim-lsp-settingsの最小構成です. 今回は補完にasynccompleteを使います.

call plug#begin(stdpath('data') . '/plugged')
  Plug 'prabirshrestha/vim-lsp'
  Plug 'mattn/vim-lsp-settings'
  Plug 'prabirshrestha/asyncomplete.vim'
  Plug 'prabirshrestha/asyncomplete-lsp.vim'
call plug#end()


function! s:on_lsp_buffer_enabled() abort
    setlocal omnifunc=lsp#complete
    setlocal signcolumn=yes
    if exists('+tagfunc') | setlocal tagfunc=lsp#tagfunc | endif
    nmap <buffer> gd <plug>(lsp-definition)
    nmap <buffer> gr <plug>(lsp-references)
    nmap <buffer> gi <plug>(lsp-implementation)
    nmap <buffer> gt <plug>(lsp-type-definition)
    nmap <buffer> <leader>rn <plug>(lsp-rename)
    nmap <buffer> [g <Plug>(lsp-previous-diagnostic)
    nmap <buffer> ]g <Plug>(lsp-next-diagnostic)
    nmap <buffer> gh <plug>(lsp-hover)
    
    " refer to doc to add more commands
endfunction

augroup lsp_install
    au!
    " 上記のキーバインドをlspサーバーが設定されているときだけ有効にする
    autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
augroup END

以上を.vimrc や init.vimに貼って保存し, PlugInstallして, LSPを使いたい言語のファイルを開き:LspInstallServerで補完が効くはずです.

上記の設定でも垣間見えるように * gd -> 定義に飛ぶ * gt -> 型情報を表示 * \rn -> rename * gh -> VSCodeなどでマウスカーソルを置いた時に出てくるポップアップを表示

などが出来て普通に開発出来ます. (余談ですが, VSCode Vimの初期設定でgdで定義ジャンプ, ghでhoverなのでちょうど良くなります)

Vimスニペット

VSCodeではよく使うコードの定型文を出力するスニペットと言う機能があります. https://code.visualstudio.com/docs/editor/userdefinedsnippets

上記のvim-lsp環境で選んだのがコチラのvim-vsnip. なんとVSCodeと同じくJSONで記述されたスニペットファイルを使用できるため, VSCodeスニペットファイルの場所を指定すればVSCodeスニペット設定を共有できます! https://github.com/hrsh7th/vim-vsnip

ほぼVSCodeスニペットJavaScript正規表現置換だけは使えませんのでご注意

その他 おすすめ(というか惰性で使っている) Vim Plugin

vim-plugで設定しているものにコメントを振っていく形でご紹介します.

ほんとに最近deinからvim-plugに移行したのでいくらか移行しきれてないです.

call plug#begin(stdpath('data') . '/plugged')
  " VSCodeの左側にあるファイルエクスプローラーみたいなやつ
  " そこからPDF開いたり, 新規ファイル作成, リネームなど出来たりして嬉しい
  Plug 'scrooloose/nerdtree', { 'on':  'NERDTreeToggle' }

  " vim-lsp + 補完用のasynccomplete
  Plug 'prabirshrestha/vim-lsp'
  Plug 'mattn/vim-lsp-settings'
  Plug 'prabirshrestha/asyncomplete.vim'
  Plug 'prabirshrestha/asyncomplete-lsp.vim'
  Plug 'prabirshrestha/asyncomplete-file.vim'

  " typescriptとjsxのシンタックスハイライト
  Plug 'HerringtonDarkholme/yats.vim'
  Plug 'maxmellon/vim-jsx-pretty'

  " divとかって入力したら <div></div>になるやつ
  Plug 'mattn/emmet-vim'

  " スニペット
  Plug 'hrsh7th/vim-vsnip'
  Plug 'hrsh7th/vim-vsnip-integ'

  " markdownをかける. :MarkdownPreviewってすると, 超いい感じでブラウザでpreviewが出る. 一番使っている
  Plug 'godlygeek/tabular', { 'for': 'markdown' }
  Plug 'plasticboy/vim-markdown', { 'for': 'markdown' }
  Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() }, 'for': ['markdown', 'vim-plug'] }

  " 選択範囲の両端をカッコで囲むやつ
  Plug 'tpope/vim-surround'

  " 下のステータスバーがかっこよくなるだけ
  Plug 'vim-airline/vim-airline'

  " GoImportsとGoFormat用
  Plug  'fatih/vim-go', { 'for': 'go' }
call plug#end()

" これ以降それぞれのプラグインの設定
" ほかにもVSCodeのctrl + p を再現する ctrp.vim https://github.com/kien/ctrlp.vim や
" いい感じにプロジェクト内のファイル検索やgrepしてくれるdeniteはおすすめです.

なぜそこまでVimにこだわるのか

さてここまでVimを頑張って設定してVSCodeにしようとしていることがわかりますが,

「最初からVSCode使えばいいじゃん」

となりますね. 自分もよく考えるんですけど, 特に理由はありません... 僕の場合は

  • キーバインドが好き
  • 基本的に一番高速に起動する
  • どの環境にもたいてい入っている/すぐ入れられる

に尽きます.

言語仕様が簡単なgolangや動的スクリプト言語, シェルスクリプトmarkdownは気軽にVimを使っていますが, IDE必須な言語はまず厳しいですし, またLSPの他にESLintやPrettier, JSXのことも考えておかないといけないJS, TSは結局VSCodeで書いています.

vimエディタ上での任意コマンド実行してフィルタをかける.

第四部: dotfilesについて

dotfilesについてご存知ですか??

設定ファイルである.(ドット)から始まるファイルをホームディレクトリではなく, dotfiles/ みたいなディレクトリに置いて, そこからホームディレクトリなどへのlnコマンドでシンボリックリンクを貼ります.
そして dotfiles/ をgitレポジトリにすればdotfilesの完成です!!

また, そのレポジトリにインストールコマンドが書かれたシェルスクリプトや, その他よく使うシェルスクリプトを置いておくといいかも知れません!

このようにすることで, Unix環境さえあればいつでも自分の環境を再現できるってワケ

今回はそのdotfilesを整理して公開できるようにしたかったんですが, 今アドカレ公開まであと30分なので12月中にサイレント更新しておきますね....

管理しているファイルは以下のようなものです

ファイル名 ナニコレ
~/.config/nvim/ NeoVim設定ファイル
~/.config/fish fish設定ファイル
~/.config/pet pet snippetファイル
~/.config/Code/User/ VSCode 設定ファイル
.tmux.conf tmux設定ファイル
.bashrc bash設定ファイル
その他 installスクリプト, lnしまくるスクリプトなどなど

おしまい

これ公式アドカレに書いても面白くないんだよなぁ~ って思って非公式の方に書きました. 分からん人はゴメンだけどVimはいいぞってことだけ覚えておいてください.

明日は数万字書くと豪語しているMISWの単眼アイドル, オダマキちゃんの記事です!! 今年も張り切っていきましょ~