3

私は Ruby の完全な初心者ですが、TextMate バンドルを改造しています。私が解決しようとしている問題は、コマンドが出力を行った後にキャレットを特定の位置に移動する問題です。

基本的に何が起こるかは次のとおりです。ドキュメントをフィルタリングするコマンドをトリガーし、関連する場所にテキストを挿入するキーの組み合わせを押してから、ドキュメントを新しいフィルタリングされたテキストに置き換えて終了します。

次にやりたいことは、キャレットを元の場所に戻すことです。TextMate.go_to 関数を見つけたときはかなりうれしかったのですが、部分的にしか機能していません。関数:

positionY = ENV['TM_LINE_NUMBER']
positionX = ENV['TM_LINE_INDEX']
...
TextMate.go_to :line => positionY, :column => positionX; #列がうまくいかない

キャレットを正しい行に移動できますが、列パラメーターが機能しません。私はそれらをずらしてみましたが、列パラメーターだけで機能を実行することさえしましたが、うまくいきませんでした。ハードコードされた整数も試しましたが、positionX パラメータは正しい行インデックスを出力するので、そこに何かがあるとは思えません。

これは、この方法について私が見つけた唯一のドキュメントですが、textmate.rb を調べたところ、訓練を受けていない私の目には、適切に使用しているように見えます。

これはマクロで実現できることはわかっていますが、可能であれば避けたいと思います。「スニペットとして挿入」を選択するとマーカーを使用できることも知っていますが、最初にドキュメントをクリアする必要があり、「ドキュメントの置換」オプションを使用せずにこれを行う方法がわかりませんでした。誰?

4

1 に答える 1

4

バインディングのソース コードを見てみましょう。

def go_to(options = {})
  default_line = options.has_key?(:file) ? 1 : ENV['TM_LINE_NUMBER']
  options = {:file => ENV['TM_FILEPATH'], :line => default_line, :column => 1}.merge(options)
  if options[:file]
    `open "txmt://open?url=file://#{e_url options[:file]}&line=#{options[:line]}&column=#{options[:column]}"`
  else
    `open "txmt://open?line=#{options[:line]}&column=#{options[:column]}"`
  end
end

かなりハックなことに、バインディングは txmt:// URL を設定し、シェルで open を呼び出します。

したがって、最初に行うことは、開いている URL を作成し、それをターミナル/ブラウザーに入力して、TextMate が列パラメーターを尊重しているかどうかを確認することです。それが機能する場合は、お使いのバージョンの Textmate.go_to の実装にバグがある可能性があります。

于 2009-03-09T11:56:12.783 に答える