169

TABメジャー モードで in buffers を押したときに、Emacs を 8 個のスペース タブから 4 個のスペース タブに切り替えることに失敗しましたtext-mode。私は私のに以下を追加しました.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 スペースインデントする方法はありますか?

4

21 に答える 21

143

短い答え:

重要な点は、インデントするときに必要なものを挿入するように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つのスペースとして構成するだけです。

于 2009-11-30T12:03:59.897 に答える
67

更新: Emacs 24.4 以降:

tab-stop-list暗黙的に無限に拡張されるようになりました。そのデフォルト値はnil、すべての列がタブで停止することを意味するように変更されていtab-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))
于 2012-05-03T20:59:05.290 に答える
30

tab-width変数と変数を混同しないでくださいtab-stop-list。前者はリテラルTAB文字の表示に使用されます。TAB後者は、特定のモードで文字を押したときに挿入される文字を制御します。

--GNUEmacsマニュアル

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

または、.emacsファイルのcustom-set-variablesにtab-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))))

タブの動作を編集する別の方法は、を使用することM-x edit-tab-stopsです。

の詳細については、タブストップに関するGNUEmacsマニュアルを参照してくださいedit-tab-stops

于 2008-09-16T07:19:32.227 に答える
21

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

M-x customize-group

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

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

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

于 2008-09-16T08:23:05.553 に答える
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)
于 2009-01-23T04:55:33.280 に答える
7

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

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

于 2009-04-12T00:05:45.140 に答える
7

これらのコード行を .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)))

お役に立てば幸いです。

于 2012-10-29T00:37:09.743 に答える
6

これを試して:

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

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

于 2008-09-16T07:53:41.553 に答える
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)

楽しみ!

于 2012-05-03T20:07:25.237 に答える
4

c-set-style でスタイルを変更するだけで十分でした。

于 2009-08-21T01:21:20.137 に答える
4

カスタマイズはシャドーできる(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)
于 2017-03-16T17:39:24.757 に答える
3

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

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

quote機能するには 2 つの数値が必要であることに注意してください(ただし、それ以上ではありません!)。

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

M-i

于 2017-02-09T23:13:43.287 に答える
2

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

(global-set-key (kbd "TAB") 'self-insert-command)
于 2015-06-29T19:45:44.150 に答える
0
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
于 2009-08-19T18:15:17.317 に答える
0

やってみました

(setq  tab-width  4)
于 2008-09-16T07:10:20.843 に答える