web-dev-qa-db-ja.com

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

Emacsを押して8つのスペースタブから4つのスペースタブに切り替えることに失敗しました TAB メジャーモード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番目のWordの先頭までインデントします

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

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

またはtab-stop-listエントリをcustom-set-variables in 。emacsファイルに追加します:

(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))))
28
Bert F

簡潔な答え:

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

133
alcortes

更新: Emacs 24.4以降:

tab-stop-listは、暗黙的に無限に拡張されました。デフォルト値はnilに変更されます。これは、tab-width列ごとにタブストップすることを意味します。

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

元の答えが続きます...


(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))
64
phils

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

M-x customize-group

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

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

この方法で行う場合は、 カスタマイズファイルをセットアップする にする必要があります。

21
Dave Webb
(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)
11
Yan Li
(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++コードと内部のコメントでも機能します

9
user2318996
(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)
9
lawlist

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

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

7
Glenn

これを試して:

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

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

6
cjm

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

(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)))

役に立てば幸いです。

6
gigilibala

これを.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
qwerty9967

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

4
dividebyzero

カスタマイズは(setq tab width 4)をシャドーすることができるため、setq-defaultを使用するか、カスタマイズに自分が何をしているかを知らせます。私もOPに似た問題があり、これだけで修正し、tab-stop-listまたはinsert関数を調整する必要はありませんでした:

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

これをすぐに追加すると便利であることがわかりました(emacsWikiからのヒント):

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

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

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

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

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

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

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

M-i

1
ryanpcmcquen

私の初期化ファイルから、タブの代わりにスペースが欲しかったので異なる:

 
(add-hook 'sql-mode-hook 
(lambda()
(progn 
(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
forkandwait

やってみました

(setq  tab-width  4)
0
GrokCode

ちなみに、C-modeの場合、(setq-default c-basic-offset 4)を追加します。 emacs。詳細については、 http://www.emacswiki.org/emacs/IndentingC を参照してください。

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