Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all 5720 articles
Browse latest View live

Vim | 正規表現でプラス ( + ) が使えない ( クエスチョンマーク、パイプ、アンド、ブレース、丸カッコも )

$
0
0

解決

プラス (+ ) を バックスラッシュ ( \ ) でエスケープしよう。

Bの連続を置換する場合の例。

image

image

問題

正規表現の +が使えない。

image

image

備考

  • クエスチョン ( ? ) パイプ ( | ) アンド ( & ) ブレース ( { ) 丸カッコ ( () )もエスケープする必要がある。

環境

  • Vim 7.3

参考

+, ?, |, &, {, (, and ) must be escaped to use their special function.


vim-jp/vimdoc-jaにコントリビューションした話

$
0
0

この記事は Vim Advent Calendar 2016 9日目の記事です。
vim-jp organization

この記事で言いたいこと

以上です。以下はどうして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.とマーク・ザッカーバーグ氏も言ってますしね。
(実際にはフルボッコなんてもちろんないですよ!)

終わりに

  • 翻訳作業にぜひ参加を!
    • 「どこから手をつけたらいいかわからない」という方は IssuesProjectsに上がっているところから手を付けていくのがいいかも。
    • 2016/12/09現在だと、eval.jax の未訳文を翻訳する・Issue #48が進行中なので、少しずつ手を広げていくのがいいかも。

Vim 8.0 Advent Calendar 9 日目 2 進数のサポート

$
0
0

この記事は 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が追加されました。
これはデフォルトで含まれているため、特に設定せずに利用可能です。
0b0Bで始まる 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の連携

$
0
0

この記事では、PPxからVimで選択ファイルを開いたり、Vimで開いているファイルパスへPPxでジャンプさせたりする方法を紹介します。
なお、記事中のデモ等ではGVimを使ってますが、Vimでも動作します。

PPxからVimで選択ファイルを開く

Vimを起動する際、起動オプションにファイルパスを渡せばそのファイルを開いた状態で起動できます。

Vimの起動オプションにファイルパスを渡す(シンプル版)

一番簡単な方法が、恐らく次のような設定になるかと思います。
※「%'vim'」はVimへのフルパスが書かれたエイリアスです

PPx.CFG(Vimで開く)
KC_main = { ; PPcメイン窓
\E  ,  %Ob %'vim' %FCD
}

これでも開く事はできますが、ここではgrep -nの検索結果にも対応してみようと思います。

Vimの起動オプションにファイルパスを渡す(grep -n対応版)

次のようなファイルがあるとします、これらにはいくらかのソースコードが書かれています。

.
|-- foo.cpp
`-- foo.h

これらのファイルから「grep -n 'foo'」で検索すると、次のような結果になります。1
vim.png

ここで、3つ目の検索結果は「foo.h」ファイルの「2行目」を指しています、Vimの起動引数にこれらを渡せれば、目的のファイルを開く際にカーソルを指定行へ移動できます。

# Vimでfoo.hを開いて2行目にカーソル移動
$ vim.exe +2 foo.h

※画像はgvimです
vim_open.png

ここでは「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.gif

Vimで開いているファイルパスでPPxへジャンプできています、ちなみに「:ppx」で関数Open_ppx()を呼び出し、その関数内でvimprocを使ってファイルパスへジャンプするコマンドを実行しています。

ツール構成

Vim

コマンドをバックグラウンド動作をさせる為にShougo/vimproc経由で実行しています。
PPxへのパスを各自の環境に合わせて下さい、実行方法もカスタマイズできます。

.vimrc
" 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

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として開く起動オプションです、スクリプトのパスと共に各自の環境に合わせて下さい。

※自身の設定が消えないように、適用前にバックアップを取るか、追加取り込みをしてください
※スクリプトのパスは自身の環境へと合わせて下さい

PPx.CFG
KC_main = { ; PPcメイン窓
\E  ,*set VIM_ARGS=%*script(%0\script\entry2vimargs.js, "%FCD")
    %Ob %'gvim' --remote-tab-silent %'VIM_ARGS'
}

おわりに

今回の連携ですが、他のエディタでも起動オプションに行番号が渡せたり、マクロ機能があれば乗り換える事ができます。
一例ですが、notepad++やサクラエディタなどでも可能な連携です。


  1. 検索結果をエントリーに表示する方法は6日目「Paper Plane xUI(PPx)からエントリーへのgrep」 

あなたがサイヤ人の時、Vimはスーパーサイヤエディタになる

$
0
0

人はスーパーサイヤ人に憧れるものです、しかし現実ではなれる人は限られています、日夜修行していつかスーパーサイヤ人になれる日を夢見るのもいいですが、ここでは変わりにVimにスーパーサイヤエディタになってもらいます。

そんなプラグインを作りました。

kuririn-no-kotoka.vim

image.png

wordijp/kuririn-no-kotoka.vim(GitHub)
インストール方法や使い方はREADME.mdに記載しています。
※動作確認はWindowsのみで行っているため、Linunx/Macでの確認ができていません

デモ

このプラグインはこちらの動画(Youtube)を見ながら作成しています。

あなたがサイヤ人ならクリリンを殺された怒りでVimがスーパーサイヤエディタへと覚醒します
demo.gif
デモでは音が出ませんが、シュインシュインの効果音も出ています。

あなたがへたれ王子なら恐怖のあまりガタガタ震えます
demo_prince.gif

苦労した点

スーパーサイヤ人らしさ

特徴といえば「逆立った髪」「金色のエフェクト」「シュインシュイン」だと思います。
このうち、「逆立った髪」はエディタで何が逆立つのか分からなかったので却下、「金色のエフェクト」はカラースキームをリアルタイムに変更しようとしたら編集に支障が出るレベルで遅いので却下。
最終的に、金色っぽいカラースキームに変更後、「シュインシュイン」だけ発生させてスーパーサイヤエディタっぽくするようにしました、見辛くてもいけないのでカラースキームも「golden.vim」という名前が金色なもので妥協しました。

技術的な話

以下は今回のプラグインを作成した際の技術的な話です、読み飛ばしてもらっても構いません。

利用したVim8の新機能

exepath

あなたがサイヤ人か、はたまたへたれ王子なのかの判定に利用しています。
それぞれの専用ディレクトリへパスを通したあと、ユーザー名コマンドを作成し、exepathで取得したフルパスに「saiyajin」か「prince」が含まれているかで判定しています。

kuririn-no-kotoka.vim
`-- autoload
    |-- kuririn_no_kotoka.vim # princeとsaiyajinへパスを通す
    |-- prince
    `-- saiyajin
        `-- wordi             # 作成されたユーザー名コマンド

タイマー(Timer)

タイマーはアニメーション処理で利用しています、Vimがスーパーサイヤエディタになるには、いくつかの過程を経る必要があるため、それらをアニメーションで処理しています。

アニメーション処理用の関数はこちらです

kuririno_no_kotoka.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パターン(のようなもの)で実装しています。
※解説用にシンプルにしています。

regist_animateの利用サンプル
" 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 に追加された機能

$
0
0

この記事は 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 でファイル名にコロンが含まれる場合に保存ができない (未解決)

$
0
0

解決には至っていないが、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 系の設定ファイルを疑う

おそらく保存まわりの追加処理に副作用が生じているのだろう。autocmdBufWrite系イベントを探る。

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

どう解決するか (未処理)

  1. vim-metarwの問題の箇所を修正
  2. そもそも vim-metarwvim-metarw-redmineでしか使っていない(たぶん)
    • 無効化してもたいして困らない(はず)
    • NeoBundle の遅延読込等で vim-metarw-redmineを常時有効にさせず、副作用を限定的にする

vim-metarw自体メンテナンスされていないかも

vimでsudoを忘れてreadonlyで編集してしまった場合

$
0
0

w !sudo tee%
w : ファイルの保存
!sudo tee : ! にて コマンド「sudo tee」を指示
% : 現在開いているファイル
⇒ 現在開いているファイルに対して、tee コマンドで強制的に上書きすることになります。

q!

http://tm.root-n.com/unix:command:vim:readlonly_write


Vim 8.0 Advent Calendar 11 日目 タイムスタンプで管理されるようになった viminfo ファイル

$
0
0

この記事は Vim 8.0 Advent Calendarの 11 日目の記事です。

今回は、ユーザーの作業が記録されている viminfo ファイルについてです。

viminfo ファイルの概要

viminfo ファイルは、ユーザーが行った様々な操作を記録しておくファイルです。例えば、レジスタの内容、コマンドラインの履歴、検索文字列の履歴や、ジャンプリストなど、様々な情報が記録されます。これらをファイルに記録することで、次回 Vim を使った際にも、前回の履歴を引き継いで使うことができます。
viminfo ファイルは、基本的には起動時に読み込まれ、終了時にファイルに書き出されます。

viminfo ファイルのマージ

1 つの viminfo ファイルを複数の Vim のセッションで使った場合、viminfo ファイルはマージされます。

どのようにマージが起きるか、例を挙げます。
同時に 2 つの Vim を立ち上げて、それぞれ A B とします。起動時には viminfo は空で、どちらも最初は履歴がありません。
この時、

  1. A で Ex コマンド :echo 1を実行
  2. B で Ex コマンド :echo 2を実行
  3. A で Ex コマンド :echo 3を実行
  4. B で Ex コマンド :echo 4を実行
  5. B を終了
  6. 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機能のバグ修正を追ってみた

$
0
0

はじめに

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でコメントアウト、アンコメントを楽にする

$
0
0

プログラミングしてたら絶対にやるコメントアウト、アンコメント。
それを色々と楽にしてくれるvimのプラグインの紹介です。

プラグインの特徴

コメントの状態(コメントアウト、アンコメント)を切り替えるコマンドや、
行末にコメントの挿入といったコマンドなど、コメントアウト関係のコマンドを提供してくれるプラグインです。

またファイルタイプを見ているため、PHPなら//、htmlなら<!-- -->といった具合に
言語仕様に合わせた適切なコメントアウトを挿入してくれます。

コマンド

多数のコマンドが提供されているが、便利なもの、特徴的なものを抜粋。全てのコマンドはこちらから。

コメントの状態を切り替える <leader>c<space>

カーソル位置の行、選択している場合は選択行のコメントの状態を切り替える。
選択行の1行目を見て、コメントされていない行なら全てコメントアウト、
コメントされている行なら全てアンコメントを行う。

NERDComToggleComment

選択した行のコメントの状態を個別に切り替える <leader>ci

さきほどのコマンドとは違い、こちらは1行毎個別に切り替える。

NERDComInvertComment

行末にコメントを追加する <leader>cA

カーソル位置の行末にコメントを追加した後、挿入モードに切り替える。

NERDComAppendComment

ブロックコメントを挿入する <leader>cs

カーソル位置の行、選択している場合は選択行を囲う形でブロックコメントを挿入する。
ブロックコメントが存在しない言語の場合は各行に単一行コメントを挿入する。

NERDComSexyComment

設定

多数の設定が提供されているが、便利なもの、特徴的なものを抜粋。全ての設定はこちらから。
いずれもデフォルトでOFFになっている設定で、.vimrcに追加することで設定可能。

コメントの後にスペースを追加する

NERD Commenterでコメント挿入した時、コメント記号の後にスペースを挿入してくれるようになる。
コメントが見やすく見やすくなるのでオススメ。

letg:NERDSpaceDelims=1

コメント記号を左に並べる

ネストしている場所をコメントアウトする時、コメント記号を左に並べるようにする。

デフォルトではこうなるが・・・
NERDComToggleComment

設定するとこうなる。
NERDDefaultAlign_left

letg:NERDDefaultAlign='left'

使ってみた所感

コメントアウトもアンコメントも一瞬でできる

普段コメントアウトする際、「行頭に移動して〜、挿入モードに切り替えて〜、コメント記号挿入して〜」って
やってた事がコマンド1発で終わるので快適。複数行だって選択した後にコマンド1発で済む。
コマンドの中でも特にコメントの状態を切り替えるコマンド(<leader>c<space>)が超便利!
このコマンド1種類で事足りるのがでかい。とりあえずこれだけ覚えるだけでも快適になる。

どんなファイルでも悩むことなくコメントアウトできる

NERD Commenter側がファイルタイプに合わせてコメントアウトしてくれるので
「この言語のコメントアウトは何の記号だっけ・・・」って悩む必要がない。
細かいファイルタイプまで対応しているので普段触らないファイルでも安心。
複数種類のファイルを触る人ほど恩恵がでかい。

そんなわけで、NERD Commenterを入れてよかった!✧\٩( 'ω' )و /✧

プラグインの入れ方

.vimrcに以下を追加

NeoBundle 'scrooloose/nerdcommenter'

その後、NeoBundleInstallで入れることでプラグインが入る。

また、ファイルタイプを参照するので、

filetypeon

も.vimrcに付け加える必要がある。

NERD Commenter

https://github.com/scrooloose/nerdcommenter

deinに乗り換えよう(第一段階)

$
0
0

前提条件

  • 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のインストール

Shougoさんのgithubだと

$ 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 たちを紹介する

$
0
0

Vim (その2) Advent Calendar 2016の12日めの記事です.微妙にパーズの難しいタイトルになってしまいました.

さて皆さん,vim の colorscheme は何をお使いでしょうか.定番は例えば jellybeans, solarized, molokai, gruvbox, hybrid辺りかと思いますが,どれも数年前からの定番ですし,我らが vim advent calendar の歴史を振り返っても,colorscheme の紹介に限って言えば案外記事が多くないのです.

というわけで,ここ2年くらいの間に誕生した colorscheme の中から,個人的な好みに基づいておすすめをいくつか紹介します1.なお筆者は気分によって色々変えますが,結局デフォルトの設定は jellybeans か hybrid に落ち着いています.

romainl/Apprentice

apprentice.png

mustang の系譜の sourcerer の流れを汲む scheme です.全体に落ち着いた色調ですが青,黄色,緑が心地良くまとまっており,よく練られた黒背景主流派といった印象.2014年3月とそんなに新しくないし github 上の star も多いので外そうかとも思ったのですがあまり日本で紹介されてない印象だったので採用しました.

jacoborus/tender.vim

tender.png

これも今回紹介する中では比較的メジャーどころかと思います.全体にパキっとしており,青が冴えていてなかなか格好いい.

reedes/vim-colors-pencil

pencil.png

黒背景にも対応していますが,実力はbg=lightのほうがよく出ると思います.定番の少ない白背景カラースキームの中で屈指の使いやすさ.華やかさと読みやすさのバランスがいいですね.(黒の縁取りは僕のスクリーンショット撮る技術の不足なので許してください)

freeo/vim-kalisi

kalisi_light.png

kalisi.png

NeoVimのデフォルト colorscheme をどうするかでわいわいやってた過程で作られたスキームです.元は白背景だけだったのが両対応になりました.シャープな色使いが気持ちいいです.

AlessandroYorba/Alduin

alduin.png

やや暖色寄りの落ち着いた色使いが魅力的です. 全体のバランスもいいし,飽きが来なさそうな感じがあります.

Haron-Prime/Antares

antares.png

鮮やかめの寒色が盛られた scheme. ちょっとキャンディを思い出します(僕だけかな).パッと見まとまりなく見えたんですが少し使ってると普通に馴染みます.

jeetsukumaran/vim-nefertiti

nefertiti.png

色調を抑えた渋い colorscheme の中でもかなり完成度が高いもののひとつだと思います.落ち着いた色使いですが読みにくくなく,調和の取れた硬質な感じで実に良い.

KKPMW/moonshine-vim

moonshine.png

今日一番おすすめしたいのはこの 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!


  1. なお, gvim はほとんど使わないのと何故か csapprox があまり好きでなかったので termguicolorsが入る以前の gui only なスキームはごっそり抜けてると思います.申し訳ない 

Vim 8.0 Advent Calendar 12 日目 連番の生成

$
0
0

この記事は 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 を使った開発をする

$
0
0

Node.js で開発するにあたってのぼくなりの環境を紹介します。

こんな感じ

Screen Shot 0028-12-09 at 10.40.20.png

環境構成

使っているツールは次のとおりです。

各設定はここに放り込んであります。

https://github.com/januswel/dotfiles

tmux

terminal multiplexer というもので ( 略 ) とても便利です。
ローカルで作業するのでセッションとかあんまり恩恵ありません。あ、まちがって Cmd+q押してターミナルを終了しまったときはとても便利です。

左上

git 操作や各コマンドの実行をするところです。主にプロジェクト開始時にここで作業することが多いですね。次のような npm scripts を定義して適宜叩いたりしています。

package.json
{"scripts":{"build":"webpack","build:watch":"webpack --watch",}}

左下

ESLint による静的解析や flow による型チェック、テストを常に流しておく場所です。次のような npm scripts を定義して、大雑把に npm run test --silentしながら開発します。

package.json
{"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 と マクロ

$
0
0

この記事は株式会社ネクスト(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ですね。

  1. qqでマクロの登録を開始します。
  2. 上記の B を意識して、 0で先頭に行きます。(^でもいいですが、この場合どちらでも構いません、場面によって使い分けて下さい)
  3. dt␣で左辺の文字列を消します。
  4. ハッシュのキーの部分に移動して内容をコピーしたいので、 2t'で移動、そして yi'でヤンクします。
  5. また 0で先頭に戻り、Pでペーストします。
  6. 最後に C を意識して jで下の行に移動し、qを押してマクロの登録を終了します。 3@qで完了です。

デモ

上記の操作をしたgifがこちら。
macro.gif

今回はシンプルな例ですが、いろんな発展も上記の、3つを意識すれば使い勝手良く、色々と効率化できると思います。

最後に

ネクストは Vim が好きなエンジニアも好きじゃないエンジニアも募集しています。
明日は リモートワークの話みたいです。

ぼくのかんがえたさいきょうのVim

$
0
0

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

マークダウンのプレビュー表示を行うプラグイン。

PrevimOpen.gif

tyru/open-browser.vim

上記のPrevimが依存しているプラグイン。

scrooloose/syntastic

ソースの静的解析を行ってくれるプラグイン。

rubocopなどと組み合わせて利用する。

今回の設定だと、バッファの保存時に静的解析が走るようになっている。

synta.gif

thinca/vim-ref

rubyの1リファレンスをvimから開くことができるようにしてくれるプラグイン。

調べたいメソッドやクラス名などにカーソルが当たっている状態で Shift + kで、そのリファレンスが開けます。

また、 Ref refe {調べたいメソッド名やクラス名}でも、検索できます。

explain.gif

http://qiita.com/c8112002/items/85a2c2cc3721c79a5322

szw/vim-tags

タグの生成やキーバインドの設定など、タグジャンプ機能の補助してくれる。

http://to-developer.com/blog/?p=1425

tpope/vim-endwise

classとか defとかの endを自動挿入してくれるプラグイン。

地味だけど超便利。

end.gif

scrooloose/nerdtree

https://kamiya555.github.io/2015/10/14/nerdtree-command/

IDE とか でお馴染みのサイドメニュー的なファイルエクスプローラ。

ブックマーク機能が便利。

NREDTree.gif

chase/vim-ansible-yaml

vim 標準の yaml のシンタックスハイライトやインデント制御が残念なので、このプラグインでいい感じにする。

tpope/vim-commentary

https://github.com/tpope/vim-commentary

コメントアウト・非コメントアウトが簡単に行えるようになる。

gc.gif

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

全角スペースの表示

全角スペースの強調表示するための関数の定義と呼び出し

スクリーンショット 2016-12-12 11.41.10.png

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の有効化
  • 前述のカラースキームの有効化

スペルチェックの様子

typo.gif

スペルエラーの警告の他にも修正案の提示や、適用、例外単語の追加などもできます!

http://d.hatena.ne.jp/h1mesuke/20100803/p1

.gvimrc

MacVim 用の設定ファイル。

主に見た目に関わること。

透過設定とかしてあげると最高にクールになるぜ!

スクリーンショット 2016-12-12 5.18.34.png

$$\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の苦手なこと(日本語入力とか)がよく分かります。


  1. 特定の言語に依存はしてないです。。。 

  2. classendifendなど対応するブロックの先頭、終端にジャンプできる機能 

vim: 今いるカーソルが指している単語をファイル内で一括検索(ハイライト)

$
0
0

作業していたら偶然発見したのでシェア。*でカーソルが表示している単語をファイル内で検索することができる。

vimmer6.gif

追記: コマンドはshift + :ではなく*だとのコメントを頂きました。ご指摘ありがとうございました。

Vim歴2年の自分の成長止まりを憂う

$
0
0

vim使い始めて2年くらい経つけど、結構クセついてきてしまいたまに焦りがきます。

例えば、diw -> iとやり慣れてる人が、 ciwに移行するのって意識して努力しないと変わらない。

以下は、僕自身が習得しなければならない、より便利な機能をリスト化してみました。結構前にまとめたので、もう改善済みのも結構ある。

とりあえず、最近vim使えてきたな〜って人は、t/f,T/Fの高速移動やText Objectを覚えると、さらに1.1倍くらい楽しくなります。

Keys

keyaction
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大文字に変換
~小文字は大文字に、大文字は小文字に変換
gQExモード(連続でコマンドを使用できる)
:eファイルを開く
:rファイルを読み込み現在編集中のファイルにペースト
gt次のタブに切替
gT前のタブに切替

Text Object

dcと組み合わせて使用する。

keyaction
iw単語(以降iの部分はaでも代用可能)
iW単語(空白含む)
is
itタグ
i]括弧("",'',(),<>,{})なども対応可能)

以上。
他におすすめあったら是非教えて欲しいです!

以下は、おまけ。
vimの標準ファイルツリー。

netrw.vim

Vimの便利なファイルブラウザ。

Keys

keyaction
:h netrw使い方をみる
:Explore(Ex)[!] [dir]カレントファイルのディレクトリを開く。:e .でも同じ。
:Hexplore[!] [dir]水平分割 & Explore
:Nexplore[!] [dir]垂直分割 & Explore
:Pexplore[!] [dir]垂直分割 & Explore
:RexploreExplorer に戻る
: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カラースキームを自作しよう

$
0
0

【前置き】カノジョを作る作戦を立てよう

今年もカノジョができなかった @yamasy1549です :innocent:

さてエンジニアという職業ですが、一般の方々に印象を聞くと「ずっとPCに向かってる」「話しかけづらい」「黒い画面に吸い込まれそう」と言われ[要出典]、実際黙々とコードを書くだけだと人間関係が希薄になりやすいです[要出典]。関わる人間の数が圧倒的に少ないのではカノジョができなくても仕方ないし、そんな中でカノジョを作ろうと思ったらもう狙いの精度を上げるしかありません。今回は「それとなく自分の趣味を明らかにし、同じ趣味の人に気づいてもらう」ことで精度向上を図る作戦を考えましょう。

作戦

おもむろにVimを立ち上げます。

カノジョできてるエンジニアとカノジョできないエンジニアの何が違うのか、それは普段使っているエディタに表れているに違いない、と思い簡単な調査をしました。

imageimage

僕が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数字定数2340xff
Booleanブール定数TRUEfalse
Float浮動小数点定数2.3e10
*Identifier識別子
Function関数名(クラスメソッドなども)
*Statement命令文
Conditional条件ifthenelseendifswitch
Repeat繰り返しfordowhile
Labelラベルcasedefault
Operator演算子sizeof+*
Keywordその他のキーワード
Exception例外trycatchthrow
*PreProc一般的なプリプロセッサ
Include#include
Define#define
MacroDefineと同じ
PreCondit#if#else#endif
*Typeintlongchar
StorageClassstaticregistervolatile
Structurestructunionenum
Typedeftypedef宣言
*Special特殊なシンボル
SpecialChar特殊な文字定数
TagCTRL-]で宣言元にジャンプできる
Delimiter注意が必要な文字
SpecialCommentコメント内での特記事項
Debugデバッグ命令
*Underlined目立つ文、HTMLリンク
*Ignore空白、見えない
*Errorエラーなど間違った構造
*Todo特別注意の必要なものTODO FIXME and XXX

*マークの付いているものは親、付いていないものは子として扱われます。
例えば

highlight Comment ctermfg=15" CUIでの Comment group の文字色を灰色(15)にする

とすると、ConstantStringCharacterNumberBooleanBooleanも自動的に灰色になります。

highlight-groups

:help highlight-groups

で詳細を確認できます。

{group-name}として以下が使えます。

group-name意味
ColorColumnset colorcolumnで設定された場所の文字行のn文字目以降に色を付ける
Conceal代替テキスト長い文字を短い文字で置き換えて表示する
Cursorカーソルのある文字
CursorIMIMEモードでの Cursor
CursorColumnset cursorcolumnされているときのカーソルのある文字の桁(縦方向)
CursorLineset cursorlineされているときのカーソルのある文字の行(横方向)
Directoryディレクトリ名・特別な名前
DiffAdd差分モードでの追加された行
DiffChange差分モードでの変更された行
DiffDelete差分モードでの削除された行
DiffText差分モードでの変更されたテキスト
EndOfBufferバッファ中で最終行以降の残りのスペースを埋める行'~' を無効にする
ErrorMsgコマンドライン上でのエラーメッセージ
VertSplitウィンドウを垂直分割したときの区切り行
Folded折りたたまれた行
FoldColumn折りたたみがあることを表示する列
SignColumnsign(目印)を表示する列
IncSearchinsearchのハイライト
LineNr:number:#コマンドの行番号
CursorLineNrset cursorlineset relativenumberされているときの現在行の行番号
MatchParenカーソル下(または直後)の括弧とそれに対応する括弧
ModeMsgshowmodeのメッセージ
MoreMsgmore-prompt のメッセージ
NonTextウィンドウ端の @showbrakeで設定されたような、実際のテキストには存在しない文字
Normal普通のテキスト
Pmenuポップアップメニューでの普通の項目
PmenuSelポップアップメニューでの選択された項目
PmenuSbarポップアップメニューでのスクロールバー
PmenuThumbポップアップメニューでのスクロールバーのツマミ
Questionhit-enter プロンプトと yes/no
Search最後に検索した単語のハイライト
SpecialKeyメタキーなど
SpellBadスペルチェッカーに認識されない単語
SpellCap大文字で始まるべき単語
SpellLocalスペルチェッカーが他の地域で使われると認識する単語
SpellRareスペルチェッカーによって殆ど使われないと認識される単語
StatusLineカレントウィンドウのステータスライン
StatusLineNCカレントウィンドウでないウィンドウのステータスライン
TabLineタブページ行のアクティブでないページのラベル
TabLineFillタブページ行のラベルがないところ
TabLineSelタブページ行のアクティブなページのラベル
Title:set allautocmdなどの出力タイトル
Visualビジュアルモード選択
VisualNOS"Not Owning the Selection" のときのビジュアルモード選択
WarningMsg警告
WildMenuwindmenuの補完での現在の候補

highlight-args

:help highlight-args

で詳細を確認できます。

カラー端末用には cterm*={arg}、そうでない端末用には term*={arg}、gVimなど用には gui={arg}を使います。

{key}={arg}意味args
cterm={arg}文字のスタイルboldunderlineundercurlreverseinverseitalicstandoutNONE
ctermbg={arg}文字の背景色色番号
ctermfg={arg}文字の色色番号

cterm*={arg}では16進数での色指定ができないので、色番号で指定する必要があります。
参考 : ターミナルで使える色と色番号を一覧にする

書いてみよう

上で紹介したものは設定のほんの一部ですが、数カ所色を変えるだけでも見た目がかなり変わります。

矢澤にこさんを見ながら作るとこうなる

image

絢瀬絵里さんを見ながら作るとこうなる

image

Vim上で

:so $VIMRUNTIME/syntax/hitest.vim

と叩いてしばらく待つと、どのエイリアスがどの色を表示しているかを確認できるので便利です。

もっとできること

まとめ

僕の例はかなり下手ですが、こんな感じで自分の好きなキャラの色をベースにカラースキームを作るといつか誰かに「◯◯さんのエディタってエリチ仕様ですよね!」って気づいてもらえ…たらいいんじゃないかなぁ…

来年は「カノジョできてるエンジニア Advent Calendar」のほうでお会いできるようお祈りしています :pray: Enjoy Vim life!

参考

僕のお気に入りのカラースキームはhybridです。

Viewing all 5720 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>