前の文字に依存する文字を挿入するときにスペースを自動的に挿入する


8

通常. , :、次の文字を挿入する前にスペースを入れるように句読点を挿入した後。Emacsが自動的にこの動作をすることは可能ですか?たとえば、のようなものを挿入すると、が任意の文字であると.x入力されます(がそれ自体である場合など、ユーザーによって除外された特定のケースを除く)。. xxxspace

これは、タイピングのスピードアップに役立つ場合があります。


2
たぶんこれを見てください:smart-operator
nanny

回答:


8

スマートなオペレーターは有望に見えますが、まだ試していないので話せません。ビルド済みのソリューションが理想的ですが、十分でない場合は、この機能をラップしてマイナーモードでラップするのは非常に簡単です。

ここに私の行く:

(defvar auto-punc-punctuation-members
  (string-to-list ".,:;?!")
  "List of charactesr to insert spaces after")

(defvar auto-punc-ignore-members
  (string-to-list " \t")
  "List of characters to not auto insert spaces before")

(defun auto-punc-maybe-do ()
  "If the last entered character is not in `auto-punc-punctuation-members' or `auto-punc-ignore-members',
and the prior character is in `auto-punc-punctuation-members',
insert a space between the two characters. "
  (when (and auto-space-punctuation-mode
             (not (member (char-before) (append auto-punc-punctuation-members auto-punc-ignore-members)))
             (member (char-before (1- (point))) auto-punc-punctuation-members))
    (backward-char 1)
    (insert " ")
    (forward-char 1)))

(define-minor-mode auto-space-punctuation-mode
  "Automatically inserts spaces between some punctuation and other characters."
  :init-value nil
  :lighter "._a"
  :keymap nil
  (make-variable-buffer-local 'post-self-insert-hook)
  (if auto-space-punctuation-mode
      (add-hook 'post-self-insert-hook 'auto-punc-maybe-do)
    (remove-hook 'post-self-insert-hook 'auto-punc-maybe-do)))

あなたは単にそれをあなたのinitに追加し、好きなときにそれを自動的に有効にすることができます

(add-hook 'text-mode-hook 'auto-space-punctuation-mode)

関数auto-punc-maybe-doが実行する文字を挿入するたびに、docstringを読んで、これが目的の動作であることを確認してください。基本的に、句読点を入力すると、句読点や空白以外のものはすべて自動的にスペースが挿入されます。


2
私はあなたのソリューションがテキストモードで完全に機能することを確認しました。
名前

1
それを聞いてよかったです。コードを更新して `post-self-insert-hook bufferをローカルにしました。以前にコードを取得した場合、予期しないバッファで動作しているモードがグローバルに追加された可能性があるため、新しいモードを評価している可能性があります。コードで修正する必要があります。
Jordon Biondo、2015

2

電気演算子に興味があるかもしれません。これは、演算子の周囲にスペースを追加するためのかなり一般的なマイナーモードです(主にプログラミングモード用ですが、テキストモードでも機能します)。

ただし、演​​算子の後に入力した内容は確認されないため、質問の「まだ入力していない場合にのみスペースを追加する」の部分は現在処理できません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.