---
title: "#이맥스 #태그 #자동완성 - 무조건 꺼라 §etags §ten"
url: "https://notes.junghanacs.com/notes/20250304T172608"
author: "Junghan Kim"
date: "2025-03-04T17:26:00+09:00"
lastmod: "2025-03-04T17:26:00+09:00"
tags: ["autocompletion","doomemacs","tag"]
description: "Emacs 태그 자동완성을 꺼야 하는 이유와 해결 설정을 정리한 노트이다."
---

> [!abstract] 이 노트에 대하여
> 
> 곳곳에 튀어나오는 태그 자동완성을 끄기 위해 completion-at-point-functions를 어떻게 비워야 하는지 설명한다. Doom Emacs에서 겪는 사소하지만 성가신 문제의 해결 메모다.

## 히스토리

-   [2025-03-04 Tue 17:26] 어디든 나타나는 태그 자동완성을 꺼야 한다.
-   [2025-04-11 Fri 17:48] 아. 둠이맥스에서 태그를 기본으로 넣어두니 그걸 초기화 해버는 것.
-   [string-inflection 문자열 변환 - 대문자 카멜 케밥 케이스](https://notes.junghanacs.com/notes/20250304T194513)
-   [#이맥스 #용어집: §ten 패키지](https://notes.junghanacs.com/bib/20240911T072002)

## 2025 태그 자동완성의 저주를 풀다

[2025-03-04 Tue 17:26]

해결 방법 아래가 끝.

```elisp
;;;; overide completion-at-point-functions nil

;; Global Value (tags-completion-at-point-function)
(setq-default completion-at-point-functions nil)
```

### 보관 이게 문제다.

## 로그

### [2025-03-04 W09](https://notes.junghanacs.com/journal/20250303T000000)

#### @user 이맥스에서 complete-tag를 활용하는 방법은? completion-at-point에서 제외하는 방법?

@assistant 이맥스에서 `complete-tag` 를 활용하는 방법에 대한 정보는 제공되지 않았지만, `completion-at-point` 에서 특정 기능을 제외하는 방법에 대해 설명할 수 있습니다.

##### completion-at-point에서 기능 제외하기

`completion-at-point` 는 이맥스의 주요 모드에서 `C-M-i` 또는 `M-TAB` 키로 호출되는 명령어로, 현재 커서 위치의 심볼을 완성합니다. 이 명령어는 `completion-at-point-functions` 라는 훅 변수를 사용하여 완성 후보를 생성합니다. 특정 기능을 제외하려면 이 훅 변수에서 해당 기능을 제공하는 함수를 제거해야 합니다.

##### 예시: 특정 함수 제거

```elisp
;; completion-at-point-functions에서 특정 함수 제거
(defun remove-function-from-completion-at-point (func)
  (setq completion-at-point-functions
        (delq func completion-at-point-functions)))

;; 예를 들어, 특정 함수 'my-completion-function'을 제거하려면
(remove-function-from-completion-at-point 'my-completion-function)
```

이 코드는 `completion-at-point-functions` 리스트에서 특정 함수를 제거하여 해당 기능이 완성 후보에 포함되지 않도록 합니다.

##### completion-at-point-functions 사용법

이 훅 변수는 함수의 리스트로 구성되며, 각 함수는 `completion-at-point` 명령어가 호출될 때 순차적으로 실행됩니다. 첫 번째로 `nil` 이 아닌 값을 반환하는 함수가 완성 후보를 제공합니다. 따라서 특정 기능을 제외하려면 해당 기능을 제공하는 함수가 `nil` 을 반환하도록 하거나, 훅 변수에서 해당 함수를 제거해야 합니다[2][4].

Citations: [1] <https://phrimm136.github.io/post/2020/05/emacs-conversion-guide-4/> [2] <https://www.gnu.org/software/emacs/manual/html_node/elisp/Completion-in-Buffers.html> [3] <https://semadi.tistory.com/41> [4] <https://www.gnu.org/software/emacs/manual/html_node/emacs/Symbol-Completion.html> [5] <https://notmuchmail.org/emacstips/>

#### @user etags 패키지에 대해서 알려줘.

@assistant **\*etags 패키지**

etags는 이맥스에서 사용하는 태그 생성 도구로, 다양한 프로그래밍 언어의 소스 및 헤더 파일에서 심볼 정보를 추출하여 TAGS 파일을 생성합니다. 이 TAGS 파일은 이맥스에서 심볼을 찾아가거나 참조하는 데 사용됩니다.

##### 주요 기능

-   **TAGS 파일 생성**: `etags` 명령어를 사용하여 C, C++, Java, Python 등 여러 언어의 소스 파일에서 심볼 정보를 추출하여 TAGS 파일을 만듭니다.
-   **심볼 탐색**: 이맥스에서 `M-.` 키를 사용하여 TAGS 파일에 등록된 심볼로 이동할 수 있습니다.
-   **다양한 언어 지원**: etags는 20개 이상의 프로그래밍 언어를 지원합니다.

##### 사용법

1.  **TAGS 파일 생성**:
    ```bash
    find . -name "*.[ch]" -print | xargs etags -a
    ```
    또는 이맥스 내에서:
    ```emacs-lisp
    M-x compile RET etags *.c *.h RET
    ```

2.  **심볼 탐색**:
    -   `M-.`: 심볼로 이동
    -   `M-*`: 이전 위치로 돌아가기

etags는 코드 탐색 및 관리에 유용한 도구로, 특히 대규모 프로젝트에서 코드의 구조를 파악하는 데 도움을 줍니다.

Citations: [1] <https://semadi.tistory.com/34> [2] <https://en.wikipedia.org/wiki/Ctags> [3] <https://ftp.gnu.org/old-gnu/Manuals/emacs-lisp-intro/html_node/etags.html> [4] <https://jeongmin.github.io/2017/11/09/emacs/emacs-package/> [5] <https://www.44bits.io/ko/post/managing-emacs-configuration-with-cask>

@assistant xref와 etags를 연동하여 사용하는 이유는 이맥스에서 코드 탐색과 관리를 효율적으로 수행하기 위해서입니다. xref는 이맥스 25 이후 버전에서 도입된 코드 탐색 기능으로, 심볼의 정의나 참조를 쉽게 찾을 수 있도록 해줍니다. etags는 코드의 심볼을 색인화하여 빠르게 탐색할 수 있는 TAGS 파일을 생성하는 도구입니다.

@user xref와 etags를 연동하여 사용하는 이유는?

##### xref와 etags의 연동 이유

1.  **효율적인 코드 탐색**:
    -   **xref**: 이맥스 내에서 코드의 심볼을 쉽게 탐색하고, 정의나 참조를 찾을 수 있는 기능을 제공합니다. xref는 기본적으로 TAGS 파일을 사용하지 않지만, etags와 함께 사용하면 더 강력한 코드 탐색이 가능합니다.
    -   **etags**: TAGS 파일을 생성하여 코드의 심볼을 색인화합니다. 이 파일을 xref와 함께 사용하면 코드의 구조를 빠르게 파악하고, 특정 심볼의 정의나 참조를 쉽게 찾을 수 있습니다.

2.  **대규모 프로젝트 관리**:
    -   대규모 프로젝트에서는 코드의 복잡성이 높아지며, 특정 함수나 변수의 정의를 찾는 것이 어려울 수 있습니다. xref와 etags를 함께 사용하면 이러한 문제를 해결할 수 있습니다.

3.  **유연한 설정**:
    -   xref는 기본적으로 TAGS 파일을 사용하지 않지만, etags와 함께 사용하면 TAGS 파일을 기반으로 코드 탐색을 수행할 수 있습니다. 이는 사용자가 자신의 환경에 맞게 설정할 수 있는 유연성을 제공합니다.

##### 사용 방법

1.  **TAGS 파일 생성**:
    ```bash
    find . -name "*.[ch]" -print | xargs etags -a
    ```
    또는 이맥스 내에서:
    ```emacs-lisp
    M-x compile RET etags *.c *.h RET
    ```

2.  **xref 사용**:
    -   `M-.`: 심볼로 이동
    -   `M-*`: 이전 위치로 돌아가기

3.  **xref와 etags 연동**: xref는 기본적으로 TAGS 파일을 사용하지 않지만, etags가 생성한 TAGS 파일을 xref가 사용하도록 설정할 수 있습니다. 이를 위해서는 이맥스의 설정 파일에서 `xref-backend-functions` 변수를 조정하여 etags의 TAGS 파일을 사용하도록 할 수 있습니다.
    ```emacs-lisp
    (setq xref-backend-functions '(xref-etags-backend))
    ```

이렇게 xref와 etags를 함께 사용하면 코드 탐색과 관리가 더 효율적으로 이루어질 수 있습니다.

Citations:

#### @user
