2008-08-13 3 views
6

文脈については、私はemacs初心者の何かです。私は非常に長い間それを使用していないが、ますます使用している(私はそれがたくさん好きです)。また、私はlispに慣れていますが、elispに精通している人ではありません。正規表現をemacsのキーの組み合わせにバインドするにはどうすればよいですか?

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

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

注意を、私は上記の改行を使用しますが、私はisearch-forward-regexpのために、あなたが本当にの結果を正規表現で\nを交換する必要があることを見つけた:私は何をしてきた

Cq Qj。これは、(コマンドを終了することなく)リテラル改行を挿入して、式に改行を入れ、行間でマッチさせることを可能にします。

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

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

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


マイク・ストーンは、これまで最高の答えを持っていた - 私が探していたではない正確何が、それは私が

編集に必要なもののために働いていた - 働いていたこの種のが、後に保存しますマクロ、私が後でそれを使用するために戻ったとき、私はCx eでそれを使うことができませんでした。


(I Emacsを再起動してはMxマクロ名を入力し、[のCx電子場合、すなわち、私は「いいえ、最後のkbdマクロ」または類似した何かのようにミニバッファでのメッセージが表示されます)@ Mike Stone - 情報をありがとう。

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

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

編集:私はのように見えます。マクロを使って私がしたいことをするには、isearch-forward-regexpの外で考えなければなりません。私はあなたが提案したものを試してみるでしょう

あなたがマクロを使用することができます

答えて

5

、単にマクロを終了するC-X(は、マクロのために全力を尽くす、そしてC-X)を行い、その後、C-X Eは、最後に定義されたマクロを実行します。その後、あなたははMx名-最後-KBD-マクロあなたはあなたがしてのMx TESTITを呼び出すことができる、それに名前を割り当てることができます使用してそれに名前を付けることができ、その後、はMx挿入-KBD-マクロを使用して定義を保存しますマクロを現在のバッファに入れて、.emacsファイルに保存することができます。

例:

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

は、 "ABC" と入力し、Returnキーを押しますし、マクロを定義します。

C-xeee 

上記のマクロをすぐに3回実行します(最初にeを実行し、2eを実行すると2回以上実行します)。

M-x name-last-kbd-macro testit 

名 "testit"

M-x testit 

は(そして返す版画 "ABC")だけという名前のマクロを実行するマクロ。

M-x insert-kbd-macro 

あなたの現在のバッファに次のように置きます:

その後、emacsの再起動後に何度も何度も名前のマクロを使用するように .emacsファイルに保存することができます
(fset 'testit 
    [?a ?b ?c return]) 

1

@Justin:マクロを実行すると

、それは少し違う...インクリメンタル検索は一度だけ起こるのだろう、とあなたがもう一度検索したい場合は、再度マクロを実行する必要がありますです。キーワードの検索、行の先頭へのジャンプ、行の終点への移動、Mw(コピー)、別のバッファへのジャンプ、次にCy(paste)など、より強力で複雑な処理を行うことができます。 )、もう一方のバッファにジャンプしてマクロを終了します。次に、マクロを実行するたびに、次のバッファに行をコピーします。

emacsマクロに関する本当にクールなことは、鐘が表示されたときに停止するということです。これは、インクリメンタルサーチ(他のものの中でも)に一致しないと発生します。したがって、上記のマクロでは、1000回マクロを実行するC-u 1000 C-x eを実行できますが、検索を行ってから1000行しかコピーされません。つまり、一致が100件ある場合は、100回だけマクロを実行します。

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

FURTHER EDIT:はMxのハイライトを消し-regexpはあなたがが、最後の正規表現を入力する必要があり、ハイライトを取り消します(ただし、あなたが強調表示するために使用正規表現デフォルト)のEmacsでカスタムキーバインドを定義するために、一般的には

1

、あなたは

(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は、関数の名前であるシンボルです。

あなたの関数が既に定義されていない限り、これを使用する前に定義したいと思うでしょう。より具体的な情報については、C-h f defunを使用する - これを行うには、

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

defunは、関数を定義書きます。 (interactive)実際には関数呼び出しはありません。コンパイラに、M-x function-nameとキーバインドを使って関数が呼び出されても問題ないことを伝えます。

ここで、特に対話型検索の場合、これは難解です。 isearchモジュールは実際にあなたがしようとしているもののために設定されていないようです。しかし、これを使って同様のことをすることができます。私は文字通りあなたの問題を解決するために始めました

2

(kbd ...)から

(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")) 

キーボードシーケンスは、新しい空白の検索を開始します。実際にあなたの文字列を検索するには、最後のキーを必要な回数だけもう一度押します。したがって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") 

、おそらくあなたが必要なものに近いです。通常は検索を開始し、キーコンボを押すと、定義済みの文字列が挿入されます。

関連する問題