Emacsのマクロ:処理のための分隊の形成





あなたのルーツを忘れないでください、覚えておいて、もっと高いものがあります...

カーストはこちら



ライフストーリー





多くのコンピューター生活はゲームで始まりました。 一部の大統領のように、木の板でチェスをしなかった人たち。 私はチェスをしません。スタークラフトや他の同様のゲームをします。 私は何時間もプレイしていましたが、時間が経つとゲームは深刻なクラスになり、何らかの結果をもたらしました。 同時に、ゲームが生まれ変わったとしても、習慣は古いままでした。 時々遊びたいです。



チェスにないものは何ですか? チェスでは、最もパワフルな場所にライブパトロール、チーム、地雷原などはなく、編集することによってプログラムを再コンパイルしている間、時には不足していることもあります。 ノスタルジアは刺激的であり、ソフトウェア環境でこのようなものを探し始めています。 そして見つけた!



今日は楽しいマクロについてお話します。







Emacsには2種類のマクロがあります-退屈なものと面白いものです。 退屈なものはLispのマクロであり、面白いものは多くの人になじみのあるキーボードマクロです。 これは2番目についてであり、説明します。



シーディング-ボタンをマスターする





初めてゲームを開始すると、あなたの前に、立って何もしない1人のビルダーが表示されます。 近所を駆け巡ると、何かを構築し始めると同時に、建物や行動の名前にハイライトされた文字が表示されます。 これらの文字は、アクションをすばやく実行できるアクセスキーです。 将来、ゲームはこれらの文字を適切なタイミングで連続して押すことになります。



マクロとは何ですか?





「マクロ」と呼ばれるプログラムにそのようなことがあることは誰もが知っています。また、その名前の根源にあるEmacsにもこの概念(エディターMACroS)が含まれているので、Emacsを使用するときにこの概念を知らないのは恥ずべきことです。 同時に、F3やF4以外のマクロを誰もが知っているわけではありません。他のプログラムのマクロとは、実際にはまだ初期段階にあるものです。



Emacsのマクロとは何ですか?





一般的に言えば、Emacsのマクロは、他のプログラムとは異なり、キーボードでしか記録されません。 残りは、最大限に使用できる強力なデバイスであり、原則として誰もアクセスできません。 Emacsの多くの適切な設定の真っmid中にいるインターネット上の1人の男が、マクロの組み合わせに別のアクションを掛けることを提案しました。 どうやら、彼はEmacsのマクロは他のどこでも同じだと思っていて、記録と再生という2つのキーがあります。



Emacsでは、状況はまったく異なります。



まず、マクロを記録するとき、マクロはマクロリングに分類されます。マクロリングには多くの操作が定義されています。 つまり、そこにあるマクロはそれらの記憶のために記録されるだけでなく、リングを前後に歩いて選択することができます。 そして、あなたはリングを歩き回るだけでなく、各マクロに入り、それを変更することもできます。



第二に、このリング自体は単純ではありません。 このようなコントロールキーは、連続操作用に設計されており、リングにアクセスするための最初のキーの組み合わせがEmacsによって記憶されているため、毎回押す必要はありません。



Ctrl + x + Ctrl + kを押すと、キーボードの名前空間を入力します。 その後、Ctrlキーを押しながら、リングと現在のマクロでのアクションを担当する多くのキーを押すことができます。



例を考えてみましょう:



1)2つのマクロを作成します。 最初のマクロは番号1を挿入し、2番目のマクロは番号2を挿入します。



F3 1 F4

F3 2 F4









以下では、F3を押すたびに記録が開始され、F4を押すたびにマクロが記録されていることがわかります。 これらのアクションの後、バッファに12が表示され、2つのマクロがある目に見えないリングがあります。 2番目のマクロが選択されています(またはアクティブです)。



2)選択したマクロを実行します。 多くの人がF4を押したいと思っています。これは非常に簡単だからです。 マクロを迅速に実行する方法ではなく、リングを使用しています。



ロングランをプッシュ



Ctrl + x + Ctrl + k + Ctrl + k









Ctrlキーを離さずに、ボタンを押し続けながら、数字の2が挿入されたことを確認しました



Ctrl + p + Ctrl + k









そして、最初に、pの後に何かが(ミニバッファーに)書き込まれていることを確認し(数字1)、kの後に数字1が挿入される方法を確認します。



Ctrl + n + Ctrl + k









そして、最初に、nの後、現在のマクロに関する情報が同じ方法(番号2)で書き込まれ、kの後に番号2が挿入される方法が表示されます。



3)すべてのボタンを放します。 12212は画面に残り、最初の2桁はマクロの記録に関与し、残りの3桁はマクロの結果です。



どうしたの? 2つの単純なマクロを記録し、プレフィックスの組み合わせCtrl + x + Ctrl + kを押してキーボードの名前空間に入りました。 この名前空間で動作して、最初に2番目のマクロを実行し、2番目のマクロから最初のマクロに切り替えて最初のマクロを実行し、最初のマクロから2番目のマクロに切り替えて2番目のマクロを再度実行しました。



すべてを正しく行った場合、スペースを入力した後の左のCtrlキーは一度も解放されず、同時に右手でkpkn kキーのみが押されました。



これはマクロの実行における違いです。マクロが1つしかない場合は、F4を介して実行する方が便利です。 リングに複数のマクロがあり、それらを交互に実行する必要がある場合は、長期実行を使用します。



この指輪で他に何ができますか?





リング自体を回転させて現在の要素を変更できるため、リングの開始または終了が固定されていません。 各瞬間において、リングの最後の要素は現在の要素であり、最初の要素はそれに続く要素です。 新しいマクロが記録されると、現在の要素の後にリングに追加され、リングの最後の要素になります。 したがって、リング内で目的のマクロ順序を形成できます。



リングを使用した操作( nに進み、 pに戻る、 kを実行する、 dを削除する、 eマクロを編集する)のほとんどはまったく同じように機能し、ボタンを1つ押すだけで、リングをすばやく便利に使用できます。 しかし、理論的には同じように動作するはずですが、動作しない操作もあります。 おそらく、それらはこのエコシステムに気付かなかった別の著者によって後で追加されたのでしょう。



一部またはすべての要素を削除してリングをきれいにするには、を押します



Ctrl + x + Ctrl + k + Ctrl + d









そして、Ctrlを押しながらdd dを押します。



マクロの順序は次の方法で変更できます



Ctrl + x + Ctrl + k + Ctrl + t









これは、失敗したマクロからリングを削除するときに必要になる場合があります。



そしてこれは、要素の除去が簡略化された形で機能し、要素の交換が完全に行われた場合にのみ当てはまります。 そのため、ほとんどの場合、完全に入力する必要があるアクションを知る必要があります。 原則として、このような不快なアクションは、メインアクションよりも頻繁に使用されないように相互に結合します。



リングの長さ制限は8マクロですが、Emacsの設定では、もちろん簡単に増やすことができます(たとえば、32を入れます)。 それは多かれ少なかれ-手動で記録された個々のマクロの場合、8で十分のように見えるかもしれません。 しかし、真剣に使用するには、8では十分ではありません。



最初の戦闘機を作る





ビルダーを追って、最初の建物を建設のために開いたとき、最も単純な戦闘機を作ることができる兵舎を見つけました。 通常、それらは2つあります。1つは近接戦闘用、もう1つは長距離戦闘用です。 それらが作成されると、これらの戦闘機とその行動にすばやくアクセスできるように、強調表示された文字が同じように表示されます。



マクロを作成するにはどうすればよいですか?





もちろん、最初はF3 F4で記録します。 次に、既に記録されているマクロを編集する唯一の方法を見つけるマクロエディターを見つけます。すべてがF3 F4に戻ります。



実際、リングには2つの状態があります。リングには何も存在せず、リングには何かがあります。 そして、これら2つの状態には、新しいマクロを作成する方法があります。



マクロリングに何も存在せず、マクロを作成するだけの場合は、次のメソッドを適用できます。



1)マクロエディターを実行します。これにより、マクロを作成するように求められます。



Ctrl + x + Ctrl + k + Ctrl + ey









この方法では、マクロに何かを書き込む必要があり、空のマクロを作成することはできません。



2)F3 F4にハックを適用します。



F3 + Ctrl + u + F4









Emacsはミニバッファーにエラーを書き込みますが、絶対に空のマクロが作成されます。



Wrong type argument: integerp, (4)









3)コマンドを実行して、テキストからマクロを読み取ります。



Ctrl + SPC + Ctrl + SPC + Alt + x + read-kbd-macro









副作用があります。マーカーを配置および削除するため、マーカーリングが変化します。これはどこかで必要になる場合があります。 Ctrl + u + Ctrl + SPCを使用すると、通常このリングに沿って歩くことができるため、余分な位置が表示される場合があります。



マクロリングに少なくとも1つのマクロがあり、マクロを追加するだけの場合、次の方法を適用できます。



1)1行のマクロエディターを使用してマクロをコピーします。



Ctrl + x + Ctrl + k + SPC + Ctrl + k









現在のマクロのエディターが開きますが、Ctrl + kのため、マクロは新しいマクロにコピーされ、すべての内容が破棄されます。



2)F3 F4にハックを適用します。



F3 + Ctrl + u + F4









ここでの方法は、空のリングの場合と同じです。



リングにマクロがある場合、read-kbd-macroコマンドは新しいマクロを作成せず、選択したマクロに書き込みます。 したがって、この方法はこのコマンドでは機能しません。 重要なものが含まれている可能性がある選択したマクロのみを上書きできます。



ここで、多くの人が「なぜ空のマクロが必要なのか」と尋ねることがあります。 実際、マクロは大小さまざまで、複雑でシンプルです。 マクロの記録は、エディターを介して迅速に記録するよりもはるかに時間がかかる場合があります。 さらに、必ずしも一見正しいマクロ記録が実行されるとは限りません。 特に基本的なため、エディターを使用できる必要があります。



マクロを編集するにはどうすればよいですか?





次の実験では、2つのマクロを作成し、3番目のマクロを完全に空にする必要があります



F3 123 F4

F3 456 F4

F3 Ctrl+u F4









リングには3つのマクロがあります。1つは123を挿入し、もう1つは456を挿入し、3つ目のマクロは空で選択されています。 最初の2つのコンテンツを3番目のマクロに書き込む必要があります。



最初のマクロに行きます



Ctrl + x + Ctrl + k + Ctrl + n









編集用に開きます



Ctrl + e









見る



 ;; Keyboard Macro Editor. Press Cc Cc to finish; press Cx k RET to cancel. ;; Original keys: 123 Command: last-kbd-macro Key: none Macro: 123 ;; self-insert-command * 3
      
      







上記の行に移動します



 ;; Original keys: 123
      
      







そして、バッファー123にコピーします。



次に、バッファを閉じます



Ctrl + x + k + <RET>









次に、2番目のマクロに移動します



Ctrl + x + Ctrl + k + Ctrl + n









編集用に開きます



Ctrl + e









見る



 ;; Keyboard Macro Editor. Press Cc Cc to finish; press Cx k RET to cancel. ;; Original keys: 456 Command: last-kbd-macro Key: none Macro: 456 ;; self-insert-command * 3
      
      







上記の行に移動します



 ;; Original keys: 456
      
      







バッファ456にコピーします。



次に、バッファを閉じます



Ctrl + x + k + <RET>









次に、3番目のマクロに移動します



Ctrl + x + Ctrl + k + Ctrl + n









編集用に開きます



Ctrl + e









見る



 ;; Keyboard Macro Editor. Press Cc Cc to finish; press Cx k RET to cancel. ;; Original keys: Command: last-kbd-macro Key: none Macro:
      
      







「Macro:」の行の後に、Ctrl + y、Alt + y、Ctrl + y、コピーした行456および123を貼り付けます。



 ;; Keyboard Macro Editor. Press Cc Cc to finish; press Cx k RET to cancel. ;; Original keys: Command: last-kbd-macro Key: none Macro: 123 456
      
      







次に、Ctrl + c + Ctrl + cで保存します。



リングには3つのマクロがあります。1つ目は123、2つ目は456、3つ目は123456です。



当然、これをすべてコピーせずに手動で(123456)書くことができますが、これらのマクロは単純すぎます。 より複雑な場合、シーケンスをすぐに記録するのはそれほど簡単ではなく、F3を介して大きなマクロを記録するとエラーが発生します。 したがって、小さなマクロは次々と書き込まれ、エディターの一番上には常に完全なレコードがあり、簡単にコピーできます。



よく使用される2番目の方法は、read-kbd-macroを使用する方法です。 テキストを選択して、read-kbd-macroを実行するだけです。 次に、どのマクロ(フルまたは空)を使用していても、このテキストで書き換えられます。 スペースと改行が消えることを忘れないでください。



エディター内のスペースはSPC SPC SPCの形式で記述されているため、エディターを介したコピーでは追加のアクションは必要ありません。



マクロには何がありますか?





マクロの構成-3つのこと:クリックのシーケンス、カウンター、フォーマットされた行カウンター。 あなたがしばしば気づくことができる2つの他のものがあります-マクロの名前とそのキーボードの組み合わせ。 最初の3つの要素が各マクロにある場合、残りの2つは外部であり、追加のコードを介して必要に応じてマクロに添付されます。 したがって、マクロに関連付けることも、マクロから解放することもできます。



マクロ内のカウンタ自体は、マクロが呼び出されたときにどのように変化するかがすぐにはわからないため、混乱を招く可能性があります。 答えは簡単です。それは決して変化しません。 このカウンターは単にマクロに保存され、完全に独立して動作します。 フォーマット文字列はカウンタのみを参照し、その出力を決定します。



マクロ内線からよく使用されるものから、「継続要求」のみを割り当てることができます。 その本質は次のように要約されます。操作中、マクロは、特別な属性によって、そのシーケンスで、停止し、さらなるアクションについてユーザーに尋ねる必要があると判断します。 なぜこれが必要なのですか? マクロ実行コマンドには、繰り返す回数を設定する引数があります。 引数を使用してマクロを自動的に繰り返すマクロを使用して未知のデータを処理する場合、マクロはこの実行中にスキップする必要のあるフラグメントを見つけることができるため、選択的に処理する必要があります。



この「継続要求」なしでマクロを記録した場合でも、いつでもマクロエディターから追加できます。 追加しても不要になった場合は、エディターを使用して同じようにすばやく削除できます。



そして彼はこんな感じ



Cx q









マクロ123を直接開き、そのような行を数字の間に挿入してから実行して、続行するリクエストを確認できます。



 ;; Keyboard Macro Editor. Press Cc Cc to finish; press Cx k RET to cancel. ;; Original keys: 1 Cx q 2 Cx q 3 Command: last-kbd-macro Key: none Macro: 1 ;; self-insert-command Cx q ;; kbd-macro-query 2 ;; self-insert-command Cx q ;; kbd-macro-query 3 ;; self-insert-command
      
      







引数を指定してマクロを実行すると



Alt + 5 + F4









実行されると、彼は適切な場所で毎回質問し、数字を書き留めて続行するか、数字を書き留めて続行します。



誰かが気付かなかった場合、すべてがこの実験をテストする準備ができています。 このテキストからマクロを「;;オリジナルキー:」の行からクリップボードに直接コピーし、Ctrl + x + Ctrl + k + Ctrl + eでEmacsのマクロエディターを開き、この行を「マクロ」の後に貼り付けます。 : "、Ctrl + c + Ctrl + cを押してから、Alt + 5 + F4を押します。



どのマクロが大きいか小さいか?





任意のプログラムでマクロを作成するとき、1つの大きなマクロまたは多くの小さなマクロをどのように最適に作成するかという疑問が生じます。 経験上、記録中であっても大きなマクロはめちゃくちゃになる可能性があり、同じリスクで書き直さなければならないことが示唆されています。 ストレージについて話す場合、ストレージが変換するデータのわずかな変更で、その変更に対処する必要があり、その変更はデバッグにつながります。 重要でないテキストの編集を開始するだけで、このようなマクロに行き詰まりやすくなります。



別の側面があります-マクロには繰り返しが必要です。 マクロ全体のアクションの小さなサブセットのみを周期的に繰り返す必要があることがよくあります。 これを行うには、最初からできるように、モノリスからそれらを分離し、同じ方法でそれらから小さなマクロを作成する必要があります。



したがって、小さなマクロの方が優れています。 システムを破壊することなく、それらを繰り返したり、交換したり、編集したり、順序を簡単に変更したりできます。



最初のキャンペーンで兵士を送ります





最初の兵士が完了すると、彼らは何かを壊して誰かと戦うためにキャンプに行きます。 そのため、さまざまな種類の戦闘機の強さ、装甲、速度が判明し、後で計画されたキャンペーン中に正しく配布できるようになります。



どのマクロがありますか?





マクロは他の機能が明らかでないため、テキストにのみ適用されることが非常に多くあります。 Emacsでは、マクロはテキストの変更、外観の変更、関数の実行の3種類に分類できます。



フレーム内にウィンドウを作成してサイズを変更するためのほとんどのアクションは何度も実行されますが、マクロを使用してすべてを実行できることを知っている人はほとんどいません。 ここで、単純なマクロを記録して、それで遊んでみましょう。



1)エディターを開き、最初のマクロを作成します。



Cx 2 Cx 3 Cx o Cx o Cx 3 Cx o









2)2番目のマクロを記録します。



123









3)クリーンウィンドウで、最初のマクロを選択し、3回実行します。



Alt + 3 + Ctrl + x + Ctrl + k + Ctrl + k









Ctrlを放さずに、2番目のマクロに移りましょう



Ctrl + n









Ctrlを放さずに実行する



Ctrl + k









正しく行われると、そのような写真が表示されます



ショー






そのような写真を作るのは簡単です



ショー






そしてそのような



ショー






ご覧のとおり、ウィンドウを分割するための簡単なマクロを記録しただけで、さまざまなパターンを作成できます。



より便利な例は、2つの独立したコンソールを開くことです。 プログラムを作成する場合、1つのコンソールで1つを実行し、別のコンソールでもう1つを実行する必要があります。 同時に、ソースを編集する必要があります。



マクロを記録して実行する



Cx 2 Cx o Cx 3 Cu <<shell>> shell-compil RET Cx o Cu <<shell>> shell-exec RET M-- 2 Cx o









下に2つの異なるコンソールがあるテキストバッファーを参照してください



ショー






今、そのようなマクロを書く



Cx o Cx k RET yes RET Cx o Cx k RET yes RET Cx 0 Cx 0









この逆のアクションは、コンソールでウィンドウを閉じます。 これで、1組のコンソールを1つのマクロで開き、別のマクロで閉じることができます。 また、これらのマクロは、既にわかっている方法で切り替えることができます。



マクロの別の例を次に示します。これは、テキストの処理やウィンドウの作成を行わず、ファイルマネージャーモードで一連のアクションを実行します。



マクロを記録する



+ dir <f3> 2*RET Cx Cf file . txt RET abcd Cx Cs Cx k RET g ^ g









彼にカウンターを設定します



Ctrl + x + Ctrl + k + Ctrl + c

1

RET









どこかにディレクトリを作成し、Ctrl + x + dを使用してそこに移動します。 マクロを5回実行すると、5つのディレクトリが作成されます。各ディレクトリには、独自のテキストを持つ独自のファイルがあります。



ショー






そのため、ディレクトリツリーを作成および削除したり、ファイルの内容や権限や名前などの外部データを変更したりできます。 同様に、コンソールでマクロを使用して、プログラムを自動的にコンパイルおよび実行できます。 さらに、1つのマクロが異なるコンソールと対話し、それらを切り替えることができます。



ここに別の例があります



echo SPC x RET Cx o echo SPC y RET Cx o









ショー






基地で兵士を調理する





最初の戦いでさまざまなタイプの兵士の可能性を発見したとき、すでに定義されたタスクを解決するための特定のタイプを作成し、誰も揺れない安全な場所にそれらを蓄積することができます。 私たちは、どの組成とどの量がより効果的であるかを見つけ始めます。



マクロを非表示にする方法は?





Emacsセッション中にあらゆる種類の便利なマクロを実行したとき、それらを捨てるのは残念です。 インターネットでの検索はほとんど行われません。Emacsに捧げられた最高のページでは、マクロをLispに変換してから通常の関数として保存することについてのみ書かれています。 これはあなたが必要なもののようですが、ここではよく知られた問題に直面しています:この関数では数日で忘れられる名前を覚える必要があります。 さらに難しいオプションがあります-マクロ自体を忘れた場合。 これら2つのものを一緒に追加すると、<forgotten macro> + <forgotten name> = 0になります。しかし、最も重要なことは、これが主な問題です。このようなマクロはマクロリングに挿入されないため、この素晴らしいデバイスから外れます。 これにより、マクロは、保存されたマクロと現在のセッション中に記録されたマクロに階層化されます。



マクロをLispビューに変換するには、マクロに切り替えてinsert-kbd-macroを実行します。



ここにマクロ123と456があります



 (setq last-kbd-macro "123") (setq last-kbd-macro "456")
      
      







シンプルで上品に見えますが、両方とも最後のマクロにロードされるため、ロードには適していません。このためには空のマクロを作成する必要があります。 ダウンロードに適したマクロを作成するには、Ctrl + x + Ctrl + k + nを使用して両方の名前を付ける必要があります(次のマクロへの切り替えと混同しないでください)。



名前がonetwothreeおよびfourfivesixの場合、insert-kbd-macroコマンドの動作は異なります



 (fset 'onetwothree (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ("123" 0 "%d")) arg))) (fset 'fourfivesix (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ("456" 0 "%d")) arg)))
      
      







今では、Emacs初期化ファイルに接続されているlispファイルにスローされます。 これはマクロを保存するための古典的なオプションと考えられており、マクロは次回Emacsが起動するときにこれらの名前で使用できます。マクロリングが空になることは考慮されません。



彼の方法はすぐに見つかりました。私はそれをすべて拾い上げてリングに着いてから、名前なしでマクロをプッシュする方法を学ばなければなりませんでした。



 (defun make-my-macros() "Make macros." (interactive) (add-to-list 'kmacro-ring '("123" 0 "%d")) (add-to-list 'kmacro-ring '("456" 0 "%d"))) (make-my-macros)
      
      







eval-bufferを介してこのコードを実行すると、新しいマクロを記録するためにリングを開いたまま、リングにいつでもマクロをロードできます。このコードが初期化ファイルにスローされた場合、マクロをリロードするには、関数を呼び出すだけで十分です。



通常の機能よりも優れているのはなぜですか?





Lispをよく知っていても(Lisp自体ではなく、Emacs内部の名前でも)、いずれの場合でも、1つの関数を書くのはマクロを書くよりも時間がかかります。同時に、デバッグ、保存、および関数の再読み込みが複雑なため、関数の変更は抑制されます。他の多くの重要でないものを記憶する必要があるため、他の人との共生における1つの機能の共同作業もうまくいきません。そしてマクロ-今日はマクロがあり、明日はマクロがあります。より無料です。これらは外出先で変更してコピーでき、問題や損失の恐れやその後のハードデバッグの恐れがありません。マクロにエラーが含まれている場合は、単にコピーされ、すべての実験はマクロエディターのコピーで実行されます。すべての準備が整ったら、古いバージョンが削除され、新しいバージョンがその場所に移動します。さらに、1つの小さなマクロの効果は、多くの機能的構成体の効果に等しいことがよくあります。







, . , , , . , .



?





少し前まで、Emacs モード見つけました。その後、同時に武器庫に入れたいだけでなく、名前とキーボードの組み合わせで競合しないようにするために、多くの機能との混乱を取り除く必要がありました。それから、Emacsでこれを自然な方法で行う方法を学びました-そして、すべてが1つのメインモードと、フックを介してそれに接続するいくつかのサイドモードを作成しました。



一般に、順序付けられた形式でいくつかの機能を使用するには、小さなモードを作成する必要があります。また、モード内では、モードをオンにするとインストールされ、オフにすると削除されるキーボードショートカットに関数呼び出しを既に追加できます。そのため、異なるコンテキスト用にいくつかの小さなモードを作成し、各モードに個別のマクロを設定できます。



いくつかのモードがあります。1つはHabra、もう1つはYouTube、そして残りはフォーラムです。そして、それらのいくつかはすでに独自の関数とマクロのシステムを開発しています。各モードでは、マクロはタスクごとにグループ化され、タスクごとにマクロのセットをリングにロードできます。さらに、タスク自体とその中のマクロの構成は、関数のコメントで説明できます。コメントは、Ctrl + h + mでアクセスできるモードのヘルプから簡単に表示できます。



そして、ここにハブラ政権への助けがあります



 Habra minor mode (indicator Habr): Mode for `http://www.habrahabr.ru'. key binding --- ------- Cc Prefix Command Cc m Prefix Command Cc mh Prefix Command Cc mhc Prefix Command Cc mhm Prefix Command Cc mhq habra-wrap-quote Cc mhmg habra-make-macro-general Cc mhc 1 habra-wrap-code Cc mhc 2 habra-wrap-source
      
      







そして、これはYouTubeの政権への助けがどのように見えるかです



 Youtube minor mode (indicator YouTube): Mode for `https://www.youtube.com'. key binding --- ------- Cc Prefix Command Cc m Prefix Command Cc my Prefix Command Cc mym Prefix Command Cc mymg youtube-make-macro-general Cc mymp youtube-make-macro-playlist
      
      







この方法で関数の名前をいつでも覚えてから、これらの関数に移動して、その中のマクロに関するコメントを見ることができます。



Habraのモード自体は次のようになります



ソースコード
 ;; Habra mode (defun habra-wrap-quote() "Wrap selection to <blockquote></blockquote> tags." (interactive) (if (not (mark)) (set-mark (point))) (narrow-to-region (mark) (point)) (goto-char (point-min)) (insert "<blockquote>") (goto-char (point-max)) (insert "</blockquote>") (set-mark (point-min)) (widen)) (defun habra-wrap-code() "Wrap selection to <code></code> tags." (interactive) (if (not (mark)) (set-mark (point))) (narrow-to-region (mark) (point)) (goto-char (point-min)) (insert "<code>\n") (goto-char (point-max)) (insert "\n</code>") (set-mark (point-min)) (widen)) (defun habra-wrap-source() "Wrap selection to <source></source> tags." (interactive) (if (not (mark)) (set-mark (point))) (narrow-to-region (mark) (point)) (goto-char (point-min)) (insert "<source>\n") (goto-char (point-max)) (insert "\n</source>") (set-mark (point-min)) (widen)) (defun habra-make-macro-general() "Make general macros." (interactive) ;; Add a title to spoiler (add-to-list 'kmacro-ring '("\Cs<spoiler\Cm title=\"\"\Cb\Cu\C-xq" 0 "%d")) ;; Replace * to <h1> (add-to-list 'kmacro-ring '([?\Cu ?\Cs ?^ ?\\ ?* ? ?\Cm ?\Cx ?q ?\M-2 ?\C-? ?\M-\\ ?< ?h ?1 ?> ?\Ce ?\M-\\ ?< ?/ ?h ?1 ?>] 0 "%d")) ;; Replace ** to <h2> (add-to-list 'kmacro-ring '([?\Cu ?\Cs ?^ ?\\ ?* ?\\ ?* ? ?\Cm ?\Cx ?q ?\M-3 ?\C-? ?\M-\\ ?< ?h ?2 ?> ?\Ce ?\M-\\ ?< ?/ ?h ?2 ?>] 0 "%d")) ;; Change < to &lt; (add-to-list 'kmacro-ring '("\Cs<\Cm\C-xq\C-?&lt;" 0 "%d")) ;; Change > to &gt; (add-to-list 'kmacro-ring '("\Cs>\Cm\C-xq\C-?&gt;" 0 "%d")) ;; Change leading space to &nbsp; (add-to-list 'kmacro-ring '("\Cu\Cs^ \Cm\C-xq\C-?&nbsp;" 0 "%d")) ;; Change double space to &nbsp; (add-to-list 'kmacro-ring '("\Cu\Cs \Cm\C-xq\C-?&nbsp;" 0 "%d")) ) (defvar habra-mode-map (let ((map (make-sparse-keymap))) (define-key map (kbd "Cc mh q") 'habra-wrap-quote) (define-key map (kbd "Cc mhc 1") 'habra-wrap-code) (define-key map (kbd "Cc mhc 2") 'habra-wrap-source) (define-key map (kbd "Cc mhm g") 'habra-make-macro-general) map) "Keymap for `habra-mode'.") (define-minor-mode habra-mode "Mode for `http://www.habrahabr.ru'. \\{habra-mode-map}" nil " Habr" nil (if habra-mode (progn (habra-make-macro-general) (add-to-list 'yas-extra-modes 'habra-mode) (yas-minor-mode t)) (progn (set 'yas-extra-modes (delete 'habra-mode yas-extra-modes))))) (provide 'habra-mode)
      
      









ここでは、モード自体が名前空間によって分割されていることがわかります。 Cc + mは、その小さいモードの1つを入力し、次に名前の最初の文字-h(habra)を入力し、さらにモード内でアクションが選択されます-m(マクロ)、次にこのアクションの亜種-g(一般)。したがって、実際には、多くのマクログループを作成できます。それらはすべて、いつでも記述してリロードするのに適しています。同時に、いくつかの小さなモードを同時にオンにすることができ、互いに干渉することはありません。



さらによく見ると、Habraのモードでコードタグがどのように分離されているかがわかります。 c(コード)キー自体は名前空間の形式で作成され、キー1とキー2はこのスペースの名前です。マクログループでも同じことができ、マクログループの階層が作成されます。



どんな小さなモードでも、マクロの一般的なグループは接続後すぐに自動的にロードされることに注意してください。実践が示しているように、これなしでは、マクロへのアクセスは常に組み合わせを呼び出す必要がありました。ただし、マクロリングには長さの制限があるため、残りのマクロは自動的に読み込まれません。したがって、YouTubeのモードでは、モードがオンになっているときに一般的なマクロがロードされ、特別なマクロ(組織モードのビデオリストをテーブルに変換するため)は常にキーボードの組み合わせによるロードを待機します。



YouTubeのコンテンツモード



ソースコード
 ;; YouTube mode (defun youtube-make-macro-general() "Make general macros." (interactive) (add-to-list 'kmacro-ring '("https://www.youtube.com\Cj" 0 "%d")) ) (defun youtube-make-macro-playlist() "Make macros for saving playlist." (interactive) ;;     (add-to-list 'kmacro-ring '([?\Mx ?b ?r ?o ?w ?s ?e ?- ?u ?r ?l ?- ?e ?m ?a ?c ?s return ?\Cy return] 0 "%d")) ;;      (add-to-list 'kmacro-ring '("\Cs<tr\Ca\Cs</tbody\Ca\367" 0 "%d")) ;;   (, , ) (add-to-list 'kmacro-ring '([?\Cs ?< ?a ? ?h ?r ?e ?f ?= ?\" ?\Cm ?\Cw ?h ?t ?t ?p ?s ?: ?/ ?/ ?w ?w ?w ?. ?y ?o ?u ?t ?u ?b ?e ?. ?c ?o ?m ?\Cs ?& ?\Cm ?\Cb ?\Cj ?\Cs ?< ?a ? ?c ?l ?a ?s ?s ?= ?\" ?p ?l ?- ?v ?i ?d ?e ?o ?- ?t ?i ?t ?l ?e ?\Cm ?\Cw ?\Cs ?d ?a ?t ?a ?- ?s ?e ?s ?s ?i ?o ?n ?l ?i ?n ?k ?= ?\Cm ?\Cw ?\Cs ?> ?\Cm ?\Cw ?\Ck ?\M-\\ ?\Ce ?\M-\\ ?\Cj ?\Cs ?c ?l ?a ?s ?s ?= ?\" ?t ?i ?m ?e ?s ?t ?a ?m ?p ?\Cm ?\Cw ?\Cs ?l ?a ?b ?e ?l ?\Cm ?\Cw ?\Cs ?> ?\Cm ?\Cw ?\Cs ?< ?\Cb ?\Cj] 0 "%d")) ;;    (add-to-list 'kmacro-ring '("|id|Url|S|Desc|Time|\Cj|-\Cj||||<40>||\Cm\Ca" 0 "%d")) ;;   (, , )    (add-to-list 'kmacro-ring '("|\Cx\Ck\Ci|[[\Ce][link]]|-|\Ck\Ce|\Ck\Ce|\Ce\Cn\Ca" 1 "%d")) ) (defvar youtube-mode-map (let ((map (make-sparse-keymap))) (define-key map (kbd "Cc mym g") 'youtube-make-macro-general) (define-key map (kbd "Cc mym p") 'youtube-make-macro-playlist) map) "Keymap for `youtube-mode'.") (define-minor-mode youtube-mode "Mode for `https://www.youtube.com'. \\{youtube-mode-map}" nil " YouTube" nil (if youtube-mode (progn (youtube-make-macro-general) (add-to-list 'yas-extra-modes 'youtube-mode) (yas-minor-mode t)) (progn (set 'yas-extra-modes (delete 'youtube-mode yas-extra-modes))))) (provide 'youtube-mode)
      
      









大軍に部隊を派遣する時です





. , . , , , , , -.



All Articles