テキストモードのEmacsで4つのスペースインデントを設定する


159

TABメジャーモードでバッファーを押したときに、Emacsで8つのスペースタブから4つのスペースタブに切り替えることができませんtext-modeでした。以下をmyに追加しました.emacs

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)

;;; And I have tried
(setq indent-tabs-mode nil)
(setq tab-width 4)

.emacsファイル(またはバッファーのローカル変数)をどのように変更しても、TABボタンは常に同じことを行います。

  1. 上にテキストがない場合は、インデント8スペースをます
  2. 前の行にテキストがある場合は、2番目の単語の先頭までインデントします

私がEmacsを愛しているのと同じくらい、これは迷惑になっています。前の行にテキストがない場合、Emacsに少なくとも4スペースをインデントさせる方法はありますか?


モードラインC ++またはcsharp-modeの場合、(deq csharp-mode()...)の最後に(setq tab-width 4)(setq c-basic-offset 4)を追加しました。 1)タブは8文字ではなく4と表示されます。(2)タブを押すと、新しい行に4つのスペースが表示されます。
Jared Updike、

非常に遅いですが、(setq tab-width 4)を使用しても機能しないことに気づきましたが、(setq-default tab-width 4)を使用する場合、他に何もする必要はありません。
Sambatyon 2014

スペースを使用したいがタブストップに移動する場合は、私の回答を参照してください。
forkandwait 2014年

この質問を見つけた他の人への注意:「-default」を見逃していないことを確認するの(setq-default tab-width 4)と同じことではありません(setq tab-width 4)
zachaysan 2015年

10
これがとても難しいとは思えません。
gwg 2017

回答:


30
(customize-variable (quote tab-stop-list))

または、.emacsファイルのcustom-set-variablestab-stop-listエントリを追加します

(custom-set-variables
  ;; custom-set-variables was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(tab-stop-list (quote (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120))))

9
タブ幅とタブストップリストの両方が必要です。tab-widthはタブを表示するときに使用され、tab-stop-listはタブを追加するときにタブストップを決定するために必要です。
マイケル・ラタナピンサ2008


5
本当にこれ以上短いものはありません'(tab-stop-list (quote (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120)))か?まあ、それが機能する限り、私は推測します...:P
HelloGoodbye '29

5
ドキュメントによると、これらのすべてのポジションは必要ありません。4 8 12を実行するだけで、他のすべてに拡張されます(4を追加し続ける)。どうやら、3つではなく1つまたは2つの要素を使用する場合、最後のステップとしてタブ幅を使用するだけです。理論的には、4つのスペースでタブを作成し、タブ幅を4に設定した場合、と書くことができます'(tab-stop-list (quote (4)))
ニコラスピーターソン

1
@NicholasPeterson気づいてくれてありがとう!ただし、実際にquoteは無限にシーケンスを続けるには2つの数値が必要なようです。参照:stackoverflow.com/a/42148697/2662028
ryanpcmcquen

138

短い答え:

重要なポイントは、インデントするときに何でも挿入するようにemacsに指示することです。これは、indent-line-functionを変更することによって行われます。タブを挿入してタブを4つのスペースに変更する方が、4つのスペースを挿入するように変更するよりも簡単です。次の構成で問題が解決します。

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)

説明:

メジャーモードで制御されるインデントから@ emacsマニュアル

各メジャーモードの重要な機能は、編集中の言語に対して適切にインデントするキーをカスタマイズすることです。

[...]

indent-line-function変数は、現在の行をインデントするために使用される関数(およびindent-regionを呼び出すときなどのさまざまなコマンド)です。コマンドindent-according-to-modeは、この関数を呼び出すだけです。

[...]

デフォルト値は、多くのモードでインデント相対です。

インデント相対@ emacsマニュアルから:

前の非空白行の次のインデントポイントの下にインデント相対スペース。

[...]

前の非空白行に列ポイントの開始位置を超えるインデントポイントがない場合、代わりに「tab-to-tab-stop」が実行されます。

indent-line-functionの値をinsert-tab関数に変更し、タブの挿入を4つのスペースとして構成するだけです。


10
私はOPと同じ問題を抱えていますが、あなたの解決策は私にとってはうまくいきません。
Gauthier

さらに詳しく説明してください。上記の行を.emacsの唯一のコンテンツとして使用し、「Mx indent-according-to-mode」を呼び出しても4つのスペースが挿入されないということですか?
アルコルテス

3
あなたの構成は私のために8つのスペースを挿入します。
Vladimir Mihailenco

4
私はemacsバージョン23.3.1を使用していますが、短い回答ではスペースに変更されません。この答えは誤解を招くものです。
VNarasimhaM 2013

2
@BruceBarnett私はテキストモードで、これらの指示はまだ機能しません。
晴れた

66

更新: Emacs 24.4以降:

tab-stop-list現在、暗黙的に無限に拡張されています。デフォルト値はに変更されてniltab-widthます。これは、すべての列でタブストップを意味します。

つまり、に設定tab-stop-listしておくことができるため、以下に示す方法で設定する必要がなくなりますnil

元の答えは...


関数がそこに座って使用されるのを待っている(setq tab-stop-list 4 8 12 ................)ときのようなものを見るのはいつも私に少し苦痛ですnumber-sequence

(setq tab-stop-list (number-sequence 4 200 4))

または

(defun my-generate-tab-stops (&optional width max)
  "Return a sequence suitable for `tab-stop-list'."
  (let* ((max-column (or max 200))
         (tab-width (or width tab-width))
         (count (/ max-column tab-width)))
    (number-sequence tab-width (* tab-width count) tab-width)))

(setq tab-width 4)
(setq tab-stop-list (my-generate-tab-stops))

これが私のシステムで作業できる唯一の答えです。
Karpov

emacsのインデントカスタマイズページは、タブリストを「最後のステップを繰り返すことで暗黙的に無限に拡張する」と述べています。つまり、リスト(4 8)は、明示的な番号シーケンスなしで十分なはずです
James Waldby-jwpat7

@ JamesWaldby-jwpat7確かに、それは24.4(2014)で起こりました。NEWSは次のように述べtab-stop-listていtab-widthます。-実際には、デフォルト値のをそのまま使用できますnil
フィル2016

21

次のようにタブを設定する方が簡単な場合があります。

M-x customize-group

Customize group:プロンプトで入力しますindent

インデントオプションをすべて設定し、それらを現在のセッションに設定したり、今後のすべてのセッションに保存したりできる画面が表示されます。

この方法で行う場合は、カスタマイズファイル設定する必要があります


Mx Customize-Groupを覚えておく必要があります-とても便利なショートカットです!
Nick Bolton

11
(setq tab-width 4)
(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80))
(setq indent-tabs-mode nil)

10
(defun my-custom-settings-fn ()
  (setq indent-tabs-mode t)
  (setq tab-stop-list (number-sequence 2 200 2))
  (setq tab-width 2)
  (setq indent-line-function 'insert-tab))

(add-hook 'text-mode-hook 'my-custom-settings-fn)

これは、このページの他の人がしなかったときに私にとってはうまくいきました。
マイケルテリー

emacsでの作業26.3
Saurabh

9
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)
(setq c-default-style "linux") 
(setq c-basic-offset 4) 
(c-set-offset 'comment-intro 0)

これはC ++コードと内部のコメントでも機能します


パーティーには遅れますが、よろしくお願いします。emacsがそのインデントルールをC / C ++コードにも適用するために特定の指示を必要とする理由を理解することはできません。私は将来的にvimに
注目し

私自身もこの質問に答えたいと思っています。できれば賞金を差し上げます。emacsが4でタブを作成するのを嫌がったため、このページのすべての解決策を試してみて、あなたは私に多大な労力を節約してくれたことに非常に腹を立てていました。
トポロジカルソート

7

この問題の原因はタブストップがないことではありません。emacsには、表形式のデータを揃えるように設計されているように見える、indent-relativeと呼ばれる(新しい?)tabメソッドがあるということです。TABキーは、メソッドindent-for-tab-commandにマップされ、変数indent-line-functionに設定されているメソッドを呼び出します。これは、テキストモードのインデント相対メソッドです。私はインデントライン関数変数をオーバーライドするための良い方法を見つけていません(テキストモードフックが機能していないので、モードフックの実行後にリセットされている可能性がありますか?)これを取り除く簡単な方法の1つ動作は、TABをより単純なtab-to-tab-stopメソッドに設定することで、intent-for-tab-commandメソッドをチャックするだけです。

(define-key text-mode-map(kbd "TAB") 'tab-to-tab-stop)


6

これを試して:

(add-hook 'text-mode-hook
  (function
   (lambda ()
     (setq tab-width 4)
     (define-key text-mode-map "\C-i" 'self-insert-command)
     )))

これにより、TABは常にリテラルTAB文字を挿入し、タブストップは4文字ごとです(ただし、テキストモードのみ)。それがあなたが求めているものではない場合は、あなたが見たいと思う行動を説明してください。


4
OPはタブではなくスペースが必要だと思います(したがって、タブを押すと4つのスペースが挿入されます)。
mipadi 2009

Aquamacs 2.4と組み合わせて、この特定の回答では、タブではなく別の言語の文字が表示されます:렔。タブキーを2回以上押すと、結果は次のようになります。そして、同じことが、連続する各タブプレスにも当てはまります。
法律家2013

6

これらのコード行を.emacsファイルに追加できます。インデント相対の代わりに挿入タブを使用するテキストモードのフックを追加します。

(custom-set-variables
 '(indent-line-function 'insert-tab)
 '(indent-tabs-mode t)
 '(tab-width 4))
(add-hook 'text-mode-hook
      (lambda() (setq indent-line-function 'insert-tab)))

お役に立てば幸いです。



4

これを.emacsファイルに追加します。

これにより、タブが表示される幅が2文字に設定されます(数字の2を必要なものに変更します)。

(setq default-tab-width 2)

emacsが実際にスペースではなくタブを使用していることを確認するには:

(global-set-key (kbd "TAB") 'self-insert-command)

余談ですが、タブをバックスペースするときのemacsのデフォルトは、タブをスペースに変換してからスペースを削除することです。これは煩わしい場合があります。タブを削除するだけの場合は、次のようにします。

(setq c-backspace-function 'backward-delete-char)

楽しい!


質問で尋ねる少なくとも4つのスペースを満たしていません。
kmarsh

2

これは、シーケンスやタブからスペースへの変換なしに、タブが挿入されないようにする唯一のソリューションです。これらはどちらも適切であるように見えましたが、無駄でした:

(setq-default
    indent-tabs-mode nil
    tab-width 4
    tab-stop-list (quote (4 8))
)

ご了承ください quoteするためには2つの数値必要です(ただし、それ以上ではありません!)。

また、ほとんどのメジャーモード(Pythonたとえば)では、インデントはEmacsで自動的に行われます。自動インデントの外でインデントする必要がある場合は、次を使用します。

M-i


2

カスタマイズは影に(setq tab width 4)なる可能性があるため、使用するsetq-defaultか、何をしているかをカスタマイズに通知します。私もOPと同様の問題があり、これだけで修正しました。調整tab-stop-listinsert機能は必要ありませんでした。

(custom-set-variables
 '(tab-width 4 't)
 )

これを直後に追加すると便利です(emacsWikiからのヒント)。

(defvaralias 'c-basic-offset 'tab-width)
(defvaralias 'cperl-indent-level 'tab-width)

1

最良の答えは、これを.emacsファイルに書き込むまで機能しませんでした。

(global-set-key (kbd "TAB") 'self-insert-command)

0

やってみました

(setq  tab-width  4)

2
彼らは彼らの質問にこれを持っているので、はい、彼らがそれを試したと仮定するのは安全です。
ryanpcmcquen 2017



0

タブの代わりにスペースが必要だったので、私のinitファイルとは異なります:

(add-hook 'sql-mode-hook
          (ラムダ()
             (予測
               (setq-default tab-width 4)
               (setq indent-tabs-mode nil)
               (setq indent-line-function 'tab-to-tab-stop) 
               (modify-syntax-entry?_ "w"); 現在、「_」は単語区切り文字とは見なされません
               (modify-syntax-entry?-"w"); 現在、「-」は単語区切り文字と見なされていません
               )))

0

フックなしでこの回答を変更しました:

(setq-default
  indent-tabs-mode t
  tab-stop-list (number-sequence 4 200 4)
  tab-width 4
  indent-line-function 'insert-tab)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.