ぼちぼち散歩

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/-- --:-- | スポンサー広告 | トラックバック(-) | コメント(-)

ページの先頭へ

VimConf 2016に参加してきた

5年もブログ書いてなかった。VimConf 2016に参加してきました。

各発表の雑な感想

内容や詳細は他の人のレポートなど見てもらうとして、個人的な感想を書き留めておきます。

Introduction to Vim 8.0

vim-jpの活動は本当に素晴らしく、以前に自分がTwitterで「これはバグかな?」という類の内容をつぶやいたところ、「既にパッチができているのでIssue登録してね」というリプライがあり、速攻で修正が本家に取り込まれました。

Vim 7.4の2300以上あるパッチのうちの一つがこれなわけで、つまり、バグっぽい挙動を呟くことでVim 8.0に超々微力ながら貢献できました。なので、皆さんも気軽にバグ報告していきましょう。以下のようなありがたいお言葉もありました。

あと、Vimは25周年なんだけど、何人かの人が「あ、Vimより年下だ!」というTweetをしていて、ジェネレーションギャップを感じました笑。

Vim as the MAIN text editor

VSCode + Vim ExtensionからVim本家に来た、という珍しい?パターンの紹介。世の中に新しいIDEやエディタが登場すると、どこからともなくVimmerが現れてVim風操作にする拡張が作成されるわけですが、それがVim本家への導線としても機能している点が新鮮でした。

Denite.nvim ~The next generation of unite~

最近のShougoさん作のプラグインがだいたいPython3ということで、自分が昔作っていたlingr.vimをちょっと思い出しました。

ただ、個人的には就職してからは開発環境やフレームワークを整えて他の多くの人に使ってもらうことが多く、そうなると必然的にVimではない普通のIDEで環境作る→勧めるためには自分も使い込み慣れる→同じことをもう一回Vimでやるのがだるい、ということで、Vimでガシガシ開発することが少なくなっています。なので、Vimはちょっとしたテキスト編集がメインの用途となり、むしろシンプルに保つ方が良いので、Shougoさんが作るような大型プラグインは使わなくなりつつあります。

Go、C、Pythonのためのdeoplete.nvimのソースの紹介と、Neovim専用にpure Goでvim-goをスクラッチした話

deopleteはPythonで補完ソースを増やせ、かつ、補完も非常に早いとのことで、機会があれば試してみたいです(上記のとおり、最近機会が減少傾向ですが…)。

エディタの壁を越えるGoの開発ツールの文化と作成法

Goは依存性なしの実行ファイルをクロスプラットフォームで作成できる、ということで、Vimのjob/channel機能と非常に相性が良さそうだと思いました。これまでは、外部プログラムに依存するVimプラグインは敬遠され、pure Vim scriptであることが有難がられる風潮が一部ではありました(ような気がしています)。Goなら主要プラットフォーム向けにビルドした実行ファイルをGitHubのReleaseにでも置いておけば良さそうなので、遅い箇所はGoで、UIはVim scriptで、その間をjob/channelで繋ぐプラグインが増えてきても良さそうです。

vim-mode-plus for Atom editor

AtomのVimプラグインを通じて、よりVimへの理解が深まったとのこと。紹介されていたような概念はVimをずっと使って理解が深まってくるとある程度たどり着ける内容だとは思いましたが、それがきっちり整理され、さらに実装に活かされているところに深みを感じました。さらに、Practical Vim(実践Vim)も併せて読むと良いと思います。

また、懇親会でt9mdさんとお話させて頂いたのですが、VimのOperatorは一貫性があるような動きをしているように見せかけて、実はtargetがline-wiseかどうかで動きをad-hocに変えている、など泥臭い実装があるらしく、実際に作った人だから分かる素晴らしい知見だと思いました。

あと、周囲へのリスペクトを忘れない姿勢がかっこよかったです。

Vimの日本語ドキュメント

最も手っ取り早くVimの貢献する方法はこれのような気がしているので、本当は時間を見つけて参加したい…。

また、懇親会では、KoRoNさんのVim論を少し聞けておもしろかったです。(おそらく歴史的経緯で)Vimの内部構造がイケていないことに起因する話をいくつかされていたのですが、それでもVimが発展していっている点は色々と考えさせられます。ついつい、一から作った方が早い論に流されがちですが、既存のものを良く理解し発展させる方も常に考えたいと思いました。

Vim script parser written in Go

最近Vim界隈では、画期的なプラグインができた!というより、この手の周辺ツールを固めていく話が多い気がしています。Vim 8.0でのVim script強化と併せて、ある意味今はVim界隈全体として、基礎固めの時期なのかなと感じました。今後、これらをもとにしたすごいプラグインが出てくるといいですね!(おまえがやれという話ですが…)

僕の友達を紹介するよ

今回は、Vimプラグインにフォーカスした発表が少なかったので、おすすめをまとめて教えてくれる発表は価値があると思いました。

Best practices for building Vim plugins

thincaさんがこれまで感じた辛さをまとめたような発表でした笑 このあたりのベストプラクティスこそ、Vim本体のhelpに入っても良さそうなものですが、そのあたりどうなんでしょう?

全体を通して

Vim関係の勉強会は出られるものはできるだけ出るようにしているけど、ここ何年も毎回進捗がなく、自分が発表できるネタがないのがちょっとつらい。Vimどうこうより、家族(妻、子ども)と過ごす時間、仕事の時間、それ以外の時間、をうまくやりくりしてVim含めたプライベートな活動をどう進めて行くかが個人的な大きな課題。がんばろう。


スポンサーサイト

2016/11/07 00:52 | Vim | トラックバック(0) | コメント(0)

ページの先頭へ

PythonでVim scriptの関数を定義する

Vim Advent Calendar 18日目!

こんにちは!Vim Advent Calendar 18日目担当のtsukkeeです。以前にも、vim-users.jpにて、Hack #132: Pythonインタフェースを使う(1)Hack #136: Pythonインタフェースを使う(2)を書かせていただきましたが、今回はさらに面白い?Pythonインタフェースの使い方を紹介したいと思います。

Pythonインタフェース内でVim scriptの関数を定義する

いきなりですが、vim_bridgeというものが既にあります。これに気づかず再発明してしまったのですが、自分が作ったものの方が自由に関数名を決めれるのでまぁいいことにします^^; サンプルコードは以下のとおりです。

PythonのデコレータでPythonの関数をVim scriptの関数に変換するところはvim_bridgeと同じですが、今回はデコレータの引数で関数名を指定できるようにしてみました。これによってs:fuga()のようなスクリプトローカスな関数や、例にはありませんが、hoge#fuga#piyo()のようなaudoload関数も定義可能です。

まとめ

PythonインタフェースはVimによってあったりなかったりするために、あまり広くは使われていません。また、はじめはPythonインタフェースを用いて実装していたものを、ピュアVim scriptにする人もいます。ですが、私はあえてPythonインタフェースを使うことも推奨したいです。逆にVim scriptゼロでVimプラグインを実装するというのも面白いのではないでしょうか?というわけで、18日目終わります!

2011/12/18 00:00 | Vim | トラックバック(0) | コメント(3)

ページの先頭へ

関西Vim勉強会 #7? #8?に参加してきました

lingr.vimとその中身の簡単な紹介を発表してきた。かなりざっとして説明だったのでどれぐらいの方に分かって頂いたかわからないけど、興味を持って頂ければと。最近は、VimのPythonインタフェース用ライブラリみたいなものも微妙に作り出しているので、将来的にはvitalに仲間入りさせてもらっても良いのかも。それぐらい洗練させれたらいいな。

他の方々の発表としては、ujihisaさんによるいくつかのプラグインの紹介とvitalの紹介、Sixeightさんによるrails.vimの紹介、kozo-niさんによるVundleの紹介があった。特に、Vundleは自分も最近つかいはじめて、超適当なhgおよびsvn対応版も勝手につくっているので、参考になった。作者がいい人っぽいというのは、自分も感じていて、GitHubにはマメにコメントしてくれるし、lingrのvim-users.jp部屋にも遊びにきてくれるしで、すごい親しみやすい人だとおもう。hgとsvnサポートも本家が近いうちにやってくれそうな感じなので期待している。

というわけで、主催してくださったujihisaさんをはじめ、参加者の皆様お疲れ様でした!

2011/05/07 19:10 | Vim | トラックバック(0) | コメント(0)

ページの先頭へ

今更ながら関西Vim勉強会#5で発表してきた

もう2週間前の話になるけど,Vim勉強会#5で発表してきました.発表者なのに大幅に遅刻するという失態を起こしつつも,なんとか自分の発表時間には間に合いました.ご迷惑をおかけしてすみませんでした.

発表では,vimrcの書き方について簡単に話しました.全然本筋と関係ないけど,Keynoteで作った資料がslideshareで思いのほかちゃんと再現されててびびった.

慣れないうちは,他の人のvimrcとか読んでるとなんでこんな書き方してるんだろ?ということがよくあるので,そういうにちょっと気を遣いながら内容を考えたんやけど,どうだったかな.とりあえずあとでUstream見直したら自分が早口過ぎたことはわかった.学会発表ではだいぶ気をつけてるけど,こういう場でもうまくしゃべれるとよいな.

あと,今回言いたかったことはthincaさんがvimrc基礎文法最速マスター - 永遠に未完成にうまくまとめてくれているので,あわせて参照というか,むしろこっちを読んでみてください.

2010/02/14 05:15 | Vim | トラックバック(0) | コメント(0)

ページの先頭へ

Vimでoperator-userを使って他のプラグインをoperatorとして使えるようにしてみた

kanaさん作のoperator-userを使うと,簡単にoperatorを定義できる.operatorというのはここでは,Vimのコマンドのうちdwとかc$とかのdとかcとかの,動作を指定するコマンドのこと(こんな説明でいいのか,まぁ詳しくは:h operatorで(^-^;)).で,Vimにははじめから便利なoperatorが定義されていて,新たにoperatorを定義できると言われても,さてどうしたもんかと思っていた.

そんなときに,operator-userとは別に,commentop.vimというコメントアウト/アンコメントするためのoperatorを定義するプラグインを見つけて,あーなるほどこれは便利だと思った.ところが,コメント系のプラグインとしては,NERD Commenterが非常に高機能で便利に使っていたので,そこから機能が落ちるのはちょっとなぁとも思っていた.

というわけで,前置きが長くなったけど,それだったらNERD Commenterとoperator-userを組み合わせて新しいoperatorを作ったらいいんじゃね?ということでやったみた.以下を.vimrcなどに書いておけば,,cや,uなどといったoperatorが定義される.

function! s:SID_PREFIX()
    return matchstr(expand('<sfile>'), '<SNR>\d\+_')
endfunction

noremap [Operator] <Nop>
map , [Operator]

" デフォルトのマッピング定義を行わない
let g:NERDCreateDefaultMappings = 0
 
 nmap gA <Plug>NERDCommenterAppend
 nmap [Prefix]a <Plug>NERDCommenterAltDelims

" NERDCommenter + operator-user
function! s:setCommentOperator(key, name)
    call operator#user#define(
    \   'comment-' . a:name,
    \   s:SID_PREFIX() . 'doCommentCommand',
    \   'call ' . s:SID_PREFIX() . 'setCommentCommand("' . a:name . '")')
    execute 'map' a:key '<Plug>(operator-comment-' . a:name . ')'
endfunction

function! s:setCommentCommand(command)
    let s:comment_command = a:command
endfunction

function! s:doCommentCommand(motion_wiseness)
    let v = operator#user#visual_command_from_wise_name(a:motion_wiseness)
    execute 'normal! `[' . v . "`]\<Esc>"
    call NERDComment(1, s:comment_command)
endfunction

call s:setCommentOperator('[Operator]c',       'norm')
call s:setCommentOperator('[Operator]<Scace>', 'toggle')
call s:setCommentOperator('[Operator]m',       'minimal')
call s:setCommentOperator('[Operator]s',       'sexy')
call s:setCommentOperator('[Operator]i',       'invert')
call s:setCommentOperator('[Operator]y',       'yank')
call s:setCommentOperator('[Operator]l',       'alignLeft')
call s:setCommentOperator('[Operator]b',       'alignBoth')
call s:setCommentOperator('[Operator]n',       'nested')
call s:setCommentOperator('[Operator]u',       'uncomment')

一応ポイントとしては,NERDComment()という関数がNERD Commenterの本体で,第一引数を1にしておくと直前のVisual modeで選択された範囲に対して操作を行うというところ.なので,doCommentCommand()でoperatorの操作範囲を一旦Visual modeで選択してからEscするようにしている.NERD Commenterの各コマンドの意味は:h NERDComFunctionalitySummaryを参照ということで.

また,operatorは,例えばddで一行削除やyyで一行ヤンクというように,2回連続入力でその行全体に対して動作したり,Visual mode中では選択範囲に対して動作したりするのだが,operator-userで定義したoperatorもちゃんとそのように振る舞う.そのため,,c,cで一行コメントアウトやVisual mode中に,uで選択範囲をアンコメントといった動作も同時に定義される.なので,NERD Commenterのデフォルト定義は無効にしてある.

さらに,textobj-commenttextobj-indentといった,text objectとももちろん連携可能なので,使いこなせば光の速さでコメント操作ができるようになる!...はず!

あと,調子にのってAlignプラグインもoperator化してみたけど,さすがにこれはちょっと無理があると思った.自分ではたまに使おうと思うけど(^-^;)

2009/09/19 15:35 | Vim | トラックバック(0) | コメント(0)

ページの先頭へ

トップページへ >> 次のページへ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。