-
Notifications
You must be signed in to change notification settings - Fork 11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
textobj と syntax の連携 #987
Comments
これには厳密に言うと2つ課題があると思っていて、まず syntax group と textobj のマッピングをどのように実現するかという点と、@haya14busa さんの言う通り、Python など、syntax からは「関数」のブロックが分からない言語もあります。
ただし、「厳密に」と言った通り同時に解決できるような気もしていて、2つ目の Python のような言語の syntax でどのように関数ブロックを紐づけるのか、という課題をクリアできるほど柔軟な設計が思いつけば、それが1つ目のマッピングの設計の課題も解決すると思っています。
ABNF をパースしてオートマトンを構築して正規表現に変換して syntax file に吐き出してやれば実現できそうな気がします(自分にやれるとは(ry)。 |
それは論理がおかしくて、Python 自身は関数の終了を認識しているわけですから、 |
なるほど確かに。原理的には作れるはずですね。 |
Lingr でも話題に上がったのでリンクだけ貼っておきます。 あとカーソル下の syntax group 限定ですが、こういうプラグインが既にありました。 |
そのまま翻訳はできないと思いますが、vim-mode-plus の text-object-function の 実装で私がやったことを参考までに記載します。 実装箇所 text-object fold の子供クラスとして実装。
このアプローチは 一行で終わる関数はピックアップできない。が、まあそんなケースあまり多くないし無視、という割り切りをしている。 関数の入れ子どうするか、という話題がありますが、カーソル行が含まれる fold のうち、最も近いfold(上に遡って fold の開始行を検査すればよい)を取ればいいので、難しい問題にはならないです。 |
解決すべき問題は3つかな
てなことから、syntax の能力を調べるのが、最初に手を付けるべき場所かも。 |
直観的には プッシュダウン・オートマトン相当 じゃないかとは感じてる。 |
仮に、これに必要な syntax ファイルを作り直す(syntaxファイルの自動生成)ならば、 |
確か synstack() で入れ子になってる syntax group を確認できたはずなので、自分もプッシュダウンオートマトン相当の能力は備えてるんじゃないかと思ってます(予想)。 |
syntax がどうかは知らないですが、このテキストで foo/bar 各々の位置で |
syntax 定義をつかったヒューリスティック関数テキストオブジェクトプラグイン作れました https://github.com/haya14busa/vim-textobj-function-syntax 知見
vim-atom-mode と違って fold 情報までは使ってませんが,同様にとりあえず行指向だと仮定してる.別に行指向じゃないものも頑張れば作れそう. syntax 範囲取得実装指定した syntax name にマッチする一番ネストの深い部分のstartとendを取得する. 関数body の syntax name 取得 for re in ['funcblock', 'funcbody', 'functionblock', 'functionbody', 'methodblock', 'block', 'brace'] なにか syntax を拡張するなら syntax を汎用的な形で取得できるようになると嬉しい. その他応用可能性syntax based textobj で有用そうだなと思うのは関数textobjが真っ先に思いついたので実装しました. |
そうなんすよねー。辞書的に優先度付けてやらんと複数マッチしてしまうのがネック。 |
僕が考えていたのは仮想の ftplugin/vim/tomaps.vim: tomap f vimFunction ftplugin/lua/tomaps.vim: tomap f luaFunction なので、涙ぐましい部分は、最終的に ftplugin か、各syntaxファイルで提供される、はずw |
確かに ftplugin でやるのが良さそうですね。 ただ tomap のインターフェースを工夫すれば割と辛くない感じにもなりそうかも…? call textobj#function#syntax#tomap('f', [
\ 'funcblock', 'funcbody', 'functionblock', 'functionbody', 'methodblock', 'block', 'brace'
\]) |
提案概要
textobj を syntax を用いて柔軟に定義できるようにする。
具体的な提案内容
結果できること
(from https://twitter.com/_tyru_/status/801794126786150404)
The text was updated successfully, but these errors were encountered: