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の用途は以下で完結してしまっていたので, さほど問題はありませんでした.
- Chromeブラウジング
- メール(ブラウザGmail)
- PDFViewer (evince: 標準で入ってるViewer)
- Slack (debパッケージが存在 https://slack.com/intl/ja-jp/downloads/linux)
- Discord (debパッケージが存在 https://discord.com)
- Zoom (debパッケージが存在 https://zoom.us/download?os=linux)
- ターミナル操作
- VSCode
- MSのリポジトリを追加してゴニョゴニョした https://qiita.com/yoshiyasu1111/items/e21a77ed68b52cb5f7c8
- Line
- Chrome拡張機能版を導入.
- こちらの記事を参考にするとアプリケーションの用に扱える. https://qiita.com/north_redwing/items/357bf0cfbc17990a5276
唯一学校生活に必須と思われるものにて動かないのはOfficeだけですが, 普通のレポートはLaTeXで書いて, ファイル形式指定されているものはLibreOfficeとグーグルスプレッドシート等でなんとかなりましたね.
ホストUbuntuのいいところ
ストレスフリー
Windows Updateが起こらず, またWindowsのように"何か知らんけどマウスカーソルくるくるしてる"が起こらなくて快適です.
また, 最初はUbuntu関係のアプリはよくワカラナイものも多数入っていますが, 明らかにWindowsに比べて無駄なアプリはそんなに多くないと思っています.
いいことです.
なんで俺Linux使いたいはずのなのにわざわざWindows起動してるの?? ってならない
結局WindowsでもWSLの中に篭ってしまう人はもういっそホストOSにしてもいいかもしれませんね. コンテナ開発に使うDockerもネイティブで動いて爆速です.
たいていのことはできる.
Chromiumブラウザさえあれば, 基本何でも出来ます.
OfficeはないけどGoogleスプレッドシート等使えばいいし, そりゃもちろんWindowsにしかないアプリはたくさんありますけど, 図や絵を書きたい時はGimpを使えばよくて, ゲーム制作方面でもunityやblenderはlinux版が存在しているのでなんとかなる.
その他
- ホスト環境の設定を全て.bashrcを中心としてファイルとinstallコマンド郡で管理できて, もしいまの環境が吹っ飛んでも復帰できる(dotfiles)
- デュアルブートのやり方次第で, UbuntuからWindowsのファイルにアクセスできる
- これはWindowsのファイルの暗号化をオフにしているからなんですけど, セキュリティ的にどうなのだろう
ホストUbuntuの悪いとこ
- 無数に存在するWindowsにしかないアプリを使おうとする度にOSを切り替えなければならない.
第二部: Terminal生活での便利コマンド, アプリのご紹介
fzf
これです. https://github.com/junegunn/fzf これはなにかと申しますとfuzzy finderというもので, コマンドライン上であいまい検索ができるすぐれものです! つまり, 完全一致じゃなくてもそれっぽいアルファベットをちょっとだけタイピングしてenterを押すだけでファイルを指定できます!
ctrl + t
使い方としては, 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で開きます.
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-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の単眼アイドル, オダマキちゃんの記事です!! 今年も張り切っていきましょ~