Vim | 正規表現でプラス ( + ) が使えない ( クエスチョンマーク、パイプ、アンド、ブレース、丸カッコも )
vim-jp/vimdoc-jaにコントリビューションした話
この記事は Vim Advent Calendar 2016 9日目の記事です。
この記事で言いたいこと
- 翻訳作業に是非参加を!
以上です。以下はどうしてvimdoc-jaに翻訳参加することになったのか、やってみてどうだったか書いていきたいと思います。
やったこと
- 未翻訳部分を翻訳。
- repeat.jax
- eval.jax(進行中)
- 英語版と日本語版とのバージョンが不一致な箇所修正、更新分を翻訳
- autocmd.jax
- cmdline.jax
- filetype.jax
動機
- そういえば最新のVimでは
packages
というプラグイン管理の仕組みが導入されたらしいので試してみよう。 - まずはヘルプ見よう。
:help packages
…ってあれ、一部未翻訳な箇所がある。 - そういえば @kaoriyaさんが VimConf2016で「翻訳作業に是非参加を!」っていってたしやってみるか。
と、ふわっとした感じでやってみました。
前提条件
- 筆者の英語力はこんな感じです。特別英語が得意というわけではありません。
- 英語で書かれた記事やドキュメントをGoogle翻訳や辞書を使いつつ読む
- かんたんなEnglishで会話できる
実際の手順
- やり方は Workflowに書いてあるのでその通りに。
- Guideに翻訳をするに当たっての注意点が書いてあるのでPRを投げる前にしっかり確認すること。
- autofmtの設定は最初にやったほうがいい。
- koron/nvcheckを使ってローカルでチェックしておくとTravisCIさんに怒られなくて済む。
- PR投げた後はvim-jpの方々から随時レビューが入るので、指摘事項を反映しコミット。
- Merged!
やってみてどうだったか。
気になるものはやってみようという意識が高まった。
- 今まで「誰かがやるだろう」とか「また今度でいいや」と後回しにしていたのに、「ちょっとやってみるか」とトライすることが多くなってきた。
Vim、Git(GitHub)の理解が深まった。
- 「Vimのhelpってこうなっているんだ。」
- 「Gitのブランチってそういえばあんまり使ってなかった。」
- 「GitHubのレビュー機能ってこう使うのか。」
vim-jp organizationのバッチをGETした。
- これで自分もPRをMergeできるよ!(けどまだそこまでレビューできる自信はないのでいずれ)
翻訳についてもそうですが、一人でやってるとmasterでガシガシコミットしていく形式でやってた自分もGitやGitHubについても理解を深められたのは嬉しい誤算でした。
実はやる前は「適当な訳を投げるな!」とかフルボッコにされるのではないかと不安な気持ちもありましたが、「まあ何かあったらその時考えればいいや。」と自分に言い聞かせてやってみました。
完璧を目指すよりまず終わらせろ Done is better than perfect.
とマーク・ザッカーバーグ氏も言ってますしね。
(実際にはフルボッコなんてもちろんないですよ!)
終わりに
- 翻訳作業にぜひ参加を!
- 「どこから手をつけたらいいかわからない」という方は Issuesや Projectsに上がっているところから手を付けていくのがいいかも。
- 2016/12/09現在だと、eval.jax の未訳文を翻訳する・Issue #48が進行中なので、少しずつ手を広げていくのがいいかも。
Vim 8.0 Advent Calendar 9 日目 2 進数のサポート
この記事は Vim 8.0 Advent Calendarの 9 日目の記事です。
Vim 8.0 では 2 進数のサポートが強化されています。
2 進数の数値リテラル
0b
もしくは 0B
で始まる 2 進数リテラルが追加されました。
echo 0b1010==10" => 1
<C-a>
<C-x>
の 2 進数サポート
'nrformats'
オプションに指定できる値に bin
が追加されました。
これはデフォルトで含まれているため、特に設定せずに利用可能です。0b
や 0B
で始まる 2 進数の数値の上で <C-a>
や <C-x>
を実行すると、数値を増減できます。
0b1000
↓<C-x>
0b0111
printf() の 2 進数サポート
printf()
関数のフォーマットに %b
が追加されました。
これを使うことで、数値を 2 進数の文字列に変換できます。
echo printf('0b%b',10)" => 0b1010
もちろんフラグにも対応しています。8 桁の 0 埋めパディングをするには以下のようにします。
echo printf('0b%08b',10)" => 0b00001010
Paper Plane xUI(PPx)とVimの連携
この記事では、PPxからVimで選択ファイルを開いたり、Vimで開いているファイルパスへPPxでジャンプさせたりする方法を紹介します。
なお、記事中のデモ等ではGVimを使ってますが、Vimでも動作します。
PPxからVimで選択ファイルを開く
Vimを起動する際、起動オプションにファイルパスを渡せばそのファイルを開いた状態で起動できます。
Vimの起動オプションにファイルパスを渡す(シンプル版)
一番簡単な方法が、恐らく次のような設定になるかと思います。
※「%'vim'」はVimへのフルパスが書かれたエイリアスです
KC_main = { ; PPcメイン窓
\E , %Ob %'vim' %FCD
}
これでも開く事はできますが、ここではgrep -nの検索結果にも対応してみようと思います。
Vimの起動オプションにファイルパスを渡す(grep -n対応版)
次のようなファイルがあるとします、これらにはいくらかのソースコードが書かれています。
.
|-- foo.cpp
`-- foo.h
これらのファイルから「grep -n 'foo'」で検索すると、次のような結果になります。1
ここで、3つ目の検索結果は「foo.h」ファイルの「2行目」を指しています、Vimの起動引数にこれらを渡せれば、目的のファイルを開く際にカーソルを指定行へ移動できます。
# Vimでfoo.hを開いて2行目にカーソル移動
$ vim.exe +2 foo.h
ここでは「grep -n」結果の場合にVimの起動引数に変換するスクリプトを利用して対応していますentry2vimargs.js。
Vimで開いているファイルパスへPPxでジャンプ
PPx -> Vimはできたので、逆のVim -> PPxも欲しくなります、こちらもPPxの起動オプションを利用します。
PPxでファイルパスへジャンプするには、以下のようにします。
> PPCW.EXE -r /k *jumppath E:\path\to\foo.h
このコマンドをVimから叩けば、PPxで指定のファイルパスへジャンプできます。
デモ
※GVim内でのファイル移動はVimFilerを使っています
Vimで開いているファイルパスでPPxへジャンプできています、ちなみに「:ppx」で関数Open_ppx()を呼び出し、その関数内でvimprocを使ってファイルパスへジャンプするコマンドを実行しています。
ツール構成
Vim
コマンドをバックグラウンド動作をさせる為にShougo/vimproc経由で実行しています。
PPxへのパスを各自の環境に合わせて下さい、実行方法もカスタマイズできます。
" PPxで開くfunction! Open_ppx() " NOTE : PPxに渡すパス区切りは「\」じゃないといけない " Windows版のVim以外だとexpand('%:p')のパス区切りの修正が必要call vimproc#system_bg("E:/tool/favorite/PPX/PPCW.EXE -r /k *jumppath '".expand('%:p')."'")endfunction" 「:PPx」「:ppx」の両対応nnoremap :ppx :call Open_ppx()
command!-bar PPx call Open_ppx()
entry2vimargs.js
//!script//// エントリーをvim用の起動引数へと変換する//// 従来のパスのみの他に、行番号付きのgrep検索結果にも対応// * 行番号付きのgrep検索結果の場合// パス:行番号:内容 -> パス +行番号//functiongetPath(str){returnstr.split(/\:[^\\]/)[0];}functiongetLineNumber(str){varm=str.match(/:\d+:/);if(!m)returnnull;returnparseInt(str.substring(m.index+1,m.lastIndex-1));}///varline_path=(function(){vararg=PPx.Arguments.item(0);if(arg==""){PPx.Echo('arg is empty');PPx.Quit(-1);}return[getLineNumber(arg),getPath(arg)];})();varargs=[];if(line_path[0]!=null)args.push('+'+line_path[0]);args.push(line_path[1]);PPx.Result=args.join(' ');
PPx設定
エイリアス「%'gvim'」はGVimへのフルパスです、--remote-tab-silentは起動中のVimで別Tabとして開く起動オプションです、スクリプトのパスと共に各自の環境に合わせて下さい。
※自身の設定が消えないように、適用前にバックアップを取るか、追加取り込みをしてください
※スクリプトのパスは自身の環境へと合わせて下さい
KC_main = { ; PPcメイン窓
\E ,*set VIM_ARGS=%*script(%0\script\entry2vimargs.js, "%FCD")
%Ob %'gvim' --remote-tab-silent %'VIM_ARGS'
}
おわりに
今回の連携ですが、他のエディタでも起動オプションに行番号が渡せたり、マクロ機能があれば乗り換える事ができます。
一例ですが、notepad++やサクラエディタなどでも可能な連携です。
検索結果をエントリーに表示する方法は6日目「Paper Plane xUI(PPx)からエントリーへのgrep」 ↩
あなたがサイヤ人の時、Vimはスーパーサイヤエディタになる
人はスーパーサイヤ人に憧れるものです、しかし現実ではなれる人は限られています、日夜修行していつかスーパーサイヤ人になれる日を夢見るのもいいですが、ここでは変わりにVimにスーパーサイヤエディタになってもらいます。
そんなプラグインを作りました。
kuririn-no-kotoka.vim
wordijp/kuririn-no-kotoka.vim(GitHub)
インストール方法や使い方はREADME.mdに記載しています。
※動作確認はWindowsのみで行っているため、Linunx/Macでの確認ができていません
デモ
このプラグインはこちらの動画(Youtube)を見ながら作成しています。
あなたがサイヤ人ならクリリンを殺された怒りでVimがスーパーサイヤエディタへと覚醒します
デモでは音が出ませんが、シュインシュインの効果音も出ています。
苦労した点
スーパーサイヤ人らしさ
特徴といえば「逆立った髪」「金色のエフェクト」「シュインシュイン」だと思います。
このうち、「逆立った髪」はエディタで何が逆立つのか分からなかったので却下、「金色のエフェクト」はカラースキームをリアルタイムに変更しようとしたら編集に支障が出るレベルで遅いので却下。
最終的に、金色っぽいカラースキームに変更後、「シュインシュイン」だけ発生させてスーパーサイヤエディタっぽくするようにしました、見辛くてもいけないのでカラースキームも「golden.vim」という名前が金色なもので妥協しました。
技術的な話
以下は今回のプラグインを作成した際の技術的な話です、読み飛ばしてもらっても構いません。
利用したVim8の新機能
exepath
あなたがサイヤ人か、はたまたへたれ王子なのかの判定に利用しています。
それぞれの専用ディレクトリへパスを通したあと、ユーザー名コマンドを作成し、exepathで取得したフルパスに「saiyajin」か「prince」が含まれているかで判定しています。
kuririn-no-kotoka.vim
`-- autoload
|-- kuririn_no_kotoka.vim # princeとsaiyajinへパスを通す
|-- prince
`-- saiyajin
`-- wordi # 作成されたユーザー名コマンド
タイマー(Timer)
タイマーはアニメーション処理で利用しています、Vimがスーパーサイヤエディタになるには、いくつかの過程を経る必要があるため、それらをアニメーションで処理しています。
アニメーション処理用の関数はこちらです
" 一定間隔で指定回数funcを読んだあと、最後にnext_funcを呼ぶfunction!s:regist_animate(interval, max_count, func, next_func) abort
" クロージャ動作をさせるバインドletl:Func =a:func
letl:Next_func =a:next_func
letl:max_count =a:max_count
letl:interval =a:interval
letl:count=1 " ループコールバックfunction!s:regist_animate_internal_loop(local, timer) abort
calla:local.Func()" max_count回数呼ばれるifa:local.max_count ==0 " 無限ループreturnendifleta:local.count+=1ifa:local.count>a:local.max_count
call timer_stop(a:timer)calls:regist_animate_internal_next(a:local.Next_func)endifendfunctioncall timer_start(a:interval,function('s:regist_animate_internal_loop', [l:]), {'repeat': -1}) " 終了時コールバックfunction!s:regist_animate_internal_next(next_func) abort
letl:Next_func =a:next_func
function!s:regist_animate_internal_next_internal(local, timer) abort
calla:local.Next_func()" max_count回数後に呼ばれるendfunction " NOTE : 非同期でa:local.Next_funcを呼び出し、ループコールバック関数の使用中を解除するcall timer_start(0,function('s:regist_animate_internal_next_internal', [l:]), {'repeat': 1})endfunctionendfunction
この関数を利用して、過程を経てスーパーサイヤエディタになります。
過程は、Stateパターン(のようなもの)で実装しています。
※解説用にシンプルにしています。
" Phase 1function!s:phase_1() abort
letl:foo ='local'function!s:phase_1_loop(local) abort
" ここにアニメーション処理を書く
echo a:local.foo
endfunctionfunction!s:phase_1_done() abort
" 次のPhaseへcalls:phase_2()endfunction " 50ms間隔でloop関数を40回実行後、done関数を呼び出すcalls:regist_animate(50,40,function('s:phase_1_loop', [l:]),function('s:phase_1_done'))endfunction" ----------------------------------" Phase 2function!s:phase_2() abort
function!s:phase_2_loop() abort
" ここにアニメーション処理を書くendfunctionfunction!s:phase_2_loop2() abort
" ここにアニメーション処理を書くendfunctionletl:remain =0function!s:phase_2_done(local) abort
leta:local.remain -=1ifa:local.remain <=0 " no-op : 最終Phaseなので何もしないendifendfunction " アニメーションを合成するcalls:regist_animate(50,40,function('s:phase_2_loop'),function('s:phase_2_done', [l:]))letl:remain +=1 " 異なるFPSでもOKcalls:regist_animate(100,20,function('s:phase_2_loop2'),function('s:phase_2_done', [l:]))letl:remain +=1endfunction
アニメーションは合成が出来ます、今回のプラグインではセリフと震えを合成しています、アニメーションをそれぞれの専用関数に実装して合成すると、FPSの違いを考慮しながら実装する手間がなくなり楽に実装できました。
作ってみた感想
ウインドウの振動を表現するために乱数が欲しいなと思いました!
https://github.com/vim-jp/issues/issues/983
おわりに
悟空が「クリリンのことかー!」と叫ぶのはスーパーサイヤ人になったあとなんですが、勢いがあるので気にしないことにしました。
Vim 8.0 Advent Calendar 10 日目 quickfix に追加された機能
この記事は Vim 8.0 Advent Calendarの 10 日目の記事です。
Vim 8.0 では quickfix 周りに便利な機能が追加されました。
quickfix の各項目の場所で Ex コマンドを実行する
quickfix の各項目に対して Ex コマンドを実行する :cdo
Ex コマンドが追加されました。この Ex コマンドを使うことで、quickfix に対する柔軟な操作が可能になります。
例えば、プロジェクトの中から単語 foo
を探し、それらを全て bar
に書き換えるには以下のようにします。
" 単語 foo を探します。結果は quickfix に入ります。:vimgrep/\<foo\>/ **/*
" 検索結果の各行にて、置換を行い、バッファを保存します。:cdo s/\<foo\>/bar/g|update
quickfix 内の各ファイルで Ex コマンドを実行する
上記の例において、検索結果の各ファイルについて複数の結果のデータがある場合に、各ファイルについて何か処理がしたい場合があるかもしれません。この場合に :cdo
を使ってしまうと、各ファイルにて結果のデータの数だけ処理が実行されてしまいます。
こういった場合のために、cfdo
Ex コマンドも追加されています。こちらの Ex コマンドは、quickfix に存在している各ファイルについて繰り返しが行えます。
各ファイルが開かれた際のカーソル位置は、ファイル内の最初の quickfix の項目の位置になります。
quickfix の一番下にスクロールする
Vim の非同期機能が強化されたため、今後は quickfix の内容が非同期で更新されることもあるでしょう。そういった場合に、常に quickfix の一番下の内容が見たい場合もあります。
新しく追加された :cbottom
Ex コマンドを実行すると、quickfix ウィンドウへ移動しなくても、quickfix ウィンドウの内容を一番下までスクロールさせることができます。
quickfix の履歴を参照する
quickfix の内容は、最新の 10 個まで履歴が保存されていて、以前の内容に戻すことができます。詳細は :help quickfix-error-lists
に記載されています。
この機能は、以前までは実際に :colder
などを実行して前に戻ってみないと古いものが存在するかどうかがわかりませんでした。
そこで追加されたのが :chistory
Ex コマンドです。この Ex コマンドを実行すると、quickfix にどのような履歴があり、現在どれが参照されているのかが以下のように表示されます(以下は help からの抜粋です)。
error list 1 of 3; 43 errors
> error list 2 of 3; 0 errors
error list 3 of 3; 15 errors
ロケーションリスト版
上記の Ex コマンド :cdo
:cfdo
:cbottom
:chistory
はそれぞれ、ロケーションリスト版として :ldo
:lfdo
:lbottom
:lhistory
が用意されています。
vim-metarw でファイル名にコロンが含まれる場合に保存ができない (未解決)
解決には至っていないが、VimScript がよく分かっていない者でも原因の特定が(たぶん)出来たので、その過程を忘れないように残しておく。いわゆるタイトル詐欺。
今後、似たような事が起き得る可能性は十分にあるので。
環境
$ uname -a
Linux desktop-arch 4.8.10-1-ARCH #1 SMP PREEMPT Mon Nov 21 11:55:43 CET 2016 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Nov 15 2016 18:04:06)適用済パッチ: 1-86Compiled by Arch LinuxHuge 版 with GTK2 GUI.以下略
症状
例えば下記のようなコマンドで、ファイル名にコロンが含まれるファイルを新規作成する。
$ vim ~/tmp/ho:ge.md
編集後に :w
で保存しようとしたところ、うんともすんとも言わない。当然 :messeage
しても何もなく :write
が無効化されてしまったような印象を受ける。
普段、ファイル名にコロンが含まれる場合などそうそう無いので全く気が付かなった。
※「可搬性からファイル名にコロンを使用すべきではない」という話はひとまず置いておく。
※コロンに限った話では無いかもしれないが、コロン以外の記号は試していない。
※後で気が付いだが、vim 起動時の新規作成ファイル特有のメッセージなども表示されていなかった。
原因の探し方
vim 本体は正常か否か
まずは素の vim で試す。
$ vim -u NONE -i NONE -N ~/tmp/ho:ge.md
ちゃんと保存できる。vim 自体は正常。
素の vim については git用に素のvimを設定する - Humanityが参考になった。
次に自分の vimrc 系の設定ファイルを疑う
おそらく保存まわりの追加処理に副作用が生じているのだろう。autocmd
の BufWrite
系イベントを探る。
vimrc
の類は ~dot/vim/rc
に用途別に分割して設置しているので Silver Searcherを使って全文検索を行う。
$ ag --vim 'autocmd BufWrite' ~dot/vim/rc
副作用が生じていそうな箇所をコメントアウトし、vim を再起動させる。それを一通り繰り返す。
問題なし。
次にプラグインを疑う
プラグインは NeoBundleで管理しており、実ファイルは ~dot/vim/bundle
以下に設置している。
先程と同様に全文検索を行う。
$ ag --vim 'autocmd BufWrite' ~dot/vim/bundle
現在は利用していない(無効化している)プラグインの実ファイルも ~dot/vim/bundle
以下に残っているため、現在有効かつ副作用が生じていそうなプラグインを探し出すのは少々面倒だった。より効率的な方法があれば知りたい。
試行錯誤の結果、vim-metarwが原因らしいという事が分かった。実際に利用していたのはフォーク版の mattn/vim-metarw
どう解決するか (未処理)
vim-metarw
の問題の箇所を修正- そもそも
vim-metarw
は vim-metarw-redmineでしか使っていない(たぶん)- 無効化してもたいして困らない(はず)
- NeoBundle の遅延読込等で
vim-metarw-redmine
を常時有効にさせず、副作用を限定的にする
vim-metarw
自体メンテナンスされていないかも
vimでsudoを忘れてreadonlyで編集してしまった場合
w !sudo tee%
w : ファイルの保存
!sudo tee : ! にて コマンド「sudo tee」を指示
% : 現在開いているファイル
⇒ 現在開いているファイルに対して、tee コマンドで強制的に上書きすることになります。
q!
Vim 8.0 Advent Calendar 11 日目 タイムスタンプで管理されるようになった viminfo ファイル
この記事は Vim 8.0 Advent Calendarの 11 日目の記事です。
今回は、ユーザーの作業が記録されている viminfo ファイルについてです。
viminfo ファイルの概要
viminfo ファイルは、ユーザーが行った様々な操作を記録しておくファイルです。例えば、レジスタの内容、コマンドラインの履歴、検索文字列の履歴や、ジャンプリストなど、様々な情報が記録されます。これらをファイルに記録することで、次回 Vim を使った際にも、前回の履歴を引き継いで使うことができます。
viminfo ファイルは、基本的には起動時に読み込まれ、終了時にファイルに書き出されます。
viminfo ファイルのマージ
1 つの viminfo ファイルを複数の Vim のセッションで使った場合、viminfo ファイルはマージされます。
どのようにマージが起きるか、例を挙げます。
同時に 2 つの Vim を立ち上げて、それぞれ A B とします。起動時には viminfo は空で、どちらも最初は履歴がありません。
この時、
- A で Ex コマンド
:echo 1
を実行 - B で Ex コマンド
:echo 2
を実行 - A で Ex コマンド
:echo 3
を実行 - B で Ex コマンド
:echo 4
を実行 - B を終了
- A を終了
とします。
5 の時点で、B の履歴が viminfo ファイルに書き込まれ、viminfo ファイルには新しいものが上に来るように以下のような順番で記録されます(実際のファイルの形式とは異なります)。
:echo 2
:echo 4
次に 6 で A が終了する際、viminfo ファイルに更新があることを Vim が検出すると、一旦新しくなった viminfo を読み込みます。続いて A の Vim のセッションで記録された履歴を追記し、viminfo ファイルに書き出します。以下のようになります。
:echo 2
:echo 4
:echo 1
:echo 3
このように、コマンドラインヒストリがマージされます。
発生する問題
上記の例で、1 つ問題が発生します。ユーザーは複数の Vim を行き来し、:echo 1
から :echo 4
まで順番に実行したのにも関わらず、履歴の順番はぐちゃぐちゃになってしまっています。
これは特に Vim を長時間起動していた場合、つい先ほど実行したコマンドが履歴の奥深くに潜ってしまうことを意味します。例だと、ユーザーが最後に実行したのは :echo 4
ですが、これは履歴の一番下から 3 番目に来てしまっています。
最近実行したものは、履歴の中でも最近に出てきてくれた方が嬉しいでしょう。
タイムスタンプを使った新しい viminfo ファイル
そこで Vim 8.0 では、コマンドなどの履歴を保存する際に、それらが実行された時間のタイムスタンプも一緒に保存するようになりました。
これによって履歴は読み込まれる時にタイムスタンプ順でソートされ、ユーザーが実行した順番で履歴を参照することができます。
以下のものがタイムスタンプで管理されるようになりました。
- コマンドラインの履歴
- 検索文字列の履歴
- 入力行の履歴
- 空ではないレジスタの値
- ジャンプリスト
- ファイルのマーク
vim8.0 Paritial機能のバグ修正を追ってみた
はじめに
vim8.0でPartial機能が追加されたことは、みなさんご存知でしょうか?http://vim-jp.org/blog/2016/09/13/vim8.0-features.html
Partial機能実装時のバグにより、いくつかのpluginに不具合が出ることになりました。今回は、バグ修正のパッチをコードリーディングしながら、バグ修正の過程を追ってみたいと思います。
これは、Vim (その2) Advent Calendar 2016のための記事です。vimのような老舗プロジェクトでもこんなことがあるんだなーと思ってネタを選びました。
何が問題だったのか
let dict = {'value': 'foo'}
function! dict.func()
return self.value
endfunction
Partialの実装後、dict.funcはdictを束縛したPartialとなりました。Partialの実装にバグがあり、dict.funcを扱っているコードの後方互換性が失われました。
修正パッチを追ってみる
patch 7.4.1580
https://github.com/vim/vim/commit/7a5c46a9df7ef01a4f6a620861c35400d5ad28d9
変更は1行だけで、pt_refcountを1で初期化しています。pt_refcountをincrement/decrementして、ゼロになったときにPartialの束縛を解放する仕組みのようですね。
patch 7.4.1581
https://github.com/vim/vim/commit/65639032bb7b17996cd255d1508a1df4ad528a1f
functionがPartialのとき、dict.funcがうまく動かないバグを修正しています。下のテストを見ると、修正の意味がわかりやすいです。
+ let dict = {"tr": function('tr', ['hello', 'h', 'H'])}
+ call assert_equal("Hello", dict.tr())
patch 7.4.1582
https://github.com/vim/vim/commit/6f2e4b36c9d9908e1cace2b1b96e2c154a837bc2
上記の問題は、まさにこの箇所で修正されました。Partialがdictを束縛していたとき、dictの引数を無視してしまったためにバグが起きた、ということのようです。
+ /* When the function has a partial with a dict and there is a dict
+ * argument, use the dict argument. That is backwards compatible.
+ */
+ if (selfdict_in == NULL)
+ selfdict = partial->pt_dict;
感想
vimのパッチを見るのは初めてで、良い経験でした。
結局3パッチしか追えず、尻切れトンボ感すみません。。コードリーディング、修行します、、
参考
こちらの記事を参考にしています。
http://vim-jp.org/blog/2016/03/23/take-care-of-patch-1577.html
NERD Commenterでコメントアウト、アンコメントを楽にする
プログラミングしてたら絶対にやるコメントアウト、アンコメント。
それを色々と楽にしてくれるvimのプラグインの紹介です。
プラグインの特徴
コメントの状態(コメントアウト、アンコメント)を切り替えるコマンドや、
行末にコメントの挿入といったコマンドなど、コメントアウト関係のコマンドを提供してくれるプラグインです。
またファイルタイプを見ているため、PHPなら//
、htmlなら<!-- -->
といった具合に
言語仕様に合わせた適切なコメントアウトを挿入してくれます。
コマンド
多数のコマンドが提供されているが、便利なもの、特徴的なものを抜粋。全てのコマンドはこちらから。
コメントの状態を切り替える <leader>c<space>
カーソル位置の行、選択している場合は選択行のコメントの状態を切り替える。
選択行の1行目を見て、コメントされていない行なら全てコメントアウト、
コメントされている行なら全てアンコメントを行う。
選択した行のコメントの状態を個別に切り替える <leader>ci
さきほどのコマンドとは違い、こちらは1行毎個別に切り替える。
行末にコメントを追加する <leader>cA
カーソル位置の行末にコメントを追加した後、挿入モードに切り替える。
ブロックコメントを挿入する <leader>cs
カーソル位置の行、選択している場合は選択行を囲う形でブロックコメントを挿入する。
ブロックコメントが存在しない言語の場合は各行に単一行コメントを挿入する。
設定
多数の設定が提供されているが、便利なもの、特徴的なものを抜粋。全ての設定はこちらから。
いずれもデフォルトでOFFになっている設定で、.vimrcに追加することで設定可能。
コメントの後にスペースを追加する
NERD Commenterでコメント挿入した時、コメント記号の後にスペースを挿入してくれるようになる。
コメントが見やすく見やすくなるのでオススメ。
letg:NERDSpaceDelims=1
コメント記号を左に並べる
ネストしている場所をコメントアウトする時、コメント記号を左に並べるようにする。
letg:NERDDefaultAlign='left'
使ってみた所感
コメントアウトもアンコメントも一瞬でできる
普段コメントアウトする際、「行頭に移動して〜、挿入モードに切り替えて〜、コメント記号挿入して〜」って
やってた事がコマンド1発で終わるので快適。複数行だって選択した後にコマンド1発で済む。
コマンドの中でも特にコメントの状態を切り替えるコマンド(<leader>c<space>)が超便利!
このコマンド1種類で事足りるのがでかい。とりあえずこれだけ覚えるだけでも快適になる。
どんなファイルでも悩むことなくコメントアウトできる
NERD Commenter側がファイルタイプに合わせてコメントアウトしてくれるので
「この言語のコメントアウトは何の記号だっけ・・・」って悩む必要がない。
細かいファイルタイプまで対応しているので普段触らないファイルでも安心。
複数種類のファイルを触る人ほど恩恵がでかい。
そんなわけで、NERD Commenterを入れてよかった!✧\٩( 'ω' )و /✧
プラグインの入れ方
.vimrcに以下を追加
NeoBundle 'scrooloose/nerdcommenter'
その後、NeoBundleInstallで入れることでプラグインが入る。
また、ファイルタイプを参照するので、
filetypeon
も.vimrcに付け加える必要がある。
NERD Commenter
deinに乗り換えよう(第一段階)
前提条件
- MacOS ElCapitan 10.11.6(やんごとなき事情で再インストールした後、しばらくヤル気を失って放置w)
- vim7.3→8.0
- homebrew
- 再インストール前はNeoBundle使ってましたが、NeoBundleはもう更新されないらしいので、初めてのdein
手順
vimのバージョンを上げる
デフォルトでvim7.3が入っているが、7.4以上でないとdein.vimが使えない
homebrewでvimをバージョンアップするといくつになるのか・・・?
$ brew info vim
vim: stable 8.0.0022 (bottled), HEAD
・・・以下略
というわけで8.0になるらしいです。
$ brew install vim --with-lua
・・・略
/usr/local/Cellar/vim/8.0.0130: 1,713 files, 23.3M, built in 57 seconds
で、一旦ターミナルを抜けてから
$ vim -h
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Dec 11 2016 18:01:49)
というわけで、無事アップデート
deinのインストール
$ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
$ sh ./installer.sh {specify the installation directory}
と書かれているので、ディレクトリが指定できるらしい。
今回は再インストール直後のmacなので、ディレクトリも作ります
.vim/deinを作ってインストール
$ mkdir .vim
$ mkdir .vim/dein
$ cd .vim/dein/
$ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2234 100 2234 0 0 1357 0 0:00:01 0:00:01 --:--:-- 1358
$ sh installer.sh ~/.vim/dein
Install to "/Users/MineDir/.vim/dein/repos/github.com/Shougo/dein.vim"...
インストールの最後に
"dein Scripts-----------------------------
if &compatible
set nocompatible " Be iMproved
endif
" Required:
set runtimepath+=/Users/MineDir/.vim/dein/repos/github.com/Shougo/dein.vim
" Required:
call dein#begin('/Users/MineDir/.vim/dein')
" Let dein manage dein
" Required:
call dein#add('Shougo/dein.vim')
" Add or remove your plugins here:
call dein#add('Shougo/neosnippet.vim')
call dein#add('Shougo/neosnippet-snippets')
" You can specify revision/branch/tag.
call dein#add('Shougo/vimshell', { 'rev': '3787e5' })
" Required:
call dein#end()
" Required:
filetype plugin indent on
syntax enable
" If you want to install not installed plugins on startup.
"if dein#check_install()
" call dein#install()
"endif
"End dein Scripts-------------------------
.vimrcに追加してねスクリプトが書かれているので、コピペ。
今回は再インストール直後で.vimrcがない。
というわけで作成。
・・・が、ここで問題発生。
$ cd
$ vi .vimrc
[dein] Does not work in the Vim (703).
[dein] Invalid begin/end block usage.
Press ENTER or type command to continue
え?さっき8.0入れましたけど・・・?
あ・・・
$ vim -h
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Dec 11 2016 18:01:49)
$ vi -h
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Jun 14 2016 16:06:49)
ついクセでviって打ったけど、Macの場合
$ which vim
/usr/local/bin/vim
$ which vi
/usr/bin/vi
$ ls -al /usr/bin/
・・・略
lrwxr-xr-x 1 root wheel 3 10 10 14:14 vi -> vim
lrwxr-xr-x 1 root wheel 3 10 10 14:14 view -> vim
-rwxr-xr-x 1 root wheel 1530064 7 9 12:03 vim
lrwxr-xr-x 1 root wheel 3 10 10 14:14 vimdiff -> vim
・・・略
さっき入れ直したのはvim
viはvimにシンボリックリンクが張られているけど、/usr/bin/vimを参照してる・・・というわけでした。
じゃ、シンボリックリンク張り直せばいーんじゃね?
と安直に思ったわけです・・・
$ sudo ln -nfs /usr/local/bin/vim /usr/bin/vi
ln: /usr/bin/vi: Operation not permitted
sudoつけたのに何でやねん・・・
と思ったら、ElCapitanの罠。SIP。
/usrとか/sbinとか、大事なファイルは上書きさせない・・・ということですか。そうですか。
切る方法が複数のサイトに載ってるんですが、リカバリモードで云々・・・
いや、これだけのために切るのも・・・。
次の策で。
$ vi .bash_profile
alias vi='vim'
alias view='vim'
alias vimdiff='vim'
$ source .bash_profile
これでviを参照してたものは新しいバージョンのvimを参照。
$ vi .vimrc
[dein] Does not work in the Vim (703).
[dein] Invalid begin/end block usage.
Press ENTER or type command to continue
と言われるようになったので最後のif文のコメントアウトを解除して、もう一度
$ vi .vimrc
[dein] Not installed plugins: ['vimshell', 'neosnippet.vim', 'neosnippet-snippets']
[dein] Update started: (2016/12/11 21:02:10)
[dein] (1/3) |vimshell | git clone --recursive https://github.com/Shougo/vimshell.git "/Users/MineDir/.vim/dein/repos/github.com/Shougo/vimshell"
[dein] (1/3) [====== ] vimshell
[dein] (2/3) |neosnippet.vim | git clone --recursive https://github.com/Shougo/neosnippet.vim.git "/Users/MineDir/.vim/dein/repos/github.com/Shougo/neosnippet.vim"
[dein] (2/3) [============= ] neosnippet.vim
[dein] (3/3) |neosnippet-snippets | git clone --recursive https://github.com/Shougo/neosnippet-snippets.git "/Users/MineDir/.vim/dein/repos/github.com/Shougo/neosnippet-snippets"
[dein] (3/3) [====================] neosnippet-snippets
[dein] (1/3) |vimshell | Locked
[dein] (1/3) |vimshell | Updated
[dein] (1/3) -> 3787e52766812d8b99a93ccdda57517bc2a0bab6
[dein] (2/3) |neosnippet.vim | Updated
[dein] (2/3) -> 3929abc3538db6e1b5958acc5f07cdad4345f86d
[dein] (3/3) |neosnippet-snippets | Updated
[dein] (3/3) -> 4431bf176650696d5a8dd93814812afd0d06212c
[dein] Updated plugins:
[dein] vimshell(1 change)
[dein] neosnippet.vim(1 change)
[dein] neosnippet-snippets(1 change)
[dein] Done: (2016/12/11 21:02:20)
Press ENTER or type command to continue
はい。これでデフォルトの設定でdein.vimが入りました。
次は、使いやすい環境にすべくプラグインを追加予定。
Vim の割と新しいおすすめ colorscheme たちを紹介する
Vim (その2) Advent Calendar 2016の12日めの記事です.微妙にパーズの難しいタイトルになってしまいました.
さて皆さん,vim の colorscheme は何をお使いでしょうか.定番は例えば jellybeans, solarized, molokai, gruvbox, hybrid辺りかと思いますが,どれも数年前からの定番ですし,我らが vim advent calendar の歴史を振り返っても,colorscheme の紹介に限って言えば案外記事が多くないのです.
というわけで,ここ2年くらいの間に誕生した colorscheme の中から,個人的な好みに基づいておすすめをいくつか紹介します1.なお筆者は気分によって色々変えますが,結局デフォルトの設定は jellybeans か hybrid に落ち着いています.
romainl/Apprentice
mustang の系譜の sourcerer の流れを汲む scheme です.全体に落ち着いた色調ですが青,黄色,緑が心地良くまとまっており,よく練られた黒背景主流派といった印象.2014年3月とそんなに新しくないし github 上の star も多いので外そうかとも思ったのですがあまり日本で紹介されてない印象だったので採用しました.
jacoborus/tender.vim
これも今回紹介する中では比較的メジャーどころかと思います.全体にパキっとしており,青が冴えていてなかなか格好いい.
reedes/vim-colors-pencil
黒背景にも対応していますが,実力はbg=light
のほうがよく出ると思います.定番の少ない白背景カラースキームの中で屈指の使いやすさ.華やかさと読みやすさのバランスがいいですね.(黒の縁取りは僕のスクリーンショット撮る技術の不足なので許してください)
freeo/vim-kalisi
NeoVimのデフォルト colorscheme をどうするかでわいわいやってた過程で作られたスキームです.元は白背景だけだったのが両対応になりました.シャープな色使いが気持ちいいです.
AlessandroYorba/Alduin
やや暖色寄りの落ち着いた色使いが魅力的です. 全体のバランスもいいし,飽きが来なさそうな感じがあります.
Haron-Prime/Antares
鮮やかめの寒色が盛られた scheme. ちょっとキャンディを思い出します(僕だけかな).パッと見まとまりなく見えたんですが少し使ってると普通に馴染みます.
jeetsukumaran/vim-nefertiti
色調を抑えた渋い colorscheme の中でもかなり完成度が高いもののひとつだと思います.落ち着いた色使いですが読みにくくなく,調和の取れた硬質な感じで実に良い.
KKPMW/moonshine-vim
今日一番おすすめしたいのはこの moonshine. 全体に暖かく柔らかな印象で,秋の丸くて黄色いお月様を思い出します.256 color のみの対応なのが残念ですが(csapprox
の逆って探せば普通にありそうです),ターミナル派の方は是非どうぞ.
環境
Kubuntu 16.04 上のKonsole 15.12.3で動いている vim 8.124 +termguicolors
を使いました.表示してるファイルと設定はgistに上げてあります.また同じ所に今回紹介した colorscheme の一覧も置いたのでとりあえず試すときにお役立てください.フォントはIosevka Slabです.
まとめ
いかがでしょうか.何かひとつでもしっくりくるものがあったら嬉しいです.普段のカラースキームを置き換えるほどでなくても, colors/
に一応入れておこうか,くらいのものもいくつかあると気分が変わっていいものです.
「最近の」colorscheme を紹介するという趣旨のため紹介できなかった個人的にすごく気に入っているものには他にjunegunn/seoul256.vim, thomd/vim-wasabi-colorscheme, 0xcharly/vim-frictionlessなどがあります.また白背景のシンプルな colorscheme をお探しの方には igungor/schellarとかもおすすめしてみたい.newspaperもいいですね.etc...
色々漁って思うのは恐らく究極の colorscheme なんてないということで,気分にもよるし,好みは徐々に変わるし,そもそも順序が入らないし,でもちょっと気になったのを時々試してみるのはすごく楽しいです.皆様にもいい出会いがありますように.
Happy Vimming!
なお, gvim はほとんど使わないのと何故か csapprox があまり好きでなかったので
termguicolors
が入る以前の gui only なスキームはごっそり抜けてると思います.申し訳ない ↩
Vim 8.0 Advent Calendar 12 日目 連番の生成
この記事は Vim 8.0 Advent Calendarの 12 日目の記事です。
Vim で連番と言えば今まででも、マクロを使う方法や Vim script を活用する方法などがありましたが、より手軽な方法が追加されました。
g<C-a>
g<C-x>
コマンド
今まではノーマルモードにて <C-a>
<C-x>
を実行することで、カーソル位置の数値を増減できましたが、ビジュアルモード中でも同様の操作が可能になりました。
加えて、連番を作り出すための g<C-a>
g<C-x>
がビジュアルモードのコマンドに追加されました。
使用例
例えば以下のようなバッファがあった場合:
1
1
1
1
1
2 行目以降をビジュアルモードで選択して、g<C-a>
を実行すると、以下のようになります。
1
2
3
4
5
連番を作ることができました。2 行目以降を選択する点に注意してください。
これは見付かった数値に対して、見付かった順に [見付かった回数×count] 分、数値を足します。
例えば 2g<C-a>
を実行すると、以下のようになります。
1
3
5
7
9
この操作は行指向で、選択範囲の各行で最初に見付かった数値のみを増減させます。また、数値が見付からなかった行はスキップされます。
1. これは 1 つ目の項目です。
1. これは 2 つ目の項目であり、
折り返しが含まれています。
1. この項目にも折り返しが含まれて
います。3 つ目の項目です。
1. 4 つ目の項目です。
このテキストに対して、<C-v>
で 2 行目から最終行まで矩形選択を行い、g<C-a>
を実行すると、以下のようになります。
1. これは 1 つ目の項目です。
2. これは 2 つ目の項目であり、
折り返しが含まれています。
3. この項目にも折り返しが含まれて
います。3 つ目の項目です。
4. 4 つ目の項目です。
数値が存在しない行は飛ばされます。
ここで V
で行単位で選択をしてしまうと、3 つ目の項目の中身が含まれてしまってうまくいかなくなります。
1. これは 1 つ目の項目です。
2. これは 2 つ目の項目であり、
折り返しが含まれています。
3. この項目にも折り返しが含まれて
います。6 つ目の項目です。
5. 4 つ目の項目です。
'nrformats'
オプションに alpha
が含まれていれば、アルファベットの増減も可能です。
a. ...
a. ...
a. ...
a. ...
a. ...
↓
a. ...
b. ...
c. ...
d. ...
e. ...
g<C-x>
は数値を減らす点以外は g<C-a>
と同様に動作します。
ターミナルで Node.js を使った開発をする
Node.js で開発するにあたってのぼくなりの環境を紹介します。
こんな感じ
環境構成
使っているツールは次のとおりです。
- Mac OS X
- Terminal.app
- tmux
- MacVim Kaoriya
- n
- avn-n
各設定はここに放り込んであります。
https://github.com/januswel/dotfiles
tmux
terminal multiplexer というもので ( 略 ) とても便利です。
ローカルで作業するのでセッションとかあんまり恩恵ありません。あ、まちがって Cmd+q
押してターミナルを終了しまったときはとても便利です。
左上
git 操作や各コマンドの実行をするところです。主にプロジェクト開始時にここで作業することが多いですね。次のような npm scripts を定義して適宜叩いたりしています。
{"scripts":{"build":"webpack","build:watch":"webpack --watch",}}
左下
ESLint による静的解析や flow による型チェック、テストを常に流しておく場所です。次のような npm scripts を定義して、大雑把に npm run test --silent
しながら開発します。
{"scripts":{"coverage":"nyc --reporter=lcov npm test","lint":"eslint src test","lint:fix":"eslint src test --fix","test":"npm run lint && npm run type-check && npm run test:spec","test:spec":"mocha test/specs/**/*.js","test:watch":"nodemon --watch src --watch test --exec npm test","type-check":"flow"}}
test:watch
のところに定義してあるように、常にテストを流すために nodemon
が大活躍です。シンプルで使い勝手よい。何か変えたらその結果がみえる。それで十分です。
あ、 ESLint はルールのメンテナンスコストが高いので、プロジェクト初期は standard
でざっとはじめて、いざルール変更が必要になったときに ESLint に切り替える、といったことをしています。
右側
主にエディターを立ち上げて作業するペインとしています。
エディターに関しては現在は WebStorm 、 Atom 、 VSCode など様々な選択肢がありますが「思考のスピードで編集」するため Vim を好んで使っています。あと軽い。
ハイライトは次を使っています。
https://github.com/isRuslan/vim-es6
jsx にも地味に対応しててステキ。インデントがたまにおかしくなることがありますが、 ESLint の --fix
オプションがこれまたステキなのでざくっと書いてフォーマッティングしています。細かいこと気にすんなガハハ。 ESLint の --fix
オプションは gofmt くらいに canonical になればいいなあと思っています。
まとめ
たまに左側もしくは右側の最下段にもう一段もうけてログを流したりしますが、基本は上に書いたとおりです。 UI まわりなどブラウザー・シミュレーター・エミュレーターでの確認が必要なときは別モニターにプレビューをうつしたり、それができないときは雑に gVim で編集しながら微調整します。
各ツールの最新バージョンを使おうと思っていたら自然とこうなっていました。 "Do one thing and one thing well" なものを組み合わせていこう。
Vim と マクロ
この記事は株式会社ネクスト(Lifull) Advent Calendar 2016の12日目です。
この記事の対象とゴール
対象
Vim を使ってるけど マクロ とかいまいち使ってない人、どう使うか迷う人。
ゴール
なんとなくマクロを使っていこうかなという気になる。
注意
なお、この記事はエディタ宗教戦争を助長するものではありません。
わたしとVim
丸5年くらい Vim を使っています。
そこまで長いわけじゃないけど、 Vim は好きです。
2こくらいですが、 プラグインも書いたりしてます。
最近は go で CLIツールを書いたりしているのですが、これも Vim で書いてます。
そんなふうに プログラムを書いているときなど、 Vim のマクロはちょっとした時に便利です。
私の使い方を書こうと思います。
マクロとは
タイプした文字をレジスタ{0-9a-zA-Z"}に記録できます。
詳しくは、
:h complex-repeat
をご覧ください。
効率的に利用する
マクロの開始は q{0-9a-zA-Z"} で実行できますが、押しやすいので qq
をよく使っています。
これを、
a=data['name']b=data['age']aa=data['weight']bb=data['height']
こんな感じにしたいとします。
name=data['name']age=data['age']weight=data['weight']height=data['height']
ハッシュのキーと変数名を揃えたいみたいな感じのときですね。
正直、このケースは以下で置換すれば一発です。
:%s/\v^[^ ]+(.+\['(.+)'\])$/\2\1/g
ただ、そういう場合だけでもないと思うので、今回はマクロを作るバージョンでやってみます。
実際問題、正規表現作るよりもマクロでやってしまったほうが早いケースも多いです。
マクロを作るときに意識していること3つ
A. 行単位の処理を意識する
B. 登録開始直後に最初に決まったポジション(だいたい先頭)に移動するコマンドを入力する
C. 登録終了時は次に処理したい行に移動してから終了する
というところです。
実際に作ってみる
まず、ファイルの始めに行ってからスタートするので、 gg
ですね。
qq
でマクロの登録を開始します。- 上記の B を意識して、
0
で先頭に行きます。(^
でもいいですが、この場合どちらでも構いません、場面によって使い分けて下さい) dt␣
で左辺の文字列を消します。- ハッシュのキーの部分に移動して内容をコピーしたいので、
2t'
で移動、そしてyi'
でヤンクします。 - また
0
で先頭に戻り、P
でペーストします。 - 最後に C を意識して
j
で下の行に移動し、q
を押してマクロの登録を終了します。3@q
で完了です。
デモ
今回はシンプルな例ですが、いろんな発展も上記の、3つを意識すれば使い勝手良く、色々と効率化できると思います。
最後に
ネクストは Vim が好きなエンジニアも好きじゃないエンジニアも募集しています。
明日は リモートワークの話みたいです。
ぼくのかんがえたさいきょうのVim
Vimmerはモテるから、みんなVimmerになろう!
ソースは俺!!(白目
DIVE INTO CODE Advent Calendar 12日目の記事です。
前提
- For Rubyiest
- 俺の方がつよいって方は挑戦受け付けます(訳:アドバイスください。お願いします(切実))
- MacVim 使ってるので、GUIありきの機能が結構あります
- 力尽きて導入方法とか端折ってるんで、リンク先を参照ください。。。
- (コメントいただければ、お答えします)
ソース
https://github.com/mktktmr/vim_config
ディレクトリ構成
$HOME
├ .vimrc # vimのメイン設定ファイル
├ .gvimrc # gvimの設定ファイル
└ .vim/
├ filetype.vim # 拡張子とファイルタイプを紐付ける設定ファイル
├ .backup/ # バックアップファイルの出力先
├ .swap/ # スワップファイルの出力先
├ .undo/ # UNDO履歴ファイルの出力先
├ bundle/ # プラグインの置き場所
└ ftplugin/ # ファイルタイプ毎の設定ファイルの置き場所
.vimrc
こんな感じです。
詳細は後述
"-------------------------------------------------------------------------------
" NeoBundle:
" Note: Skip initialization for vim-tiny or vim-small.
if 0 | endif
if has('vim_starting')
if &compatible
set nocompatible " Be iMproved
endif
" Required:
set runtimepath+=~/.vim/bundle/neobundle.vim/
endif
" Required:
call neobundle#begin(expand('~/.vim/bundle/'))
" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'
" My Bundles here:
" Refer to |:NeoBundle-examples|.
" Note: You don't set neobundle setting in .gvimrc !
" vimgrepの結果から置換
NeoBundle 'thinca/vim-qfreplace'
" previm
NeoBundle 'kannokanno/previm'
NeoBundle 'tyru/open-browser.vim'
" 静的解析
NeoBundle 'scrooloose/syntastic'
" ドキュメント参照
NeoBundle 'thinca/vim-ref'
NeoBundle 'yuku-t/vim-ref-ri'
" メソッド定義元へのジャンプ
NeoBundle 'szw/vim-tags'
" ブロックのendを自動で挿入
NeoBundle 'tpope/vim-endwise'
" ファイルをtree表示
NeoBundle 'scrooloose/nerdtree'
" indent for yaml
NeoBundle 'chase/vim-ansible-yaml'
" Railsプロジェクトのナビゲーション
NeoBundle 'tpope/vim-rails'
" コメントアウト
NeoBundle 'tpope/vim-commentary'
" カラースキーム
NeoBundle 'cocopon/iceberg.vim'
call neobundle#end()
" Required:
filetype plugin indent on
" If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
NeoBundleCheck
"-------------------------------------------------------------------------------
" 編集に関する設定:
" タブの画面上での幅
set tabstop=4
" 自動インデントでずれる幅
set shiftwidth=4
" タブの代わりに空白文字を指定する
set expandtab
" 新しい行のインデントを現在行と同じにする
set autoindent
"-------------------------------------------------------------------------------
" ファイル操作に関する設定:
" バックアップファイル
"" 有効化
set backup
"" 出力先
set backupdir=~/.vim/.backup
" スワップファイル
"" 有効化
set swapfile
"" 出力先
set directory=~/.vim/.swap
" UNDOファイル
"" 有効化
set undofile
"" 出力先
set undodir=~/.vim/.undo
"-------------------------------------------------------------------------------
" 表示に関する設定:
" 行番号の表示
se nu
" 全角スペースの表示:
function! ZenkakuSpace()
highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=darkgray
endfunction
if has('syntax')
augroup ZenkakuSpace
autocmd!
autocmd ColorScheme * call ZenkakuSpace()
autocmd VimEnter,WinEnter,BufRead * let w:m1=matchadd('ZenkakuSpace', ' ')
augroup END
call ZenkakuSpace()
endif
"-------------------------------------------------------------------------------
" NERDTree:
" .ファイルの表示(1: 表示)
let NERDTreeShowHidden=1
" ブックマークを表示 (1:表示)
let g:NERDTreeShowBookmarks=1
" 引数なしで起動した場合、NERDTreeを開く
" autocmd vimenter * if !argc() | NERDTree | endif
" 表示・非表示切り替え
nmap <silent> <C-n><C-t> :NERDTreeToggle<CR>
"-------------------------------------------------------------------------------
" Previm:
let g:previm_open_cmd = 'open -a FirefoxDeveloperEdition'
augroup PrevimSettings
autocmd!
autocmd BufNewFile,BufRead *.{md,mdwn,mkd,mkdn,mark*} set filetype=markdown
augroup END
"-------------------------------------------------------------------------------
" rubocop:
" syntastic_mode_mapをactiveにするとバッファ保存時にsyntasticが走る
" active_filetypesに、保存時に syntastic を走らせるファイルタイプを指定する
let g:syntastic_mode_map = { 'mode': 'passive', 'active_filetypes': ['ruby'] }
let g:syntastic_ruby_checkers = ['rubocop']
"-------------------------------------------------------------------------------
" refe:
let g:ref_refe_cmd = $HOME.'/.rbenv/shims/refe' "refeコマンドのパス
"-------------------------------------------------------------------------------
" map:
" 検索結果のハイライトをEsc連打でクリアする
nnoremap <ESC><ESC> :nohlsearch<CR>
" 常にvery magicを利用
nnoremap / /\v
" タブ移動
nnoremap [t :tabprevious<CR>
nnoremap ]t :tabnext<CR>
" :ls + :buffer
cnoremap bb ls<CR>:buf
" 開いてるファイルのパスを表示 (Show Path)
cnoremap sp echo expand("%:p")<CR>
" 現在日時を入力 (yyyy/MM/dd)
cnoremap date <ESC>a<C-r>=strftime("%Y/%m/%d")<CR><ESC>
" 現在日時を入力 (yyyy/MM/dd hh:mm:ss)
cnoremap datetime <ESC>a<C-r>=strftime("%Y/%m/%d %H:%M:%S")<CR><ESC>
"-------------------------------------------------------------------------------
" その他設定:
" not ignore case.
se noic
" スペルチェック
set spell
set spelllang=en,cjk
" matchit.vim
runtime macros/matchit.vim
" color
colorscheme iceberg
NeoBundle について
https://github.com/Shougo/neobundle.vim
NeoBundleは Vim のプラグインを管理するためのツールです。
.vimrc
の、1行目から NeoBundleCheck
までは この NeoBundle の設定とインストールするプラグインを定義しています。
Dein.vimに移行しないとな。。。(遠い目
プラグインについて
thinca/vim-qfreplace
vimgrep
の検索結果に対して一括して置き換えを行うことができるプラグイン。
kannokanno/previm
http://kannokanno.hatenablog.com/entry/2013/06/11/225806
マークダウンのプレビュー表示を行うプラグイン。
tyru/open-browser.vim
上記のPrevimが依存しているプラグイン。
scrooloose/syntastic
ソースの静的解析を行ってくれるプラグイン。
rubocop
などと組み合わせて利用する。
今回の設定だと、バッファの保存時に静的解析が走るようになっている。
thinca/vim-ref
rubyの1リファレンスをvimから開くことができるようにしてくれるプラグイン。
調べたいメソッドやクラス名などにカーソルが当たっている状態で Shift + k
で、そのリファレンスが開けます。
また、 Ref refe {調べたいメソッド名やクラス名}
でも、検索できます。
http://qiita.com/c8112002/items/85a2c2cc3721c79a5322
szw/vim-tags
タグの生成やキーバインドの設定など、タグジャンプ機能の補助してくれる。
http://to-developer.com/blog/?p=1425
tpope/vim-endwise
class
とか def
とかの end
を自動挿入してくれるプラグイン。
地味だけど超便利。
scrooloose/nerdtree
https://kamiya555.github.io/2015/10/14/nerdtree-command/
IDE とか でお馴染みのサイドメニュー的なファイルエクスプローラ。
ブックマーク機能が便利。
chase/vim-ansible-yaml
vim 標準の yaml のシンタックスハイライトやインデント制御が残念なので、このプラグインでいい感じにする。
tpope/vim-commentary
https://github.com/tpope/vim-commentary
コメントアウト・非コメントアウトが簡単に行えるようになる。
cocopon/iceberg.vim
vimのシンタックスハイライトなどの色の設定です。
私のお気に入りは icebergです。
モテるVimmerはカラースキームにこだわるんだぜ!
編集に関する設定
タブキーで半角スペースを入れるようにしたり、その際、スペースがいくつ入るのかなどの設定。
"-------------------------------------------------------------------------------
" 編集に関する設定:
" タブの画面上での幅
set tabstop=4
" 自動インデントでずれる幅
set shiftwidth=4
" タブの代わりに空白文字を指定する
set expandtab
" 新しい行のインデントを現在行と同じにする
set autoindent
ファイル操作に関する設定
ファイルのバックアップなどの設定
"-------------------------------------------------------------------------------
" ファイル操作に関する設定:
" バックアップファイル
"" 有効化
set backup
"" 出力先
set backupdir=~/.vim/.backup
" スワップファイル
"" 有効化
set swapfile
"" 出力先
set directory=~/.vim/.swap
" UNDOファイル
"" 有効化
set undofile
"" 出力先
set undodir=~/.vim/.undo
- バックアップファイル
- => 編集前のファイルを自動的にバックアップする。ファイルを誤って削除したり、誤った編集をしてしまっても、1つ前のバージョンであれば救出が可能になる
- スワップファイル
- => Vimが異常終了などして保存ができなかった際、データを復元するためのファイル
- UNDOファイル
- => Undo履歴が保存されている。このファイルがあると、ファイルを閉じた後でも、閉じる前のUndoを再現できる。
表示に関する設定
"-------------------------------------------------------------------------------
" 表示に関する設定:
" 行番号の表示
se nu
" 全角スペースの表示:
function! ZenkakuSpace()
highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=darkgray
endfunction
if has('syntax')
augroup ZenkakuSpace
autocmd!
autocmd ColorScheme * call ZenkakuSpace()
autocmd VimEnter,WinEnter,BufRead * let w:m1=matchadd('ZenkakuSpace', ' ')
augroup END
call ZenkakuSpace()
endif
全角スペースの表示
全角スペースの強調表示するための関数の定義と呼び出し
NERDTree
"-------------------------------------------------------------------------------
" NERDTree:
" .ファイルの表示(1: 表示)
let NERDTreeShowHidden=1
" ブックマークを表示 (1:表示)
let g:NERDTreeShowBookmarks=1
" 引数なしで起動した場合、NERDTreeを開く
" autocmd vimenter * if !argc() | NERDTree | endif
" 表示・非表示切り替え
nmap <silent> <C-n><C-t> :NERDTreeToggle<CR>
Previm
以下の設定では、Firefox のディベロッパー版で開くようになってます。
"-------------------------------------------------------------------------------
" Previm:
let g:previm_open_cmd = 'open -a FirefoxDeveloperEdition'
augroup PrevimSettings
autocmd!
autocmd BufNewFile,BufRead *.{md,mdwn,mkd,mkdn,mark*} set filetype=markdown
augroup END
rubocop
Rubyの静的解析ツール rubocop
巡査の設定。
"-------------------------------------------------------------------------------
" rubocop:
" syntastic_mode_mapをactiveにするとバッファ保存時にsyntasticが走る
" active_filetypesに、保存時に syntastic を走らせるファイルタイプを指定する
let g:syntastic_mode_map = { 'mode': 'passive', 'active_filetypes': ['ruby'] }
let g:syntastic_ruby_checkers = ['rubocop']
refe
Rubyのリファレンスツール refe
の設定。
"-------------------------------------------------------------------------------
" refe:
let g:ref_refe_cmd = $HOME.'/.rbenv/shims/refe' "refeコマンドのパス
キーバインドの設定
ショートカットやちょっとしたスクリプトのキーバインドを設定。
"-------------------------------------------------------------------------------
" map:
" 検索結果のハイライトをEsc連打でクリアする
nnoremap <ESC><ESC> :nohlsearch<CR>
" 常にvery magicを利用
nnoremap / /\v
" タブ移動
nnoremap [t :tabprevious<CR>
nnoremap ]t :tabnext<CR>
" :ls + :buffer
cnoremap bb ls<CR>:buf
" 開いてるファイルのパスを表示 (Show Path)
cnoremap sp echo expand("%:p")<CR>
" 現在日時を入力 (yyyy/MM/dd)
cnoremap date <ESC>a<C-r>=strftime("%Y/%m/%d")<CR><ESC>
" 現在日時を入力 (yyyy/MM/dd hh:mm:ss)
cnoremap datetime <ESC>a<C-r>=strftime("%Y/%m/%d %H:%M:%S")<CR><ESC>
その他
"-------------------------------------------------------------------------------
" その他設定:
" not ignore case.
se noic
" スペルチェック
set spell
set spelllang=en,cjk
" matchit.vim
runtime macros/matchit.vim
" color
colorscheme iceberg
以下の設定をしています。
- 大文字/小文字の区別
- スペルチェック機能の有効化
- matchit2の有効化
- 前述のカラースキームの有効化
スペルチェックの様子
スペルエラーの警告の他にも修正案の提示や、適用、例外単語の追加などもできます!
http://d.hatena.ne.jp/h1mesuke/20100803/p1
.gvimrc
MacVim 用の設定ファイル。
主に見た目に関わること。
透過設定とかしてあげると最高にクールになるぜ!
$$\style{color:red;}{\text{※ デスクトップが汚いことがバレます!}}$$
filetype.vim
ファイル名とファイルタイプの紐付けを行う。
vimのデフォルトでは定義されていない拡張子のファイルとかをここで定義してあげる。
下記の例では、yamlファイルに対して、プラグインで定義された ansible
というファイルタイプを割り当てている。
augroup filetypedetect
au BufRead,BufNewFile *.yaml setfiletype ansible
au BufRead,BufNewFile *.yml setfiletype ansible
augroup END
モテるVimmerになるにはまだまだ先は長い。。。
私は Vim を使い始めてから1年も経ってないビギナーなので、ぜひ本物のVimmerの方から「こんな便利なプラグインあるよ」とか、「そのキーバインドダメじゃね?」とかご意見いただけると嬉しいです。
また、この記事をきっかけに「Vim使ってみようかな」とかいう方が増えればいいなと思います。
最後に、本気でVimmer目指される方は、入門書として『実践Vim 思考のスピードで編集しよう!』をお勧めします!
Vim で以下に効率よくコーディングできるかや、Vimの苦手なこと(日本語入力とか)がよく分かります。
vim: 今いるカーソルが指している単語をファイル内で一括検索(ハイライト)
Vim歴2年の自分の成長止まりを憂う
vim使い始めて2年くらい経つけど、結構クセついてきてしまいたまに焦りがきます。
例えば、diw
-> i
とやり慣れてる人が、 ciw
に移行するのって意識して努力しないと変わらない。
以下は、僕自身が習得しなければならない、より便利な機能をリスト化してみました。結構前にまとめたので、もう改善済みのも結構ある。
とりあえず、最近vim使えてきたな〜って人は、t/f
,T/F
の高速移動やText Objectを覚えると、さらに1.1倍くらい楽しくなります。
Keys
key | action |
---|---|
Ctrl + j,k,h,l | インサートモード中に移動 |
ca" | "ごと"内を削除 |
ge | 前の単語の末尾に移動 |
S | 現在の行を消してインサートモード |
s | カーソル下の一文字を消してインサートモード |
C | カーソルより右を消してインサートモード |
ZZ | :wqと同じ |
dG | 現在行以下をすべて削除 |
Ctrl + p | インサートモード時に前方単語補完 |
Ctrl + n | インサートモード時に後方単語補完 |
:r! + CMD | コマンド実行結果を貼り付け |
gJ | スペースを含まず行結合 |
5J | 現在行以下5行を一括行結合 |
]m | 次のメソッドの始めに移動 |
]M | 次のメソッドの終わりに移動 |
[m | 前のメソッドの始めに移動 |
]M | 前のメソッドの終わりに移動 |
{ | 前の空行へ移動 |
} | 次の空行へ移動 |
% | 対応する括弧や予約語に移動 |
* | カーソル下の単語を後方検索 |
# | カーソル下の単語を前方検索 |
g* | カーソル下の単語を後方部分検索 |
g# | カーソル下の単語を後方部分検索 |
+ | 下の行頭に移動 |
- | 上の行頭に移動 |
g; | 直前の変更箇所に戻る |
g, | 直前の変更箇所に進む |
:noh | 検索結果のハイライトを解除 |
W,B,E,gE | |
q + 文字 | レコード開始(qで終了) |
@ + 文字 | レコード再生 |
q: | コマンド履歴を表示 |
q/, q? | 検索履歴を表示 |
gg=G | 全行インデント(V+G+=と動きは同じ) |
R | 上書きモード |
Ctrl + [ | コマンドモードに戻る(=esc) |
Ctrl + z | 一時停止(vim で戻る) |
yy5p | 行をコピーし、下に5行分ペースト |
gv | 直前の選択を再選択 |
ma | マークaをつける |
`a | マークaに移動 |
'a | マークaのある行の先頭に移動 |
y`a | 現在のカーソル位置からマークaまでをコピー |
v`a | 現在のカーソル位置からマークaまでを選択 |
:marks | マーク一覧を表示 |
"ayy | レジスタaにコピー(aをAにすると現在保持しているテキストの末尾に追加される) |
"ap | レジスタaをペースト |
:reg | レジスタ一覧を表示 |
:reg a b | レジスタa,bを表示 |
@: | 直前に実行したコマンドを実行 |
:g/^$/d | 空行削除 |
u | 小文字に変換 |
U | 大文字に変換 |
~ | 小文字は大文字に、大文字は小文字に変換 |
gQ | Exモード(連続でコマンドを使用できる) |
:e | ファイルを開く |
:r | ファイルを読み込み現在編集中のファイルにペースト |
gt | 次のタブに切替 |
gT | 前のタブに切替 |
Text Object
d
やc
と組み合わせて使用する。
key | action |
---|---|
iw | 単語(以降iの部分はaでも代用可能) |
iW | 単語(空白含む) |
is | 文 |
it | タグ |
i] | 括弧("",'',(),<>,{})なども対応可能) |
以上。
他におすすめあったら是非教えて欲しいです!
以下は、おまけ。
vimの標準ファイルツリー。
netrw.vim
Vimの便利なファイルブラウザ。
Keys
key | action |
---|---|
:h netrw | 使い方をみる |
:Explore(Ex)[!] [dir] | カレントファイルのディレクトリを開く。:e . でも同じ。 |
:Hexplore[!] [dir] | 水平分割 & Explore |
:Nexplore[!] [dir] | 垂直分割 & Explore |
:Pexplore[!] [dir] | 垂直分割 & Explore |
:Rexplore | Explorer に戻る |
:Sexplore[!] [dir] | ウィンドウ分割 & Explore |
:Texplore[!] [dir] | タブ & Explore |
:Vexplore[!] [dir] | 垂直分割 & Explore |
i | 表示方法を切り替える (thin, long, wide, tree) |
s | ソート方法を変える: name, time, file size |
r | ソート順を逆にする |
a | 隠しファイルの表示を切り替える |
gh | ドットファイルの表示/非表示を切り替える |
p | ファイルをプレビューする |
qf | ファイル情報を表示する |
- | 一つ上のディレクトリに移動する |
u | 最近訪れたディレクトリに移動する(undo的な) |
U | 次に訪れたディレクトリに移動する(redo的な) |
t | カーソル位置のファイル/ディレクトリを新しいタブで開く |
o | カーソル位置のファイル/ディレクトリを新しいウィンドウで開く。水平分割。 |
v | カーソル位置のファイル/ディレクトリを新しいウィンドウで開く。垂直分割。 |
gt | 次のタブに切替 |
gT | 前のタブに切替 |
P | 直前に使用していたウィンドウで開く |
d | ディレクトリを作成する |
D | ファイル/ディレクトリ(複数可)を削除する(マークしたファイルがある場合には、マークしたファイルを削除) |
R | ファイル/ディレクトリ(複数可)の名前を変える |
mf | ファイルをマーク/アンマークする |
md | マークしたファイルの差分を表示する (3ファイルまで) |
mz | マークしたファイルを圧縮/伸長する |
mr | シェル形式正規表現 (regexp) でファイルをマークする |
mt | 表示中のディレクトリをターゲットディレクトリにする |
mc | マークしたファイルをターゲットディレクトリにコピー |
mm | マークしたファイルをターゲットディレクトリに移動 |
mv | マークしたファイルに対して任意のVimコマンドを実行 |
mx | マークしたファイルに対して任意のシェルコマンドを実行 |
mX | マークしたファイルに対して任意のシェルコマンドを一括実行 |
mu | すべてのマークを解除する |
mb | カレントディレクトリをブックマークする |
qb | ブックマークと履歴の一覧を表示する |
gb | 前のブックマークされたディレクトリに移動 |
女子受けバツグン必殺Vimカラースキームを自作しよう
【前置き】カノジョを作る作戦を立てよう
今年もカノジョができなかった @yamasy1549です
さてエンジニアという職業ですが、一般の方々に印象を聞くと「ずっとPCに向かってる」「話しかけづらい」「黒い画面に吸い込まれそう」と言われ[要出典]、実際黙々とコードを書くだけだと人間関係が希薄になりやすいです[要出典]。関わる人間の数が圧倒的に少ないのではカノジョができなくても仕方ないし、そんな中でカノジョを作ろうと思ったらもう狙いの精度を上げるしかありません。今回は「それとなく自分の趣味を明らかにし、同じ趣味の人に気づいてもらう」ことで精度向上を図る作戦を考えましょう。
作戦
おもむろにVimを立ち上げます。
カノジョできてるエンジニアとカノジョできないエンジニアの何が違うのか、それは普段使っているエディタに表れているに違いない、と思い簡単な調査をしました。
僕がVimユーザーなのでVimに絞って聞いてみましたが、2つの結果は大して変わりませんでした。
しかしこれは有用な結果です。みんな似たようなものを使っているなら、ここで自分の個性をアピールすればきっと誰かが自分の存在に気づいてくれるはずです。
前置きが長かったですが、自分の趣味をアピールできるようなVimカラースキームを作っていきましょう。
【本題】Vimカラースキームを作ろう
構成を知ろう
一から書くのはしんどいので、既存のカラースキームを上書きしていくのがラクで良いです。
今回は icebergというカラースキームを参考にしました。
諸々の設定
setbackground=darksetbackground=light
カラースキームの背景を設定します。
icebergのようにどちらかの色使いのみ対応するなら、カラースキーム側にどちらかを書いておきます。両対応にするなら、カラースキーム側でdark向けの色使いとlight向けの色使いを振り分けることができます(例 : solarized)。
if exists("syntax_on")syntax reset
endifhi clear
" orhighlight clear
すべてのハイライト設定を一旦クリアします。
Highlight command
:help highlight
で詳細を確認できます。
highlight {group-name} {key}={arg}
よく使うのが上の形です。
group-name
:help group-name
で詳細を確認できます。
{group-name}
として以下が使えます。
group-name | 意味 | 例 | |
---|---|---|---|
* | Comment | コメント | |
Constant | 定数 | ||
String | "" で囲まれるような文字列定数 | "this is a string" | |
Character | '' で囲まれるような一文字の定数 | 'c' '\n' | |
Number | 数字定数 | 234 0xff | |
Boolean | ブール定数 | TRUE false | |
Float | 浮動小数点定数 | 2.3e10 | |
* | Identifier | 識別子 | |
Function | 関数名(クラスメソッドなども) | ||
* | Statement | 命令文 | |
Conditional | 条件 | if then else endif switch | |
Repeat | 繰り返し | for do while | |
Label | ラベル | case default | |
Operator | 演算子 | sizeof + * | |
Keyword | その他のキーワード | ||
Exception | 例外 | try catch throw | |
* | PreProc | 一般的なプリプロセッサ | |
Include | #include | ||
Define | #define | ||
Macro | Define と同じ | ||
PreCondit | #if #else #endif | ||
* | Type | int long char | |
StorageClass | static register volatile | ||
Structure | struct union enum | ||
Typedef | typedef 宣言 | ||
* | Special | 特殊なシンボル | |
SpecialChar | 特殊な文字定数 | ||
Tag | CTRL-] で宣言元にジャンプできる | ||
Delimiter | 注意が必要な文字 | ||
SpecialComment | コメント内での特記事項 | ||
Debug | デバッグ命令 | ||
* | Underlined | 目立つ文、HTMLリンク | |
* | Ignore | 空白、見えない | |
* | Error | エラーなど間違った構造 | |
* | Todo | 特別注意の必要なもの | TODO FIXME and XXX |
*
マークの付いているものは親、付いていないものは子として扱われます。
例えば
highlight Comment ctermfg=15" CUIでの Comment group の文字色を灰色(15)にする
とすると、Constant
String
Character
Number
Boolean
Boolean
も自動的に灰色になります。
highlight-groups
:help highlight-groups
で詳細を確認できます。
{group-name}
として以下が使えます。
group-name | 意味 | 例 |
---|---|---|
ColorColumn | set colorcolumn で設定された場所の文字 | 行のn文字目以降に色を付ける |
Conceal | 代替テキスト | 長い文字を短い文字で置き換えて表示する |
Cursor | カーソルのある文字 | |
CursorIM | IMEモードでの Cursor | |
CursorColumn | set cursorcolumn されているときのカーソルのある文字の桁(縦方向) | |
CursorLine | set cursorline されているときのカーソルのある文字の行(横方向) | |
Directory | ディレクトリ名・特別な名前 | |
DiffAdd | 差分モードでの追加された行 | |
DiffChange | 差分モードでの変更された行 | |
DiffDelete | 差分モードでの削除された行 | |
DiffText | 差分モードでの変更されたテキスト | |
EndOfBuffer | バッファ中で最終行以降の残りのスペースを埋める行 | '~' を無効にする |
ErrorMsg | コマンドライン上でのエラーメッセージ | |
VertSplit | ウィンドウを垂直分割したときの区切り行 | |
Folded | 折りたたまれた行 | |
FoldColumn | 折りたたみがあることを表示する列 | |
SignColumn | sign(目印)を表示する列 | |
IncSearch | insearch のハイライト | |
LineNr | :number :# コマンドの行番号 | |
CursorLineNr | set cursorline か set relativenumber されているときの現在行の行番号 | |
MatchParen | カーソル下(または直後)の括弧とそれに対応する括弧 | |
ModeMsg | showmode のメッセージ | |
MoreMsg | more-prompt のメッセージ | |
NonText | ウィンドウ端の @ や showbrake で設定されたような、実際のテキストには存在しない文字 | |
Normal | 普通のテキスト | |
Pmenu | ポップアップメニューでの普通の項目 | |
PmenuSel | ポップアップメニューでの選択された項目 | |
PmenuSbar | ポップアップメニューでのスクロールバー | |
PmenuThumb | ポップアップメニューでのスクロールバーのツマミ | |
Question | hit-enter プロンプトと yes/no | |
Search | 最後に検索した単語のハイライト | |
SpecialKey | メタキーなど | |
SpellBad | スペルチェッカーに認識されない単語 | |
SpellCap | 大文字で始まるべき単語 | |
SpellLocal | スペルチェッカーが他の地域で使われると認識する単語 | |
SpellRare | スペルチェッカーによって殆ど使われないと認識される単語 | |
StatusLine | カレントウィンドウのステータスライン | |
StatusLineNC | カレントウィンドウでないウィンドウのステータスライン | |
TabLine | タブページ行のアクティブでないページのラベル | |
TabLineFill | タブページ行のラベルがないところ | |
TabLineSel | タブページ行のアクティブなページのラベル | |
Title | :set all autocmd などの出力タイトル | |
Visual | ビジュアルモード選択 | |
VisualNOS | "Not Owning the Selection" のときのビジュアルモード選択 | |
WarningMsg | 警告 | |
WildMenu | windmenu の補完での現在の候補 |
highlight-args
:help highlight-args
で詳細を確認できます。
カラー端末用には cterm*={arg}
、そうでない端末用には term*={arg}
、gVimなど用には gui={arg}
を使います。
{key}={arg} | 意味 | args |
---|---|---|
cterm={arg} | 文字のスタイル | bold underline undercurl reverse inverse italic standout NONE |
ctermbg={arg} | 文字の背景色 | 色番号 |
ctermfg={arg} | 文字の色 | 色番号 |
cterm*={arg}
では16進数での色指定ができないので、色番号で指定する必要があります。
参考 : ターミナルで使える色と色番号を一覧にする
書いてみよう
上で紹介したものは設定のほんの一部ですが、数カ所色を変えるだけでも見た目がかなり変わります。
矢澤にこさんを見ながら作るとこうなる
絢瀬絵里さんを見ながら作るとこうなる
Vim上で
:so $VIMRUNTIME/syntax/hitest.vim
と叩いてしばらく待つと、どのエイリアスがどの色を表示しているかを確認できるので便利です。
もっとできること
- 色番号の変数管理
dark
light
での色使いの振り分けgui
cterm
両対応- などなど…
まとめ
僕の例はかなり下手ですが、こんな感じで自分の好きなキャラの色をベースにカラースキームを作るといつか誰かに「◯◯さんのエディタってエリチ仕様ですよね!」って気づいてもらえ…たらいいんじゃないかなぁ…
来年は「カノジョできてるエンジニア Advent Calendar」のほうでお会いできるようお祈りしています Enjoy Vim life!
参考
- Vimカラースキームの作り方
- 既存のカラースキーム
- Vim
- その他
僕のお気に入りのカラースキームはhybridです。