2018年9月20日 | ブログ記事

私のinit.vimを紹介します(+おまけ)

xecua

当記事は夏休みブログリレー第-5日目の記事です、エントリーしたものの書くものが特に思いつきませんでしたので私のinit.vimの紹介を書こうと思います。
あとついでに先日行われたISUCONで何もできなかったよ~的な話をします。こちらは何も参考になるようなことはないので何なら読まなくていいです。

目次

  1. init.vimの紹介
  2. ISUCONの感想

init.vimの紹介

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

image1
こんな感じで「ファイル上の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下にある、パターンにマッチしたファイルを読み込んでくれます。runtimeruntime!がありますが前者は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を見てみるといろいろ発見とか便利な設定とかあって面白いかもしれません。私もやったことなかったんですがやってみようと思います。

「これなんだ?」となるような設定に遭遇したときは

https://vim-jp.org/vimdoc-ja

を大いに活用しましょう。有志の方が:helpで出てくる内容を読みやすく日本語に翻訳してくださっています。

おまけ:ISUCONに参加しました

「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点台だったかと思います。

今回のハイライトはこちらになります。
------1
開始直後に参照実装をGolangに切り替えた際のテストベンチマークで2位まで上がったそうです(私が見た時は3位に落ちててこの写真みたいな感じでした)。
まあ当然このあとじゃんじゃん抜かれて本戦出場とはなりませんでした。

最近Golangの人気も年収も上がってるみたいですしそのうちちゃんと勉強したいですね。

おわりに

めっちゃ長くなったんですが最後まで読んでくださったかたはお疲れ様でした。
全部読んでないよ、少しだけ読んだよって方もありがとうございます。
なんか勉強になったので自分で書いててもいい感じでした。

この記事を書いた人
xecua

東方クラスタではないです。

この記事をシェア

このエントリーをはてなブックマークに追加

関連する記事

2018年9月24日
夏休みブログリレー エンディング
Yosotsu
2018年9月23日
ゲームを作るものを作っています
Sigma1023
2018年9月22日
数理計算の講義を活かして震度計を作った話
RLook
2018年9月19日
ゲームの敵の動きを実装した話
mds_boy
2018年9月18日
楽して絵っぽいものを作る
Kejun
2018年9月17日
ロシアでSNS規制されたお話
Aniie

活動の紹介

カテゴリ

タグ