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

Vimで24bit カラーコードを素早く編集して Colorschemeを作成した話

$
0
0

はじめに

この記事はvim2 advent calendar 2019 17日目の記事です。

完成物は以下です。

自分で Colorscheme を作りたくなった

私は vim-gothamというcolorschmeを3~4年間ほど使用してきました。

このcolorschemeに非常に満足していたのは

  • 単純に色がいい
  • 端末のAnsi colors の設定も ここにまとまっていて、Truecolorが使えないvimでも端末さえ設定すれば綺麗な色で使えた。

という点です。

ですが、少しずつ自分の好みとは違うなあと思い始めて、それをどうやって調整していたかというと
端末のAnsicolorを少しずつ調整して、vim側では notermguicolorsで使っていたんですね。
これによってColorscheme自体には全く手入れすることなく、色合いだけを自分好みにできていたというわけです。(非常に情けないですが)

こんな本質的でないやり方をしていたのはひとえに、 「Colorscheme作るの、大変そうだし、難しそう」という思いからでした。

そんなとある日、私は VimConf 2019に参加しました。

登壇されていた方のお話はそのどれもが素晴らしくて、1日が本当にあっという間でした。

この会場で直接vimのcolorschemeのお話を聞いたわけではないんですが、
私は、参加者皆様ののvimに対する熱意といいますか、こだわりといいますか、そういったものを感じているうちに、
自分が現状のcolorschemeに満足していないにも関わらず、妥協し、自分のニーズを満たすものを作ろうとしていないことに非常に 情けなさ・恥ずかしさを覚えました。

そこで初めてcolorschemeを作成することを決意したのです。

とりあえず暗い背景のcolorschemeが完成した

vim-gothamの色を微調整しながら使っていた
ので、なんとなくこういうのが作りたいというイメージがありました。
ですので、それを目指しながらなんとか黒背景のcolorschemeを完成させました。

(commit でいうと このへんでしょうか)

icebergという非常に洗練されたcolorschemeがあるのですが、
lightlineの設定の仕方などは非常に参考にさせていただきました。大変感謝しています。

自分の好きなように作っただけあって、全体的な色合いには確かに満足できました。

しかしこの頃から以下の課題を感じ始めるようになりました。

課題1. 微妙な調整をしたくなることがある

完成したものを使っていると、度々「ここの色はもう少しこうしたい」というのが生まれてきます。
そのたびに色を少しずつ調整して試行錯誤するというのは辛いものがあります。

課題2. 同系統の色を基調とした明るい背景のcolorschemeもほしい

超有名なcolorschemeにsolarizedというのがありますが、
これは dark / lightと2種類用意されていて、背景が違えど全体的なコンセプトは統一されていて、気分でカジュアルに使い分けられるなど、どこか羨ましい思いがありました。

とはいえ、私はすぐにlight版のcolorschemeの作成に取り組むことはできませんでした。
黒背景のcolorschemeをひとつ作ってその大変さを痛感してしまい、
もう一回それをやるというのは気が進まなかったのです。

気づき: 色の編集、特に明度の調整がボトルネック

ある時、ひとつのことに気づきました。

私がcolorschemeの作成、とりわけ色の調整をしている時にいたずらに時間を消費しているのは
#abcdef← こういうカラーコードを編集している時でした。

さらに言うと、個人的に色の調整を行うときに多い操作としては、特定の色の明るさを上げていく(或いは下げていく)というよりは、「明度をあげる」「明度をさげる」という調整をすることが非常に多かったです。

こうなると煩わしさは単色の調整の凡そ3倍で、R, G, Bそれぞれの値を16進数を意識しながらインクリメント、デクリメントするという操作の繰り返しでした。

vimには現在行にある(カーソル下、あるいはカーソル右側の)数字をインクリメント、デクリメントする<C-a>, <C-x>があるんですが、それと同じような感じで色を編集できたらどれだけ楽だろうと思うようになりました。

色のインクリメント・デクリメントの実装

そこで vim-colorrangeを開発しました。
(正確には自分の .vimrcなどに書いていたものを最終的にプラグインとして切り離しました)

demo

特に自分が課題としていた 明度の微調整にすこぶる強いものを開発しようと思って作りました。

見ていただければ仕様は簡単に分かるとは思うんですが、

:ColorrangeIncrementを カーソルがカラーコードの #上、或いはそれより左の時に実行すればRGBそれぞれ1bitインクリメントした値に書き換わり、カーソルがカラーコード中にあるときは、その桁のみをインクリメントするというものです。

(カラーコードに色がついているのは https://github.com/lilydjwg/colorizerを使用しています)

Vimのデフォルトの <C-a>, <C-x>と同じように扱えるように私は

nnoremap <A-a>:ColorrangeIncrement<CR>
nnoremap <A-x>:ColorrangeDecrement<CR>

のようにマッピングして optionキーa or xでインクリメント or デクリメント を行っています。

プラグインの名前なんですが、colorと arrangeをいい感じに短縮したつもりなんですが、結果的に colorrangeみたいになったので命名悪かったなと思っています。
(そういう意味で自分でも覚えやすいからよかったと思っている側面もあります)

回数の指定にも対応しているので 10<A-a>とかってやると 10bit分 インクリメントしてくれます。

無事 light 版のcolorschemeも作成できた

上で紹介したのを使うと、あっという間にlight版もおおかた完成しました。
時間が短縮されたというのも大きいんですが、何より試行錯誤のストレスが激減して、colorschemeを作ることに全く抵抗を感じなくなりました。

以下が完成物ですので興味のあるかたはぜひ使ってみてください。

https://github.com/relastle/bluewery.vim

(まだ私の開発する範囲でしか色の調整をできていないので、プラグイン、言語によって見た目が酷い場合があると思います。ご了承ください。)

青色がベースのcolorschemeを意識したのと、私がビールが好きなので、
bluebreweryをいい感じに合わせて命名しました。

まとめ

本記事では 作ったcolorscheme
その過程でできたPluginについて紹介したんですが、
主題は 「VimConf 2019に参加したからこういう意欲が湧いた」というところです。

colorschemeを作っても、自分だけで使っていればよいし、
色を編集する便利コマンドを作っても自分の .vimrcにベタ書きして使っていればよかったかもしれません。

それでも公開しようと思えたのは間違いなくVimConfに参加できたおかげですし、
参加できて心から良かったと思っています。

来年もぜひ参加させてください。

ありがとうございました。


今まで付き合ってきた子たちと、当時の思い出を振り返る

$
0
0

エムスリーキャリア Advent Calendar 2019 17日目の記事です。

動機

今までのIDE、エディタを振り返る。
今の自分があるのはあの子達のおかげ。
別れた人との思い出話みたいな感じ。

大学時代

黎明期。プログラミングとの出会い。vimとの出会いを果たした。

emacs

https://www.gnu.org/software/emacs/
今思えば、大学の先生がemacs派だったのかも。
公平性を期すためにも、ぜひ授業でvimも紹介してほしい。
授業で使う端末はmacだったからCtrlの位置的に問題なかったけど、学生の標準のノートPCはWindowでCtrlの位置が辛かった。
いわゆる、emacs小指になりそうだった。。

Dreamweaver

https://www.adobe.com/jp/products/dreamweaver.html
バイト時代にhtmlとかを書くのに触った。
そんなにガッツリ使い込まなかったから特に感想はないけど、初めて触ったときの「便利だ。。」と思ったのは覚えてる。
ただ、当然だけどemacsとかと比べると重さを感じた。

Crescent Eve

https://www.kashim.com/eve/index.html
Dreamweaverが何となく重く感じて、もう少しライトなのを探した。
結局、これもそんなに使い込まなかったけど、最低限の機能を備えていて、そんなに重くなかったという点で印象は良かった。

Vim(現在、サーバ環境),GVim

https://www.vim.org/
大学2年?3年?のときに参加したインターンで紹介されて、それ以来ずっと使っている。
このインターンに参加したきっかけは、当時付き合っていた人に振られたから。。
常にホームポジションにいられる感じが大変良い。
あの人はホームにいてくれなくなったのが大変辛かった。
Vimはそんな心の隙間に入り込んだんだと思う。今もVimからは離れられないでいる。

インターンのときはLinuxサーバ上にsshしての開発だったのでターミナル上でVimだった。
インターン終了後に自分のWindowsでもVimを使おうと思ったときに、出会ったのがGVim。個人的な付き合い方としては、VimとGVimの違いはあまりない。
強いて言うなら、gitのcommit メッセージはターミナルで起動されるvimのまんま。
(G)Vim on Windowsでは香り屋さんに大変お世話になった。

ブラウザとか別のIDEとかもVimキーバインドにしている。
- Vimium
- IdeaVim

新社会人時代

過渡期。神に出会ったせいで、全てに物足りなさを感じてしまった。
足るを知るの精神も大事。必要を満たしていればいいじゃないか。

メモ帳

最初の研修はメモ帳だった。辛かった。。
ただ、まだメモ帳で良かったのかもしれない。。。
研修の試験は、Wordか何かで書かれたであろうプログラムを読んで、どのような結果を出力するかを答える問題だった。
しかし、Word特有の文頭のアルファベットを自動で大文字にする機能のおかげか、コンパイルエラーになるプログラムになっていた。
指摘したけど、いや、ちゃんと出力されるから!とか適当にはぐらかされた。
再度抗議して、問題を修正してもらった。
もし万が一Wordでプログラムを書かされるようなことがあったら発狂したと思う。
プログラムのインストール制限があったのでVimが使えなかったのが本当に辛かった。気づいたら、
っっっっっっっっっっっっっっj
とか
jjjjjjjjjjjjjjjjjjjjj
みたいのをよく入力してた。

サクラエディタ

https://sakura-editor.github.io/
研修の途中からサクラエディタが使えるようになった。相変わらずコードを書くのは辛かったけど、メモ帳よりは幾分マシ。
ピンク色の画面に目がやられる気がしたのはいい思い出。
画面を黒くしたり、Ctrl+j,kで上下の移動ができるようにしたりのカスタマイズをした。
当時の先輩に、「見た目とか形から入るタイプ?」って聞かれたから、「普段vimなんで、画面も見にくいし、使いにくくて、なんとか寄せました」って言ったら会話が途切れた。
プログラムのインストール制限が(以下略)

eclipse

https://www.eclipse.org/downloads/
研修の後半のjava開発で使った。マシンパワーが足りなく、辛かった。。
メモリ2GBのマシンで、eclipse + chrome + excelは無理がある。そこに人権はなかった。
sysoのショートカットというか、スニペットはよく使った。
Vimのバインド設定はした気がする。
プログラムのインストール制限が(以下略)

Visual Studio

https://visualstudio.microsoft.com/ja/
神。これが神。
C#しか書いてなかったけど、これがあれば困らない。
この時期にはVimは近くにいてくれた。

Atom

https://atom.io/
一瞬使った。インストールしたくらい。

sublime text2

https://www.sublimetext.com/2
一瞬よりもう少し長く使った。IDEじゃないんだけど、拡張できるライトな開発環境みたいな位置づけ。

現職

Neovim(現在)

https://neovim.io/
転職後、今まで同じ環境を作り直す必要があった。
dotfilesとかはgithubにあげていたのでそんなに手間ではなかったんだけど、せっかくならちょっと乗り換えてみようかなと思って変えてみた。
概ね満足。python2,3の過渡期みたいなこともとあって、たまに変なエラーが出たのが面倒なくらいだった。
今はガッツリコードを書くというよりは、メモを作るときに使ったり、コードのリーディングがメイン。
コードを読むときは、ホームポジションのまま色々できるのが思考が分断されなくていいなと思っている。

色々プログラムを書かないといけないときはIDEを使ってる。

(Neo,G)Vimはいつでもそばにいてくれる。

visual studio code(現在)

https://code.visualstudio.com/
js書くのはこれがいいよねっていう話をよく聞くので、ある程度は触るようにしている。
自分のメインがjsではないので、そんなに活躍の機会は多くない。
markdown書くときとかは結構重宝している。
本当はもっと活用したほうがいいなと思いつつ、ちょっと腰が重い。
WSL環境を用意したいと思っているんだけど、結構便利そうな話も聞くので、ちゃんと使えるようにしたいとは思ってはいる。
私はいつもそうだ。そのうちちゃんとしよう、ちゃんとしようと考えたまま行動に移せず、機を逸するのだ。。。

android studio

https://developer.android.com/studio?hl=ja
仕事でAndroidアプリを書く機会があって、数ヶ月使っていた。
やっぱりIDEって便利だなと思う反面、メモリをもりもり使って重いなというのを再認識した。

IntelliJ IDEA(現在)

https://www.jetbrains.com/ja-jp/idea/
Ruby、Railsを書く機会が多い中、どうやって効率をあげられるか?と考えた結果、ライセンスを購入した。
kotlinだとかAndroidを書く機会もあったので、もうこれしか無いだろうという感じだった。
Vimを拡張していくのでもいいんだけど、拡張のための時間を仕事に当てたいし、早く帰りたい。
時間に対する投資と思って買った。
実際、年間ライセンスが14,000円位だった気がする(正確な値段は各自で調べて)ので、12ヶ月、20日稼働日を考えると、所詮幾らもかからないと判断した。
コーヒー一杯我慢すれば十分ペイする(我慢しない)。

最後に

私にとってのVimみたいに、「新しいのが合わなかったら、Vimに戻ればいいや」みたいな安心感というか、最後の砦にできる環境を一つ作るのは大事だと思う。
安心感、最後の砦があるからこそ、新しい挑戦ができる。
いろいろなツールに手を出すことで、効率が上がることもあるだろうし、今までのツールの良さを再認識することもあると思う。

気持ち的なこだわりももちろん大事だけど、こだわりすぎて世界を狭めてしまわないように注意したい。

デスクトップ背景にyoutube動画を再生しながらVimでコードを打てるようにしてみた

$
0
0

はじめに

私はVim(Neovim)を使ってコードを書いています.私は動画を観ながらコードを書くことが多いのですが,Macではブラウザ上でのyoutubeのfull screenモードの上にVim(正確にはターミナルapp)を展開できないので,大きくともシアターモードあるいはブラウザのズームによる拡大の上でvimを重ねるしかありません.どちらにせよPCのモニター全体に動画を表示することができません.(しかもブラウザでyoutubeを見る場合はタブやメニューが有,ただし設定次第では消せるかも)

そこで,geektoolというアプリケーションを用いてhtmlページをPCモニター全体に表示しターミナルアプリの透明にすることによりVimでコードを書きながらyoutube動画をフルスクリーンで視聴できるようにします.

そもそも...

最近はMacしか触っていないのでわかりませんでしたが,windowsやlinuxはやろうとすればブラウザ経由のyoutube動画のフルスクリーンにターミナルを重ねることができるみたいです.Windows,lLinuxユーザの方はなぜこんな回りくどいことを?状態になるかもしれないです.
Macじゃあそれができないんですよ(私が試した限りでは).

この方法で使用するgeektoolですが,これはMac(Linuxでも使用可能かも)用アプリケーションになるので,そういう意味でもMacユーザ向けになります.

私の環境について

IDEのような高級な環境(値段が高いという意味ではない)ではbackgroundを透明に設定できるものはなかなかないと思います.おそらくVimのようなエディタやターミナル経由で起動できるものを使用することになり,今までそれを使用してこなかった方は何を使えば良いかわからないかもしれないです.そこで一例にはなりますが,私の環境を紹介しようと思います.(おそらくこんなに面倒な思いをしてまでマネする人はいないと思が)

使っているもの

Mac book Pro

こんな面倒なことまですることになった理由というか原因です.これを実現するときに初めてWindows使おうかなと思いました.

Alacritty

なんだそれ?と思った方がいるかもしれませんが,Alacrittyはターミナルアプリです.
https://github.com/jwilm/alacritty
仲間ですとMacにデフォルトでインストールされているターミナル(app名です)やiTerm2です.もともとはiTerm2を使っていましたが,Alacrittyに変えました.
理由は私がプログラミング言語としてrustを使っているので,そのrustで作られているAlacrittyに惹かれたからです.それだけです.ただ,体感だとAlacrittyの方がiTerm2より起動が早く感じました.しかし,shellの設定の違いのような別の要因を考えることもできるので,アプリの違いにより早くなったかどうかはわかりません.
Alacrittyは設定をテキストベース(alacritty.yaml)でいじるので慣れていない方は難しいかもしれません.そのときはiTerm2を使うと良いです.多くの方が使用しているので調べやすいと思います.

Alacrittyを使う場合はbackgroundを透明にする際,alacritty.yaml内のbackground_opacityを次のようにすれば良いです.

~/.config/alacirtty.yaml
...# other codesbackground_opacity:0.4# select 0.0~1.0...# other codes

0.0が完全な透明で1.0が不透明になります.

Neovim

エディタです.私は純粋なVimではなくNeovimを使っています.どちらでも問題ないので好きな方を使えば良いです.私は新しく出てきたものを使いたくなりがちなのでNeovimを使っています(本当はもう少ししっかりした理由もありますが).詳しくないのであまりはっきりしたことは言えませんが,ターミナル経由で起動できるものなら別のエディタ(emacsのような)でも背景は透明になるかもしれないので,Vimが必須というわけではありません.もっと言えば背景を透明にできるのであれば単独のアプリとして起動するエディタやIDEでも問題ありません.

使用方法

私のリポジトリのREADME.mdに使用方法は記してあるので,もし私と同じように動画を観ながら(単一モニターしかない状況でフルスクリーンモードで観ながら)コードを書きたいという欲張りな方(効率性,集中力なんて興味ない方)はそちらを見てください.
https://github.com/faluna/vim-bg-youtube

ただ汎用的に作っているわけではないので,現在はyoutubeのplaylist idから動画を再生します.単一の動画をリピートし続けるような別の設定をしたい場合は自分でコードを変更していただく必要があります.Youtube-IFramePlayerAPIの使い方は公式か以下の記事でGeekToolの使い方も含めて解説している記事がありますのでそちらを参照してください.というか私はこの記事を参考にして作成しました.
GeekToolとYoutube-IFramePlayerAPIを使って、MacでWallpaper Engineを再現する

最後に

多くの需要があるような機能は誰かしらが実現してくれますが,このようなマイナー要望はどうしても自分で作成する必要があり,しかもなかなか記事もないです.というか数件(片手で数えるくらい)しかありませんでした.
そこまでというか全く難しいことはしていませんが,同じような要望を持っている方の役にたてば幸いです.

同じことをしたい方にこれを使って欲しいというより,これを元により良いものを作っていく参考になればと思います.

参考

Visual Studio 2019でEasymotion

$
0
0

この文章の目的

  • Visual Studio 2019 (以下、VS2019)で Easymotion 使えるようにしたので、その方法に関する覚書。
  • 記事のタイトルは「Visual Studio 2019でEasymotion」ではあるが、同様の方法で、VSの所望の拡張機能が自分のVSのバージョンに対応していない場合に対応できるかもしれない。

キモチ

動機をダラダラ書いてるだけだから、本記事は、基本「やったこと」だけで事が足りる。しかし、なんにしても motivation は大事だと思うのですよ。

Chrome を vimキーバインドちっくにしてくれる Vimium のリンク文字のマッピング機能、ブラウジングするときのページ移動が超効率化されてかなり気に入っている。
で、あれ?このアイディアってそもそもvim系のアイディアってことは、 VSCode のvimエミュレータにもそれっぽいのあるんじゃね?と思い立って調べてみたら、 VSCode のvimエミュレータにはデフォルトで easymotion が入ってるらしくって、適当に設定をしてやれば、サクサクと使えるようになった。
ここまでくれば、本家の Visual Studio にも入れたくなってくるというのが人情ってもの。

調べてみたところ、それっぽい感じの拡張機能を見つけたので、ものは試しと、VS2017 にインストールしてみた所、確かにそれっぽい動きになっていて、縦方向の移動が格段に楽になる。
しかし、この拡張機能、オフィシャルにはVS2017までしか対応してなくて、自分の現行の開発環境は VS2019 。

しょうがないので、 Visual Studio の拡張機能の開発はやったことないけど、何とかなるんじゃないかマインドで、Easymotion のソースコード落としてきてビルドしなおしたら、なんかそれっぽく動いたので、その時のメモを残す。

(というわけで、記事のタイトルは「Visual Studio 2019でEasymotionが使えるようにした」ではあるが、同様の方法で、VSの所望の拡張機能が自分のVSのバージョンに対応していない場合に対応できるかもしれない(もちろん、処理の実装がちゃんとしていることが前提だが))

やったこと

以下の調子でやってみたら、なんかうまい事いったっぽい。ホンマかいな、という気もするが…。

  1. guthub のリポジトリから Easymotion のビルド環境一式を落としてくる。
  2. Visual Studio 2019 を管理者権限で起動して、落としてきたビルド環境を開く。
    • 当初、ユーザ権限で起動・ビルドしたら、"GenerateFileManifestが見つからない"云々というエラーでビルドできなくなって少しハマった。
    • このIssueによると、管理者権限で立ち上げてビルドしたらうまいこと行くぜ、的なことが書かれていたので、従ったらうまくビルドできた。これがなぜ管理者権限でうまいこと行くのかは、イマイチ腑に落ちないが…
    • ちなみに、このIssue自体はまだopenなので、環境によってはこの方法でも解決しないかもしれない。
  3. ソリューションエクスプローラーで、source.extension.vsixmanifestを開く。
  4. Install Targetsを開くと、まさしくインストールするターゲットの設定らしきものがあるので、既存の設定を選択して、Editボタン押下で、Version Range[14.0, 16.0)から[14.0,18.0)に変更する。
  5. Prerequisitesを開くと、同じような設定があるので、同様に変更する。
  6. これで、ビルドを実行して、成功すると、$(SolutionDir)EasyMotion\bin\ReleaseEasyMotion.vsixができるので、これをダブルクリックして、ターゲットの環境にVisual Studio 2019が入っていれば成功。

オチ

ちゅうわけで、無事 VS2019 に Easymotion が入ったのだけれども、vsvim との相性があまりよくないようで、インサートモードでジャンプすると、ジャンプしたときに入力したリンク文字が挿入されてしまい、ノーマルモードでジャンプしようとするとノーマルモードのコマンドとして認識されてジャンプされない、というオチがついた。

まとめ

ので、vsvim を優先する現状では使えない…。これについては、もう少し調べて、解決できたらまた記事にする予定。

Vimプラグイン開発でCI

$
0
0

アドベントカレンダーの2本目ですが、1本目は時間的に後に出ますw

Vimプラグイン開発

現在、開発といえば、CIでの継続的テストなどは必須に近いところがあります。
ただ、これをVimのプラグイン開発でやるとなかなか大変です

  • Vimのスクリプトでテストが難しい(が、まだこれは易しい方)
  • Vimという単体で完結するものについて、テスト結果やエラーなどのレポートの連携が難しい
  • 他の事例を流用するのが簡単ではない
  • そもそも事例があまりなくてわからない(これが一番?)

CI

上記に対して、優秀なVimプラグイン開発者の方々は様々に対応し、それなりに実績を蓄積してきています。
ただ、それでも流用しにくいところはあり、結果としてそこまで広く実施されているとも言えないかもしれません。

今回の例にするのは、vim-jpで開発されている プラグイン支援ライブラリ vim-jp/vital.vimの流儀にそった自分開発ライブラリtsuyoshicho/vital-codec (vital.vim へ contribを目標にしている)のテスト環境についてです。

GitHub Actions

vital-codec のテスト環境ですが、当初は vital.vim の内容を流用させてもらっていました。

それにより

  • Travis CI
    • vim-themisによるテスト実行マトリクス (LinuxでVim 8.0/8.1/latest、MacでMacVim latest)
    • lint系ツール詰め合せによる lintチェック (Linux)
  • AppVeyor
    • vim-themisによるテスト実行マトリクス (WindowsでVim 8.0/latest)
  • Codecov (上記のvim-themisのテスト結果はすべて集計されてカバレッジを明確化)

これ自体はかなりの充実度であり、現時点でできる網羅性としては高いものと言えます。

ただ、その実としていくつか問題がありました。

  • lint の結果報告をする reviewdogがそのための token 取得に失敗してテストNGになることがある
  • lint 系が1セットなので、なにかでlint自体がNGになると以降が実行されない
  • テスト実行が遅い
  • reviewdogによるPRへのコメント追加、Codecovへの登録など、いくつかのsecret情報のあつかいの面倒さ

これらの解決とテスト(というかCI的作業項目)の流用性を高めるためにGitHub Actionsでの実行への切り替えにトライしてみました。

結果と内容

結果としてすべて移行できました。

作業方針

まず、作業項目を整理し

  • ビルドおよびテストマトリクス
  • lint と 例外送出チェック
  • ヘルプのタグチェック

へ作業を分解し、それぞれに対応するActionを定義しました。

ビルドとテスト

中身としては、os x vim バージョンの組合せマトリクス、にしたかったのですが実行環境の細かい都合もあり、workflow定義で泥臭く実行処理を作りました。

Linux,Windows,macそれぞれのjobを定義し

  • Linuxは8.0/8.1/latestについてビルドしてのテスト実行
  • Windowsは8.0/latestをダウンロードしてのテスト実行
  • macはMacVim latestをダウンロードしてのテスト実行

と旧来のCIをほぼそのまま移植しています。
ただ、Windowsは処理の都合、PowerShell/Cmdをうまく使ってまわすようにしたりしてます。

また、stepを越えた作業でのデータの引き継ぎできるところにインストールされない場合もあるので...各ツールのインストールのタイミングを変更したりしてます。

そしてCodecovへのレポートはactionで...
処理したかったのですが、結果としてそれはLinuxしか使えなかったので、Windows,macでは手動でやってます。

Lintと例外

lint自体は1つのworkflowに定義はしましたが、jobを分割し、個別に並列実行されるようにしました。

中身は、vint、misspell、vimlint、vital-throw-message(例外チェック) です

vint

reviewdogのオフィシャルのactionである

を利用

PRであれば、チェック結果の埋め込みもします

misspell

reviewdogのオフィシャルのactionである

を利用

vimlint

既存の処理方法を流用して、自作でactionを作成

PRであれば、チェック結果の埋め込みもします

vital-throw-message

これはvitalに特有な所があるので、リポジトリ内にactionを作りました。
関連のソースは持ち込みしてます。

チェック

vimのヘルプは検索のためhelptagを生成します、この時にタグ名がかぶるとエラーになります。
このチェック自体はかなり汎用的ですが、reviewdogでの通知とかには向きません。

なので、完全に個別のworkflowとして作成し(別jobなら問題ないんですが、reviewdog使いませんからね)、その成功失敗だけでチェックします。
そのためのactionも作成しています。

結論

結果として、流用しやすい(主観)定義と、codecovのtokenのGitHubでの管理、reviewdogはtoken不要と、流用性が高いものが作れたと思います。

OpenSiv3D Linux版をVimで

$
0
0

はじめに

この記事はSiv3d Advent Calendar 201918日目の記事です。

今回やること

OpenSiv3D Linux版はCMakeを使ってビルドを行います。
Vimmerの私はプロジェクトの作成、ビルド、実行を全部Vimからできれば便利だと思い、プラグインを作成しました。
それがこちらになります。
https://github.com/higashi000/opensiv3d.vim

※プラグインの名前がnamespace的にやばいので新しい名前が決まり次第すぐに変更します。

補完の話

前もって書いておきますが、このプラグインでは補完はサポートしません。
というのも、vim-lspやcoc.nvim、LanguageClient-neovimといったプラグインを使ってlspを使えば簡単にOpenSiv3Dの補完ができるからです。

それぞれのプラグインのオプションにルートディレクトリの指定のオプションがあるので、そちらでプロジェクトをビルドした際に吐かせるcompile_commands.jsonを読み込むようにするだけです。

sample(vim-lsp)

if executable('ccls')auUser lsp_setup call lsp#register_server({      \'name':'ccls',      \'cmd':{server_info->['ccls']},      \'root_uri':{server_info->lsp#utils#path_to_uri(lsp#utils#find_nearest_parent_file_directory(lsp#utils#get_buffer_path(),'compile_commands.json'))},      \'whitelist':['c','cpp'],      \})endif

実装したい機能

  • プロジェクトの作成
  • CMakeLists.txtへビルド対象のソースファイルを追加
  • ビルド(cmake, make)
  • 実行

実装できた機能

実行以外の機能は実装しました。

使い方

OpenSiv3Dをビルド

まずはOpenSiv3Dをgit cloneしてきます。
その後、ビルドし、cloneしてきたリポジトリごと、.cacheに配置します。
下記コマンドのようにディレクトリを作成、ビルドしてください。

$ git clone https://github.com/siv3d/OpenSiv3d ~/.cache/OpenSiv3D
$ cd ~/.cache/OpenSiv3D
$ git checkout linux
$ mkdir Linux/Build
$ cd Linux/Build
$ cmake -DCMAKE_BUILD_TYPE=Release -GNinja ..
$ ninja

プロジェクトの作成

$ mkdir TestProject
$ cd TestProject

等でプロジェクトのディレクトリを作成、移動してください。

  • OpenSiv3DInit

というVimコマンドがあるのでプロジェクトディレクトリ直下で実行するとそのディレクトリにプロジェクト(CMakeLists.txt、resources、src)が作成されます。

ここでresourcesが存在しない等のエラーが出た場合は.cache下に配置したOpenSiv3Dのディレクトリの名前等が間違っている可能性があります。

プロジェクトのビルド

プロジェクトがあるディレクトリでvimを開き、
- OpenSiv3DBuild
を実行するとcmakemakeが実行されます。

ビルド対象ソースコードの追加

追加したいソースコードを開いた状態で
- OpenSiv3DSourceAdd
を実行することで追加できます。

このプラグインの今後

名前を変えます。
この名前を保持し続けるのは他のプラグインのnamespaceとの衝突を招くため、なるべく早く(年内には)新しい名前を決めて変更します。

また、まだまだ未完成なのでこれからより完成度を高めていきたいです。

vimrc設定方法について 

$
0
0

動作環境

Windows10,64bit
Oracle VirtualBox 6.0.14
CentOS-7x86_64-DVD-1908 linux redhat64bit

vimrcのパスを調べる

まず、vimrcがどこにあるのか探してみる。ターミナルに

$vim --version

と入力するといろいろずらずらと表示される。
image.png
この中でvimのパスは下図の部分に書かれている。
image.png
基本的に編集するのは一番上のシステムの部分で問題ないと思うが、システムの部分のvimrcは読み込み専用ファイルになっており、通常のユーザーでは編集することができない。私の場合はsudoコマンドを使うことで編集が可能となった。vimrcのパスについては各自で変えてください。

$sudo vim /etc/vimrc

管理者権限のない方に向けて
管理者権限のない方でもユーザごとにvimrcの設定ができる。大学のサーバにアクセスするような方はユーザとして登録されているので先ほどのユーザの部分をパスに指定して新規にvimrcを作ることができる。私の環境では以下のコマンドを使うことで編集可能であった。~は/home/userを表します。

$vim ~/.vimrc

vimrcのカスタマイズ

vimrcのカスタマイズについてはいろんな方がわかりやすく解説してくださっているのでそちらを参考にしていただいた方がいいと思います。
https://qiita.com/marrontan619/items/541a1374e1ac672977e6
そんなにこだわりのない方は以下の設定をコピペしておけば問題ないでしょう。

set title↲
set ambiwidth=double↲
set tabstop=4↲
set expandtab↲
set shiftwidth=4↲
set smartindent↲
set list↲
set listchars=tab:»-,trail:-,eol:↲,extends:»,precedes:«,nbsp:%↲
set nrformats-=octal↲
set hidden↲
set history=50↲
set virtualedit=block↲
set whichwrap=b,s,[,],<,>↲
set backspace=indent,eol,start↲
set wildmenu↲

insertモードでのカーソル操作

insertモードでわざわざノーマルモードに戻らずにカーソルを動かしたいという時があると思います。
その際はvimrcに以下のキーマップを追加することをお勧めします。私はUnix配列のキーボードであるHHKB Professional JPを使っているのでemacsのカーソル操作と同じもの割り当てておきました。

imap <C-p> <Up>↲
imap <C-n> <Down>↲
imap <C-b> <Left>↲
imap <C-f> <Right>↲

カラースキームの変更について

https://qiita.com/sff1019/items/3f73856b78d7fa2731c7
この方が非常にわかりやすくまとめてくださっているのでこちらを参照してください。
私は新たにテーマをダウンロードするのが面倒だったのでデフォルトで入っているdarkblueを使っています。vimrcに以下のように追加することで設定できます。

syntax enable↲
colorscheme darkblue↲

iVimでvimrcを設定する。IPadやIPhoneでもvimが使える!

$
0
0

ivimとは

AppStoreでダウンロードするだけで使える。vimのことです。専用のキーボードがついているため、通常のタッチ操作だけでもesc,Ctrlキーなどを使うことができます。

どんな人に向けての記事か

Vimの操作になれたい!もしくは慣れすぎてしまったのでIPadやIPhoneでもvimを使いたい!というvimを愛してやまない方がivimというアプリを使って快適にコーディングするお手伝いができればと思い記事を書きました。私自身は2019.12.19現在、vimmer歴1か月未満の絶賛勉強中ですので普段からvimを使って体になじませていこうと考えてivimを使っています。慣れてきたのでカーソルキーを使うのが面倒になってきたというのもありますが。

動作環境

①IPad第六世代 Software Version 13.1.2
②IPhoneSE Software Version 13.1.3

before-after

皆様にモチベーションを上げていただくためにもvimrcの設定前と後の変化をお見せします。パッと見た感じではあんまりわからないかも...

image.png

image.png

vimrcのパスを探してみる

まずやってみたのはvimrcのパスを調べることです。

echo $VIM

とするとvimrcのパスが表示されます。

e $VIM/vimrc 

とするとvimrcを開くことができました。しかし、readonlyfileなので編集できないようです。
これには困ってしまったのでGoogle先生の力を借りましょう。

vimrcの設定 ~たすけて!Google先生!!~

https://www.atmarkit.co.jp/ait/articles/1201/25/news149_3.html
このサイトにざっくりですがvimrcの導入方法が書かれていました。ざっくりで苦労したので、ここで詳しく解説していこうと思います。
まずvimrcのファイルをカレントディレクトリに作ります。
おそらくこれは通常のvimで$vim --version実行すると表示されるもののシステムではなくユーザの方のvimrcにあたるものと思われます。

e .vimrc

そしてこのファイルに

set number

を入力して:wqで一度終了してivimを再起動すると変更が反映されていました!!!

vimrcを手打ちしたくない人へ

vimrcが使えたのはうれしいのですが、ひとつ問題がありました。それはスマートフォン側でコピーしたものを直接ivimに貼り付けたり、逆にコピーすることができないということです。スマートフォンの小さな画面でvimrcの設定を打つのは嫌なのでファイルの共有ができないか調べました。

そこでわかったのはIOSのデフォルトアプリを使えばファイルの内容を共有できるようです。しかし、このアプリでは隠しファイルを表示する方法がわからなかったので別名で外部から持ち込んだファイルの名前をvimのEXコマンドを使って、名前を変更することにしました。
image.png
まずは、PCでいつも使っているCentOS7のvimrcの内容をコピーしてメモ帳に貼り付けました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455763/0bbf03b4-1feb-807d-b747-6107220a6d2b.png
これをPC版のItunesを使ってスマートフォンに送ります。ファイル共有→iVimを選択し、ドラッグ&ドロップするだけでファイル共有が完了します。
image.png
ここからは、iVimでの操作に移ります。

e .

としてiVimのカレントディレクトリにコピーしてきたファイルがあることを確認します。
その後カーソルを動かしてvimrc.txtを選択して開きます。
自分の場合だとvimrc.txtの名前になっていたのでファイルを開いた状態でカレントファイルの名前の変更を行います。

:call rename(expand('%'), '.vimrc')  #変更前ファイル 変更後ファイル

%がカレントファイルを表すので、その名前を.vimrcに変更します。
しかし、なぜか変更が反映されません!!
理由はわかりませんが、外部からいれたファイルにはpermissionが通らないとかあるんでしょうか?
しかし、先ほどvimrc側で作ったファイルは動いたので、新規ファイルを作りなおして持ってきた内容をコピーすればきちんと動作するはずです。

:call rename(expand('%'), '.vimrc2' #名前の変更
gg #カーソルを先頭行に
V-G y #全選択してヤンク(コピー)
:e .vimrc #新規.vimrcの作成
p #プット(貼り付け)
:wq

上記の操作を行ったところ、無事変更が反映されました。
*名前を間違ってしまったりいらないファイルを作成してしまったときには隠しファイル以外はファイルアプリで消せますがコマンドで消すなら

:call delete(expand('%'))

とすると開いているファイルを消すことができます。
vim単体でもファイル操作は結構できるようですが、普段はPCでファイル操作するのでivimをメインで使わないという方はファイルの作成とデリートぐらい覚えておけばとりあえず困らないでしょう。

補足 ivimでの文書作成、コーディングなど

IPadなどでコーディングをする際にivimを使った後直接のコピペはできませんが、先ほど紹介したファイルアプリを使うことで作成したファイルを外部に持ち出せます。
ファイルアプリを開きivimを選択。selectボタンを押して、持ち出したいファイルにチェックをつけてノートなどに貼り付けるたものはコピペしたりもできます。
image.png

それではみなさんが楽しいvimライフを送られることを祈っています


sbt consoleのキーバインドをvimに変更していく

$
0
0

はじめに

sbtは立ち上げっぱが前提となっているcliですよね。1
そうすると困るのはなんでしょう。
そうです、キーバインドですね。
普段のshellではせっかくvimなどのキーバインドを使用していても、sbtになると突然バインドは失われます。
衰退です。
そんなお困りのscala民のためにsbtでもvimキーバインドを使用できるように設定しましょう。

設定方法

簡単です。
$HOME/.inputrcに以下を追記しましょう。

set editing-mode vi

これで平和が訪れます。

.inputrcとは

そもそも.inputrcとは何でしょう。
実態はlinuxの設定ファイルです。
具体的にはreadlineという行操作を支援するライブラリの設定を行うための設定ファイルです。
bashを始めとする各CUIはこのライブラリを利用して行操作を実現しています。
ここから察するにおそらくsbtもreadlineを利用しているのでしょう。

まとめ

sbtを使うイライラもこれで解消。

参考

https://stackoverflow.com/questions/53458458/using-vim-in-scala-sbt-console-scala-repl
http://x68000.q-e-d.net/~68user/unix/pickup?%7E%2F%2Einputrc
http://x68000.q-e-d.net/~68user/unix/pickup?readline


  1. scala界の象徴こと水島さんのブログを参考(http://kmizu.hatenablog.com/entry/2017/05/06/160822

最速最短でターミナルカスタマイズをする。

$
0
0

はじめに

初めまして!DMM WEBCAMPでメンターをしている@y-hirako0928です。

この記事では、日々プログラムを書いていく中で頻繁に使うターミナルを使いやすく、カッコよくしていく方法を紹介していく記事です。

ターミナルといえば、黒い背景に白い文字。実行された結果も全部白文字。

正直、ダサくないですか?
もっとかっこいいターミナル、欲しくない?

この質問にYES!と思った人は、ぜひぜひターミナルを自分の思いのままにカスタマイズしていきましょう!

この記事に書かれていること:
Macのターミナルに使えるカスタマイズ知識
カスタマイズ未経験者向けの簡単な解説
最低限のカスタマイズの例
さらに進んだカスタマイズをする場合に便利な記事一覧

この記事に書かれていないこと:
・windowsのコマンドプロンプトやPowerShellのカスタマイズ
・シェルについての詳しい解説
・zshプラグインなど、外部ツールやインストールが必要なツールを用いたカスタマイズについて

1. iTerm2を導入しよう

iTerm2とは、ターミナルと同じコマンドラインツールです。
この記事では、ターミナルのカスタマイズよりもiTerm2を導入し、カスタマイズすることをオススメしています。

iTerm2

スクリーンショット 2019-12-19 2.55.05.png

iTermは

ターミナルを素早く&カッコよく開く設定をつけることができる!
画面収録 2019-12-18 1.32.16.mov.gif

私は、controlを2回連続で入力するとしたからニュッ!とiTerm2のコマンドラインが表示されるように設定しています。設定を変更すれば上部、右側、左側からニュッ!と表示できるように設定することもできます。

ね?かっこいいでしょ?
かっこいい以外にも、ブラウザでサイトをみながらちょっとしたコマンドを実行したい時にも便利に使えます。

また、iTerm2は設定できる項目が多く、ユーザーの好みに合わせてより細かなカスタマイズができます。

iTerm2のインストールに特別な設定は必要ありませんので、外部アプリをダウンロードする手順を素直にこなしていけば問題なくダウンロードできます。サイトのDownloadをクリックし、アプリを起動してみましょう。

もし、細かい手順を知りたい方はこちらの記事を参考にすると良いかもしれません。

初心者向け iTerm2のインストール方法 - Qiita

ニュッ! と飛び出るターミナルの設定方法

  1. iTerm2 > preferences...をクリックして設定を開きます
    スクリーンショット 2019-12-19 3.14.29.png

  2. ホットキー用の設定を作ります
    メニューからProfileを選び、+をクリックして新しいプロファイルを作成。舐めをわかりやすいようにHotkey windowを作ります。
    こうすることで、windowHotkey windowの二つを同時に使うことができます。
    スクリーンショット 2019-12-19 3.17.31.png

  3. keyメニューに移り、A hotkey opens a dedicated window with this profileの項目にチェックを入れ、configure Hotkey WindowをクリックしてHotkeyの設定画面を開きます。
    スクリーンショット 2019-12-19 3.23.27.png

  4. ホットキーを開くためのアクションをここで自由に設定することができます。
    個人的にオススメは、^Controlキーのダブルタップでニュッ!と開く設定です。もし同じ設定にするならば、Double-tap keyの項目にチェックを入れ、^Controlを選択すると良いでしょう。
    スクリーンショット 2019-12-19 3.28.27.png

これで、カッコよくターミナルを開く設定は完成です。
もし細かくカスタマイズをしたい場合は設定項目を調べてみると良いかもしれません。
iTermの設定に関しては、Qiitaやその他のサイトで設定例を公開している方がたくさんいらっしゃいますので、そうした記事を参考にしてみるのも良いかもしれません。

記事によってはバージョンが古く、レイアウトが変わっているため設定を読み解く若干の英語力が必要になってきます。まぁ、エラー文を読む労力とそこまで変わらないと思いますのでぜひぜひチャレンジしてみてください。

これまで私がカスタマイズしていく中で参考にした先駆者様の記事一覧
僕がiTerm2を使ってる理由 - Qiita
iTerm2のHotkeyを使わないなんてもったいない!! - Qiita


2. .zshrcを見つけよう

では、シェルの設定をしましょう。

設定を始める前に、現在使っているシェルを確認しましょう。

hogehoge[~] % echo $0
-zsh

hogehoge[~] %

シェルという言葉に聞き馴染みがなかったら、”ターミナルの中で動いているプログラム、パソコンを動かす時に使うプログラムなんだなー”ぐらいのイメージでOKです。

(ちょっと知っている人向けの蛇足)
ここで、少しシェルを齧ったことがある方であれば、なんでbashじゃなくてzshなの?と疑問に思うかもしれません。zshのカスタマイズ方法を書いている理由としては、macOS 10.15 Catalinaからデフォルトシェルがbashからzshに変更されたからです。
おそらく、macを最近買った方や、Catalinaにアプデートしている方のターミナルはzshが動いているハズなので、zshの設定ファイルをカスタマイズすれば問題ないと思います・・・!

自分は、Catalinaになる前からzshを使っていたため、アップデート後自動的にbashからzshに変わるかどうか定かではありません。もし「echo $0って入力したら-Bashって表示されたよー!」とか、「echo $SHELLと入力したら/bin/bashと表示されたよー!」などの現象がありましたら、コメント蘭でMacのバージョンを添えてお知らせいただけると幸いです。

まず、設定ファイルがある場所を確認します。
cd ~
でrootディレクトリ へ移動してください。

ls -a
で、カレントディレクトリ内にある隠しファイルを探しましょう。
.zshrcというファイルがあれば、それがシェルの設定ファイルです。
もしも.zshrcファイルが存在しなければ、source .zshrcで.zshrcファイルを作りましょう。

hogehoge[~] % ls -a
~(その他いろいろなファイルやディレクトリ)~
.zprofile
.zsh_history
.zshenv
.zshrc

hogehoge[~] %

rootディレクトリに.zshrcがあることが確認できましたら、いよいよ.zshrcの編集に移ります。

3. vimの基本的な使い方

設定ファイルの編集にはVimを使うと良いでしょう。.(ピリオド)から始まる設定ファイルは、Sublime TextやVisual Studio Codeのようなスクリプトエディタを使って編集することができないファイルです。
(カスタマイズ次第でできると思いますが、vimと触れ合う良い機会ですのでvimを使ってみましょう。)

Vimを使って設定ファイルを開いてみましょう。

hogehoge[~] % vi .zshrc

(もしファイルが見つからなければ、cd ~ でディレクトリを変えてから実行してみましょう。もしそれでもファイルが見つからなければ、touch .zshrcのコマンドを入力してください。)

すると、Vimのエディタが起動し.zshrcファイルの中身を見る事ができます。

Vimではコマンドを実行して保存などをします。

コマンド実行結果
escノーマルモードにする。(コマンドを入力できる状態にする)
i入力モードにする。
: wファイルの変更を保存する。
:wq変更点を保存してvimを終了する。
:q!変更点を保存せずにvimを終了する。

vimの操作についてさらに詳しく知りたければこちらのサイト( 知識0から始めるVim講座 - Qiita )や、vim 入門などのキーワードで調べてみてください。
また、ターミナル上でvimtutorのコマンドを実行すると、vimの日本語チュートリアルを見ることができます。

4. 簡単におしゃれにしたい人向け(コピー&ペーストでOK!)

1. Simple is the best
PROMPT='%*
%F{green}[%~]%f %# '

スクリーンショット 2019-12-18 1.50.51.png

現在の時刻と、カレントディレクトリを表示するプロンプトです。
作業時間を意識するため、常にプロンプトの脇に時間が表示されるようにしています。
(私はこのスタイルにしています。)

2. 見慣れたデフォルトプロンプトをカラフルに!
PROMPT='%F{magenta}%B%n%b%f@%F{blue}%U%m%u%f %F{green}[%~]%f %# '

スクリーンショット 2019-12-18 2.17.03.png

ユーザー名と現在利用しているPCの名前、カレントディレクトリを表示するプロンプトです。

User_name@UsernoMacBook-Pro ~ %

Zshプロンプトのデフォルトデザインがこんな感じなので、デフォルトデザインに慣れている人にとっては見やすいプロンプトかもしれません。

3. 左右を広く使ったプロンプト
PROMPT='%F{green}[%~]%f %# '
RPROMPT='%*'

スクリーンショット 2019-12-18 2.27.17.png

PROMPT='%F{magenta}%B%n%b%f@%F{blue}%U%m%u%f %# '
RPROMPT='%F{green}[%~]%f'

スクリーンショット 2019-12-18 2.43.40.png

RPROMPTで右側にもプロンプト の設定をすることができます。

4.コマンド実行結果ごとに、改行を入れたい!
PROMPT='
%*
%F{green}[%~]%f %# '

スクリーンショット 2019-12-18 2.39.54.png

プロンプト の頭に改行を入れるとこのようになります。
隙間が空いている方が見やすい!という方は、改行をしてみましょう。

ここまでカスタマイズができれば、だいぶ使いやすいターミナルになってきたと思います!

5. さらに自由なカスタマイズがしたい!(オススメ参考資料)

ここからは、ここまでのカスタマイズでも満足できない!もっとカスタマイズしたい!向けです。

紹介したカスタマイズの例で使用しているコードの意味をまとめていきます。

プロンプトの設定
PROMPT=''
RPROMPT=''

zshのプロンプトは、PROMPT=以降に書かれた内容は、コマンドラインの左端に表示。
RPROMPT=以降に記述した内容は、コマンドラインの右端に表示されます。

文字に色をつける
%F{color}お好きなコマンド%f

%F{color}%fで挟まれた場所は、colorで定義した色に文字色を変えます。
ここで使っているコマンド以外にも背景色を設定するやり方もあったりします。
詳しくは、こちらのQiitaを参考にすると良いです。

zshでプロンプトをカラー表示する - Qiita

その他のコード
コード出力
%#プロンプト右端の%
%~カレントディレクトリ
%nユーザー名
%mホスト名
%Bお好きなコード%b太文字
%Uお好きなコード%uアンダーバー

その他にも出力できる項目はまだまだありますので、調べてみると面白いかもしれません!

zshプロンプトのカスタマイズ - Qiita
zsh 設定 - プロンプト -

沼に挑戦したい方

fishシェルを導入してみよう!
何も、シェルはbashとzshしかないわけではありません。
世の中にはfishシェルというシェルも存在します。
もし、自分が今使っている環境以外のシェルにも興味が湧いたら、導入してみると楽しいですよ・・・!

fish shellが結構良かった話 - Qiita

shellスクリプトを勉強してみよう!

こんなサイトがあります。一通り中身に目を通せば、シェルスクリプトの意味がだいたい理解できるようになるかも・・・?

UNIX & Linux コマンド・シェルスクリプト リファレンス

もうここからは趣味の領域になってきます。興味がある人はググってみてください!

終わりに

ターミナルのカスタマイズは、ハマると結構楽しいです!oh-my-zshを導入してみたり、zshの補完機能を強化したり、gitのbranch名やcommit状況を表示するなどなど、できることは無限大と言って良いでしょう。
本当にハマってしまうと一日中ターミナルのカスタマイズを永遠とカスタマイズしてしまう・・・なんて状況も発生してしまうかもしれません。

もちろんハマってみるとかなりプログラミングの勉強になります。私も、bashやzshのカスタマイズを通じて、隠しファイルの存在やプログラムファイルの保存場所、ディレクトリの概念や"PATHを通す"という概念に触れることができました。

ポートフォリオ作りに疲れた時、休みの日にターミナル環境弄りに挑戦したいなと感じた時、時間に余裕があって心に余裕がある時。そんなタイミングがありましたら、ぜひターミナル環境弄りにハマってみてください!

う し た ぷ に き あ く ん 笑 . v i m 

$
0
0

はじめに

この記事では、私が作成した(ネタ)プラグイン「ushitapunikiakun.vim」の紹介をします。

Q. 「う し た ぷ に き あ く ん 笑 っ て な ん で す か 笑 ? 」
A. 「知 り ま せ ん 笑 」

正直よくわかっていません。(は?) 競技プログラミング界隈でいつの間にか流行っていました。
詳しくはここを見てください。

どんなプラグイン?

皆さんは、以下のツイートのように文字列に1文字ずつ空白を入れた文章を作ったことはありますか?

ありますよね?? 特にTwitter廃人の方はあるかと思います。
しかし、全文字間に空白を入れるのは普通に面倒くさいです。特に、文字列内に漢字が入ったりアルファベットが入ったりすると余計に面倒くさいと思います。

このプラグインを使うと、Vimに書かれている文字列の間に全角空白を挟み込むことを容易にします。

プラグイン紹介

使用例

Ushitapunikiakun

:Ushitapunikiakunで、現在の行に全角空白を挿入します。

うしたぷにきあくん笑

↓ (:Ushitapunikiakun)

う し た ぷ に き あ く ん 笑

ちなみに現在の行が空だった場合、う し た ぷ に き あ く ん 笑が挿入されます笑。
この文字列は、設定することができます。

UshitapunikiakunAll

先のコマンドが現在の行だけだったのに対し、このコマンドはVimの文字すべてに空白を挿入します。

設定

挟み込む文字はデフォルトでは全角空白ですが、変更することもできます。変更する場合は.vimrcに以下のように記述します。

letg:ushitapunikiakun#insert_str ='🐮'

このように設定すると、Ushitapunikiakunコマンドの結果は以下のようになります。

う🐮し🐮た🐮ぷ🐮に🐮き🐮あ🐮く🐮ん🐮笑🐮

また、文字列が空だった場合に入力する文字は、ushitapunikiakun#empty_strの値で設定できます。

便利な利用例

藤原竜也っぽいセリフを生成する

letg:ushitapunikiakun#insert_str ='"'

とすると、藤原竜也っぽいセリフを生成できます。(お好みで'" 'などを設定すると良いです。)

demo

huziwaranikiakun..gif

firenvimと組み合わせる

https://github.com/glacambre/firenvim
こちらのfirenvimというプラグインを用いると、ブラウザのテキストボックスに自分のNeovimを展開することができます。
このプラグインを合わせると、とても簡単にうしたぷにきあくん構文をツイートすることができます。
これはTweetDeckでの利用イメージです。

demo

「う し た ぷ に き あ く ん 笑」や任意の文字列のうしたぷにきあくん笑構文をTweetdeck内で素早く作成しています。
 
tweetdeck.gif

Firenvimについては、いつか別記事で便利な設定例なども紹介したいなと思っています。
思っていましたが、Vim advent calendar 201914日目の記事にてすでに良い記事が公開されていました!

(ちなみにこの記事も、Neovim in Qiitaによって書いています)

実装について

とくに興味がなければ、最後にまでとんでください。

結論からいうとこのプラグインは

s/\(.\)/\=submatch(1).g:ushitapunikiakun#insert_char/g

というシンプルな文字列置換をしているだけにすぎません。ただ、この実装に行き着くまで時間がかかってしまいました。
この章ではVimscript初心者が、この実装に行き着いた経緯を書こうと思っています。

for文による実装

はじめ、このプラグインは「2重for文で行、文字を順に見て、g:insert_charを使って空白入り文字列を作り直す」という実装を考えていました。
具体的には、

letl:source_code_list = getline(0,'$')fors:lnumin range(len(l:source_code_list))letl:newline =''fors:cnumin range(strlen(l:source_code_list[s:lnum]))letl:newline =l:newline .l:source_code_list[s:lnum][s:cnum].g:insert_charendforcall setline(s:lnum+1,l:newline)endfor

という実装をしていました。
ちなみに、このコードを書いているときはスコープや名前空間の重要さなどをよくわからずに変数名を定義しています…。今もスコープについては理解しきれていないかもです……。
(当初と現在は変数名などが一部異なっています)

しかし、このコードを日本語に適用するとバグが発生することがわかりました。
以下のコードを試してみてください。

let japanese ="あいうえお"foriin range(strlen(japanese))echon japanese[i]endfor

(少なくとも私の環境では)結果はこうなります。

<e3><81><82><e3><81><84><e3><81><86><e3><81><88><e3><81><8a>

(おそらくUTF-8の文字コード?)

つまり、日本語にこの関数を適用しても<e3> <81> <82>...のように、想定していない文字列を生成してしまいます。
この問題を修正するために、実装を変更する必要がありました。

正規表現による実装

しばらく、「どのようにすれば日本語の文字単位でfor文を使えるようにできるか」考えていましたが、次第に「文字列置換なら正規表現で実現できるのでは?」と考えるようになりました。しかし、

%s/\(.\)/\1 /g

このコードなら全角空白を挿入することができますが、変数g:ushitapunikiakun#insert_charによるカスタムができなくなってしまいます。
色々調べたのですが、後方参照と変数の挿入を同時に実現する方法がどうしてもわからず、vim-jpのSlackにて質問をしてみたところ、解決することができました。

最終的な実装

最終的に、\=submatch()関数を使うことで解決しました。
\=は聞いたこともなかったのですが、helpによると「置換文字列が "\=" で始まるとき、それ以降の文字列は式として解釈される。」ようです。(詳しくは:h sub-replace-expression)
式として扱われるので、変数や関数の呼び出しができるようになる、というわけですね。

ということで、最終的に

s/\(.\)/\=submatch(1).g:ushitapunikiakun#insert_char/g

という実装になりました。
(実際にこのプラグインを使用してみて、全文にこの関数を適用したいと思うことがなかったので、現在の行に関数を適用するよう修正されました。)

最後に

質問に答えてくださったvim-jpの皆様、ありがとうございました。
Vim plugin作成経験やVimscript経験などまだまだ浅いので、何か間違っているところやより良い実装、改善案などがありましたら、この記事のコメントやIssues、PRにお願いします。:bow:

Vim で Prettier かけながら、TypeScript の型チェックを行う(with vim-lsp)

$
0
0

この記事は Vim Advent Calendar 2019向けに書かれました。
もう一つネタがあって記事を書いていたのですが、
なんか微妙な出来だったので Advent Calendar とは別として投稿しようかなと思っています。

はじめに

この記事は

  • Vim を使っている
  • vim-lsp を使っている
  • TypeScript を書いている
  • prettier/eslint を連携させたい!

な人向けの記事です。

本題

vim-lsp を使って TypeScript の開発をしているならば、
使っている言語サーバは typescript-language-serverではありませんか?

よく出来ていますよね。快適です。

しかし、自分は下記の点が物足りませんでした。

Prettier でフォーマットできない

今どきのフロントエンドの現場であれば、Prettier を使うことが多いと思います。
当然ながら typescript-language-serverによるフォーマットは Prettier によるそれではありません。

eslint のエラーが検出できない

typescript-language-serverを使えば型エラーが即座にわかります。最高!
しかし、動作するコードでも lint を通らなければコミットはできません。
コードを書いている最中に unfixable な eslint エラーを知れたら嬉しいですよね。

解決方法

efm-langserver、もしくは diagnostic-languageserverを利用しましょう。

これらは linter/formatter などの CLI ツールを、LSP のインターフェースでラップしてくれる言語サーバです。
つまり、vim-lspから eslintなどを利用できるようになります。

しかし、はっきりいって設定はちょっと難しいです。
そのため、ここに eslint向けの設定を書いてしまいます。
prettiereslint --fix経由で実行することとしましょう。
eslint経由で prettierを走らせる方法は他の記事をご参照ください。

設定方法

diagnostic-languageserver のインストール

npm i -g diagnostic-languageserver

eslint_d のインストール

npm i -g eslint_d
※ これを入れると、リントのパフォーマンスが劇的に向上します。

vim-lsp に設定を追加

  autocmd! vimrc User lsp_setup call lsp#register_server({        \'name':'diagnostic-languageserver',        \'cmd':{ info ->['diagnostic-languageserver','--stdio']},        \'whitelist':[        \'typescript',        \'typescript.tsx',        \'typescriptreact',        \'javascript',        \'javascript.jsx',        \'javascriptreact',        \],        \'initialization_options':{        \'linters':{        \'eslint':{        \'sourceName':'eslint',        \'command':'eslint_d',        \'args':['--stdin','--stdin-filename=%filename','--no-color'],        \'rootPatterns':['.eslintrc','.eslintrc.js'],        \'formatLines':1,        \'formatPattern':[        \'^\s*(\d+):(\d+)\s+([^ ]+)\s+(.*?)\s+([^ ]+)$',        \{        \'line':1,        \'column':2,        \'message':[4,' [',5,']'],        \'security':3        \}        \],        \'securities':{        \'error':'error',        \'warning':'warning'        \},        \},        \},        \'filetypes':{        \'javascript':'eslint',        \'javascript.tsx':'eslint',        \'javascriptreact':'eslint',        \'typescript':'eslint',        \'typescript.tsx':'eslint',        \'typescriptreact':'eslint',        \},        \'formatters':{        \'eslint':{        \'rootPatterns':['.eslintrc','.eslintrc.js'],        \'command':'eslint_d',        \'args':['--fix','--fix-to-stdout','--stdin','--stdin-filename=%filename'],        \'isStdout':v:true,        \'isStderr':v:true,        \}        \},        \'formatFiletypes':{        \'javascript':'eslint',        \'javascript.tsx':'eslint',        \'javascriptreact':'eslint',        \'typescript':'eslint',        \'typescript.tsx':'eslint',        \'typescriptreact':'eslint'        \}        \}        \})

※ 完全におまじないですね。
※ diagnostic-languageserver 向けの設定しか提供できず悔しいです。
※ efm-langserver に関しても設定をいろいろ試している最中です。うまく動いたら移行予定だし、記事を書きます!

vim-lsp でフォーマットする

eslintのエラーは勝手に表示されますが、フォーマットは下記のコマンドを実行する必要があります。

:LspDocumentFormat

まとめ

これで vim-lspを利用して、

  • TypeScript の賢い補完や型チェック、定義ジャンプを利用する
  • 合わせて、eslint による lint 結果を表示する
  • Prettier でフォーマットをかける

をすべて同時に満たすことができます。

vim-lsp は一つの filetype に複数の言語サーバを走らせることが可能で、強みです。
これに対応しているのは、coc.nvimvim-lspくらいしか知りません。

この設定を行って快適なフロントエンド開発をやっていきましょう!

以下、ハマった点など

TypeScript/JavaScript 両方への対応

eslintに STDIN 経由でファイルを渡した場合、そのテキストが TypeScript なのか JavaScript なのか eslintさんには判別できません。
そのため、--stdin-filenameにファイル名を渡してやる必要がありました。

eslintを毎回起動してるとめちゃくちゃ遅いし重い問題への対応

最初、eslint_dを使わずに設定をしていましたが、死ぬほど遅かったです。
いろいろ調査していると、eslint_dというものを見つけて組み合わせて解決しました。

Vim で使える LSP クライアント各種を使った感想

$
0
0

この記事は Vim Advent Calendar 2019向けに書かれていたのですが、やめました。
なんか、個人的な感想を羅列する記事になってしまい、微妙だったため。。。

はじめに

たくさん記事が出ているので皆さんご存知かもしれませんが、
最近の Vim は LanguageServer Protocolの台頭によって IDE ライクな機能が多数使えるようになってきています。

  • Go To Definition
  • (賢い)Completion
  • (ファイルを跨がった)Rename
  • Hover documentation
  • Signature Help
  • Formatting
  • Refactor

などなどです。

それもこれも Microsoft さんが LSP 仕様を策定し、
言語開発者達が Language Server を用意し、
Vim もどんどん進化を続けているからに他ならないなと思います。

この記事について

自分は LSP 向けのプラグインを多数試してきました。
そしてついには自作するに至りました。(どんだけ進捗を犠牲にしているのか…)
そういうわけで、この記事では多数あるプラグインを使ってみた感想を書いていこうと思います。

プラグイン達

今回取り上げるのは下記のプラグインたちです。

  • coc.nvim
  • vim-lsp
  • vim-lsc
  • LanguageClient-neovim
  • neovim built-in lsp

では一つ一つ使ってみた感想を書いていきます。

coc.nvim

特徴

  • TypeScript で書かれている(使うには node のインストールが必要)
  • All-in-one(自動補完機能、スニペット機能、ファイル検索などがくっついてくる)
  • プロトコル対応が最も進んでいて機能が豊富(利用者は特に意識せず便利に使える)
  • セットアップが非常に簡単
  • コミュニティはとても強い(使っている人がとても多い)
  • 1 ファイルタイプに対して、複数言語サーバに対応

感想

とにかく熱量を感じるプロダクト。機能もとても多い。
ただ、go を書きたいだけなのに node を要求されたり、そこは好き好き。
導入も簡単で機能も豊富なので「LSP プラグイン何がおすすめ?」と言われればこれを一番におすすめする。
coc.nvim は LSP に対応しているが「coc.nvim が提供する API にサーバの機能を接続する」という形で実現されている。
つまり、LSP に対応していないツール(例えば eslint など)も、coc.nvim の API につなげれば使えるようになる。(実際、coc-eslint が存在する)

(ちなみに 逆の発想で「ツールを LSP のプロトコルに合わせて利用する」というプロダクトも存在する、efm-langserver や diagnostic-languageserver など)

なぜ使っていないのか?というと、

  • 良くも悪くも All-in-one である
    • 自動補完機能だけ別のプラグインにしたいなーといったことはできない
    • まあ、自動補完くらいかな?問題になるのは

とかが理由。正直 coc.nvim 使えばいいのに...と自分でも思う。

vim-lsp

特徴

  • Pure Vim script で書かれている
  • 他プラグインとの連携手段が豊富(自動補完は deoplete.nvim、スニペットは ultisnips など)
  • LSP の機能に比較的多く対応している
  • コミュニティは強い(日本語圏だと vim-jp slack で気軽に質問できる)
  • 1 ファイルタイプに対して、複数言語サーバに対応

感想

一番お世話になった期間が長いプラグイン。
界隈のプラグインの中では活発に開発が進んでいる方だと思う。
ソースコードがわかりやすく、なにか問題が見つかった時に自力で直しやすい。
最近は動作もかなり安定している。
vimrc のポータビリティも大事だし機能の豊富さも大事って人はこれがおすすめ。

便利に使うには自動補完機能の入ったプラグインなどがあったほうがいいが、それは自力で設定する必要がある。そこまで難しくはない。

vim-lsc

特徴

  • Pure Vim script で書かれている
  • 自動補完機能を内蔵している(coc.nvim 以外では珍しい!)
  • LSP の機能はそこまで対応していない(よく使うものは流石に対応している)
  • 動作が安定している(ほとんどバグったことがない)
  • ファイルタイプにつき、言語サーバは一つまで

感想

当時、vim-lsp に個人的にクリティカルな不具合があって vim-lsc を使っていた。今は複数言語サーバに対応していて欲しいので vim-lsp に戻っている。
(現状は vim-lsp の動作はかなり安定してるのでご心配なく)
とりあえず動作が安定しているというのが強い。
coc.nvim 以外では珍しくビルトインで自動補完に対応している。
あまりプラグインを入れたくないんだよなって人は、Pure Vim script でポータブルだし、入れるだけで便利になるのでいいかもしれない。

LanguageClient-neovim

特徴

  • Rust で大部分がかかれている
  • LSP の機能に比較的多く対応している
  • デフォルトで有名なプラグインと連携してくれる(珍しい。他のプラグインは極力依存を切り離す方向で考えられている)
  • ファイルタイプにつき、言語サーバは一つまで

感想

はじめて利用した LSP プラグインはこれだった気がする。
デフォルトで denite.nvim や deoplete.nvim や fzf.vim に対応している。
すでにそれらのプラグインを利用している人はこれを入れると簡単に統合できていいかもしれない。

neovim built-in lsp

特徴

  • 大部分が Lua で書かれている
  • エディタレベルで行差分を検出して言語サーバに送るのでおそらく一番軽い(多分)
  • コミュニティは最強クラス(neovim built-in なので...)
  • UI がイケてる(代わりに、実装されている機能はまだ少なめ)
  • neovim でしか利用できない

感想

エラー箇所をハイライトしたり、エラー文言を表示したりする UI にこだわりを感じる。
動きもかなりサクサクしていて、仕組み的に大きなファイルを開いても遅くなりにくいはず。
neovim しか使わないし、今後に期待!という人はこれがいいかもしれない。

まとめ

まとめてみると、それぞれのプラグインに方針の違いや強みがあるなあと思った。

自作のプラグインはいろいろ使ってみて、ここがいいなと思った点を各種取り入れるように頑張ってみてはいます。まだ安定してないのですが…。

他にも、LSP のスニペット機能を実現するプラグインも書いていてこっちはもうすでにちゃんと動いてるので興味があったら使ってみてください。

このスニペット向けのプラグインは、上述したプラグインと合わせて使うこともできます。

最後の最後に宣伝になってしまった…。

mintty + tmux + Vim の環境で、insert mode 終了時に IME を off にする

$
0
0

自分の環境

Windows -> mintty -> SSH -> tmux -> Vim

vimrc

if&term =~'tmux'let&t_EI .="\ePtmux;\e\e[<0t\e\\"elseif&term =~'xterm'let&t_EI .="\e[<0t"endif

過程

  • tmux なしだと "ここ"に書いてある設定で行けたのに、tmux の内からだとうまくいかなかった。
  • IME off の制御が tmux から mintty にうまく伝わっていないのだろうと推測。
  • この制御が Control Sequence Introducer (CSI) というもので実現されていると知る。
  • "ここ"にたどり着く。

その他

  • Insert mode を抜けてから IME が off になるまで少し時間差がある。この間のキーストロークが抜け落ちてしまう。どこでこのラグが発生しているのかはよく分からない。
  • Tera Term でも同じように設定できるはず。
  • あと以下のように設定しておくと、IME on のときはカーソルが赤くなって分かりやすいのでとっても便利。
.minttyrc
IMECursorColour=255,0,0

参考 links

挿入モードを出る時にIMEをオフにする(SSH接続など端末エミュレータからVimを利用する場合)
tmux and control sequence character issue

Vimで作業時間を計測→モチベ維持作戦

$
0
0

About

この記事はK3 Advent Calender20日目の記事です。区切りだよ(o・∇・o)

今回はVimにはまったり、VimScriptいじったりしてみていたので、それを題材にしてみました。

今回行ったこと

  • 時報機能を追加
  • 作業開始時間を記録&時報を呼ぶと何分やってるかを教えてくれる
  • なんとなく労ってくれる

経緯

  1. HaskellでghcもghciもVimから簡単に呼べるようにしたい→自作コマンドを作ろう
  2. あれ、Vim scriptさん凄く色々できそうじゃない?
  3. なんかやろう

こんな経緯からお察しの通り、私自身はここ1ヶ月くらいでVim熱が一気に高まった弱々Vimmerです。何かアドバイス有りましたら頂ければ嬉しいです。

環境

  • Windows 10 Education
  • Vim 8.0.596

前準備

実際にコーディングに入る前の段階です。

Scriptファイルの作成

今回はUserディレクトリの下に各種設定用のフォルダを作り、その下にmycmd.vimを作成しました。

この中身をいじっていくのが中心となります。

.vimrcの設定

上記のことを.vimrcに教えてやり、vim起動時に有効になるようにします。

常時起動にしない場合は普通に各コマンドと同じようにコマンド打てばOKですが、私は面倒でした。

source C:\Users\XXX\setting\mycmd.vim

基礎知識

とりあえず、必要だった知識を先にまとめます。スルーしていることがあるかもしれないです…そしたらすみません………
ここから先のことは試すときはmycmd.vimに書くのをおすすめします。

Vimスクリプト基礎文法最速マスター←この辺を参考にさせていただきました。

独自コマンドの作成

とりあえず、Hello, (o・∇・o)と出力するだけのコマンドMcoを作ってみましょう。独自コマンドは大文字から始めなければならない規則があるようです。

command Mco echo "Hello, (o・∇・o)"

簡単ですね。command [コマンド名] [実行する内容]です。

echoは単純に出力するやつなので、Cのprintfとか、JavaのSystem.out.printlnとか、pythonのprintとか、JSのconsole.logとか、そのイメージですね。

関数を作ろう&ついでに変数

Vim scriptさん、関数を定義できます。正直この辺りナメてました。すみません。

上のやつをmcoechoとか関数にしてみます。

functions:mcoecho()
    echo "Hello, (o・∇・o)"endfunction

あまり難しいことはないですね。よくある関数定義と一緒です。functionfunction!と末尾にエクスクラメーションマークを付けると既存の関数を上書きしてくれるようですが、あまり既存のものを壊すのが好きではないので、なんとなく付けていません。かぶらないような名前をつけていきたい(願望)。

関数名の頭のs:についてはこの辺りを参考にしました。要するにprivateというか、そんなもんです。変数についての話ですが関数も大方同じみたい?
vimスクリプトの変数

変数の代入時は頭に毎度letが必要です。この辺りも注意。宣言ではなく、代入の頭に必要です。むしろ宣言は不要。一度上のリンクで確認頂くのが良いと思います。

引数を取る関数&while/for/if

引数も勿論取れます。

functions:mcoechorepeat(n)leti=0whilei<a:n
        echo "Hello, (o・∇・o)"leti+=1endwhileendfunction

引数を取るときはnに対してa:nのように頭に接頭辞がいります。ここだけご注意。
ぬるっと使いましたが、whileは大方の言語と似ています。括弧がいらない。
ところで閉じるときは大体endXXXXです。BASICを思い出す。

この引数、実は可変長を取れます。...で示します。

functions:multifunc(...)[やること]endfunction

こいつ、a:0で引数の個数を、以降はa:1, a:2と順番に引数が格納されていきます。便利です。詳細は最初に提示したサイトさんに掲載されていました。

forはリストの中身を回します。pythonのforとか各種言語のforeachに近いですね。

for i in [1,2,3,4,5]
    echo "Hello, (o・∇・o)" . i
endfor

この出力はこんな感じです。
image.png

最後にifはこんな感じです。

foriin[1,2,3,4,5]ifi % 2==0
        echo "Even"elseifi==1
        echo "One"else
        echo "Odd"endifendfor

関数を独自コマンドとして適用

超大事。これできないとあんまり意味なくなっちゃう。

command Mco calls:mcoecho()functions:mcoecho()
    echo "Hello, (o・∇・o)"endfunction

commandで使うときはcallが必要です。関数内で関数を呼び出す等のときはcallなしで普段の手続き型言語のように書いてOKです。

文字の結合

文字の結合は.です。

let strQiita ="Qii"."ta"

って感じですね。数値とか大丈夫かな~って思ってたんですけど結構柔軟に扱ってくれます。良い子です。

モチベ維持作戦スタート

ざっくり説明したんだか他のサイトさんに丸投げしたんだかわかりませんが、とりあえず本題に入ります。以降メインで実行させる関数はs:nowtimeです。

時間を言ってもらおう

まずは時間を取得しなければなりません。strftimeという関数を使います。

どこかの言語で時刻を扱ったことのある人なら見たことはあるかもしれない形で扱えます。

let nowtime = strftime("%Y-%m-%d %H:%M:%S")

とりあえずこれで現在時間が2019-11-25 11:00:00という感じにnowtime変数に代入されます。第2引数としてUNIX時間をつっこんでやるとその時間出したりもできます。

command Mtime calls:nowtime()functions:nowtime()let nowtime = strftime("%m月%d日%H時%M分")
    echo ("(o・∇・o)<いま、". nowtime ."だよ~")endfunction

じゃあこれを使って、

これで、:Mtimeと打ってやればとりあえず時報は言ってくれるようになります。

image.png

こんな感じ。可愛いですね。

作業時間を記録しよう

記録はUNIX時間で行いました。経過時間の計算の際に、現在時刻のUNIXとの差を求めていい感じにやると楽できるかなぁと思ったので。

というところで現在のUNIX時間を取ってきましょう。localtime()で持ってきます。

let nowUnix = localtime()

これでnowUnixには1574698112みたいなのが入ってくれます。

とりあえず単純に記録機能を追加させてみます。

command Mtime calls:nowtime()lets:timerec=-1functions:nowtime()let nowtime = strftime("%m月%d日%H時%M分")
    echo ("(o・∇・o)<いま、". nowtime ."だよ~")lets:timerec= localtime()endfunction

はい、これで記録できますね。ただ無限に記録させ続けてしまう……コマンドでなんとかしたいですね。

引数にrを取るときだけ記録させてみます。

command -nargs=? Mtime calls:nowtime(<f-args>)lets:timerec=-1functions:nowtime(...)let nowtime = strftime("%m月%d日%H時%M分")
    echo ("(o・∇・o)<いま、". nowtime ."だよ~")ifa:0>=1ifa:1=="r"lets:timerec= localtime()endifendifendfunction

ちょっと面倒になりました。まず1行目コマンド定義の行。

コマンドに引数を取るときは-nargs=1のように、何個引数を取るか書かねばなりません。引数が可変の場合は-nargs=?です。今回は0個or1個なので可変ですね。nowtime()nowtime(<f-args>)と変えとく必要がある。

そして、function側も引数に可変を表す...を入れる必要があります。内部では引数を持つ場合1つ目のif文がTrue,その引数が"r"であればs:timereclocaltime()を入れています。

作業終了させる

同様に、引数にbを取るときだけ作業終了の処理をします。

これはs:timerecと現在時刻の差を出力、s:timerecを初期化する、の2点ができればOKです。

とりあえずs:timerecと現在時刻の差を整形してくれる関数を作りましょう、ということで、引数に現在時刻をとって「4時間17分56秒」とか返してくれるs:getElapsedTimeを作りました。

functions:getElapsedTime(loctime)let worktime =a:loctime-s:timereclet wsec = worktime % 60let worktime = worktime / 60let wmin = worktime % 60let whour = worktime / 60let strtime = wsec ."秒"if whour >0let strtime = whour ."時間". wmin ."分". strtime
    elseif wmin >0let strtime = wmin ."分". strtime
    endifreturn strtime
endfunction

特に難しいことはなく。letif文べたーっと書いてreturnしているくらいです。returnは関数の戻り値を指定する、多くの言語であるやつです。

これを使って、(o・∇・o)に経過時間を喋らせてみましょう。

elseifa:1=="b"ifs:timerec==-1
                echo("(o・∇・o)<時間が記録されてないよ~")returnendlet strtime =s:getElapsedTime(loctime)
            echo ("(o・∇・o)<いま、". nowtime ."! ". strtime ."作業したよ~おつかれさま~")lets:timerec=-1

s:timerecは記録されていないときに-1にしています。スタートしてないのに終了しようとしたら時間が記録されてないよ~と煽ってあげましょう。

正しく実行されるとこんな感じになります。

image.png

可愛いですね。

単に時間を出力するコマンドの修正

こうなると、単に時間を出力させるのも味気ないですし、そのときに今何分やったかを知らせてほしいですね。
ついでに、先のコードだと、2回も時間を出力させられてしまうので、そこも上手く修正したいところです。

ざっくり、s:nowtime()関数の概形はこんな感じにしましょう。

lets:timerec=-1
funtion s:nowtime(...)if[引数が1つ以上]if[引数が"r"]" 記録スタートelseif[引数が"b"]" 記録終了endelseif[時間が記録されていない]" 単に時間を出力else" 時間と一緒に経過時間も表示endendendfunction

完成!

これらを踏まえて最終的なs:nowtime()はこうなります。

lets:timerec=-1functions:nowtime(...)let nowtime = strftime("%m月%d日%H時%M分")let loctime = localtime()ifa:0>=1ifa:1=="r"
            echo ("(o・∇・o)<すたーと~ いま". nowtime ."です~がんばっていこ~")lets:timerec= loctime
        elseifa:1=="b"ifs:timerec==-1
                echo("(o・∇・o)<時間が記録されてないよ~")returnendlet strtime =s:getElapsedTime(loctime)
            echo ("(o・∇・o)<いま、". nowtime ."! ". strtime ."作業したよ~おつかれさま~")lets:timerec=-1endelseifs:timerec==-1
            echo ("(o・∇・o)<いま、". nowtime ."だよ~")elselet strtime =s:getElapsedTime(loctime)
            echo ("(o・∇・o)<いま、". nowtime ."! ". strtime ."作業したよ~がんばっていこ~")endendendfunction

結論

  • 可愛い
  • 進捗は言うても変わんない
  • でも可愛い

vscode でsidebar, terminal, editer のフォーカスをvimっぽく移動する

$
0
0

環境

  • vscode 1.41.1
  • vscodevim 1.12.0
  • macOS Mojave 10.14.6

目的

  • sidebar とediter, terminal へのフォーカスの移動用ショートカットが欲しかった
  • Vimっぽいキーバインドに設定する事で「あのショートカットなんだったけ...」を防止

方法

コマンドパレット開く(⌘P) > keybindings.json 検索 > keybindings.json に下記を記述

keybindings.json
[
    {
        "key": "ctrl+h",
        "command": "workbench.action.focusSideBar",
        "when": "editorTextFocus"
    },
    {
        "key": "ctrl+j",
        "command": "workbench.action.terminal.focus",
        "when": "editorTextFocus"
    },
    {
        "key": "ctrl+l",
        "command": "workbench.action.focusFirstEditorGroup",
        "when": "filesExplorerFocus"
    },
    {
        "key": "ctrl+k",
        "command": "workbench.action.focusFirstEditorGroup",
        "when": "terminalFocus"
    },
]

備考

ctrl キーで設定する場合はvscodevim の設定でctrl キーを有効にする

settings.json
  "vim.useCtrlKeys": true

syntax/colorsのafterに差分の独自ハイライトを追加する

$
0
0

謝辞

すみません、ほんとはGVimのウィンドウ群とchannelで作るブロック崩しを公開する予定でしたが、間に合いそうにないので代替の投稿をさせていただきます。

作成中

はじめに

既存のcolorschemeやsyntaxに差分のカスタマイズ設定を追加する方法を紹介します。

afterについて

Vimで読み込まれる設定ファイルはruntimepathにより設定されており、afterは設定の追加読み込み用途として末尾に設定されています。

Windowsの場合
(略),$VIM/vimfiles/after,$HOME/vimfiles/after

独自ハイライトを追加するために、今回はこのafterディレクトリに差分のsyntaxやcolorschemeを置いて対応してみます。

afterに置くcolorschemeについて

追加用のcolorschemeはafter/colors/ディレクトリに配置するのですが、オリジナルと同名のままではafter/colors/側だけが読み込まれオリジナルは読み込まれなくなってしまいます。
対策として、両者それぞれを読み込む独自コマンドをvimrcに追加します。

" vimrc
command!-nargs=1ColorSchemecallColorScheme(<f-args>)function!ColorScheme(scheme)
  execute 'colorscheme '.a:schemetry
    execute 'colorscheme '.a:scheme.'_after'catchendtryendfunction

これで準備完了です。
追加用をafter/colors/に配置する際は、ファイル名をオリジナル名+_afterへリネームします。

真/偽を強調するハイライト

例として、Go言語にて真/偽を強調する為のハイライトをdesert colorscheme用に作成してみます。

設定後は下記のような見た目になります。
hilight.png

ファイル構成

.vim/after
├── colors
│   └── desert_after.vim
└── syntax
    └── go.vim

各設定

" syntax/go.vimsyn keyword goNo false
syn keyword goYes true

synmatch goNo /!=\?/ containedin=CONTAINED
synmatch goYes /==\|!!/ containedin=CONTAINED
synmatch goNoWrong /!==\|!!!/ containedin=CONTAINED
synmatch goYesWrong /===/ containedin=CONTAINED

hi link goNo No
hi link goYes Yes
hi link goNoWrong Error
hi link goYesWrong Error
" colors/desert_after.vimhi No guifg=#ff7777 guibg=#773838hi Yes guifg=#9999ff guibg=#383888

あとはcolorscheme変更の際はColorSchemeコマンドを利用すればOKです。

まとめ

colorschemeは気に入ってるが少しカスタマイズしたい、て時に新たにcolorschemeを作るのは少々大げさになってしまいます。
本記事はcolorschemeもafterディレクトリへの差分設定だけで済ませる方法の紹介でした。

vscode vim でInsertモードでカーソルを移動する

$
0
0

環境

  • vscode 1.41.1
  • vscodevim 1.12.0
  • macOS Mojave 10.14.6

目的

  • Insert モードでカーソルを移動したかった(生粋のvimmer に怒られるかも...)

方法

コマンドパレット開く(⌘P) > settings.json 検索 > settings.json に下記を記述

keybindings.son
[
    {
        "key": "cmd+l",
        "command": "cursorRight",
        "when": "editorTextFocus && !editorReadOnly"
    },
    {
        "key": "cmd+h",
        "command": "cursorLeft",
        "when": "editorTextFocus && !editorReadOnly"
    },
    {
        "key": "cmd+j",
        "command": "cursorUp",
        "when": "editorTextFocus && !editorReadOnly"
    },
    {
        "key": "cmd+k",
        "command": "cursorDown",
        "when": "editorTextFocus && !editorReadOnly"
    },
]

詳細

  • cmd + l or h or j or kでInsertモードでもカーソルを移動できる

感想

勝手に挿入される)"を以前は

  1. ctrl + oで一時的にInsertモード抜ける
  2. aで1文字スキップした状態でInsertモードに戻って続きを入力

という方法でやっていましたが、ちょっとスッキリしました。

Insertモード中に1文字スキップさせる方法が私には見つける事ができなかったので、もし他に方法があるなら是非教えて頂きたいです!!

vscode vim でvim-airline っぽくモード毎にstatusbar の色を変える

$
0
0

環境

  • vscode 1.41.1
  • vscodevim 1.12.0
  • vscode theme Icebarg
  • macOS Mojave 10.14.

目標

vscode でvim-airline 風にモード毎にstatusbar の色を変えたい

https://github.com/vim-airline/vim-airline

こんな風に↓
vim-airline.png

詰まったところ

vscode のtheme を設定後、settings.json でstatusbar の色を指定したが背景色しか反映されなかった

Normalモード
normal_ok.png

Insertモード 文字が見ずらい...
insert_error.png

Visualモード 同じく見ずらい...
visual_error.png

Replaceモード これは嫌だ...
replace_error.png

方法

vscode vim はとても親切でデフォルトでEmulated Plugins でvim-airline 風にモード毎にstatusbar の色を変える事ができます。

settings.json

コマンドパレット開く(⌘P) > settings.json 検索 > settings.json に下記を記述

背景色と文字色の指定は私が大好きなtheme のIcebarg に合わせていますのでお好みでどうぞ!

settings.json
{
  "vim.statusBarColorControl": true,
  "vim.statusBarColors.normal": ["#161821", "#818596"],
  "vim.statusBarColors.insert": ["#84A0C6", "#161821"],
  "vim.statusBarColors.visual": ["#B4BE82", "#161821"],
  "vim.statusBarColors.visualline": ["#B4BE82", "#161821"],
  "vim.statusBarColors.visualblock": ["#B4BE82", "#161821"],
  "vim.statusBarColors.replace": ["#E2A478", "#161821"],
  "vim.statusBarColors.commandlineinprogress": ["#818596", "#161821"],
  "vim.statusBarColors.searchinprogressmode": ["#818596", "#161821"],
  "vim.statusBarColors.easymotionmode": ["#818596", "#161821"],
  "vim.statusBarColors.easymotioninputmode": ["#818596", "#161821"],
  "vim.statusBarColors.surroundinputmode": ["#818596", "#161821"],
}

theme のstatusbar の文字色指定を無効にする

私の環境では上記のsettings.json の設定ではなぜか背景色しか変わらず、文字色が変わりませんでした。
試しにtheme をデフォルトに戻したところ、上手く背景色、文字色共に変化したのでtheme の文字色指定のみ無効にしました。

Users/user_name/⁨.vscode/⁨extensions⁩/⁨cocopon.iceberg-theme-1.0.1/icebarg.color-theme.json を修正し無効化します。
コメントアウト、もしくは削除してください。

Users/user_name/⁨.vscode/⁨extensions⁩/⁨cocopon.iceberg-theme-1.0.1/icebarg.color-theme.json
.
.
"statusBar.background": "#0f1117",
"statusBar.debuggingBackground": "#242940",
"statusBar.debuggingForeground": "#6b7089", <- ココ
"statusBar.foreground": "#6b7089", <- ココ
"statusBar.noFolderBackground": "#0f1117",
"statusBar.noFolderForeground": "#6b7089", <- ココ
"statusBarItem.hoverBackground": "#6b708920",
.    
.

上記の設定に変更後、settings.json のstatusbar の文字色指定が効くようになるはずです。

注意点.1

settings.json を開いた状態だと挙動がおかしくなるので設定を確認する際には一度settings.json を閉じて確認してください。
これで私はかなりハマりました。

注意点.2

vscode のtheme の仕様なのか分かりませんがsettings.json にworkbench.colorCustomizationsという設定が自動生成されます。
何度削除してもコメントアウトしても復活してきます笑

settings.json
"workbench.colorCustomizations": {
"statusBar.background": "#B4BE82",
"statusBar.noFolderBackground": "#B4BE82",
"statusBar.debuggingBackground": "#B4BE82",
"statusBar.foreground": "#161821"

ちなみにモードを切り替えるとココのカラーコードも自動で変化します。
原因は分かりませんが、とりあえず無視して大丈夫だと思います。

まとめ

かなり強引な方法ですがvim-airline 風にstatusbar の色を変化させる事ができました。

Insertモード
insert_ok.png

Visualモード
visual_ok.png

Replaceモード
replace_ok.png

正式な方法じゃない可能性が高いので、もっと良い方法があれば是非教えてください!

Neovim で関数ジャンプする

$
0
0

ある vimmer が IDE を眺めていて思ったこと。


関数の定義元にジャンプするやつずるい!!!!!!!


Vim でもぴょんぴょんしたい...

※ 以下は Neovim での手順ですが、Vim でも Neovim でもだいたい同じ手順のはず

ctags のインストール

Ctags(英: Ctags)はソース及びヘッダ内にある名前のインデックス(又はタグ)ファイルを生成するプログラム。
- Ctags - Wikipedia

関数ジャンプを実現するにはこいつと vim のタグジャンプを組み合わせればいい。

ctags といっても exuberant-ctags と universal-ctags というのがあり、前者はメンテされてないっぽい。
なので universal-ctagsをインストールしてみる。

Mac を使ってるので Homebrew を使う。

$ brew install--HEAD universal-ctags/universal-ctags/universal-ctags

実行が終わったらインストールされたか確認。

$ brew tap
homebrew/cask
homebrew/core
universal-ctags/universal-ctags

追加されてるね。
ついでに ctagsコマンド打ってみる。

$ ctags --version
Universal Ctags 0.0.0(ff18000), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Jul 17 2019, 22:33:32
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath, +case-insensitive-filenames, +packcc

たぶんOK。

設定ファイルの作成

universal-ctags の設定ファイルは ~/.ctags.d/配下に拡張子が .ctagsのファイルを置く。

$ mkdir ~/.ctags.d
$ touch ~/.ctags.d/config.ctags

config.ctagsはとりあえず以下のようにしておく。

config.ctags
# 除外するファイル or ディレクトリ
--exclude=*.min.js
--exclude=.git
--exclude=node_modules

# タグを作成する言語
--languages=javascript,php,python,typescript

# 言語ごとの作成するタグの種類
--kinds-javascript=*
--kinds-php=-{namespace}{local}{alias}
--kinds-python=*
--kinds-typescript=*

# 再帰的にディレクトリを探索してタグを作成
--recurse=yes

# タグを case-sensitive にソート
--sort=yes

# タグに相対パスを使う
--tag-relative=yes

# 参照する側のタグも作成
--extras=+{reference}

正規表現を使う

関数名が動的に定義されたりする場合でも、 ---regex-<LANG>=オプションでタグを作ることができる。
以下は Laravel のスコープとアクセサに対応させた例。

config.ctags
--regex-php=/get([a-z|A-Z|0-9]+)Attribute/\1/
--regex-php=/scope([a-z|A-Z|0-9]+)/\1/

タグの生成

試しにタグを作ってみる。
-R--recurseと同じ。

$ ctags -R

デフォルトではカレントディレクトリに tagsというファイルができる。

Neovim 経由で作るので一旦削除。

$ rm ./tags

Neovim の設定

init.vim に追記する。
以下のように書いておくと開いているファイルから親を遡って tags を探してくれるらしい。

settags=./tags;

他にも色々設定できる。

settags=./tags " 開いているファイルのディレクトリから tagsを探す
settags=tags   " カレントディレクトリから tagsを探す
settags=./tags,tags " どちらも探す (優先度高い順)

これで、手動で ctags -Rすれば一応は使えるようになった。

プラグイン

ファイル更新時に生成したりするのは面倒なのでプラグイン入れる。
auto-ctags.vimが良さそう。

dein などでインストールして、設定を init.vim に追記。

" ファイルに書き込む際にタグ生成letg:auto_ctags=1

Neovim で以下を実行すればカレントディレクトリに tags を生成してくれる。

:Ctags

使い方

コマンド動作
Ctrl - ]定義元にジャンプ
Ctrl - tジャンプ元に戻る
g]定義元の候補を列挙する

まとめ

結構手間がかかったけど無事に使えるようになった。
関数探すのにいちいち grep しなくて済む!

参考

Viewing all 5770 articles
Browse latest View live