텍스트 모드에서 Emacs에서 4 개의 들여 쓰기 설정


159

TAB주요 모드에서 버퍼를 누를 때 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. 이전 줄에 텍스트가 있으면 두 번째 단어의 시작 부분에 들여 쓰기

내가 Emacs를 좋아하는 한 이것은 성가시다. 이전 줄에 텍스트가 없을 때 Emacs가 4 칸 이상 들여 쓰기 할 수있는 방법이 있습니까?


모드 라인 C ++ 또는 csharp-mode의 경우 (setq tab-width 4) (setq c-basic-offset 4)를 (defun csharp-mode () ...) 끝에 추가하고 ( 1) 탭은 8 문자 대신 4로 표시되며 (2) 탭을 누르면 새 줄에 4 개의 공백이 생깁니다.
Jared Updike

매우 늦었지만 (setq tab-width 4) 사용이 작동하지 않는다는 것을 깨달았지만 (setq-default tab-width 4)를 사용하면 다른 작업을 수행 할 필요가 없습니다.
Sambatyon

공백을 사용하고 탭 정지로 이동하려면 내 대답을 참조하십시오.
forkandwait

이 질문을 발견 한 다른 사람들에게 참고 : "-default"를 놓치지 않았는지 확인 (setq-default tab-width 4)하는 것과 같은 것은 아닙니다 (setq tab-width 4)!
zachaysan

10
나는 이것이 그렇게 어렵다는 것을 믿을 수 없다.
gwg

답변:


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
탭 너비와 탭 중지 목록이 모두 필요합니다. 탭 폭은 탭을 표시 할 때 사용되는 반면 탭을 추가 할 때 탭 정지를 결정하려면 탭 중지 목록이 필요합니다.
Michael Ratanapintha

3
참고하시기 바랍니다 stackoverflow.com/questions/69934/...은
필리스

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

5
설명서에 따르면 모든 위치가 필요하지는 않습니다. 4 8 12를 수행하면 다른 모든 것까지 확장됩니다 (계속 4 추가). 분명히 3 대신 1 또는 2 개의 요소 만 사용하면 마지막 단계로 탭 너비가 사용됩니다. 이론적으로 4 칸씩 탭하고 탭 너비를 4로 설정하면 쓸 수 '(tab-stop-list (quote (4)))있습니다.
니콜라스 피터슨

1
@NicholasPeterson는 그것을 알아 주셔서 감사합니다! 그럼에도 불구하고 실제로 quote는 광고를 무한대로 계속하려면 두 개의 숫자가 필요합니다. 참조 : stackoverflow.com/a/42148697/2662028
ryanpcmcquen

138

짧은 답변:

요점은 이멕스가 들여 쓰기 할 때 원하는 것을 삽입하도록 지시하는 것입니다. 이는 들여 쓰기 라인 기능을 변경하여 수행됩니다. 탭을 삽입하도록 변경 한 다음 4 개의 공백을 삽입하도록 변경하는 것보다 탭을 4 개의 공백으로 변경하는 것이 더 쉽습니다. 다음 구성은 문제를 해결합니다.

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

설명:

주요 모드로 제어되는 들여 쓰기 에서 @ emacs manual :

각 주요 모드의 중요한 기능은 편집중인 언어에 맞게 들여 쓰기되도록 키를 사용자 정의하는 것입니다.

[...]

indent-line-function 변수는 현재 줄을 들여 쓰기 위해 (그리고 indent-region을 호출 할 때와 같은 다양한 명령) 사용할 함수입니다. 들여 쓰기 모드로 명령은 더 이상이 함수를 호출하지 않습니다.

[...]

많은 모드에서 기본값은 들여 쓰기 기준입니다.

들여 쓰기 기준 @ emacs 매뉴얼에서 :

들여 쓰기 기준 이전 공백이 아닌 줄의 다음 들여 쓰기 지점 아래로 공백.

[...]

이전의 비 공백 라인이 열 포인트 시작점을 넘어서서 들여 쓰기 지점이 없다면,`tab-to-tab-stop '이 대신 수행됩니다.

indent-line-function의 값을 insert-tab 함수로 변경하고 탭 삽입을 4 개의 공백으로 구성하십시오.


10
OP와 동일한 문제가 있으며 솔루션이 작동하지 않습니다.
Gauthier

더 자세히 설명 해주세요. 위의 행을 .emacs의 유일한 내용으로 사용하고 "Mx 들여 쓰기에 따라 모드"를 호출해도 4 개의 공백이 삽입되지 않습니까?
alcortes

3
당신의 첩보는 8 개의 공백을 넣습니다.
블라디미르 Mihailenco

4
나는 emacs 버전 23.3.1을 사용하고 있으며 짧은 대답은 공백으로 변경하지 않습니다. 이 답변은 잘못된 것입니다.
VNarasimhaM

2
@BruceBarnett 텍스트 모드에 있으며이 지침은 여전히 ​​작동하지 않습니다.
햇볕이 잘 드는

66

업데이트 : 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))

이것은 내 시스템에서 일할 수있는 유일한 대답입니다.
Karpov

emacs 들여 쓰기 커스터마이징 페이지는 탭 목록 "마지막 단계의 반복을 통해 암시 적으로 무한대로 확장된다"고 말합니다. 즉, 목록 (4 8)은 명백한 숫자 순서 없이도 충분해야합니다.
James Waldby-jwpat7

@ JamesWaldby-jwpat7 실제로 24.4 (2014)에 발생했습니다. NEWS에 따르면 : " tab-stop-list이제 암시 적으로 무한대로 확장되었습니다. 기본값은 nil로 변경되어 탭마다 모든 tab-width열이 중지됩니다 ." 따라서 실제로 기본값 인을 사용할 수 있습니다 nil.
phils

21

다음과 같이 탭을 설정하는 것이 더 쉬울 수 있습니다.

M-x customize-group

상기 Customize group:메시지 입력 indent.

들여 쓰기 옵션을 모두 설정하고 현재 세션에 대해 설정하거나 향후 모든 세션에 저장할 수있는 화면이 표시됩니다.

이렇게하면 사용자 지정 파일설정해야합니다 .


Mx 사용자 정의 그룹을 기억해야합니다-매우 편리한 바로 가기!
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)

이 페이지의 다른 사람들이하지 않았을 때 나를 위해 일했습니다.
Michael Terry

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 ++ 코드와 주석 내부에서도 작동합니다.


파티에 늦었지만 감사합니다. 왜 이맥스가 들여 쓰기 규칙을 C / C ++ 코드에 적용하기 위해 특정 지침이 필요한지 이해할 수 없습니다. 나는 앞으로 vim을
eye

이 질문을 직접하고 싶습니다.이 답변에 동의 할 수 있습니다. 내가 할 수 있으면 현상금을 줄 것이다. 나는 emacs가 4시에 탭하기를 꺼려 하고이 페이지의 모든 솔루션을 진행하고 있다는 것을 매우 화가 났고, 당신은 나에게 엄청난 양의 작업을 저장했습니다!
Topological Sort

7

이 문제는 탭 중지 누락으로 인한 것이 아닙니다. emacs에는 테이블 형식의 데이터를 정렬하도록 설계된 들여 쓰기 기준이라는 (새로운?) 탭 방법이 있습니다. Tab 키는 indent-for-tab-command 메소드에 맵핑됩니다.이 메소드는 indent-line-function 변수가 설정되어있는 모든 메소드를 호출합니다.이 메소드는 텍스트 모드의 들여 쓰기 관련 메소드입니다. indent-line-function 변수를 대체하는 좋은 방법을 찾지 못했습니다 (텍스트 모드 후크가 작동하지 않으므로 모드 후크가 실행 된 후 재설정 될 수 있습니까?). 그러나 이것을 제거하는 간단한 방법 TAB을 더 간단한 tab-to-tab-stop 방법으로 설정하여 tab-in-to-command 명령 방법을 실행하는 것입니다.

(키 텍스트 모드 맵 정의 (kbd "TAB") '탭-탭-정지)


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 문자를 삽입합니다 (단, 텍스트 모드에서만). 그것이 당신이 원하는 것이 아닌 경우,보고 싶은 행동을 설명하십시오.


4
OP가 탭 대신 공백을 원한다고 생각합니다 (따라서 탭을 누르면 4 개의 공백이 삽입됩니다).
mipadi 2009

Aquamacs 2.4와 함께이 특정 답변은 탭 대신 다른 언어로 된 문자를 제공합니다. 렔. 탭 키를 두 번 이상 누르면 결과는 다음과 같습니다. 렔렔 (분리없이). 그리고 각 연속 탭 프레스에 대해서도 마찬가지입니다.
lawlist

6

이러한 코드 줄을 .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)))

도움이 되길 바랍니다.


4

c-set-style로 스타일을 바꾸는 것만으로 충분했습니다.


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작동하려면 두 개의 숫자 가 필요합니다 (그러나 더 이상은 아닙니다!).

또한 대부분의 주요 모드 ( Python예 : Emacs)에서는 들여 쓰기가 자동으로 수행됩니다. 자동 들여 쓰기 이외의 들여 쓰기가 필요한 경우 다음을 사용하십시오.

M-i


2

커스터마이제이션은 섀도 잉 할 수 (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)

1

.emacs 파일에 이것을 쓸 때까지 가장 좋은 답변이 작동하지 않았습니다.

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

0

당신이 시도 했습니까

(setq  tab-width  4)

2
그들은 그들의 질문에 이것을 가지고 있으므로, 그들이 시도했다고 가정하는 것이 안전합니다.
ryanpcmcquen



0

init 파일에서 탭 대신 공백을 원했기 때문에 다릅니다.

(추가 후크 'sql-mode-hook
          (람다 ()
             (프론
               (setq- 기본 탭 너비 4)
               (setq 들여 쓰기 탭 모드 nil)
               (setq 들여 쓰기 라인 기능 '탭-탭-스톱') 
               (변형-구문 엔트리? _ "w"); 이제 '_'는 단어 구분 기호로 간주되지 않습니다
               (변형-구문 입력?- "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.