한글 문장을 입력할 수 있어도 여러 문단이 원래대로 들어가는지는 따로 확인해야 했다. 어떤 편집기는 문자열 안의 줄바꿈을 버리고 어떤 채팅창은 Enter를 전송으로 쓴다. 나는 텍스트와 키의 의미를 입력 화면별로 나눠 다뤘다.

줄바꿈 문자 하나가 항상 같은 동작은 아니다

일반 textarea와 문서 편집기, 채팅 입력창은 Enter의 뜻이 다르다. 원고의 LF 문자를 한 번에 insertText로 넣어도 실제 문단이 만들어지지 않는 편집기가 있다. 반대로 Enter 키를 무작정 보내면 작성 중인 채팅이 전송될 수 있다.

그래서 문자열을 보낼지 네이티브 키로 문단을 만들지 화면의 계약에서 정한다. 모든 사이트에 같은 줄바꿈 방식을 적용하지 않는다. 전송 버튼을 누르는 작업과 텍스트에 줄바꿈을 넣는 작업도 다른 도구와 기대 조건으로 남긴다. 글자가 보인다는 사실과 입력의 의미가 맞다는 사실을 구별해야 했다.

원고를 논리 줄로 나누되 빈 줄을 버리지 않는다

네이티브 편집 경로는 CRLF를 LF로 맞춘 뒤 줄 단위로 나눈다. 첫 줄 이후에는 필요한 Enter 동작을 보내고 비어 있지 않은 줄의 텍스트를 넣는다. 빈 줄에도 줄 경계는 남으므로 단순히 빈 문자열을 필터링해 문단을 합치지 않는다.

이때 키와 텍스트는 네이티브 클릭과 같은 frame session을 사용한다. iframe에 포커스를 맞추고 바깥 세션에 글자를 보내면 다른 곳으로 들어갈 수 있기 때문이다. 현재 실행 세대도 중간마다 확인한다. 여러 줄을 보낸다는 작은 작업 안에도 대상과 수명의 조건이 이어진다. 보이는 문단 사이 CSS 간격도 실제 빈 줄과 다를 수 있어 지정한 채팅 편집기는 논리 문단에서 값을 읽는다.

채팅의 Shift+Enter와 노트북 실행은 다르다

지정한 ChatGPT와 Gemini의 편집 입력에는 nativeLineBreak가 shift-enter로 연결된다. 문단을 만들 때 Shift 수정자를 쓰고 최종 전송은 별도의 요청으로 남긴다. 이것을 모든 contenteditable에 같은 방식으로 적용하는 규칙으로 쓰지는 않는다.

북극성 노트북 화면의 Shift+Enter는 코드 셀 실행 단축키다. 여기서는 한글 조합 중인 이벤트를 제외한다. 같은 키 조합이어도 앱 UI와 웹 입력의 뜻이 다르다. 이 검사를 실제 모든 운영체제 IME 조합을 완전히 재현한 결과라고 확대하지 않는다. 텍스트 전달과 사용자 키 입력의 경계도 구분한다.

부분 입력을 처음부터 다시 보내지 않는다

줄을 나눠 보내다가 중간에 멈추면 앞부분은 이미 들어갔을 수 있다. 같은 원고를 처음부터 다시 넣으면 문단이 두 번 생긴다. 현재 경로는 각 단계의 중단을 확인하고 입력 뒤 실제 값을 읽는다. 늦은 반영을 기다릴 때도 재삽입 대신 읽기만 한다.

특정 문서 편집기의 빈 모듈에만 채우는 제한도 있다. 기존 원고 전체를 Ctrl+A로 덮어쓰는 방식으로 통일하지 않는다. 값이 이미 같을 때와 다른 원고가 들어 있을 때를 구별한다. 편집기를 편하게 다루려다 기존 문서를 지우는 기능으로 바꾸지 않기 위한 조건이다.

전송 키의 시험은 입력 보존도 본다

네이티브 Enter fixture는 실제 검색 결과와 Enter 횟수뿐 아니라 원래 검색어가 그대로 남는지 확인한다. 이미 참인 조건으로 두 번째 Enter를 요청하면 키를 보내지 않는지 본다. 민감 입력은 사용자 인계 조건으로 거절하는 범위도 있다.

이 글은 현재 입력·문단 처리와 노트북 키 코드, 해당 fixture 시험을 읽었다. 실제 계정에 새 메시지를 보내거나 한글 원고를 발행한 검수는 아니다. 특정 입력 계약의 구현과 테스트 코드가 있다는 사실을 모든 편집기의 문단·서식 호환성으로 확대하지 않는다. 새 편집기에는 별도 합성 원고가 필요하다.

문단은 콘텐츠 구조이자 실행 계약이다

고객이 작성한 빈 줄과 문단은 읽기 리듬과 의미를 만든다. 자동화 편의를 위해 공백을 모두 지우고 한 줄로 만들면 글은 들어가도 원고는 달라진다. 나는 입력 도구가 원고의 구조를 어디까지 보존하는지 설명해야 한다고 본다.

한글이 된다는 말도 글자 입력·조합 중 단축키·문단·전송·저장으로 나누면 더 정확해진다. 각 단계의 규칙을 확인하고 실제 값과 결과를 대조한다. 이 구분이 있어야 같은 Enter를 써도 언제 줄을 바꾸고 언제 요청을 보내는지 에이전트가 정확히 다룰 수 있다.