7
Magitで使用されるものと同様のポップアップメニューを実装する方法
質問 私はの形でユーザーインターフェイスを作成したいポップアップメニュー、Magitに使用されるものと同様のポップアップメニュー。 特徴 ポップアップの定義 この質問のポップアップは、メニュー項目のコレクションを含む小さな一時的なウィンドウを意味し、ユーザーはこれらの項目の1つだけを選択できます。 画面上の位置 ポップアップは画面のどの部分にも表示できますが、非常にわかりやすく、現在アクティブなウィンドウの横に表示されることが望ましいです。 ポップアップバッファの内容 アイテムはきれいな表の形で表示されるべきです。かなりの質問のコンテキストは視覚的に魅力的であることを意味します。この効果は、メニュー項目をまっすぐな列に配置することで最も簡単に実現できます complete--insert-string。この段落は、追加の説明に役立ちます。独自の方法で行うことができます。これにより、答えが不正確になることはありません。 メニュー項目の選択 選択は、単一のキーを押すか、必要に応じてマウスを使用して実行されることが予想されます(それほど重要ではないため、マウスをサポートしない命題を含む回答は合法です)。マウスをサポートするソリューションを提案する場合は、ユーザーが直感的な方法で、つまり目的の選択肢を左ボタンをクリックすることによってメニュー項目を選択できる必要があることに注意してください。 NBマウスはさまざまな方法で使用でき、選択肢を示す別の方法も歓迎します。 ポップアップの排除 ユーザーが上記の方法でメニュー項目を選択すると、バッファーとそのウィンドウが表示から削除され、強制終了されます。ポップアップメニューを呼び出す前にアクティブであったウィンドウは、再びフォーカスされる(つまり、アクティブになる)必要があります。 戻り値と引数 できれば、このアクションの結果として、Lispオブジェクトが返される必要があります。Lispオブジェクトは次のいずれかです。 nil—これは、ユーザーがを押すC-gか、その他の方法でポップアップメニューを中止したことを示します†。 string—文字列(シンボルの使用が許可されています)はstring-equal 、実際のアイテムのコレクションとしてポップアップメニューに提供される文字列の1つにする必要があります。 プログラムの残りの部分にユーザーの選択、または場合によってはその不在を知らせる別の方法も許容されます。ただし、他にどのように実行できるかが明確でない場合は、すべての回答者に即興で質問し、この側面のさらなる明確化を求めません。 これはすべて戻り値です。入力パラメータについては、可能な選択肢(つまり、メニュー項目)を表す文字列のコレクションを少なくとも含める必要があります。 許容できる回答 予想される回答は次の形式になります。 知識のある読者が上記のような関数を記述できるようにする十分なコードスニペット。作業関数全体を記述することは予期されていません。ただし、不確実性を避けるために(コードのかなりの部分を省略できますか?)、スニペットの欠落部分は回答のテキストコンポーネントで説明する必要があります。 同様の機能を実装する既存のライブラリへのリンク。不確実性を避けるために、私たちの場合と同様に、ライブラリーを使用して、上記の機能を少なくとも2つまたは3つ持つポップアップ(上記の定義を参照)を作成できることに注意してください。提案されたライブラリーが前述の条件を満たせない点と異なる場合、そのようなケースはそれぞれ独立して判断され、OPが有用であると判断した場合は常に賛成されます。 «機能»セクションで説明されている機能を実装するために使用できる組み込みEmacs関数またはサードパーティの関数の説明。上記を参照してください。回避の不確実性には、あなたの答えは実装したい、将来の読者のためにどのように活用できるか明確にしてください状態のポップアップ、Magitに使用されるものと同様のポップアップメニューを。 †ポップアップメニューを中止する別の方法には、次のものがあります(これらに限定されません)。 ポップアップメニューウィンドウの外側をクリックします。 選択せずにポップアップを含むバッファを強制終了します。