1

TAB が Emacs でスマートになりたいと思っていることは知っています。しかし、それは私の好みには十分ではありません。そして「賢い」からこそ、伸ばすのは難しそうです。

Clojure モードの TAB が、列 0 にあるa などの最初の括弧にいる場合を除いて、動作するのとまったく同じように動作することを望みます。defn, defmacro

そこにある場合は、代わりにhs-minor-modeからhs -toggle-hidingを呼び出すようにします。

しかし、私はそれを機能させようとして夢中になっています。

最初に TAB に割り当てられたショートカットを変更して、Clojure モードでのみ、最初に関数を呼び出し、次にindent-for-tab-command を呼び出すようにしましたが、TAB ショートカットの変更は驚くほど複雑に思えます。Emacs はモードが Lisp-indent-function に TAB 関数を登録できるケースをすでに計画していたので、私はclojure-indent-functionを変更したいと思っていました。

(defun clojure-indent-function (indent-point state)
  "This function is the normal value of the variable `lisp-indent-function'.

ただし、この関数は、カーソルが関数内にある場合にのみ呼び出されるようです。カーソルが "(defn ...") の最初の '(' にあるときではありません。

hs-toggle-hidingClojure モードのときにTAB を呼び出すにはどうすればよいですか?

これが org-mode やその他のモードに影響を与えたくありません。ただのClojureモード。

4

2 に答える 2

3

clojure-indent-functionはの実装であり、インデントするのlisp-indent-functionではなく、インデントを計算することになっています。インデントの可能性に関心のある任意のコードからいつでも呼び出すことができるため、目的のTAB動作をこの場所にフックしたくないことは確かです。

TAB興味深い時点でそのスマートさがあなたが望むものではないかもしれないことを考えると、すべての可能なスマートさTABの前に私たちのロジックを置くために再バインドする方が良いかもしれません:

(defun clojure-hs-tab (arg)
  (interactive "P")
  (if (and (<= (current-column) 1)
           (save-excursion
             (beginning-of-line)
             (looking-at "\(")))
      (hs-toggle-hiding)
    (indent-for-tab-command arg)))

(define-key clojure-mode-map (kbd "TAB") 'clojure-hs-tab)    

私は自由に要件を変更し、列1も許可しました。これは、hs-toggle-hidingが非表示の後にポイントを配置する場所だからです。2回目のTABキー押下で再表示しませんか?

「タブの賢さ」の次のレベルはindent-line-function 変数です。これは、完了またはインデントタブがインデントすることを決定し、完了しないことを決定したときに呼び出されるものです。ここでは使用しないという強い理由があります。領域indent-line-functionをインデントするために複数回呼び出される場合があります。インデントと完了 のインデント動作だけをオーバーライドすることにした場合でも、アドバイスすることをお勧めします (グローバルにアドバイスし、そのモードでのみ必要なことを実行するようにチェックします)。TABindent-for-tab-commandmajor-mode

于 2013-01-31T19:25:47.800 に答える
3

一般的な答えは次のようになります。

(eval-after-load 'clojure-mode
  '(define-key clojure-mode-map [tab] 'my-tab-command))

そして、あなたが説明したように、定義:

(defun my-tab-command (&optional arg)
  (interactive "P")
  (if (and (zerop (current-column)) (eq (char-after) ?\())
      (hs-toggle-hiding)
    (indent-for-tab-command arg)))
于 2013-01-31T19:11:20.667 に答える