Vimでビルドエラー行にサクッとジャンプできるプラグインを作った。

私が作ったVimプラグインで結構長く使っているので、ブログで紹介しようかと思います(作っただけで満足して使わないVimプラグインよくあるので...)。

github.com

どんなプラグインかというと、ビルドエラー行やVimのQuickFixの行で:JumpToLIneコマンドを実行すると、その行を読み取ってそのファイルを任意のウィンドウで開けるといったプラグインです。

https://raw.githubusercontent.com/rbtnn/vim-jumptoline/master/jumptoline.gif

ビルドエラー行かどうかの判定は力業で、現状以下のパターンに対応してます。Vimのquickfixやgfで十分じゃないと思うかとかもしれませんが、開くウィンドウを選択できるのは結構重要なファクターだと思い作りました。

QuickFix on Vim

xxx.vim|1006 col 8| call system(prog)

MSBuild

  C:\Users\rbtnn\Desktop\main.vb(923,21): warning BC42021: ...

VC

  C:\Users\rbtnn\Desktop\main.vb(923): warning BC42021: ...

C#,F#

main.cs(9,10): error CS1002: ; expected

Python

  File "./prog.py", line 1, in <module>

Ruby

prog.rb:1:in `<main>': undefined local variable or method `aaaa' for main:Object (NameError)

Rust

 --> src\main.rs:7:42

Go,gcc,Clang

prog.go:1:1: expected 'package', found aaaaaa

一応、Neovimでも使えるようにしてますのでよかったら使ってみてください。

Windows版 Vocaloid5 EditorとCubase Artist 10.5の連携までにハマったこと

Vocaloidの作曲に以前から興味はあったがなかなか手を出せずにいた。
で、なんとなくやる気になって2019年の大みそかにすっと買ってしました。
買ったものは以下の3点。

ここではWindows版 Vocaloid5 EditorとCubase Artist 10.5の連携するまでにハマったので連携までのことをずらずら備忘録的に書いていく。

まずインストールとライセンス認証はそう難しくない(むしろ簡単といっていいレベル)のでスッとできるはず。 ただ、Cubase Artist 10.5はUSB-eLicenserというものが必要になるので買うときはちょっと注意しないといけない。

Vocaloid5 Editorもインストールし、1時間くらい触っていればなんとなく操作感は掴めると思う(ただしボカロを調教するスキルはまた別の話)。

f:id:rbtnn:20200102011518p:plain

とてもハマるのはCubaseサウンド周りです。
まずCubaseを起動すると以下のような画面が出ますが私はピアノの5線譜しか読めないで「Melody + Piano Page Layout」を選択して「作成」をしました。

f:id:rbtnn:20200102012358p:plain

すると以下のような画面が出るのですがとりあえず「OK」で問題ないです。あとで設定しなおすことができます。

f:id:rbtnn:20200102012652p:plain

これで「OK」をクリックするとスコア(5線譜)ウィンドウやプロジェクトウィンドウなどが出てきて、あとはご自由にって感じで路頭に迷います。

Cubaseのオーディオコネクションの設定

まずはサウンドの設定をちゃんとやらないと5線譜に音符を並べて再生しても音が鳴りません。 これはCubaseで再生される音声がPCのサウンド出力に設定されていないためです。なのでこれから設定していきます。

  1. メニューの「スタジオ」から「オーディオコネクション」を選択します。

    f:id:rbtnn:20200102014912p:plain

  2. 表示されたウィンドウの「出力」タブをクリックすると以下のような画面になり、「BUS1」という雑な設定になってます。なので「パスを追加」でステレオ/LRのパスを追加してあげます。 f:id:rbtnn:20200102015048p:plain

    f:id:rbtnn:20200102015435p:plain

  3. すると「BUS1」の下に「Stereo Out」というオーディオデバイスが選択されたものが追加されるはずです。「BUS1」の方はいらないので右クリックから「パス”BUS1”を削除」で削除してください。

    f:id:rbtnn:20200102015612p:plain

Cubaseのスタジオ設定

オーディオコネクションの設定が正しくできていれば、メニューの「スタジオ」から「スタジオ設定」を選択し「Generic Low Latency ASIO Driver」を見ると、I/Oがアウトの行の状況が「アクティブ」になっているはずです。

f:id:rbtnn:20200102020550p:plain

また、「コントロールパネル」をクリックするとサウンド出力先が選べますので、もし違っていたら修正してあげます。

f:id:rbtnn:20200102020626p:plain

トラックのInspectorの設定

これでうまくいくかと思いきやまだ音は出せません。
下の図でいうViolineやPianoの行をトラックといいますが、このトラックにもサウンドの入出力とどのVSTi(Cubase内で使える仮想の楽器のこと)を使うか設定しなければなりません。下の図でいう赤枠の部分を設定する。

f:id:rbtnn:20200102022459p:plain

上記の場合、「Microsoft GS WavetableSynth」というVSTiを使い、その音をチャンネル2に出力するような意味の設定になってます。 ここでチャンネル2になってますが「MixConsole」タブの「Stereo Out」をみるとチャンネル1になっていますのでチャンネル1に設定します(この辺の理解が正しいか微妙)。 VSTiは好きなのを選択してください。これで音が再生できるはずです。たぶん。

Vocaloid5 VSTiトラックの設定

CubaseVocaloidの声を入れるのはインストールが正しくできていれば簡単です。

  1. コンテキストメニューから「インストゥルメント トラックを追加」を選択する。

    f:id:rbtnn:20200102025125p:plain

  2. インストゥルメントを「VOCALOID5 VSTi」、オーディオ出力を「Stereo Out」にして「トラックを追加」を選択する。

    f:id:rbtnn:20200102025240p:plain

  3. VOCALOID5用のトラックが作成されますので、さっきと同じ要領でチャンネルなどを合わせていけば、MIDIVocaloidを一緒に作成したり再生したりできるはずです。

    f:id:rbtnn:20200102025421p:plain

まとめ/感想

とりあえず以上ですが、感想としては他のオーディオ関連のソフトウェアの経験なしにいきなりCubaseを触るものでないですね。 PCのオーディオ関連の知識をある程度入れてから触ることをお勧めします。

私が持ち歩いているUSBケーブルとかの小物まとめ

今はAmazonの注文履歴から購入したものを辿れる時代ですが、なんだかんだ言ってまとめといた方が再購入したいときなどに便利です。ので、以下、私が持ち歩いているUSBケーブルとかの小物です。コンセプトとしてナイロンコンパクトポーチにすべて収まるように心がけています。

f:id:rbtnn:20191229000801j:plain

Vimで色を直感的に編集するプラグインを作ったので紹介

Vim2 Advent Calendar 2019の11日目担当の@rbtnnです。

TL;DR

色を編集するVimプラグインを作ったから良かったら使ってみてください。
ただ、このVimプラグインは256 bit color対応でかつpopup windowが使えるVimが必要です(Neovimの方ごめんなさい)。

github.com

このVimプラグインを作った経緯

みなさん、Vimのhighlightやcssのbackgroundなどの色を編集したことありますか?

Vim scriptのコード

highlight Normal       guifg=#e0e0e0 guibg=#203b46

cssのコード

.hoge {
  background-color: #ffea00;
}
.foo {
  background-color: hsl(240,50%,50%);
}

これらの色を編集するとなるとRGBもしくはHSLのコードを編集して保存、そしてVimもしくはWebブラウザの再読み込みしてやっとその指定した色がわかります。
またVimの場合、ハイライトを作成するのにRGB(赤・緑・青)指定しかできないのでカラースキームを作るときとか結構面倒くさいです。

まぁなのでHSL(色相・彩度・輝度)を扱える、かつ、すぐ色がわかるようなVimプラグインを作りました。

このVimプラグインの紹介

このVimプラグイン#rrggbbhsl(12,50%,50%)などの上でColorEditコマンドを実行すると、カーソル下の値を編集できるというものです。 デフォルトキーマッピングは用意してませんので以下のようなマッピングを各自で定義してください。

nnoremap ce    :<C-u>ColorEdit<cr>  

f:id:rbtnn:20191207012807g:plain

ColorEditコマンドを実行するとポップアップウィンドウが表示され、以下の操作で色を調整します。

  • j : カーソルを下に移動する
  • k : カーソルを上に移動する
  • h : その行の値を下げる、display-modeの行で押すとRGBとHSLの表示切り替え
  • l : その行の値を上げる、display-modeの行で押すとRGBとHSLの表示切り替え
  • <space> or <enter> : 決定する(カーソル下の値に反映される)
  • <esc> or <C-c> : キャンセルする(カーソル下の値に反映させない)

RGBとHSLの表示切り替えができるのでVimのカラースキームを調整するのにかなり使えるのではないかと思います。 ただ、RGBとHSLは完全な相互変換はできないので変換するたびに誤差が出て表示されますがこれはもう仕様です。
あとcssのコーディングも対応したかったため、cssで使うだろう#rrggbbhsl(12,50%,50%)のパターンはほぼほぼ対応できたかと思います。以下、扱えるパターンです。

  • hsl({hue},{saturation}%,{lightness}%)
  • hsla({hue},{saturation}%,{lightness}%,{alpha})
  • rgb({red},{green},{blue})
  • rgba({red},{green},{blue},{alpha})
  • #rrggbb

以上

vue.jsとvue-cliの始め方

Vue.jsというJavaScriptフレームワークを触ってみたのでこの導入の仕方をまとめてみようかと思います。 vue-cliというコマンドラインからVue.jsのプロジェクトを操作するcliが用意されていて、初心者はこのvue-cliを後回しにする傾向があるようですが、 最低限の操作であれば特に難しくないように思えましたので、ここではいきなりvue.jsとvue-cliの導入の仕方を一緒にまとめます。 ちなみに私はWindows 10でvue.jsとvue-cliを動かしてみました。

jp.vuejs.org

1) node.jsのインストール

まず、vue-cliをインストールするためにnpmが欲しいのでnode.jsをインストールします。 インストール出来たら、コマンドラインからnpmが実行できるはず(できない場合には環境変数PATHを見直してみるとよろしいかと)。

2) vue-cliのインストール

npmが実行できるようになったら、コマンドラインから以下のコマンドを実行してvue-cliをインストールします。 @vue/cli-service-global は後でどうせ必要になるのでここで一緒にインストールしておきます。

npm install -g @vue/cli
npm install -g @vue/cli-service-global

インストールが完了するとvueというコマンドがコマンドラインから実行できるようになります。

3) プロジェクトの作成

vueをインストール出来たら、早速プロジェクトを作成してみます。 作り方はvue create {プロジェクト名}です。

vue create hello

f:id:rbtnn:20191124180301p:plain

4) プロジェクトの実行

プロジェクトを作成できたら、そのプロジェクトを動かしてみます。 まず、cd helloでプロジェクトのディレクトリに移動し、npm run serveを実行するとビルドおよびサーバーが立ち上がります。

f:id:rbtnn:20191124180908p:plain

http://localhost:8080/Webブラウザでアクセスすると以下のようなページが表示されれば成功です。

f:id:rbtnn:20191124180518p:plain

5) 番外編

さて、vue create {プロジェクト名}はbabelなどのnodeモジュールをインストールしてしまって(ちゃんと設定をすればインストールしないようにはできる)、 サクッとvue.jsを試したいときには余計な行程なんですよね。 最初は1つのソースファイルからビルドして動かしてみたいわけです。package.jsonとかをいちいち作成したくありません。 そんなわけで、1つのソースファイルから動かす方法を以下にまとめます。

まず、適当な空のディレクトリにApp.vue というファイル名で以下のようなコードのファイルを作成します。

<template>
  <h1>Hello!</h1>
</template>

そして、コマンドラインからvue build を実行します。

f:id:rbtnn:20191124182556p:plain

ビルドが成功すると上記のような感じになりますので、あとはvue serveでサーバーを立ち上げることができます。

f:id:rbtnn:20191124182830p:plain f:id:rbtnn:20191124182920p:plain

参考

VimのPopup windowとwindow-IDについて

Vim 8.1からPopup windowが実装されました。 詳しくは :h popup を参照して欲しいですがちょっと凝った使い方をしようとし、filterとcallbackを実装しますが結構ノウハウ、具体的にはwindow-IDの理解が必要になってくるのでここでまとめてみようと思います。

window numberとwindow-ID

Popup windowを作成する関数は戻り値としてwindow-IDを返し、また、Popup windowのfilterとcallbackのコールバック関数の第一引数にはwindow-IDが渡ってきます。そのため、Popup windowを扱ううえでwindow-IDの理解が必須になってくるのです。

まず、Vimにはもともとwindow numberというものがありますがこれはwindow-IDとは全く異なるものになります。

window number

window numberは現在Vim画面上に表示されているウィンドウを左上から順にナンバリングした値になります。ここで気を付けたいのはwindow numberは完全に一意な値にならないことです。 例えばtabpageが複数になる場合、window numberはそれぞれのtabpageで左上から順にナンバリングされるため、Vim全体としてwindow numberが重複することになります。

tabpage:1                        tabpage:2
+-------------+----------------+ +-------------+----------------+
|             |                | |             |                |
|     1       |        2       | |     1       |        2       |
|             |                | |             |                |
+-------------+----------------+ +-------+-----+------+---------+
|                              | |       |            |         |
|             3                | |   3   |     4      |    5    |
|                              | |       |            |         |
+------------------------------+ +-------+------------+---------+

window-ID

window-IDはwindow numberとは違いウィンドウに完全に一意な値を振ったものになります。そのため、ウィンドウを作成する度に新しいwindow-IDが生成されます。

tabpage:1                        tabpage:2
+-------------+----------------+ +-------------+----------------+
|             |                | |             |                |
|     1000    |     1002       | |    1023     |        1020    |
|             |                | |             |                |
+-------------+----------------+ +-------+-----+------+---------+
|                              | |       |            |         |
|            1031              | | 1030  |    1004    |  1050   |
|                              | |       |            |         |
+------------------------------+ +-------+------------+---------+
※ 環境よってwindow-IDは異なる場合があります。

window-IDの重要性

window-IDですがそもそもなぜwindow-IDが重要かというとcallbackやfilterのコールバック関数の中では既存の関数やコマンドを使うと Popup windowに対してではなく、カレントウィンドウに対して適用されます。 このため、このコールバック関数内で唯一のPopup windowに関する情報であるwindow-IDはかなり重要で、これから出来ることを知っておく必要があります。

let winid = popup_menu(['aaa', 'bbb'], {
    \ 'filter' : function('s:filter'),
    \ 'callback' : function('s:callback'),
    \ })
echo winid
" 1001

function! s:filter(id, key) abort
    " a:idがそのPopup windowのwindow-IDになります。
    echo a:id
    " 1001

    " getline()でPopup windowの行を取得したいところですが、実際はカレントウィンドウの行を取得しようとします。
    echo getline(2)

    " Popup windowに行番号を表示するのではなく、カレントウィンドウに行番号を表示しようとします。
    set number

    return popup_filter_menu(a:id, a:key)
endfunction

function! s:callback(id, key) abort
    " a:idがそのPopup windowのwindow-IDになります。
    echo a:id
    " 1001

    " getline()でPopup windowの行を取得したいところですが、実際はカレントウィンドウの行を取得しようとします。
    echo getline(2)

    " Popup windowに行番号を表示するのではなく、カレントウィンドウに行番号を表示しようとします。
    set number
endfunction

window-IDから出来ること

Popup windowのcallbackやfilterのコールバック関数内でそのPopup windowに対しての操作が必要になってきます。 で、必要になってくるのがwinbufnr()win_execute()です。これはwindow-IDからそのウィンドウに表示されているbuffer numberを取得、window-IDに対してコマンドを適用できます。 このbuffer numberはPopup windowに表示されているバッファに対するものになりますので、既存の関数がいろいろ使えます。

" Popup windowのcallbackやfilterのコールバック関数
function! s:callback_or_filter(id, key) abort
    " winbufnr()でwindow-IDからそのウィンドウに表示されているbuffer numberを取得できます。
    let bnr = winbufnr(a:id)

    " buffer numberがあれば既存のsetbufline()やgetbufline()でバッファ内容設定/取得できます。
    call setbufline(bnr, 1, 'xxx')

    " window-IDのウィンドウに対して、コマンドを実行することができます。
    call win_execute(a:id, 'set number')

    " Popup windowのカーソル行位置を取得しようとline(".")を単純に使いたいところですが、
    " そのまま使うとPopup windowに対してではなく、カレントウィンドウに対してのカーソル行位置
    " が取得できてしまいますので、以下のような2ステップを踏まないとカーソル行位置は取得できません。
    call win_execute(a:id, 'let w:lnum = line(".")')
    echo getwinvar(a:id, 'lnum', 0)

    return popup_filter_menu(a:id, a:key)
endfunction

その他

もしfilterとcallbackを実装方法がわからなかったら、私は何個かのPopup windowに関するVimプラグインを作成したりしてますのでご参考に。

最新のdotnetコマンドを使う

これは備忘録です。 最新のdotnetコマンドをインストールするには以下の2つのPowerShellコマンドを実行すればいい。

curl -Uri https://dot.net/v1/dotnet-install.ps1 -OutFile dotnet-install.ps1
.\dotnet-install.ps1 -Version coherent -Channel master

そもそも私は dotnet format を使ってみたかったので、追加で以下のコマンドを実行した。

dotnet.exe tool install -g dotnet-format

f:id:rbtnn:20190421211605j:plain

リンク

https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-install-script

https://github.com/dotnet/core-sdk