Emacs Lisp으로 줄 끝에 문자열 추가하기

Emacs, Emacs Lisp // 2025년 09월 05일 작성

Emacs와 같은 이상한(?) 편집기는 마음껏 자동화가 가능하다는 특징이 있다. 이번에도 개인적인 용도로 '현재 커서가 위치하고 있는 줄 끝에 어떤 문자열을 덧붙이는 기능'을 만들어 보고 있었다. 그런데 뭔가 원하는 대로 붙지 않는 문제가 있었다.

시도

생각했던 코드는 (실제로는 좀 복잡했지만 필요한 것만 간추리자면) 현재 커서가 위치하고 있는 줄 끝에 'foo'라는 문자열을 덧붙이는 것으로 아래와 같은 식이다.

(goto-char (end-of-line))
(insert " foo")

이 코드를 아래와 같은 줄에다 놓고 시험해 보았다.

sample line

예상 대로라면 줄 끝에 ' foo'가 붙어야 하는데 실제로는 아래와 같이 동작하였다.

sample lin fooe

그러니까 줄 끝에 붙는게 아니라 줄의 마지막에 있는 문자 위치에 문자열을 삽입해 버린 것이다. 그래서 원래 줄 끝에 있던 문자가 가장 마지막으로 밀려나는 어이없는 상황이 되어버렸다.

이건 의도와는 다르다. 뭐가 문제일까?

해답

해답은 생각보다 간단했다. end-of-line은 개행문자 바로 앞의 위치를 돌려주는 함수이기 때문이다. 그래서 동작이 의도한 대로 되지 않았던 것 뿐이다.

이럴 때는 line-end-position 함수가 용도에 맞다는 것을 알게 되었다. 그래서 위에서 시도했던 코드를 아래와 같이 바꾸어 보았다.

(goto-char (line-end-position))
(insert " foo")

위 코드를 같은 예제에서 실행시켜 보니 아래와 같이 의도했던 모양으로 동작하는 것을 확인할 수 있었다.

sample line foo

여담

간단한 내용이지만 잘 활용하면 몇몇 일을 자동화 할 수 있다. 예를 들어 코드 내에서 정규표현식으로 어떤 줄을 찾아서 거기에 문자열을 붙이는 등의 경우라면 이런 식으로 쓸 수도 있다.

(goto-char (point-min))
(re-search-forward "PATTERN" nil t)
(goto-char (line-end-position))
(insert " foo")

그 외에 현재 커서가 있는 문자열의 끝이 아니라 버퍼의 끝에 문자열을 붙이고 싶다면 line-end-position 함수 대신 point-max 함수를 사용하면 가능하다.

이렇게 또 새로운 지식을 하나 알아간다.

Seorenn (Konrad Seo)
개발자 주제에 경제나 먹거리 관련 글을 주로 쓰는 사람