「実践Vim」2週目を読んで気になった機能
これはAizu Advent Calendar 2018の6日目?の記事です。
前の人は id:ywkw1717さんで、次は id:culumn さんです。
体はVimで出来ている
そしてipad proを買いました。
夜、暗いところでも本読みながらメモがとれてアニメ観れるって控えめに言って最強なんだが?しかも単一のデバイスで... pic.twitter.com/VatK5ZXP2U
— 電脳ゴリラ (@dennougorilla) December 15, 2018
なので、自分にしては珍しく、本のlogが残っているのでまとめてみようと思います。特に初心者向けとか玄人向けとかガチガチ技術記事とかエロ同人誌とか自己啓発ではなく、備忘録として適当に書くので、長くなるし参考程度に読んでくださいw(Vimに興味ない人は読まないほうがいいかも)
この本について
自分がこの本を初めて読んだのは、
あれは今から36万・・・いや、1万4000年前だったか、
うん、確か1、2年前です。図書館で借りて二週間かけて一通り読んだ気がしますが、あの頃の自分には情報量が多すぎて取りこぼしたものを2週目で何個か拾えた気がします。つまり2週目でも為になる本だし、多分3週目でも新しいものを得られると思う。この本は、
文字で説明するのではなく、実例を示すことで、その何かについて語っている。
ので、機能の説明だけでなく、どう実践で使えるかまで理解できます。Vimを使っていればすぐに試すことができるし、慣れていれば頭の中で再現することもできますw。とても実践的でVim本来の良さを味わえる最高の一冊です。 以下に読んで気になった部分を抜粋していきます。
タッチタイプができないと、Vimを学んでも、その長所はなかなか現れない。タッチタイプができるようになろう。これは必須だ。
Vimの起源は、古の時代のUnixエディタ、viとedにまで遡ります。これらのエディタはマウスとポイント、クリック的なあらゆるインターフェイスよりも前に生まれたものです。Vimはあらゆることがキーボードで行える。
おそらくここで言っているタッチタイプとは、記号も含めた全ての文字をキーボードを見ずに打つことを言っている。記号も含めるとなると、自分も出来ているのかかなり怪しい。振り返ってみると、*や$などチラ見して打っている気がする。少し意識して、真のタッチタイプを身につけようと思います。
TIP37:引数リストを使ってバッファをコレクションにまとめる
引数リストは管理も簡単で、これを使うと、ファイルをコレクションにして、ファイル間を簡単に移動できるようになる。コマンドを `:argdo`コマンドを使えば、引数リストの中の各要素にExコマンドも実行できる。
引数リストはvimコマンドの起動時に引数として渡されたファイルのリストを表します。Vimでよく困るのはファイルの管理です。1つのプロジェクトで複数のファイルを管理することはよくありますが、vimはモダンなエディタと違って左にファイルツリーが表示されたりしません(しようと思えば出来ます)。どのように管理するかは人それぞれですが、自分はバッファで管理していました。しかしバッファ管理はごちゃごちゃするしなと考えていたときに、この引数リストが使えるということを知りました。
:args {arglist}
:argadd
主に使うのは:argadd %で現在開いているカレントバッファをarglistに追加できます。
引数リストはバッファよりも管理が簡単で、バッファをコレクションするための場所としては理想的だ。筆者が思うにバッファリストは机みたいなものだ。つまり、いつもごちゃごちゃしている。引数リストは独立した作業場所で、広々と作業したいときのためにいつでも綺麗になっている。
argdoでgit addとかformatかけるのもいいかもしれない。
TIP53:場所をマークして、そこにサッと戻る
Vimのマークを使うと、ドキュメント内できになるところにサッと戻れる。マークは自分でも設定できるが、開発者が気にしている箇所をVimが自動的に管理してくれる。
VimConf2018でBram氏のkeynoteを聞いているときに使おうと思い、ちょくちょく使っていたが、開発者が気にしている箇所をVimが自動的に管理してくれる。 こんな便利な機能を見逃していた。
例えば、import分を追加して、それを使ったmethod文を、他の場所に書いている途中で、import文が間違っていることに気づくことが偶にある(あるよね?)。そんなときに `. を押せば一瞬でそのimport行に戻れる。直前のミスにそのあとの操作で気づいた場合にとても有効な機能だと思う。g;やgiでも代用可能
TIP39:ワークスペースを分割ウィンドウにする
プロジェクトごとにタブを使って分けて、分割windowでプロジェクト内のファイル編集を行う、あるいはterminalを開くなどは以前から使っていましたが、毎回 :sp や :vsで分割していました。<C-w>sで水平分割、<C-w>vで垂直分割ができることを知りました。window移動と同じprefixでこっちの方が直感的で使いやすいです。
TIP40:タブページを使ってウィンドウのレイアウト管理
上記にあるように、タブは使っていましたがファイルパスの管理が曖昧だったので、:windo lcd {path} を使うことで分割ウィンドウ全体にVimのパスを指定することが出来ることを知りました。これは:eで新たにファイルを開くときや、 <C-x><C-f>でファイル補完をするとき、新たにterminal windowを開くときに重要になってきます(たぶん)。気になったけど、カレントバッファを基準にしたファイル補完とかできないのかな?
TIP70:イテレータ
Vim内部の変数とExpressionレジスタを使って数値インクリメントが出来るらしい。なにこれめちゃくちゃオシャレ✨
これをマクロに挟むだけで、インクリメント出来るし、多分もっと複雑なこともできそうで、かなり興奮した。
また、「:normal @a」で選択された各行に対してマクロを実行するので、これを使えば、マクロ内に移動を挟む必要がなくなり、マクロも簡潔になるし、再利用性も高まる気がしました。
また、
qaと入力すれば、Vimはキーストロークを記録して、レジスタaにこれを保存してくれる。このとき、それまでのレジスタ内容は上書きされる。qAと入力するとキーストロークを記録して、これを今のレジスタaの内容に追記してくれる。ミスを修正できるという事だ。
大文字のレジスタ参照で追記は色々と使えそうだ。
TIP73:\v正規表現検索で「\v」パターンスイッチを使う
これで正規表現を使って検索を行えるらしい。自分は正規表現自体が怪しいのでそこから勉強して後々使えたらなと思う。
/\v#([0-9a-fA-F]{6}|0-9a-fA-F]{3})
これで16進のカラー値にマッチするものを検索できる。さらに文字クラスというのを使って、
/\v#(\x{6}|\x{3})
こんな感じで、文字集合[09afAF]を文字クラス\xで置き換えられるらしい
TIP74:\Vリテラルスイッチを使ってテキストそのものを検索
特殊記号を無視して、テキストそのものを検索できるらしい。(/\Va.k.a. など)
TIP75:カッコを使って部分マッチをキャプチャする
/\v(And|D)rewNeil
こんな感じで部分マッチを使用でき、さらに各カッコが表す部分マッチを\1, \2, ...., \9で参照できる。関係ないけど、このTIPに出てくる構文的幻想(lexical illusion)という単語がカッコよすぎる...厨二心を擽ぐるぜ。
TIP76:単語の境界を指定する
「the」を検索するとき、「these」、「they」など想定よりも多くのものがマッチしてしまう。このような単語を明確にマッチさせたいときに、単語境界デリミタというのが使えるらしい。\v (verymagic検索)では、単語デリミタは<>で表される。したがって/\v<the>とすれば、theを限定的にマッチさせることができる。
TIP97 :グローバルコマンドとは
:globalコマンドは、ExコマンドのパワーとVimのパターンマッチ機能とを結合する。これを使って、指定したパターンにマッチする各行に、Exコマンドを実行できる。
:normalが選択行に対し、:globalはパターンマッチ行で、パターンにマッチした行に対してマクロを再生できたりする。これを使うことで:normalと同じように、検索ワードのジャンプ(n)などをマクロの中に記述する必要がなくなるね!ちなみにこれは古のエディタedからあるもので、grepの起源はg/re/pでgはglobalの省略表記、reは正規表現(regular expression)を表し、pはprintの省略表記になっているらしい。
ちなみに、マッチする行以外は:vglobalを短縮して:vで表し、:gと逆のことをする。
その他
- :Eでファイルエクスプローラーを開く、今まで:e .とかで開いてたけどもっと短いのがあった。
- :put a 必ず現在行の下に貼り付ける。これを最近よく使う(:put "とか:put +とか)
- :g/TODO/yankA TODOが書いてある行をaレジスタに追記する(globalコマンドと大文字レジスタ参照の併用技)
- let@a=substitute(@a,'\~','vU','g') これでもレジスタに追記出来る
まとめ
頭にgがつくコマンドを使いこなせていない気がした(頭文字G)。マーカー、マクロ、レジスタをもっとうまく使えるようになりたい。特に
- 自動マーカー
- :normal, :global, :vglobalを利用したマクロの再生
- Expressionレジスタ
あたりをこれから積極的に使っていこうと思いました。それと正規表現をある程度覚えたいので\v縛りでもやろうかなと思いますw
最後に
ここまで読んでくれてありがとうございます!何か一つでも気になる機能があれば幸いです笑 ここまで書いといてあれですが、やはり文字だと伝わりにくいし、動画を差し込めればなと思います。自分の気分が乗ればgifかyoutubeとかでまとめて載せたいなと考えています(正直めんどくさい)。スターとかコメントで気分を上げてくれたらなとw 他にも感想とかおすすめの機能とかエディタとか本とかゲームとかアニメなどがあればコメントに書いてもらえると嬉しいです。
Fortnite
これは プログラマーにオススメしたいゲーム紹介 Advent Calendar 2018 - Adventar 3日目の記事です。
自分がプログラマーにオススメしたいゲームは、タイトルの通りFortnite。
Fortniteとは、
フォートナイト バトルロイヤル(Fortnite Battle Royale) はエピックゲームズが開発・運営するアクションビルディングゲーム、サードパーソン・シューティングゲームである「フォートナイト」のfree-to-playのバトルロイヤルモードである。本作は2017年9月にMicrosoft Windows、macOS、PlayStation 4及びXbox One向けに早期タイトルとしてリリースされ、2018年4月にiOS、2018年6月にNintendo Switch、2018年8月にAndroid向けにもリリースされた。
で今世界で最も流行っていると言っても過言ではないゲーム!取り敢えず世界的トレンドのコンテンツってだけでプレイしてみる価値はある。
まず注目して欲しいのはエピックゲームズが開発しているという点。エピックゲームズは「最も成功したビデオゲームエンジン」としてギネス世界記録にもなってるUnreal Engineを作っている会社であり、もちろんFortniteはUnreal Engineを使って作られている。つまり、ゲームエンジンを作った会社がそれを使って本気で作ったゲームがFortniteなのだ。
具体的にすごい点をあげると、
- F2P
- アップデート頻度
- クロスプラットフォーム
- チート対策
- サーバーの安定性
- ワンタイムイベント
あと単純にゲームが面白い。
この記事をみているということはゲームが好きなプログラマーであり、少なからずゲーム製作に興味があると思うのでUnreal Engineで作った究極のゲームサンプルとしてもやってみて欲しい。ちなみにUE4はC++で書ける。Blueprintsというビジュアルプログラミングでもゲームを作れます(自分は今ここ)。
この講演動画、Fortniteにおけるキャラクタの挙動をどう実装したのかについて、実際の挙動+ノードを見せてるので凄く勉強になりそう!オススメ!(まだ流し見中) #UE4 #UE4Study https://t.co/DCyBErPZ1R
— おかず (@pafuhana1213) November 28, 2018
VimConf2018に行ってきた🍕
にゃんぱすー
田舎を出てまんがタイムきらら展に行ってきました! 自分はアニメを見ながらプログラミングを書くのが好きなのですが、この時に観るアニメは面白すぎたりシリアスすぎたりせずに何度でも見れる中毒性のあるアニメがベストで、これにぴったり当てはまるのがきらら系アニメ!!、自分のプログラミングはきららアニメと共にあったと言っても過言ではないです。そんな素晴らしいアニメたちがなぜあんなにも中毒性があるのかが、このきらら展でわかったような気がします。また作者さんの制作風景動画が見られたのは胸熱でした! それとついでにVimConf2018にも行ってきました。
ギリギリ間に合ってきらら展行って来た!バッチ被ったけどかなり満足 pic.twitter.com/JcyEBVq46D
— 電脳ゴリラ (@dennougorilla) November 23, 2018
冗談です笑 本題のVimConf2018に行ってきました!マジで最っ高でマジ卍でした。今年のVimConfは何がすごいってVim製作者のBramが来て登壇したんですよ!(さんを付けろよデコスケ野郎)その他にもVim界隈で有名な人たちの話が生で聞けてVim力が爆アドしました。その中でも特に印象に残った発表を何個か紹介させていただこうと思います。
Opening
moppさんによるOpeningで、実はmoppさんは研究室の先輩で面識は全くなかったのですが、Openingで話している姿をみて”あの人なんだ!”ってのと同大学だった人がVimConfで司会をやってることに感動しました。
Keynote - What is the next feature?
mattnさんのkeynoteで前半はvim-jpについてで後半は追加機能の提案でした。mattnさんのライブコーディング?というより生のVim操作は本当に感動しました。
おそろしく速いVim操作、オレでなきゃ見逃しちゃうね
あまり内容とは関係ありませんが、8.1でリリースされた?terminalをとても上手く使いこなしていて、自分はtmuxで画面分割をして同じような操作をしていたのでこちらに移行しようと強く思いました。VimでWebServerはめっちゃ面白かったし、実用面でも色々な使い道がありそう?でした。
Keynote - Vim: From hjkl to a platform for plugins
Bram氏によるVimの歴史とこれからについてでした。歴史については結構古くからあるmarksという機能があまり使えてないなーとなぜか強く感じました。Bram氏がpluginのperformanceをあげるには”get fast computer”というジョーク?を言っていて本人は何使ってるんだろうと思ってツイートしたらなんとKaoriyaさんからanswerが!
なんと僕と同じで XPS13 でした! #vimconf https://t.co/ExExbZcAl7
— MURAOKA Taro (@kaoriya) November 24, 2018
次買うPCが決まった瞬間でした。
まあ、それは根本的な解決にはならないので色々な高速化の手段を考えていて本物のVimの製作者なんだ...と感動しました。
また、意外とPluginについても考えていてやはりそこがVimの魅力でもあるんだなと感じました。それとUserが欲しい機能、第1位がpopupwindowで、個人的には正直いらないな(IDE使え)と感じたのですが、それを実装するためのText propertieというのはとても使い道がありそうだなと感じました(小並感
Migrating plugins to standard features
daisuzuさんによる脱Plugin的な発表で、まさに自分の辿って来た道でした。VimをいかにIDEっぽくするかばかり考え、碌に考えもせずPluginマシマシのVimを使っていた時期が私にもありました。 闇に染まっていたVim(中二病)がフラッシュバックしてエモかったです。始めたては何かとPluginに目が向きがちですが標準機能の方もとても便利で素晴らしのでぜひ試してみてください。
ujihisaさんによるVimのModesというよりVimについての解説的な発表でした。これも内容関係ないのですが、demoの時にVimShellという過去に自分も最も愛用していたPluginを使っていてなんか涙が出そうでした。(押入れからゲームボーイが出て来た感じ?)同じ作者の補完PluginをVimShellと使うと本当にいい感じにshellの補完ができて... ウゥ(涙
Effective Modern Vim scripting
AlisueさんによるPluginの作り方的な発表でした。自分も簡単なPluginを作ったことがあるのですが、その時にこんなSlideがあったら!と強く感じました。個人的にAlisueさんのファンでスピーチとSlideにとてもキレとセンスがあって最高でした。
この記事が好き
Oni - The GUI-fication of Neovim
AkinさんによるモダンなGUIのvimについての発表でした。少し触ってみましたがかなり完成度が高くて凄かったです。特にチュートリアルがとても楽しくてよかった。しかし、個人的にはcommand-lineモードが上にpopup表示されるのが微妙でした(慣れの問題)。プログラミング始めたての人にVimを使って欲しいけど、いきなりVimを勧めるのはハードルが高いし、見た目が古いとか、操作がむずいとか、汚いとか、臭そうとか言われそうで躊躇ってたけど、こンな時にOniを進めれば万事解決ジャネ? 時々気分転換に使っていきたい。
他にもLTとか懇親会とか最高でした! 来年も参加したいです(懇願
短くしようとしたけど、スゲー長くなってもうた。 Vimサイコー!
フォートナイトの編集ラグ改善方法 (Fortnite How To Fix Edit Lag)
日本語で編集ラグに言及しているサイトがなかったので、ここに記しておこうと思います。
改善方法
編集ラグについてはこの動画で解説されています。
やり方を先に説明すると、この動画にあるようにEpic Games Launcherの設定で、MANAGE GAMES(ゲームの管理)のAdditional Command Line Arguments(追加コマンドライン引数)に-lanplay
を入力するとラグが改善されます。
動画でも言われていますが、完全にラグがなくなるわけではなくプラシーボ効果の可能性もあります。しかし、自分も試した感触では編集だけでなく建築のレスポンスも上がっているように感じました。また動画内では、この方法はpingやlatency(遅延)が増加する可能性があると示唆していて、もし以前より悪化した場合は戻すことをお勧めします。
原因
おそらく、latencyのせいだと思います。アジアは人口、面積共に最大なのでなおさらラグが発生しやすいのではないかと思います。(Fortniteの編集はボタンが押されてサーバからの応答があった後に画面に反映されているのかな?)
-lanplayとは
Unreal公式のdocumentには
Network
LANPLAY
: Tells the engine to not cap client bandwidth when connecting to servers. Causes double the amount of server updates and can saturate client's bandwidth.
このように書かれていて、bandwidth(通信帯域)を制限しないようにエンジンに伝え、サーバの更新量が2倍以上になると言っています。おそらくサーバ側はクライアントがLANケーブルでプレイしているのか、無線LAN(wifi)を使用してプレイしているのかだったり、どのようなプロパイダー契約かがわからないので、ある程度通信帯域を絞って確実に通信ができるようににしているのではないかと思います。なので帯域が担保されているプロパイダーや、LANケーブル(ある程度新しい規格)でプレイしている人はこの設定の恩恵を受けられるのではないかと思います。
最後に
これでNick Eh 30やSymfuhnyのような編集を...