emacs
  • haskell
  • elisp
  • alignment
  • 2011-01-11 14 views 13 likes 
    13

    を==に、正規表現を揃える=ではなく:私は合わせ-正規表現を使用して「=」文字の上に整列するEmacsは、私はHaskellで作業し、頻繁に次のようなコードに遭遇しています

    func i j | i == j = i 
         | otherwise = j 
    

    が、 elispのノウハウはありません。引用符を使わずに "="をやってみましたが、これは各 '='の前に不要な空白文字を挿入します。私は提案された解決策hereを見つけましたが、私は何もすることができないようです。

    私はこれのためのキーバインドを設定することができる関数またはハードコードされたマクロを書くのを手伝ってください。

    答えて

    17

    銅のMxalign-regexpRET\(\s-*\) =RETn

    (NBそこスペースは '=' の後だが、それは非常に明白ではありません。)

    RET 1 RET 0

    これは...

    プレフィックス引数を使用して、align-regexpにデフォルトより多くのパラメータを要求するよう指示します。

    詳細align-regexpC-HのValign-rules-list fをC-Hを参照するが、要するに:

    \(\s-*\)は削除/拡張用のデフォルト 'グループ' です。私たちはパターンの最後に '='を追加します。 (\s-は、空白のためのEmacs regexpの構文です。)

    1は、単に括弧で囲まれたグループ1(上記と同じ)を指します。これがデフォルトです。

    0行の2つの部分の間の間隔。デフォルトではこれは1です。なぜなら、あなたは追加のスペースで終わっていたのです。

    n各行の最初の後に続くパターンマッチングを揃えないようにする。

    編集:実際には、あなたがにリンクQ & Aが同一の近くにある、とのEmacs 23.2.1上で私のために正常に動作しますので、この重複しているが、キーバインディング側面を継続して答えること:

    キーボードマクロを使用して、そのシーケンスをバインドすることができます。ここでは最終結果が得られます。これはおそらくあなたのinitファイルに追加することができますが、自分でプロセスを進めることをお勧めします。キーはC-c aの代わりに好きなものを使用してください。 C-c (letter)とF5-F9は、エンドユーザが望むようにバインドするために予約されているため、モードのキーマップが邪魔になることはありません。

    (global-set-key (kbd "C-c a") (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([21 134217848 97 108 105 103 110 45 114 101 103 101 120 112 return 32 61 32 return return backspace 48 return 110] 0 "%d")) arg))) 
    

    私がでていることでした:

    1. テキストを選択します。
    2. F3録音を開始します。
    3. 上記のようにalign-regexpを実行してください(ミニバッファの履歴やヤンクを使用しないで、すべてそのまま入力してください)。
    4. F4記録を停止する。
    5. C-X C-K nはマクロ名をLispのを取得する
    6. M-Xinsert-kbd-macroRETalign-single-equalsRETを与えるalign-single-equalsRET
    7. (lambda)発現を(global-set-key)でラップして結合する。 (あなたが提供されるようにも(fset 'align-single-equals ...)コードを使用して、そのシンボルにキーをバインドすることもできますが。

    複雑なマクロを記録する際に間違えた場合は、Emacsは実際に提供して—を心配しないでくださいあなたは完璧である必要はありませんので、(単にCxとのCK Eを入力)録音を終了した後、あなたが間違いを修正するために使用することができます良いマクロエディタ

    編集2:だけでなく、Aの例を追加することができますコメントに応じて、機能ごとに表示されます。

    (defun my-align-single-equals() 
        "Align on a single equals sign (with a space either side)." 
        (interactive) 
        (align-regexp 
        (region-beginning) (region-end) 
        "\\(\\s-*\\) = " 1 0 nil)) 
    
    (global-set-key (kbd "C-c a") 'my-align-single-equals) 
    
    +0

    ありがとうございます。私はあなたのソリューションを使用することができましたが、マクロの代わりに関数を作成しました。 – Karl

    +0

    それはさらにうまくいっています:)もしあなたが幸いなことにlispを書いているのなら、関数は間違いなく望ましいですが、そうでなければマクロはとても便利です。 – phils

    +0

    少し遅れてしまいましたが、これを解決する標準的な方法は、独自の関数を書くのではなく、 'align-rules-list 'にルールを追加することです。 –

    関連する問題