当記事は夏休みブログリレー第-5日目の記事です、エントリーしたものの書くものが特に思いつきませんでしたので私のinit.vimの紹介を書こうと思います。
あとついでに先日行われたISUCONで何もできなかったよ~的な話をします。こちらは何も参考になるようなことはないので何なら読まなくていいです。
目次
init.vimとは
世界的に圧倒的人気を誇るテキストエディタVimの派生エディタであるNeoVimの設定ファイルです(Vimでいう.vimrc
に当たるものです)。
ちなみに私のメインのエディタはVSCodeで、コマンドラインで作業をするときににメインで使うエディタがNeoVimって感じです。
そんな感じなので移動のコマンドとかも全然覚えてないです。プラグインも全然使いこなせてないです。
そんなにわかVimmerであることをご了承ください。
で、件のinit.vimですが他の環境でも簡単に複製できるという観点からGitHubで公開しています。
なおこの記事の内容はコミットハッシュでいうと76b4718f45b352684ce8bd153b48f80f74771092
の時点のものに準拠します。
大体パクリなんですが各項目軽く解説しようと思います。一応helpとか読んでるつもりですが適当なことを言っている可能性もあります。鉞はコメント欄・Twitterにお願いします。
解説はじめるよ~
上から順番に。
filetype plugin indent off
ファイルの種類毎に設定ファイルを記述できるんですが、それを利用する際はinit.vimの最初にこれを記述しておく必要があります。また、これを設定した場合、末尾に
filetype plugin indent on
と追記する必要があり、最終行にこれを記述しています。
set mouse=a
マウスでクリックしたところにカーソルを飛ばしたり、ホイールでスクロールできるようになります。
colorscheme molokai
" set backgroundcolor=dark
" colorscheme solarized
カラースキーム、つまりエディタの色の設定ですね。私はmolokaiが好みなんですがたまにsolarizedも使います。コメントアウトしているのはその時に使う設定です。
set fileformats=unix,dos,mac
改行コードを指定します。開いたファイルの行末に指定したものがあった時、それを改行コードとして使用するようになります。
unix
はLF、dos
はCRLF、mac
はCRに対応します。
なお、いずれも見つからなかった場合は一番左のもの(したがって私の設定ではLF)が採用されます。
set termguicolors
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
True Color(256色)でシンタックスハイライトしてくれるようになります(対応したターミナルが必要です)。
後の2行は一部の環境でうまく動作しない場合があることに対応します。
set fileencodings=ucs-bombs,utf-8,euc-jp,cp932
ファイルを読み込むときのエンコーディング。左から順に試していきます。他のエディタでは一々開き直す必要があるのに比べるといいですね。
set ambiwidth=double
日本語を始めとした全角文字の表示に2文字分使うことでちゃんと表示できるようにします。
set noswapfile
スワップファイルを作成しないようにします。
スワップファイルは事故ってVimが勝手に終了したとき、復旧するために変更箇所を保存しておく、というファイルですがとくになくていいかなと思いました。
set hidden
:q
したときにバッファを消さずに隠して保持しておくようにします。なんかよく紹介されているので設定しています。
set clipboard+=unnamedplus
NeoVimの無名レジスタ(yでヤンクしたときにコピーする先)とOSのクリップボードを結びつけます。これによりyでクリップボードにコピーできるようになります。なおWSL(Windows Subsystem for Linux)でこれを設定してもWindowsのクリップボードにはコピーされないため無意味です(したがって後述する手段などを利用する必要があります)。
set number
set list
set listchars=tab:>-,trail:*
set smartindent
set visualbell
set number
は行番号を表示します。これないとやってられない気がするんですけどどうなんでしょう。
set list
は空白文字を可視化します。set listchars
で表示する文字を変更できます(NeoVimではデフォルトでset listchars=tab:> ,trail:-,nbsp:+
となっています)。
記号:表示方法
という書式でカンマ区切りで設定できます。
tab
はtab文字(\t)を表す記号を半角記号2つで設定します。1文字目を一回、以降は2文字目を繰り返します。
trail
は行末にある余計なスペースを表す記号を半角記号1つで設定します。後述するspace
を上書きします。
nbsp
はノーブレークスペース(ゼロ幅文字とも言います。ココ→←ココにある文字。)を表す記号を半角記号1つで設定します。
これ以外にも、eol
で行末、space
でスペースを表す文字を設定できます。
set smartindent
はブロックインデントとかコメントのインデントとかをうまい具合にしてくれます。本来はset autoindent
が必要なのですがNeoVimだとデフォルトでこれが設定されているのでautoindentの方の記述は不要です。
visualbell
はビープ音を生じる際に音ではなく画面のフラッシュを行うようにします。発動したことはないのでよくわかりません。
nnoremap j gj
nnoremap k gk
こんな感じで「ファイル上の1行が画面上では複数行にわたっている」とき、NORMALモード時のj/kで見た目通りに移動できるようになります。
set expandtab
set tabstop=4
set shiftwidth=4
私はソフトタブ+スペース4つ派(PEP8に従うPythonistの鑑)なのでこんな感じになります。
set expandtab
でTABキーを押したときにtab文字(\t)ではなくスペースを入力するようになります。
set tabstop
ではTABキーを押したときのインデントのスペースの個数を指定できます。
set shiftwidth
では自動インデント(上のsmartindentや>>
によるインデント)のスペースの個数を指定できます。
set ignorecase
set smartcase
set wrapscan
nmap <Esc><Esc> :nohlsearch<CR><Esc>
検索関係の設定です。
set ignorecase
は大文字小文字の区別をなくします。
set smartcase
は検索単語に大文字が含まれていた場合、特別な意味があると解釈しignorecase
をなかったことにして検索を行います。
set wrapscan
では一番下の単語まで行ったら一番上に戻るという、最近のエディタだと普通に実装されている機能を有効にします。
なお、よく設定されているhlsearch
(ヒットした単語のハイライト)/incsearch
(n
/N
を押すと次/前の候補に飛ぶ)はNeoVimではデフォルトで設定されているので省略しました。
最後のキーマッピングではEscキーの連打によりハイライトを解除するようにします。
set whichwrap=b,s,<,>,[,]
ある行の行頭から前の行の行末に移動したり、逆に行末から次の行の行頭に移動したりできるようになります。
b
はBackSpace(delete)キーで、s
はSpaceキーで、この機能が有効になります。
<
(←キー),>
(→キー)はNORMALモード及びVISUALモードで各キーにこの機能を割り当て、[
(←キー),]
(→キー)はINSERTモード(置換含む)でこの機能を有効にします。
imap <S-CR> <End><CR>
imap <C-S-CR> <Up><End><CR>
nnoremap <S-CR> mzo<ESC>`z
nnoremap <C-S-CR> mzO<ESC>`z
GUI版Vim(GVim,MacVim等)においてINSERTモード時にShift+Enter(return)で上、Ctrl+Shift+Enterで下に空行を追加できるようにします。一応書いてますがGUI版は利用しないのでただ書いてるだけです。
let g:python_host_prog = '/usr/bin/python2'
let g:python3_host_prog = expand('~/.pyenv/versions/neovim/bin/python3')
何かと使うことの多いPythonのパスです。Python3に関してはpyenvでバージョン管理をしているためそこに渡しています。
nnoremap <C-w>n <Esc>:enew<Return>
Ctrl+Wを押した後にnを押すことで新規タブを開けるようにします。:enewと打つのがめんどくさいのでショートカットに設定しています。
nnoremap <silent> <Space>y :.w !win32yank.exe -i<CR><CR>
vnoremap <silent> <Space>y :w !win32yank.exe -i<CR><CR>
nnoremap <silent> <Space>p :r !win32yank.exe -o<CR>
vnoremap <silent> <Space>p :r !win32yank.exe -o<CR>
これは https://qiita.com/rattcv/items/da6730384111ad8fb70a にあるものをパクらせていただきました。
前述の通り、WSLでVimを利用する際、そのままだとクリップボードとの連携ができませんが、[win32yank.exe]https://github.com/equalsraf/win32yank/releases)というソフトウェアを利用することで連携を行うことができます。これはそのショートカットの設定です。
私は上の記事と同様、NORMALモード及びVISUALモードにおいて、Spaceキーと(通常のヤンク/ペーストと同様の)yキー/pキーの同時押しをクリップボードへのコピー/ペーストに割り当てています。
ちなみにtmuxだと色がうまく表示されず、未だにうまくいっていないのでPowerShellのプロンプトで頑張っています。
set showtabline=2
set noshowmode
これらは直接の関係はありませんがlightline.vimを使用した際の見た目を良くするための設定です。
showtabline=2
で常にタブページのラベル(各タブのファイル名)を表示します。
noshowmode
はモードの表記を消します。lightline側で表示するため元々の表記はもはや不要です。
let g:markdown_fenced_languages = [
\ 'html',
\ 'python',
\ 'bash=sh',
\ 'js=javascript',
\ 'json=javascript',
\ 'c',
\ 'vim'
\]
このブログを執筆する際にも利用しているマークアップ言語の一つMarkDownの設定。
```python
print('hoge')
```
のようにバッククオート3つで囲み、最初に言語名を書いておくとシンタックスハイライトをかけてくれるのですが、ここに記述した言語のみそれをしてくれるみたいです。
ここに関してはあんまり調べてないので(情報が出てきにくい)、もしかしたら不要になっているかもしれません。
let g:vim_home = $XDG_CONFIG_HOME.'/nvim'
let g:rc_dir = $XDG_CONFIG_HOME.'/nvim/rc'
set runtimepath+=$XDG_CONFIG_HOME/nvim
下でプラグイン別の設定ファイルを読み込むための前準備みたいなものです。
~/.config/nvim/conf
以下に設定ファイルを記述しているため、runtimepath
に~/.config/nvim
を追加しています。なんで~/.config/nvim/conf
じゃないのかといいうとなんとなくです。
rc_dir
はdein.vimで使う分です。
runtime! conf/*.vim
プラグインを(使っているわけでもないのに)いろいろ入れすぎてinit.vimがごちゃごちゃになってきたのでプラグインごとに設定ファイルを分割し、$XDG_CONFIG_HOME/nvim/conf
下にばらまきました。それらを読み込むようにここで指示しています。
runtime
は上で見たruntimepath
下にある、パターンにマッチしたファイルを読み込んでくれます。runtime
とruntime!
がありますが前者は1つだけ、後者はすべてのマッチしたファイルを読み込みます。目的からして後者のほうが適しているのでこちらを使用しています。
ここで読み込むファイル群の方の紹介は時間がなさすぎるので省略させていただきます(投稿前日の夜にはじめましたので)。興味がある方は(多分いらっしゃらないと思いますが)GitHubに上げてるのでそちらを見てください。
調べてくるとよく出てくるオプションのうち不要なものは削除しています。
if &compatible set nocompatible endif
vi(Vimの元になったエディタ)と設定が被った際にVim側を優先させるというものですが、デフォルトで設定されているため不要です。
set t_Co=256
利用できる色数を設定しますがVimが判断してくれるため不要です。
set fileencoding=utf-8
ファイルの書き込み時のエンコーディングを指定します。省略すると
encoding
(システムのエンコーディング。NeoVimではutf-8で固定)の値と一致させます。UTF-8に文句言う人はいないので不要です。
set autoread set showcmd set backspace=indent, eol, start set nobackup
これらはすべてNeoVimではデフォルトで設定されているため不要です。
なおset autoread
で他エディタでのファイルへの変更を自動的に読み込んでくれます。
set showcmd
は入力したキー操作を右下に表示してくれます。
set backspace
はBackSpaceキーで削除できる文字を追加します。indent
でインデント、eol
で行末文字、start
で前の行の末尾の文字を消せるようになります。
set nobackup
はバックアップファイル(変更前の状態を保存して元に戻せるようにしたファイル)を作らないというものです。正直いりませんしいるならgitのほうが便利な気がします。
syntax enable
シンタックスハイライトを有効にしますがNeoVimではデフォルトで設定されています。なお自分で定義した色を使う際はこの代わりに
syntax on
を使用する必要があり、こちらは省略できません。
あとがき
GitHubで公開されている方も多いようですし、他人のinit.vimを見てみるといろいろ発見とか便利な設定とかあって面白いかもしれません。私もやったことなかったんですがやってみようと思います。
「これなんだ?」となるような設定に遭遇したときは
を大いに活用しましょう。有志の方が:help
で出てくる内容を読みやすく日本語に翻訳してくださっています。
「ISUCON」とは、Iikanjini Speed Up CONtestの略で(マジです)、課題となっているアプリケーションの速度向上を目指してサーバーの構成の見直し・アプリーケーションの改善・その他いろいろやるコンテストです。
http://isucon.net
今回のテーマは劇場の予約サービスだったんですかね。ジ○リのパチもんみたいなネーミングセンスがかなり好みでした。
traPからも何チームか参加していて(私が把握している限り)2チームが本戦に出場されています。他の方の記事をご覧になった方もいらっしゃるかと思います。
私は今回はtraPの他の方(@Altair626さん、@RLookさん)とチームで参加しました。言語はGolangを選択(ちなみに私はGolangに関してはA Tour of Goのinterfaceの演習問題で挫折している状態です。開発経験はないです)。
私が実家(福岡)にいたこともあり、顔を合わせることはなく話はDiscordで行いました。
開始直後はそれぞれでサーバーの構成を見たりアプリのソースコードを読んだりしつつ、改善できそうな点を探しました。(今回httpサーバーにはnginxではなくh2oが使用されていてちょっと意外でした。あと名前の性質上かなり調べにくかったです。)
上でも言ったとおり私はGolangには疎いのでノリと感覚でソースコードを読み、書ける人に気づいた箇所を言って変更してもらう感じでした。
全員開発経験も運用経験もあまりなかったもので、どこを変更したらいいのかわからず、とりあえずSQLのクエリを投げる回数を減らすことを目標にチューニングしていきました。...が全然改善できませんでした。ベストスコアは1600点台だったかと思います。
今回のハイライトはこちらになります。
開始直後に参照実装をGolangに切り替えた際のテストベンチマークで2位まで上がったそうです(私が見た時は3位に落ちててこの写真みたいな感じでした)。
まあ当然このあとじゃんじゃん抜かれて本戦出場とはなりませんでした。
最近Golangの人気も年収も上がってるみたいですしそのうちちゃんと勉強したいですね。
おわりに
めっちゃ長くなったんですが最後まで読んでくださったかたはお疲れ様でした。
全部読んでないよ、少しだけ読んだよって方もありがとうございます。
なんか勉強になったので自分で書いててもいい感じでした。