BIBLIOGRAPHY

History

  • [2025-04-15 Tue 17:40] 테스트 케이스 추가. 그리고 휴고 내보내기와 연동해야 한다.
  • [2025-04-16 Wed 18:06] 매우 중요하다. 공백문자 사랑한다.
       abc입니다.
       =한글=입니다.
       *dd*입니다
       =한글=입니다
       _한글_이에요
       +ㅇㅇ+한글
     
     
    통령이
    대통령이 입니다ㅁ.
    대통령가 입니다.
    대통령은 입니다.
    대통령을 입니다.
    대통렬를 입니다.
     
       abc입니다.
       =한글=입니다.
       *dd*입니다
       =한글=입니다
       _한글_이에요
       +ㅇㅇ+한글
     
       대통령이 입니다
    abc한글
    =테스트=입니다
    *중요*내용
    학교에서 공부합니다
    강으로 흐르다
    친구와 이야기

|2025-04-15 Tue 17:40|

@user 조직모드 버퍼에서 영어 알파벳 또는 ’*’, ’=’, ’_’, ’+’ 뒤에 한글 유니코드(가-힣)이 있을 경우, 사이에 ”을 넣어주는 이맥스 리스프 코드를 만들어줘.

심볼정보 character: (displayed as ) (codepoint 160, #o240, #xa0) charset: unicode (Unicode (ISO10646)) code point in charset: 0xA0

@assistant 다음은 조직모드 버퍼에서 영어 알파벳 또는 ’*’, ’=’, ’_’, ’+’ 뒤에 한글 유니코드(가-힣)가 있을 경우, 사이에 ”을 넣어주는 이맥스 리스프 코드입니다:

(defun insert-nbsp-between-latin-and-hangul ()
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward "$[A-Za-z*+=_]+$$$$[가-힣]$$$" nil t)
      (goto-char (match-beginning 2))
      (insert (progn (string-to-char "")))  ; Non-breaking space
      (goto-char (match-end 2)))))
 
(add-hook 'org-mode-hook
          (lambda ()
            (add-hook 'after-change-functions #'insert-nbsp-between-latin-and-hangul nil t)))

이 코드는 조직모드 버퍼에서 변경이 있을 때마다 실행되며, 영어 알파벳 또는 ’*’, ’=’, ’_’, ’+’ 뒤에 한글이 있을 경우 사이에 ”을 삽입합니다.

@user [A-Za-z*+=_]이 조건 바로 앞에 공백이면 안되는 조건을 추가해줘. 영어, 한글, 기호 뭐든 들어가 있어야 해.

@assistant 다음은 조건을 수정한 이맥스 리스프 코드입니다:

(defun insert-nbsp-between-latin-and-hangul ()
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward "$[A-Za-z*+=_]+$$$$[가-힣]$$$" nil t)
      (when (not (string-match-p "\\s-" (match-string 1)))
        (goto-char (match-beginning 2))
        (insert (progn (string-to-char "")))  ; Non-breaking space
        (goto-char (match-end 2))))))
 
(add-hook 'org-mode-hook
          (lambda ()
            (add-hook 'after-change-functions #'insert-nbsp-between-latin-and-hangul nil t)))

이 코드는 영어 알파벳 또는 ’*’, ’=’, ’_’, ’+’ 뒤에 한글이 있을 때, 그 앞에 공백이 없고 다른 문자가 있을 경우에만 ”을 삽입합니다.

@user 이 경우에는 공백문자가 들어가지 않거든

한글입니다. 한글입니다 한글이에요

다시 조건을 말하자면, [A-Za-z*+=_가-힣][가-힣] 일 경우에 [가-힣] 앞에 공백문자를 넣어줘

@assistant 아, 이해했습니다. 더 간단하게 조건을 정리해서 다시 작성해드리겠습니다. 요구사항은 다음과 같습니다:

  1. 영어 알파벳(A-Za-z) 또는 특수문자(*+=_) 바로 뒤에 한글(가-힣)이 오는 경우
  2. 단, 앞에 공백이 없어야 함
  3. 그리고 해당 문자들 사이에 공백 문자()를 삽입

다음은 간결하게 수정한 코드입니다:

(defun insert-nbsp-between-latin-and-hangul ()
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward "$[A-Za-z*+=_]$$[가-힣]$" nil t)
      (unless (save-excursion
                (goto-char (match-beginning 1))
                (looking-back "\\s-" 1))
        (goto-char (match-beginning 2))
        (insert "")
        (goto-char (match-end 2)))))
 
(add-hook 'org-mode-hook
          (lambda ()
            (add-hook 'after-change-functions #'insert-nbsp-between-latin-and-hangul nil t)))

이 코드는:

  1. [A-Za-z*+=_] 바로 뒤에 [가-힣]이 오는 패턴을 찾습니다
  2. looking-back으로 앞에 공백이 없는지 확인합니다
  3. 조건이 맞으면 한글 앞에 공백 문자()를 삽입합니다

더 간단하면서도 =, _ 등 모든 특수문자에 대해 동일하게 작동합니다.

@user 좋아. 잘 동작한다. org-mode-hook으로 after-change-functions 넣으면 오버헤드가 크지 않나? 매번 저장할 때 마다 버퍼를 다 찾으니까?

@assistant 네, 맞습니다. after-change-functions를 사용하면 모든 변경 사항마다 전체 버퍼를 검색하므로 성능 저하가 발생할 수 있습니다. 특히 대용량 버퍼에서는 더욱 그렇죠.

더 효율적인 방법으로 다음과 같은 접근 방식을 고려해볼 수 있습니다:

  1. before-save-hook 사용: 파일 저장 직전에 한 번만 처리
  2. 변경된 영역만 처리: after-change-functions를 사용하되, 변경된 영역 주변만 검사
  3. 비활성화 가능하게 만들기: 필요할 때만 수동으로 실행할 수 있도록

가장 추천하는 방법은 before-save-hook을 사용하는 것입니다:

(defun insert-nbsp-between-latin-and-hangul ()
  (interactive)
  (save-excursion
    (save-restriction
      (widen)
      (goto-char (point-min))
      (while (re-search-forward "$[A-Za-z*+=_]$$[가-힣]$" nil t)
        (unless (save-excursion
                  (goto-char (match-beginning 1))
                  (looking-back "\\s-" 1))
          (goto-char (match-beginning 2))
          (insert "")
          (goto-char (match-end 2)))))))
 
(add-hook 'org-mode-hook
          (lambda ()
            (add-hook 'before-save-hook #'insert-nbsp-between-latin-and-hangul nil t)))

성능을 더 최적화하려면 변경된 영역만 처리하는 버전도 고려할 수 있습니다:

(defun insert-nbsp-between-latin-and-hangul (&optional beg end _)
  (interactive)
  (save-excursion
    (save-restriction
      (when (and beg end)
        (narrow-to-region (max (point-min) (- beg 10))  ; 앞쪽 여유 공간
                         (min (point-max) (+ end 10)))) ; 뒤쪽 여유 공간
      (goto-char (point-min))
      (while (re-search-forward "$[A-Za-z*+=_]$$[가-힣]$" nil t)
        (unless (save-excursion
                  (goto-char (match-beginning 1))
                  (looking-back "\\s-" 1))
          (goto-char (match-beginning 2))
          (insert "")
          (goto-char (match-end 2)))))))
 
(add-hook 'org-mode-hook
          (lambda ()
            (add-hook 'after-change-functions #'insert-nbsp-between-latin-and-hangul nil t)))

어떤 방식이 더 적합한지는 사용 패턴에 따라 다르겠지만, 일반적으로 before-save-hook을 사용하는 것이 가장 무난한 선택입니다.

@user