BIBLIOGRAPHY
Related Notes
- #노트테이킹, #유니코드: § † ‡ № ¶ ↔ → ∉ ⊢ 기호 파일명
- #한글 #조직모드: #휴고 #내보내기 #공백문자 제거 방법
- #조직모드: 한국어 조사 공백문자 삽입 - 코드 통합
History
- 테스트 케이스 추가. 그리고 휴고 내보내기와 연동해야 한다.
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 아, 이해했습니다. 더 간단하게 조건을 정리해서 다시 작성해드리겠습니다. 요구사항은 다음과 같습니다:
- 영어 알파벳(A-Za-z) 또는 특수문자(*+=_) 바로 뒤에 한글(가-힣)이 오는 경우
- 단, 앞에 공백이 없어야 함
- 그리고 해당 문자들 사이에 공백 문자()를 삽입
다음은 간결하게 수정한 코드입니다:
(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)))
이 코드는:
[A-Za-z*+=_]
바로 뒤에[가-힣]
이 오는 패턴을 찾습니다looking-back
으로 앞에 공백이 없는지 확인합니다- 조건이 맞으면 한글 앞에 공백 문자()를 삽입합니다
더 간단하면서도 =, _ 등 모든 특수문자에 대해 동일하게 작동합니다.
@user 좋아. 잘 동작한다. org-mode-hook으로 after-change-functions 넣으면 오버헤드가 크지 않나? 매번 저장할 때 마다 버퍼를 다 찾으니까?
@assistant 네, 맞습니다. after-change-functions
를 사용하면 모든 변경 사항마다 전체 버퍼를 검색하므로 성능 저하가 발생할 수 있습니다. 특히 대용량 버퍼에서는 더욱 그렇죠.
더 효율적인 방법으로 다음과 같은 접근 방식을 고려해볼 수 있습니다:
before-save-hook
사용: 파일 저장 직전에 한 번만 처리- 변경된 영역만 처리:
after-change-functions
를 사용하되, 변경된 영역 주변만 검사 - 비활성화 가능하게 만들기: 필요할 때만 수동으로 실행할 수 있도록
가장 추천하는 방법은 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