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) 



倧軍に郚隊を掟遣する時です



. , . , , , , , -.

Source: https://habr.com/ru/post/J281499/


All Articles