6

文脈上、私はemacs初心者のようなものです。私はそれを長い間使用していませんでしたが、ますます使用しています(私はそれがとても好きです). また、私は Lisp には慣れていますが、elisp にはあまり詳しくありません。

この特定の正規表現を頻繁に使用するため、正規表現をキーボードの組み合わせにバインドする必要があります。

私がやってきたこと:

M-C-s ^.*Table\(\(.*\n\)*?GO\)

上記では改行を使用しましたが、正規表現の を の結果にisearch-forward-regexp置き換える必要があることがわかりました。これにより、(コマンドを終了せずに)リテラルの改行が挿入され、式に改行を挿入して行間で一致させることができます。\nC-q Q-j

これをキーの組み合わせにバインドするにはどうすればよいですか?

式で実行される elisp 関数を作成する必要があることは漠然と理解していますがisearch-forward-regexp、詳細についてはあいまいです。Google で検索したところ、ほとんどのドキュメントが少しわかりにくいことがわかりました。

emacsで正規表現をキーの組み合わせにバインドするにはどうすればよいですか?


マイク・ストーンはこれまでのところ最高の答えを持っていまし.

編集-この種の機能はありましたが、マクロを保存した後、後で使用するために戻ったときに、C-x e. (つまり、emacs を再起動して を入力してから を入力するM-x macro-nameと、ミニバッファーC-x eに「最後の kbd マクロがありません」などのメッセージが表示されます)


@Mike Stone - 情報をありがとう。私は次のようなマクロを作成しようとしました:

C-x( M-C-s ^.*Table\(\(.*C-q C-J\)*?GO\) C-x)

これでマクロが作成されましたが、マクロを実行すると、 を使用したときに通常得られるのと同じハイライトが得られませんでしたisearch-forward-regexp。代わりに、式の次の一致の最後にジャンプしました。だから、それは私が必要とするものには実際には機能しません。何か案は?

編集:マクロを使用してやりたいことを実行できるisearch-forward-regexpようです。あなたが提案したことを試してみます。

4

4 に答える 4

6

マクロを使用することができます。マクロに対してC-x (すべてを実行しC-x )、マクロを終了C-x eすると、最後に定義されたマクロが実行されます。次に、 を使用しM-x name-last-kbd-macroて名前を付けることができます。名前を割り当てることができます。これを で呼び出し、M-x TESTITを使用して定義を保存します。M-x insert-kbd-macroこれにより、マクロが現在のバッファーに配置され、.emacsファイルに保存されます。

例:

C-x( abc *return* C-x)

「abc」と入力してリターンを押すマクロを定義します。

C-xeee

上記のマクロをただちに 3 回実行します (最初に e で実行し、次に 2 回の e でさらに 2 回実行します)。

M-x name-last-kbd-macro testit

マクロに「testit」という名前を付けます

M-x testit

指定したマクロを実行します ("abc" を出力してから戻ります)。

M-x insert-kbd-macro

以下を現在のバッファーに入れます。

(fset 'testit
   [?a ?b ?c return])

これを.emacsファイルに保存して、emacs の再起動後に名前付きマクロを何度も使用できます。

于 2008-08-13T18:21:06.830 に答える
2

私は文字通りあなたの問題を解決することから始めました。

(defun search-maker (s)
  `(lambda ()
     (interactive)
     (let ((regexp-search-ring (cons ,s regexp-search-ring)) ;add regexp to history
           (isearch-mode-map (copy-keymap isearch-mode-map)))
       (define-key isearch-mode-map (vector last-command-event) 'isearch-repeat-forward) ;make last key repeat
       (isearch-forward-regexp)))) ;`

(global-set-key (kbd "C-. t") (search-maker "^.*Table\\(\\(.*\\n\\)*?GO\\)"))
(global-set-key (kbd "<f6>") (search-maker "HELLO WORLD"))

からのキーボード シーケンス(kbd ...)は、新しい空白検索を開始します。実際に文字列を検索するには、必要な回数だけ最後のキーを押します。そうC-. t t t<f6> <f6> <f6>。解決策は基本的にハックですが、試してみたい場合はここに残します。

以下は、おそらく必要なものに最も近いものです。

(defmacro define-isearch-yank (key string)
  `(define-key isearch-mode-map ,key 
     (lambda ()
       (interactive) 
       (isearch-yank-string ,string)))) ;`

(define-isearch-yank (kbd "C-. t") "^.*Table\\(\\(.*\\n\\)*?GO\\)")
(define-isearch-yank (kbd "<f6>") "HELLO WORLD")

キーの組み合わせは isearch モードでのみ機能するようになりました。通常どおり検索を開始し、キーの組み合わせを押して、定義済みの文字列を挿入します。

于 2008-09-13T00:34:28.763 に答える
1

一般に、Emacsでカスタムキーバインディングを定義するには、次のように記述します。

(define-key global-map (kbd "C-c C-f") 'function-name)

define-key当然のことながら、新しいキーを定義する機能です。global-map各モードの個別のマップではなく、グローバルキーマップです。(kbd "C-c C-f")キーシーケンスを表す文字列を返しますC-c C-f。文字列を直接入力するなど、これを行う方法は他にもありますが、通常の書面による表現を使用するため、通常はこれが最も簡単です。'function-name関数の名前であるシンボルです。

ここで、関数がすでに定義されていない限り、これを使用する前に関数を定義する必要があります。そのためには、

(defun function-name (args)
  (interactive)
  stuff
  ...)

defun関数を定義します-C-h f defunより具体的な情報に使用します。実際には関数呼び出しは(interactive)ありません。これは、キーバインディングを使用してユーザーが関数を呼び出しても問題がないことをコンパイラーにM-x function-name通知します。

さて、特にインタラクティブ検索の場合、これは注意が必要です。モジュールは、isearchあなたがやろうとしていることに対して実際にはセットアップされていないようです。しかし、これを使用して同様のことを行うことができます。

于 2008-08-24T08:12:16.660 に答える
1

@ジャスティン:

マクロを実行する場合は少し異なります...インクリメンタル検索は 1 回だけ行われ、再度検索する場合はマクロを再度実行する必要があります。ただし、キーワードの検索、行頭へのジャンプ、マーク、行末への移動、Mw (コピー)、別のバッファへのジャンプ、Cy (貼り付け) など、より強力で複雑なことを実行できます。 )、次に他のバッファに戻ってマクロを終了します。次に、マクロを実行するたびに、行を次のバッファーにコピーします。

emacs マクロの本当に優れた点は、ベルが表示されると停止することです...これは、インクリメンタル検索の一致に失敗した場合に発生します (とりわけ)。したがって、上記のマクロでは、マクロを 1000 回実行する Cu 1000 Cx e を実行できます...しかし、検索を行ったので、検索が失敗するまで、1000 行しかコピーされません! つまり、100 件の一致がある場合、マクロは 100 回しか実行されません。

編集: 正規表現に一致するすべてのものを強調表示するコマンドのヘルプを表示する C-hf highlight-lines-matching-regexp をチェックしてください...ただし、強調表示を元に戻す方法はわかりません...とにかく使用できます正規表現に一致するすべてを強調表示する保存されたマクロと、次のものを見つけるための別のマクロ...?

さらに編集: Mx unhighlight-regexp は強調表示を元に戻しますが、最後の正規表現を入力する必要があります (ただし、強調表示に使用した正規表現がデフォルトになります)

于 2008-08-13T18:44:39.997 に答える