diff --git a/docs/tips/avy-can-do-anything.md b/docs/tips/avy-can-do-anything.md index e1777c9..4503ba4 100644 --- a/docs/tips/avy-can-do-anything.md +++ b/docs/tips/avy-can-do-anything.md @@ -17,6 +17,53 @@ ignorePublish: false 元の記事: [Avy can do anything \| Karthinks](https://karthinks.com/software/avy-can-do-anything/) + @@ -32,9 +79,12 @@ Too harsh? Let me rephrase: you’re barely using Avy. Still too broad? Okay, th Without burying the lede any further, here's a demo that uses a single Avy command (avy-goto-char-timer) to do various things in multiple buffers and windows, all without manually moving the cursor: --> -説明はこれ位にしておこう。以下のデモでは複数のバッファーやウィンドウにたいして、手作業でカーソルを移動することなく、Avyのコマンド1つ(avy-goto-char-timer)で様々な物事すべてを行う様子をお見せする: +説明はこれ位にしておこう。以下のデモでは複数のバッファーやウィンドウにたいして、手作業でカーソルを移動することなく、Avyのコマンド1つ(`avy-goto-char-timer`)で様々な物事すべてを行う様子をお見せする: -[avy-all-demo.mp4](https://karthinks.com/img/avy-all-demo.mp4) + -# フィルター -> 選択 -> アクション +# フィルター選択アクション -主要目的がテキストをタイプすることではないEmacsとのやり取りのほとんどにおいて、同じパターンが繰り返されるのを目にする。あるタスクを実行するためにフィルター(filter: 抽出)して、選択(select)して、それからアクション(act: 実行)を順繰りに行うパターンのことだ。 +主要目的がテキストをタイプすることではないEmacsとのやり取りのほとんどにおいて、同じパターンが繰り返されるのを目にする。あるタスクを実行するためにフィルター(filter: 抽出)して、選択(select)して、それからアクション(act: 実行)を順繰りに行うパターンのことだ。 -フィルター(Filter): 通常は何らかのテキストをタイプすることによって、大量に積まれたウィンドウ候補をより少ない候補へと絞り込む。以下に示す例のように候補は何でもよい。 +フィルター: 通常は何らかのテキストをタイプすることによって、大量に積まれたウィンドウ候補をより少ない候補へと絞り込む。以下に示す例のように候補は何でもよい。 -選択(Select): 必要は候補いずれかを指定する(通常は視覚的な同意つき)。フィルターによって候補リストが1つの候補に絞り込まれた場合には自動的にそれを選択する。 +選択: 必要は候補いずれかを指定する(通常は視覚的な同意つき)。フィルターによって候補リストが1つの候補に絞り込まれた場合には自動的にそれを選択する。 -アクション(Act): 引数としてその候補を渡してタスクを実行する。 +アクション: 引数としてその候補を渡してタスクを実行する。 -* ファイルをオープンしたい? ならコマンドを呼び出してから補完リストをフィルターするテキストをタイプして補完結果から選択してからfind-fileだ。 +* ファイルをオープンしたい? ならコマンドを呼び出してから補完リストをフィルターするテキストをタイプして補完結果から選択してからfind-fileだ。 -* バッファーの切り替え? フィルターに何かをタイプ、バッファーを選択して切り替えるだけ。 +* バッファーの切り替え? フィルターに何かをタイプ、バッファーを選択して切り替えるだけ。 -* コード内のシンボルの自動補完はどうだろう? ポップアップリストを絞り込むための文字を数文字タイプして、候補を選択したら確認に同意すればいい。 +* コード内のシンボルの自動補完はどうだろう? ポップアップリストを絞り込むための文字を数文字タイプして、候補を選択したら確認に同意すればいい。 -例のごとく、これは単純化されたモデルだ。たとえばHelm、Ivy、Diredの仲間たちは処理する複数の候補をユーザーが選択できるようにしている。このアイデアを検討する間は、この知識は脇に避けておくことにしよう。この観察によっていくつかの興味深いアイデアが導かれる。たとえばフィルター->選択->アクションというプロセスが、1つの操作と考えられることが珍しくない。フィルタリング、選択、アクションのフェーズを(コードや脳内で)分離してみれば、多くの可能性を考慮する自由が得られるだろう。以下はミニバッファーにおけるやり取り: +例のごとく、これは単純化されたモデルだ。たとえばHelm、Ivy、Diredの仲間たちは処理する複数の候補をユーザーが選択できるようにしている。このアイデアを検討する間は、この知識は脇に避けておくことにしよう。 + +この観察によっていくつかの興味深いアイデアが導かれる。たとえばフィルター選択アクションというプロセスが、1つの操作と考えられることが珍しくない。フィルタリング、選択、アクションのフェーズを(コードや脳内で)分離してみれば、多くの可能性を考慮する自由が得られるだろう。以下はミニバッファーにおけるやり取り: ![minibuffer-interaction-paradigm.png](https://karthinks.com/img/minibuffer-interaction-paradigm.png) @@ -107,7 +159,9 @@ The possibilities are, respectively: different completion styles (matching by re But this usage pattern extends to more than just minibuffer interaction. We often do things in regular buffers that involve the Filter → Select → Act pattern. In fact, you can look at most interactions with Emacs (whose focus isn't typing text) this way: when you call a goto-definition command with point–the text cursor–in some text, the filtering stage is skipped, the selection is made for you by a function from the thing-at-pt library, and a preset action is called. How about a mouse interaction? scroll through a window full of icons, move the mouse cursor to an icon and click on it. These completely redundant examples prime us for the more interesting cases. Consider Isearch: --> -この使用パターンはミニバッファーとの対話にかぎらず拡張できる。通常のバッファー操作において、フィルター->選択->アクションというパターンで物事を行うことは珍しいことではない。Emacsとのほとんどの(テキストのタイプに重点を置かない)対話において、この使い方を実際に目にできるだろう。ポイント(テキストカーソルのこと)が何らかのテキストにあるときにgoto-definitionコマンドを呼び出せば、フィルタリングのステップは飛ばしてthing-at-ptライブラリーの関数が選択を行い事前にセットされたアクションを行うのだ。マウスによる対話ならどうなるだろう? アイコンだらけのウィンドウをスクロールしてかいくぐり、お目当てのアイコンにマウスカーソルを置いてクリックといった具合である。この完全に冗長な例から、より興味深いケースにたいする気づきが得られる。Isearchで考えてみよう: +この使用パターンはミニバッファーとの対話にかぎらず拡張できる。通常のバッファー操作において、フィルター選択→アクションというパターンで物事を行うことは珍しいことではない。Emacsとのほとんどの(テキストのタイプに重点を置かない)対話において、この使い方を実際に目にできるだろう。ポイント(テキストカーソルのこと)が何らかのテキストにあるときにgoto-definitionコマンドを呼び出せば、フィルタリングのステップは飛ばして`thing-at-pt`ライブラリーの関数が選択を行い事前にセットされたアクションを行うのだ。マウスによる対話ならどうなるだろう? アイコンだらけのウィンドウをスクロールしてかいくぐり、お目当てのアイコンにマウスカーソルを置いてクリックといった具合である。この完全に冗長な例から、より興味深いケースにたいする気づきが得られる。 + +Isearchで考えてみよう: ![isearch-interaction-paradigm.png](https://karthinks.com/img/isearch-interaction-paradigm.png) @@ -119,19 +173,19 @@ When you type (after C-s), you automatically filter buffer text and select the n Isearch combines filter/search/act into a single command for efficiency. Even so, it's a very cleverly designed library for Emacs with support for many actions. Folks who replace Isearch entirely with Swiper or similar commands are missing out. --> -(C-sの後に)何かタイプすると、バッファーのテキストが自動的にフィルターされてもっとも近くにあるマッチが選択される。その後に続くマッチを順に選択したり、最初や最後のマッチにジャンプすることも可能だ。ここではマッチした位置へのカーソル移動というプロセスがアクションに相当するが、これは検索文字列にたいするoccurやquery-replaceの実行のような処理のうちの1つとみなすことができる。Isearchには多くはフィルターと選択、アクションを同時に行うコマンドが多く、そのためにユーザーは丸い穴に無理して四角い釘を打つような破目となる[^2]。 +(`C-s`の後に)何かタイプすると、バッファーのテキストが自動的にフィルターされてもっとも近くにあるマッチが選択される。その後に続くマッチを順に選択したり、最初や最後のマッチにジャンプすることも可能だ。ここではマッチした位置へのカーソル移動というプロセスがアクションに相当するが、これは検索文字列にたいする`occur`や`query-replace`の実行のような処理のうちの1つとみなすことができる。Isearchには多くはフィルターと選択、アクションを同時に行うコマンドが多く、そのためにユーザーは丸い穴に無理して四角い釘を打つような破目となる[^2]。 -Isearchの使用に少しでも時間を費やした経験があればIsearchの単一のタスクを、独自に構成可能な3つのフェーズに分割することで生じるトレードオフが理解できるはずだ。2つ、あるいは3つすべてを単一操作にまとめることが、Isearchにおけるキーボード操作を *邪悪なまでに高速化* する。わたしがIsearchを使用する際には、頭が指を追いかける場面が珍しくない。他方モジュール化がもつ優位な点は、その表現力にある。3つのフェーズからなるプロセスは全体として遅くはなるもののフィルター、選択、アクションそれぞれのスロットに異なるパーツを繋げることによって、さらに多くのことを行うことが可能になる。まったく異なるタスクにたいして、ミニバッファーがさまざま方法を用いていかにして処理をこなすか思い浮かべてみればわかるだろう! +Isearchの使用に少しでも時間を費やした経験があればIsearchの単一のタスクを、独自に構成可能な3つのフェーズに分割することで生じるトレードオフが理解できるはずだ。2つ、あるいは3つすべてを単一操作にまとめることが、Isearchにおけるキーボード操作を *邪悪なまでに高速化* する。わたしがIsearchを使用する際には、頭が指を追いかける場面が珍しくない。他方モジュール化がもつ優位な点は、その表現力にある。3つのフェーズからなるプロセスは全体として遅くはなるもののフィルター選択アクションそれぞれのスロットに異なるパーツを繋げることによって、さらに多くのことを行うことが可能になる。まったく異なるタスクにたいして、ミニバッファーがさまざま方法を用いていかにして処理をこなすか思い浮かべてみればわかるだろう! -話をIsearchに戻す。どうやれば3つのステージに分割できるのか? 根性が持続できれば大したことはないだろう。すべてがelispである以上、それは難しい注文ではないのだ。たとえばProtesilaos Stavrouは[ビデオ](https://www.youtube.com/watch?v=y6_bmcd3nis)において、候補のマーキングといった直観的な多くのアクションをIsearchに追加している。しかし **Avy** の存在によってIsearchの修整が不要だということが明らかになった。フィルターというキラー機能を有しつつも、王者同様3つのステージを分離しているのがAvyである。Avyによって何とも興味がそそられる可能性が生みだされた。 +話をIsearchに戻す。どうやれば3つのステージに分割できるのか? 根性が持続できれば大したことはないだろう。すべてがelispである以上、それは難しい注文ではないのだ。たとえばProtesilaos Stavrouは[ビデオ](https://www.youtube.com/watch?v=y6_bmcd3nis)において、候補のマーキングといった直観的な多くのアクションをIsearchに追加している。しかし **Avy** の存在によってIsearchの修整が不要だということが明らかになった。フィルターというキラー機能を有しつつも、王者同様3つのステージを分離しているのがAvyである。Avyによって何とも興味がそそられる可能性が生みだされた。 ![avy-interaction-paradigm.png](https://karthinks.com/img/avy-interaction-paradigm.png) @@ -145,7 +199,7 @@ Wait, what's Avy Avy is authored by the prolific abo-abo (Oleh Krehel), who also wrote Ivy, Counsel, Ace-Window, Hydra, Swiper and many other mainstays of the Emacs package ecosystem that you've probably used. If you're reading this, chances are you already know (and probably use) Avy. So here's a very short version from the documentation: --> -[Avy](https://github.com/abo-abo/avy)は[abo-abo](https://oremacs.com/)の作者でもあるOleh Krehelによって記述された。彼は実に多産な作者でありIvy、Counsel、Ace-Window、Hydra、Swiperを記述したのは彼であり、他にもおそらく読者も使ったことがあるEmacsのパッケージエコシステムの主要コンポーネントの多くも彼が記述した。この記事を読んでいる読者なら、すでにAvyを知っている(そして多分使ったことがある)かもしれない。したがってAvyのドキュメントから非常に短いバージョンを紹介しよう: +[Avy](https://github.com/abo-abo/avy)は[abo-abo](https://oremacs.com/)ことOleh Krehelによって記述された。彼は実に多産な作者でありIvy、Counsel、Ace-Window、Hydra、Swiperを記述したのは彼であり、他にもおそらく読者も使ったことがあるEmacsのパッケージエコシステムの主要コンポーネントの多くも彼が記述した。この記事を読んでいる読者なら、すでにAvyを知っている(そして多分使ったことがある)かもしれない。したがってAvyのドキュメントから非常に短いバージョンを紹介しよう: -テキストにマッチする位置に(ウィンドウ間を横断して)ジャンプ、その後はpop-global-mark (C-x C-SPC)で元の位置にジャンプして戻る、というのがAvyの典型的な使い方だろう。後半のセクションではじAvyを使った前方あるいは後方へのジャンプについて詳解する。以下のデモではAvyで2回ジャンプしてから順番にジャンプして戻るプロセスを行っている: +テキストにマッチする位置に(ウィンドウ間を横断して)ジャンプ、その後は`pop-global-mark` (`C-x C-SPC`)で元の位置にジャンプして戻る、というのがAvyの典型的な使い方だろう。後半のセクションではじAvyを使った前方あるいは後方へのジャンプについて詳解する。以下のデモではAvyで2回ジャンプしてから順番にジャンプして戻るプロセスを行っている: -[avy-jump-back-demo-2.mp4](https://karthinks.com/img/avy-jump-back-demo-2.mp4) + -少なくとも、これが公式の説明だ。詳細については[README](https://github.com/abo-abo/avy/blob/master/README.md)を参照してほしいが、わたしが疑問に思うのは... +少なくとも、これが公式の説明だ。詳細については[README](https://github.com/abo-abo/avy/blob/master/README.md)を参照してほしいが、わたしが疑問に思うのは…… -# ... Avyのドキュメントにはもっとも肝心な部分が記載されていない +# Avyのドキュメントにはもっとも肝心な部分が記載されていない -Avy自動的にフィルタリングを行い、文字ベースのデシジョンツリーを通じて選択を行う。これを3つのパートからなるわたしたちの対話モデルにどのように適合させるかを示そう。 +Avyは自動的にフィルタリングを行い、文字ベースのデシジョンツリーを通じて選択を行う。これを3つのパートからなるわたしたちの対話モデルにどのように適合させるかを示そう。 -## フィルター +## フィルターして、 -ここで問題が生じる: **わたしたちはエディター自体にではなく、テキストエディターで解決しようとしている問題にたいして精神的な帯域幅を使用したい** のだ。無意識に行えない意思決定にはコストがかかり、集中力も乱されてしまう。現段階では物事を見つけて処理を行うためには、IsearchとAvyの中間点の何かを使ってその場で決定する必要がある。Swiper、Helm-swoop、Consult-lineといった多機能な検索ツールを使っている場合には、選べるオプションは3つだ。大量のAvyコマンドをトップに据えると、それが精神的な行き詰まりへと導くための処方箋になりかねない。すべての面においてもっとも適応力があり、柔軟かつ汎用的なAvyコマンド(avy-goto-char-timer)を選択するだけにしておけば、これを回避できるだろう。 +ここで問題が生じる: **わたしたちはエディター自体にではなく、テキストエディターで解決しようとしている問題にたいして精神的な帯域幅を使用したい** のだ。無意識に行えない意思決定にはコストがかかり、集中力も乱されてしまう。現段階では物事を見つけて処理を行うためには、IsearchとAvyの中間点の何かを使ってその場で決定する必要がある。Swiper、Helm-swoop、Consult-lineといった多機能な検索ツールを使っている場合には、選べるオプションは3つだ。大量のAvyコマンドをトップに据えると、それが精神的な行き詰まりへと導くための処方箋になりかねない。すべての面においてもっとも適応力があり、柔軟かつ汎用的なAvyコマンド(`avy-goto-char-timer`)を選択するだけにしておけば、これを回避できるだろう。 ```elisp (global-set-key (kbd "M-j") 'avy-goto-char-timer) @@ -280,13 +340,13 @@ But in this piece we are interested in a different, much less explored aspect of とは言ったものの興味があるのは、まだ探求が済んでいないAvyの別の側面だ。以下の主張ではそれについても目を向けていこう。 -## 選択 +## 選択して、 -Avyが提供する選択メソッドには、すべてスクリーン上の位置にマッピングされた文字のタイプが含まれている。これはIsearchとは大きく異なる。isearch-repeat-forward (C-s、数プレフィックス引数が指定されているかもしれない)を呼び出すIsearch、補完バッファー(completions buffer)のナビゲーションにC-nやC-pを用いるミニバッファーとはまったく異なるのだ。Avyの選択メソッドは使用する文字シーケンスが最小となるようにデザインされており、わたしたちには40のキーに計算量オーダーO(1)でアクセス可能な10本の指が備わっているので、より高速であることが一般的だ。ジャンプしようとしている位置を直接見ていることが多いという事実は、ちんぷんかんぷんなスクリーン全体の解析が不要なことを意味している。この記事にとっては不幸ではあるが、スクリーンショットやデモを見るよりも、Avyを使ってみるほうが遥かに直観的であることをも意味している。 +Avyが提供する選択メソッドには、すべてスクリーン上の位置にマッピングされた文字のタイプが含まれている。これはIsearchとは大きく異なる。`isearch-repeat-forward` (`C-s`、数プレフィックス引数が指定されているかもしれない)を呼び出すIsearch、補完バッファー(completions buffer)のナビゲーションに`C-n`や`C-p`を用いるミニバッファーとはまったく異なるのだ。Avyの選択メソッドは使用する文字シーケンスが最小となるようにデザインされており、わたしたちには40のキーに計算量オーダーO(1)でアクセス可能な10本の指が備わっているので、より高速であることが一般的だ。ジャンプしようとしている位置を直接見ていることが多いという事実は、ちんぷんかんぷんなスクリーン全体の解析が不要なことを意味している。この記事にとっては不幸ではあるが、スクリーンショットやデモを見るよりも、Avyを使ってみるほうが遥かに直観的であることをも意味している。 -さらにAvyには、スクリーン上の何処かからテキストをコピーするのように、他のアクションを実行するいくつかのコマンドも定義されている: +さらにAvyには、スクリーン上の何処かからテキストをコピーするのように、他のアクションを実行するいくつかのコマンドも定義されている: | Kill | Copy | Move | |-------------------------------|-----------------|-------------------------------| @@ -339,7 +399,7 @@ The problem with this approach is that it doesn't scale. Each of these commands --> このアプローチは拡張性において問題がある。 -これらはそれぞれフィルター -> 選択 -> アクションという完全なプロセスを定義するコマンドなので、多様性や対応範囲で何らかの必要が生じたとしても、拡張の余地やキーボードの空きはすぐに枯渇してしまうだろう。動的な面においても不十分だ。一旦コマンドを開始してから気が変わっても、コマンド間をつなぐパイプラインが固定されているので変更できないのだ。 +これらはそれぞれフィルター選択アクションという完全なプロセスを定義するコマンドなので、多様性や対応範囲で何らかの必要が生じたとしても、拡張の余地やキーボードの空きはすぐに枯渇してしまうだろう。動的な面においても不十分だ。一旦コマンドを開始してから気が変わっても、コマンド間をつなぐパイプラインが固定されているので変更できないのだ。 -以下はわたしがAvyで頻繁に行うことの一部。アクティブなウィンドウにかぎらず、フレーム内のすべてのテキスト行えることに注目! +以下はわたしがAvyで頻繁に行うことの一部。アクティブなウィンドウにかぎらず、フレーム内のすべてのテキスト行えることに注目! -まずはAvyを用いて一般的な編集アクションを行う際の悩みの種を解消する。VimとEasymotionを使っていれば、以下のアクションのうち最初のいくつかは無料で入手できる: +まずはAvyを用いて一般的な編集アクションを行う際の悩みの種を解消する。VimとEasymotionを使っていれば、以下のアクションのうち最初のいくつかは無料で入手できる: -
以下のデモに関する注意 +
以下のデモに関する注意 -フレームのどこかから行やリージョンをコピーするために、実際にはavy-copy-lineおよびavy-copy-regionというコマンドをAvyが個別に定義している。これらのコマンドの方が関数呼び出しにアクションステージが織り込み済みなので僅かに速いので、そちらを使うほうがよいかもしれない。しかし多すぎるトップレベルコマンドを記憶することによる精神的な燃え尽き症候群をわたしたちは避けたいので、avy-goto-char-timerを呼び出して(フィルターと選択)、その後にお目当ての候補を選択してディスパッチを行うという、よりシンプルな2つのステージで作業を行っている。 +フレームのどこかから行やリージョンをコピーするために、実際には`avy-copy-line`および`avy-copy-region`というコマンドをAvyが個別に定義している。これらのコマンドの方が関数呼び出しにアクションステージが織り込み済みなので僅かに速いので、そちらを使うほうがよいかもしれない。しかし多すぎるトップレベルコマンドを記憶することによる精神的な燃え尽き症候群をわたしたちは避けたいので、`avy-goto-char-timer`を呼び出して(フィルター選択)、その後にお目当ての候補を選択してディスパッチを行うという、よりシンプルな2つのステージで作業を行っている。 ## 単語、sexp、行の候補の移動 -これはAvyでは"teleport"、わたしは"transpose"と呼んでいるが、いずれにせよtにバインドされることになる。このデモではバッファーのあちこちをあまり移動せずに、バッファーのあちこちにテキストを移動する。 +これはAvyでは"teleport"、わたしは"transpose"と呼んでいるが、いずれにせよ`t`にバインドされることになる。このデモではバッファーのあちこちをあまり移動せずに、バッファーのあちこちにテキストを移動する。 -[avy-transpose-demo.mp4](https://karthinks.com/img/avy-transpose-demo.mp4) +
ビデオ実況 @@ -566,7 +635,7 @@ Select a candidate line (the one just below the image). It is moved over (transp
  • "("で始まる候補にフィルタリングする。
  • -
  • tを押下してavy-action-teleportを実行する。
  • +
  • tを押下してavy-action-teleportを実行する。
  • "(parametric forcing)"という候補を選択する。
  • @@ -576,7 +645,7 @@ Select a candidate line (the one just below the image). It is moved over (transp
  • "the"にマッチする候補にフィルタリングする。
  • -
  • Tを押下してavy-action-teleport-lineを実行する。
  • +
  • Tを押下してavy-action-teleport-lineを実行する。
  • 候補の行(イメージの直下にある)を選択する。ポイントがある位置に移動(またはtranspoae: 転地)するはず。
  • @@ -595,9 +664,12 @@ Select a candidate line (the one just below the image). It is moved over (transp ## 候補の位置までzap -これはビルトインのコマンドで、デフォルトではzにバインドされている。 +これはビルトインのコマンドで、デフォルトではzにバインドされている。 -[avy-zap-demo.mp4](https://karthinks.com/img/avy-zap-demo.mp4) +
    ビデオ実況 @@ -628,9 +700,12 @@ Select a candidate char, in this case "In Emacs…". The text between point and Also built in, m by default. This isn’t different from jumping to the candidate using Avy and calling mark-sexp, but it is more convenient: --> -これもビルトインのコマンドであり、デフォルトではmにバインドされている。Avyを使って候補にジャンプするのは、 mark-sexpを呼び出すジャンプと変わらないが、Avyの方がより使いやすくなっている: +これもビルトインのコマンドであり、デフォルトではmにバインドされている。Avyを使って候補にジャンプするのは、mark-sexpを呼び出すジャンプと変わらないが、Avyの方がより使いやすくなっている: -[avy-mark-demo.mp4](https://karthinks.com/img/avy-mark-demo.mp4) +
    ビデオ実況 @@ -650,9 +725,9 @@ Repeat steps 1 to 4 twice to mark other candidates: (data_directory... and Rotat
  • avy-action-markを実行するためにmを押下する。
  • -
  • 候補から単語かsexp(ここでは("~/.local/share"))を選択する。
  • +
  • 候補から単語かsexp(ここでは("~/.local/share"))を選択する。
  • -
  • 他の候補(data_directory...とRotatingFileHandler)をマークするために、1-4のステップを2回繰り返す。
  • +
  • 他の候補(data_directory...RotatingFileHandlerをマークするために、1-4のステップを2回繰り返す。
  • @@ -666,7 +741,10 @@ Avy sets the mark before it jumps, so you could use C-x C-x to activate the regi Avyジャンプする前にマークをセットするので、C-x C-xを使用してリージョンをアクティブにすることも可能だが、このコマンドを使うほうがトラブルを回避できるだろう。 -[avy-mark-to-char-demo.mp4](https://karthinks.com/img/avy-mark-to-char-demo.mp4) +
    ビデオ実況 @@ -687,7 +765,7 @@ Choose a candidate (series of spaces) that begins a line. This marks the region
  • フィルタリングに使用するテキスト(ここでは"')")をタイプする。
  • -
  • avy-action-mark-to-charを実行するために、SPCを押下する。
  • +
  • avy-action-mark-to-charを実行するために、SPCを押下する。
  • 候補のヒント文字を選択する。これによりポイントからヒント文字までのリージョンをマークして、ポイントを移動する。
  • @@ -695,7 +773,7 @@ Choose a candidate (series of spaces) that begins a line. This marks the region
  • フィルタリングに使用するテキスト(ここでは単に一連のスペース)をタイプする。
  • -
  • avy-action-mark-to-charを実行するために、SPCを押下する。
  • +
  • avy-action-mark-to-charを実行するために、SPCを押下する。
  • 行の開始となる候補(ここでは一連のスペース)を選択する。これによりポイントからその行までがマークされる。
  • @@ -708,7 +786,8 @@ Choose a candidate (series of spaces) that begins a line. This marks the region (activate-mark) (goto-char pt)) -(setf (alist-get ? avy-dispatch-alist) 'avy-action-mark-to-char) +(setf (alist-get ?t avy-dispatch-alist) 'avy-action-mark-to-char + (alist-get ?T avy-dispatch-alist) 'avy-action-teleport-whole-line) ``` -これはビルトインのコマンドであり、デフォルトではiにバインドされている。 +これはビルトインのコマンドであり、デフォルトではiにバインドされている。 -[avy-ispell.mp4](https://karthinks.com/img/avy-ispell.mp4) +
    ビデオ実況 @@ -743,13 +825,15 @@ Select the candidate, in this case the "teh" match. This runs ispell-word again, and 、"teh" can be corrected. --> +
      +
    1. avy-goto-char-timer(Avyの他のジャンプコマンドでもよい)を呼び出す。
    2. -
    3. "can"とタイプすると"candidate"(スペル間違い)がハイライトされる。
    4. +
    5. "can"とタイプすると"candidate"(スペル間違い)がハイライトされる。
    6. -
    7. avy-action-ispell用のディスパッチキー(デフォルトではiにセットされている)を押下する。
    8. +
    9. avy-action-ispell用のディスパッチキー(デフォルトではiにセットされている)を押下する。
    10. -
    11. マッチのいずれか(ここではスペル間違いの"candidate"のマッチ)を選択する。
    12. +
    13. マッチのいずれか(ここではスペル間違いの"candidate"のマッチ)を選択する。
    14. これにより選択にたいしてispell-wordが実行される。
    15. @@ -757,11 +841,11 @@ This runs ispell-word again, and 、"teh" can be corrected.
    16. もう一度avy-goto-char-timerを呼び出す。
    17. -
    18. "te"をタイプすると"teh"にたいするマッチが(他より強調されて)ハイライトされる。
    19. +
    20. "te"をタイプすると"teh"にたいするマッチが(他より強調されて)ハイライトされる。
    21. -
    22. avy-action-ispell用のディスパッチキーを押下する 。
    23. +
    24. avy-action-ispell用のディスパッチキーを押下する 。
    25. -
    26. 候補(ここでは"teh"のマッチ)を選択する。
    27. +
    28. 候補(ここでは"teh"のマッチ)を選択する。
    29. これによりもう一度ispell-wordが実行されて、"teh"が修整される。
    30. @@ -773,7 +857,7 @@ This runs ispell-word again, and 、"teh" can be corrected. You can replace avy-action-ispell (built-in) with a version that automatically picks the top correction for a word, automating the process: --> -このプロセスを自動化するために、一番上にある修整を自動的に採用するバージョンで、avy-action-ispell(ビルトイン)を置き換えることもできる。 +このプロセスを自動化するために、一番上にある修整を自動的に採用するバージョンで、avy-action-ispell(ビルトイン)を置き換えることもできる。 ```elisp (defun avy-action-flyspell (pt) @@ -795,9 +879,12 @@ You can replace avy-action-ispell (built-in) with a version that automatically p I use the dictionary package for Emacs, and I’m lazy about it: --> -わたしはEmacsdictionaryパッケージを使っているので、単語の登録は怠けがちだ: +わたしはEmacsのdictionaryパッケージを使っているので、単語の登録は怠けがちだ: -[avy-define.mp4](https://karthinks.com/img/avy-define.mp4) +
      ビデオ実況 @@ -819,25 +906,25 @@ This produces the buffer with the dictionary definition of "finch"
    31. avy-goto-char-timer(Avyの他のジャンプコマンドでもよい)を呼び出す。
    32. -
    33. "non"とタイプすると"nonpareil"にたいするマッチが(他より強調されて)がハイライトされる。
    34. +
    35. "non"とタイプすると"nonpareil"にたいするマッチが(他より強調されて)がハイライトされる。
    36. -
    37. avy-action-define用のディスパッチキー(ここでは=にセットされている)を押下する。
    38. +
    39. avy-action-define用のディスパッチキー(ここでは=にセットされている)を押下する。
    40. -
    41. マッチのいずれか(ここでは"nonpareil"にたいするマッチのいずれか)を選択する。
    42. +
    43. マッチのいずれか(ここでは"nonpareil"にたいするマッチのいずれか)を選択する。
    44. -
    45. これにより""nonpareil""の定義とともにバッファーが生成される。
    46. +
    47. これにより"nonpareil"の定義とともにバッファーが生成される。
    48. こdefinitionバッファーをスクロールするために、scroll-other-window (C-M-v)を呼び出す。
    49. もう一度avy-goto-char-timerを呼び出す。
    50. -
    51. "fi"をタイプすると"finch"にたいするマッチが(他より強調されて)ハイライトされる。これは定義をもつ別のバッファーでのマッチであることに注意。このバッファーへの切り替えは不要。
    52. +
    53. "fi"をタイプすると"finch"にたいするマッチが(他より強調されて)ハイライトされる。これは定義をもつ別のバッファーでのマッチであることに注意。このバッファーへの切り替えは不要。
    54. -
    55. avy-action-define用のディスパッチキーを押下する 。
    56. +
    57. avy-action-define用のディスパッチキーを押下する 。
    58. -
    59. 候補(ここでは"finch"のマッチ)を選択する。
    60. +
    61. 候補(ここでは"finch"のマッチ)を選択する。
    62. -
    63. これによりもう一度finchの辞書定義とともにバッファーが生成される。
    64. +
    65. これによりもう一度"finch"の辞書定義とともにバッファーが生成される。
    @@ -875,7 +962,10 @@ This produces the buffer with the dictionary definition of "finch" ## シンボルのドキュメントを調べる -[avy-help-demo.mp4](https://karthinks.com/img/avy-help-demo.mp4) +
    ビデオ実況 @@ -908,11 +998,11 @@ Repeat steps 5-9 to find the documentation of another symbol, in this case memq.
  • フィルタリングするためのテキスト(ここでは"ma")をタイプする。
  • -
  • avy-action-helpfulを実行するためにHを押下する。
  • +
  • avy-action-helpfulを実行するためにHを押下する。
  • 候補フレーズ(ここでは"macroexp-parse-body")を選択する。これは他のウィンドウ(helpバッファー)でのマッチであることに注意。これによりシンボルのドキュメントが表示される。
  • -
  • 他のシンボル(ここでは"memq"のドキュメントを調べるために、ステップ5-9を繰り返す。
  • +
  • 他のシンボル(ここではmemqのドキュメントを調べるために、ステップ5-9を繰り返す。
  • @@ -939,9 +1029,12 @@ Repeat steps 5-9 to find the documentation of another symbol, in this case memq. You’ll need an Emacs feature that can search Google for you. There are several. I use a CLI program named Tuxi for this, and it’s pretty handy: --> -Googleを検索できるEmacs機能が必要になるだろう。[いくつか存在する](https://melpa.org/#/?q=google%20search)が、わたしが使っている[Tuxi](https://github.com/Bugswriter/tuxi%20)という名前のCLIプログラムはとても便利だ: +Googleを検索できるEmacs機能が必要になるだろう。[いくつか存在する](https://melpa.org/#/?q=google%20search)が、わたしが使っている[Tuxi](https://github.com/Bugswriter/tuxi)という名前のCLIプログラムはとても便利だ: -[avy-tuxi-demo.mp4](https://karthinks.com/img/avy-tuxi-demo.mp4) +
    ビデオ実況 @@ -963,21 +1056,21 @@ Repeat steps 6-10 but selecting the string "POSIX" instead.
  • avy-goto-char-timer(Avyの他のジャンプコマンドでもよい)を呼び出す。
  • -
  • "ema"とタイプすると"Emacs"にたいするマッチが(他より強調されて)がハイライトされる。
  • +
  • "ema"とタイプすると"Emacs"にたいするマッチが(他より強調されて)がハイライトされる。
  • -
  • avy-action-tuxi用のディスパッチキー(ここではC-=にセット)を押下する。
  • +
  • avy-action-tuxi用のディスパッチキー(ここではC-=にセット)を押下する。
  • -
  • 候補(ここでは"Emacs"にたいするマッチのいずれか)を選択する。
  • +
  • 候補(ここでは"Emacs"にたいするマッチのいずれか)を選択する。
  • これによりGoogleのEmacsの説明とともにバッファーが生成される。
  • もう一度avy-goto-char-timerを呼び出す。
  • -
  • "vi"とタイプすると"Vi"にたいするマッチが(他より強調されて)がハイライトされる。これはGoogleの説明が表示されている別のバッファーでのマッチであることに注意。このバッファーへの切り替えは不要。
  • +
  • "vi"とタイプすると"Vi"にたいするマッチが(他より強調されて)がハイライトされる。これはGoogleの説明が表示されている別のバッファーでのマッチであることに注意。このバッファーへの切り替えは不要。
  • -
  • avy-action-tuxi用のディスパッチキーを押下する。
  • +
  • avy-action-tuxi用のディスパッチキーを押下する。
  • -
  • 候補(ここでは"Vi"にたいするマッチ)を選択する。
  • +
  • 候補(ここでは"Vi"にたいするマッチ)を選択する。
  • これによりGoogleのViの説明とともにバッファーが生成される。
  • @@ -997,7 +1090,7 @@ Repeat steps 6-10 but selecting the string "POSIX" instead. Avy and Embark plug into each other like LEGO blocks. Here are a couple of examples: --> -AvyとEmbarkはレゴブロックのように互いに接続させることができる。例をいくつか示そう: +AvyとEmbarkはレゴブロックのように互いに接続させることができる。例をいくつか示そう: ## 出現位置のハイライト @@ -1005,9 +1098,12 @@ AvyとEmbarkはレゴブロックのように互いに接続させることが In this demo I highlight some keywords in a busy LaTeX document, then visit the bibliography entry of a citation key with Avy and Embark, without ever manually moving the cursor: --> -このデモでは細部まで記述されたLaTeXドキュメントの一部のキーワードをハイライトして、その後に手作業でカーソルを移動するのではなく、AvyとEmbarkを用いて引用キーから参考文献にアクセスしている: +このデモでは細部まで記述されたLaTeXドキュメントの一部のキーワードをハイライトして、その後に手作業でカーソルを移動するのではなく、AvyとEmbarkを用いて引用キーから参考文献にアクセスしている: -[avy-embark-demo-2.mp4](https://karthinks.com/img/avy-embark-demo-2.mp4) +
    ビデオ実況 @@ -1031,11 +1127,11 @@ Choose the bibtex-action to visit the Bib file, bound to e by the bibtex-actions
  • "Floquet"を含むマッチにフィルタリングするために、"flo"とタイプする。
  • -
  • oでavy-action-embarkを実行する。
  • +
  • oavy-action-embarkを実行する。
  • "Floquet"にたいするマッチからいずれかを選択する。これによりそのマッチにEmbarkが実行される。
  • -
  • Hでembark-toggle-highlightアクションを選択する。
  • +
  • Hembark-toggle-highlightアクションを選択する。
  • "Parametric"をハイライトするために、1-5を繰り返す。
  • @@ -1043,11 +1139,11 @@ Choose the bibtex-action to visit the Bib file, bound to e by the bibtex-actions
  • 引用キーの中から1つのキーにマッチさせるために、"na"とタイプする。
  • -
  • oでavy-action-embarkを実行する。
  • +
  • oavy-action-embarkを実行する。
  • マッチした引用キーを選択する。これによりそのマッチにEmbarkが実行される。
  • -
  • Bibファイル(訳注: 文献データベースファイル)をvisitするために、bibtex-actionを選択する(bibtex-actionsパッケージによってeにバインドされている)。
  • +
  • Bibファイル(訳注: 文献データベースファイル)をvisitするために、bibtex-actionを選択する(bibtex-actionsパッケージによってeにバインドされている)。
  • @@ -1065,7 +1161,10 @@ In this demo I explore my way through a package with Avy and Embark, threading h このデモではパッケージで何かを探す際にAvyとEmbarkを使ってhelp、apropos、customizationのバッファーを結びつける。ここでも手動でのカーソル移動は行わない。 -[avy-embark-demo-1.mp4](https://karthinks.com/img/avy-embark-demo-1.mp4) +
    ビデオ実況 @@ -1088,33 +1187,35 @@ Repeat the previous steps to run Embark again, this time on the symbol “projec Choose the customize-variable action with u in Embark. This opens a customization buffer for the variable project-x-local-identifier. --> +
      +
    1. avy-goto-char-timerを実行する。
    2. フィルタリングするためにテキスト(ここでは"root")をタイプする。
    3. -
    4. oでavy-action-embarkを実行する。
    5. +
    6. oavy-action-embarkを実行する。
    7. -
    8. マッチの中からproject-rootを選択する。これによりそのマッチにたいしてEmbarkが実行される。
    9. +
    10. マッチの中から"project-root"を選択する。これによりそのマッチにたいしてEmbarkが実行される。
    11. -
    12. hを押下するとマッチにたいしてEmbarkがdescribe-symbolを実行する。これによりそのマッチの関数にたいするヘルプバッファーがオープンする(これより前の箇所でAvyにヘルプコマンドをバインドしてあるので、そちらを使うこともできるだろう)。
    13. +
    14. hを押下するとマッチにたいしてEmbarkがdescribe-symbolを実行する。これによりそのマッチの関数にたいするヘルプバッファーがオープンする(これより前の箇所でAvyにヘルプコマンドをバインドしてあるので、そちらを使うこともできるだろう)。
    15. -
    16. ヘルプバッファーをスクロールするためにC-M-v (scroll-other-window)を押下する。
    17. +
    18. ヘルプバッファーをスクロールするためにC-M-v (scroll-other-window)を押下する。
    19. -
    20. もう一度avy-goto-char-timerを呼び出す。
    21. +
    22. もう一度avy-goto-char-timerを呼び出す。
    23. フィルタリングするためにテキスト(ここでは"proj")をタイプする。
    24. -
    25. oでavy-action-embarkを実行する。
    26. +
    27. oavy-action-embarkを実行する。
    28. マッチの中から"project-x"を選択する。これによりそのマッチにたいしてEmbarkが実行される。
    29. -
    30. embark-cycleを呼び出して、ターゲットを("poject-x"という名前の)ファイルから("poject-x"という名前の)ライブラリーに変更する。
    31. +
    32. embark-cycleを呼び出して、ターゲットを("poject-x"という名前の)ファイルから("poject-x"という名前の)ライブラリーに変更する。
    33. -
    34. hを押下するとproject-xライブラリーにたいしてEmbarkがfinder-commentaryを実行する。これによりコメントが表示されているバッファーがオープンする。
    35. +
    36. hを押下すると"project-x"ライブラリーにたいしてEmbarkがfinder-commentaryを実行する。これによりコメントが表示されているバッファーがオープンする。
    37. 前のステップを繰り返して、もう一度"project-x"にたいしてEmbarkを実行する。
    38. -
    39. 今度はシンボル"project-x-local-identfier"にたいして前のステップを繰り返す。
    40. +
    41. 今度はシンボルproject-x-local-identfierにたいして前のステップを繰り返す。
    42. uでEmbarkのcustomize-variableアクションを選択する。これにより編集project-x-local-identfierにたいするcustomizationバッファーがオープンする。
    43. @@ -1128,7 +1229,7 @@ Choose the customize-variable action with u in Embark. This opens a customizatio We save ourselves a lot of redundancy and reuse muscle memory here. Avy provides its unique means of filtering and Embark does what it does best, run actions! The intermediate job of candidate selection is shared between Avy and Embark: Avy specifies the general location of the candidate, and Embark figures out the semantic unit at that position on which to act. The fact that the Filter → Select → Act process is helpfully chunked this way by Avy makes the elisp required to integrate the two completely trivial[^5]. --> -ここではわたしたち自身がもつ大量の冗長性と指に教え込んだ記憶を節約する。Avyには独自のフィルタリング手段を提供してもらい、Embarkには自分のベストを尽くすこと、すなわちアクションを実行してもらうのだ! 候補選択における中間的な作業はAvyとEmbarkで共有して行ってもらおう。Avyが候補の一般的な位置を指定して、その位置でアクションを行う際の意味的単位の解決はEmbarkが行う。Avyによってフィルター -> 選択 -> アクションというプロセスが使いやすいようにchunk化(訳注: あるものをより小さな断片に分割したり、より大きな断片にまとめすること)されているので、2つを統合するために必要なelispは簡単なもので事足りるはずだ[^5]。 +ここではわたしたち自身がもつ大量の冗長性と指に教え込んだ記憶を節約する。Avyには独自のフィルタリング手段を提供してもらい、Embarkには自分のベストを尽くすこと、すなわちアクションを実行してもらうのだ! 候補選択における中間的な作業はAvyとEmbarkで共有して行ってもらおう。Avyが候補の一般的な位置を指定して、その位置でアクションを行う際の意味的単位の解決はEmbarkが行う。Avyによってフィルター選択アクションというプロセスが使いやすいようにchunk化(訳注: あるものをより小さな断片に分割したり、より大きな断片にまとめすること)されているので、2つを統合するために必要なelispは簡単なもので事足りるはずだ[^5]。 ```elisp (defun avy-action-embark (pt) @@ -1147,7 +1248,7 @@ We save ourselves a lot of redundancy and reuse muscle memory here. Avy provides Note that if you don’t like the candidate that Embark picks as the unit to act on, you can call embark-cycle to cycle through the other targets. --> -アクションを行う単位としてEmbarkが採用した候補が気に入らなければ、他のターゲットに巡回するためにembark-cycleを呼び出すことができる。 +アクションを行う単位としてEmbarkが採用した候補が気に入らなければ、他のターゲットに巡回するために`embark-cycle`を呼び出すことができる。 -Avyを用いることで得られる利点として、カーソルを移動せずにアクションを実行するテキストのフィルタリングと選択を行えることが証拠の1つとして挙げられる。しかしこれまで示してきたコードスニペットのsave-excursionブロックによりポイントを移動しないのではなく、単にほとんど不可視な状態でポイントを移動していたことが明らかになった。ポイントがあるのはEmacsのgap-bufferと呼ばれるデータ構造体の中であり、Emacsのコマンドはすべてそのポイントを中心に動作することを指向しているし、通常はその方が効率的なのだ。 +Avyを用いることで得られる利点として、カーソルを移動せずにアクションを実行するテキストのフィルタリングと選択を行えることが証拠の1つとして挙げられる。しかしこれまで示してきたコードスニペットの`save-excursion`ブロックによりポイントを移動しないのではなく、単にほとんど不可視な状態でポイントを移動していたことが明らかになった。ポイントがあるのはEmacsのgap-bufferと呼ばれるデータ構造体の中であり、Emacsのコマンドはすべてそのポイントを中心に動作することを指向しているし、通常はその方が効率的なのだ。 -正にその通り。other-windowを呼び出してからテキストをIsearch、アクションを実行して戻るよりも、別のウィンドウにあるテキストにたいして任意のAvyアクションを実行するほうがより高速だ。しかしわたしにとってポイント(har)は、elispを記述に役に立つ抽象化なのだ(訳注: harはポイントを実際に実装するgapではなくハードウェアポイント、つまりカーソル位置と等価な意味でのポイントを強調するためだと思われる)。フレーム全体のコンテンツについて、フィルター -> 選択 -> アクションという強力なパラダイムで考えさせてくれることがAvyの真価だ。意識的にウィンドウやフレームを移動することで生じる精神的なコンテキストスイッチなしで操作を行うことができるという事実は、ボーナスのようなものだろう。 +正にその通り。`other-window`を呼び出してからテキストをIsearch、アクションを実行して戻るよりも、別のウィンドウにあるテキストにたいして任意のAvyアクションを実行するほうがより高速だ。しかしわたしにとってポイント(har)は、elispを記述に役に立つ抽象化なのだ(訳注: harはポイントを実際に実装するgapではなくハードウェアポイント、つまりカーソル位置と等価な意味でのポイントを強調するためだと思われる)。フレーム全体のコンテンツについて、フィルター選択アクションという強力なパラダイムで考えさせてくれることがAvyの真価だ。意識的にウィンドウやフレームを移動することで生じる精神的なコンテキストスイッチなしで操作を行うことができるという事実は、ボーナスのようなものだろう。 # Avyにたいする心構え @@ -1317,7 +1424,7 @@ Jumping to locations to delete single words - テキストにカーソルを合わせるためにウィンドウを何回か切り替えている - Isearchで正しいマッチにたどり着くために4個以上のマッチをジャンプしている - 何かを調べるコマンドを実行するためにポイントを長距離移動している -- 毎回C-SPCによる手作業でマークをアクティブにしている +- 毎回`C-SPC`による手作業でマークをアクティブにしている - 単語1つの削除のために場所をジャンプしている ## キーマップに埋もれて @@ -1336,25 +1443,26 @@ This is true. But the effort is greatly mitigated by a choice of keys that is se これは真実だが自分にとって道理に適ったキーを選択することで、労力は大幅に軽減されるだろう。これまでのコードスニペットでは、わたしのEmacsのキーバインディング(ほぼデフォルト)を真似たので、新たに何かを覚える必要はないはずだ: -| Action | Avy keybinding | Emacs keybinding | Emacs Default? | -|-----------------|----------------|----------------------|----------------| -| Copy | w, W (line) | M-w | Yes | -| Yank | y, Y (line) | C-y | Yes | -| Transpose | t, T (line) | C-t, M-t etc | Yes | -| Zap | z | M-z | Yes | -| Flyspell | ; | C-; | Yes | -| Mark | m | m in special buffers | Yes | -| Activate region | SPC | C-SPC | Yes | -| Dictionary | = | C-h = | No | -| Google search | C-= | C-h C-= | No | -| Embark | o | C-o | No | +| Action | Avy keybinding | Emacs keybinding | Emacs Default? | +|-----------------|----------------|------------------------|----------------| +| Kill | `k`, `K` (行) | `C-k` | Yes | +| Copy | `w`, `W` (行) | `M-w` | Yes | +| Yank | `y`, `Y` (行) | `C-y` | Yes | +| Transpose | `t`, `T` (行) | `C-t`, `M-t` など | Yes | +| Zap | `z` | `M-z` | Yes | +| Flyspell | `;` | `C-;` | Yes | +| Mark | `m` | `m` in special buffers | Yes | +| Activate region | `SPC` | `C-SPC` | Yes | +| Dictionary | `=` | `C-h =` | No | +| Google search | `C-=` | `C-h C-=` | No | +| Embark | `o` | `C-o` | No | -ニーモニックに留めず通常の編集で使うのと同じキーバインディングを再利用するだけだ。若干長目のキーシーケンスという犠牲を払うことによって、指に覚えさせた記憶を最大限に再利用できる。Embarkユーザーであれば上記のキーすら必要なくなる。必要なのはembark-actの呼び出しだけだ。 +ニーモニックに留めず通常の編集で使うのと同じキーバインディングを再利用するだけだ。若干長目のキーシーケンスという犠牲を払うことによって、指に覚えさせた記憶を最大限に再利用できる。Embarkユーザーであれば上記のキーすら必要なくなる。必要なのは`embark-act`の呼び出しだけだ。 # 未解決問題 @@ -1362,13 +1470,13 @@ You can go beyond the mnemonic and simply reuse the same keybindings you use in There are two common editing actions that still require manually moving the point elsewhere, perhaps to another window: --> -一般的な編集においてポイントをどこか(別のウィンドウかもしれない)へ移動する際に、依然として手作業を要するアクションが2つ存在する: +一般的な編集においてポイントをどこか(別のウィンドウかもしれない)へ移動する際に、依然として手作業を要するアクションが2つ存在する: -- スクリーンの境界を超えた別ウィンドウのコンテンツにたいする検索やジャンプ。これにはシンプルな解決策がある: +- スクリーンの境界を超えた別ウィンドウのコンテンツにたいする検索やジャンプ。これにはシンプルな解決策がある:
      別ウィンドウをIsearchする
      
       (defun isearch-forward-other-window (prefix)
      @@ -1401,7 +1509,7 @@ Searching or jumping to the contents of other windows beyond the confines of the
       In keeping with C-M-v to scroll the other window, you can Isearch the other window with C-M-s without switching to it8. If you’re feeling adventurous, replace (other-window next) in the above functions with (ace-window).
       -->
       
      -  C-M-vで他のウィンドウのスクロールしながら、そのウィンドウに切り替えずにC-M-sでIsearchできる[^8]。冒険してみたければ、上記関数の`(other-window next)`を`(ace-window)`に置き換えてみよう。
      +  `C-M-v`で他のウィンドウのスクロールしながら、そのウィンドウに切り替えずに`C-M-s`でIsearchできる[^8]。冒険してみたければ、上記関数の`(other-window next)`を`(ace-window)`に置き換えてみよう。
       
       
       
      -この記事は[Embarkの使用方法に関する記事](https://karthinks.com/software/fifteen-ways-to-use-embark)のアイデアと関連しているので、主にアクションについて記述されている。しかしAvyはモジュールの組み合わせにより構成されているので、フィルター -> 選択によって機能するさまざまなアプリケーションの広い範囲に適性がある。シリーズ第2弾ではAvyのAPI、および独自コマンドを作成する方法についても掘り下げていくつもりだ。
      +この記事は[Embarkの使用方法に関する記事](https://karthinks.com/software/fifteen-ways-to-use-embark)のアイデアと関連しているので、主にアクションについて記述されている。しかしAvyはモジュールの組み合わせにより構成されているので、フィルター選択によって機能するさまざまなアプリケーションの広い範囲に適性がある。シリーズ第2弾ではAvyのAPI、および独自コマンドを作成する方法についても掘り下げていくつもりだ。
       
       # 脚注
       
      @@ -1429,8 +1537,8 @@ This post primarily concerned itself with the Act part as it connects with the i
       
       [^5]: この関数を改善してくれたOmar Antolinに感謝する。
       
      -[^6]: Avyのすべてのアクション関数の内部でsave-excursionを使用しているので、これは技術的には誤りだ。ここでの実際の成果はEmbarkに言及する前に、このコード断片にほぼ4000語にのぼる単語を詰め込んだことだろう。
      +[^6]: Avyのすべてのアクション関数の内部で`save-excursion`を使用しているので、これは技術的には誤りだ。ここでの実際の成果はEmbarkに言及する前に、このコード断片にほぼ4000語にのぼる単語を詰め込んだことだろう。
       
      -[^7]:  違うウィンドウに戻ってしまう場合には、かわりにpop-global-mark (C-x C-SPC)でグローバルマークをpopできる。今ではdogearsのような外部パッケージでこれを行うことができる。
      +[^7]:  違うウィンドウに戻ってしまう場合には、かわりに`pop-global-mark` (`C-x C-SPC`)でグローバルマークをpopできる。今ではdogearsのような外部パッケージでこれを行うことができる。
       
      -[^8]: C-M-sはデフォルトではisearch-forward-regexpにバインドされている。isearch-forward-regexpにはC-s M-rのようにIsearchマップでM-rとタイプすればアクセスできる。
      +[^8]: `C-M-s`はデフォルトでは`isearch-forward-regexp`にバインドされている。`isearch-forward-regexp`には`C-s M-r`のようにIsearchマップで`M-r`とタイプすればアクセスできる。