Emacs Editing Fill Paragraph
단락 자동으로 채우기 ¶M-q는 기본적으로 'fill-paragraph'로 연결(bind)되어 있습니다. Major mode에 따라서 다른 함수로 binding되기도 하지만, 기본적으로는 비슷한 command로 연결됩니다. 예를 들어 C 파일을 편집할 때 쓰는 C major mode에서는 M-q가 'c-fill-paragraph'로 연결됩니다. 하지만 기본적인 idea는 같으니 크게 신경쓰지 않아도 됩니다.
fill-paragraph가 하는 역할은 매우 간단합니다. 현재 point(커서)가 위치한 곳의 이 너무 긴 경우, 자동으로 여러 줄로 바꾸어 줍니다.
예를 들어 보겠습니다. 먼저 tmp.txt를 편집합니다. (C-x C-f tmp.txt<RET>) 그리고 다음과 같이 입력합니다. (아래 입력에서 <EOL>은 실제로 입력한 내용이 아니고 그 위치에서 다음 줄을 입력한다는 표시입니다. 또 [1]는 현재 point, 즉 커서가 위치한 곳을 나타냅니다.)
Valen snarled:<EOL> There's no need to say, devil. I am Tanar'ri and you [*]are Bataazu. There is nothing but death between us.<EOL> 이 때, M-q를 누르게 되면 입력 내용이 다음과 같이 바뀝니다:
Valen snarled: There's no need to say, devil. I am Tanar'ri and you<EOL> [*]are Bataazu. There is nothing but death between us.<EOL> 위와 같이 자동으로 줄을 맞추어 줄 때, 한 줄이 차지할 수 있는 글자의 갯수는 변수 fill-column에 저장되어 있습니다. 기본값으로 70으로 설정되어 있습니다.
`fill-paragraph' 함수는 원래, 현재 단락(paragraph)에서만 동작합니다. 즉, 연속적으로 두 개의 newline 문자로 구분되지 않는 한 (빈 줄이 하나 이상 오지 않는 이상), 하나의 단락으로 봅니다. 만약 위의 예에서, 입력이 다음과 같았다고 가정해 봅시다:
Valen snarled:<EOL> <EOL> There's no need to say, devil. I am Tanar'ri and you [*]are Bataazu. There is nothing but death between us.<EOL> 위의 경우 M-q를 누르면 다음과 같이 변경됩니다:
Valen snarled:<EOL> <EOL> There's no need to say, devil. I am Tanar'ri and you [*]are Bataazu.<EOL> There is nothing but death between us.<EOL> 즉, 첫번째 줄에 있는 "Valen..." 다음에는 두 개의 <EOL>이 있으므로, "Valen..."은 M-q가 작업하는 단락에 포함되지 않습니다.
여기까지는 일반적인 `fill-paragraph' 명령에 대한 것이고, C 코드를 편집할 때 쓰이는 `c-fill-paragraph'에 대해 알아봅시다. 크게 다른 점은 별로 없습니다만, `c-fill-paragraph'는 C나 C++ 코드에서 쓰이는 주석 스타일을 좀 더 잘 처리합니다. (여러분이 신경쓸 것은 없습니다. 왜냐하면 C 언어 코드를 편집할 때에는 자동적으로 M-q가 `c-fill-paragraph'에 연결됩니다.)
아래 코드는 gcc 소스의 일부에서 얻은 것입니다. 편의상 아래 코드에서 <EOL>은 표시하지 않았습니다. 그리고 아래 코드의 주석은 한 줄로 되어 있습니다:
case ZERO_EXTRACT:
/* Note that in some cases those types of expressions are altered by optimize_bit_field, and do not survive to get here. */ if (XEXP (x, 0) == var || (GET_CODE (XEXP (x, 0)) == SUBREG && SUBREG_REG (XEXP (x, 0)) == var)) 위 코드에서 포인트(커서)를 주석 중간에 위치시키고 M-q를 누른 결과입니다:
case ZERO_EXTRACT:
/* Note that in some cases those types of expressions are altered by optimize_bit_field, and do not survive to get here. */ if (XEXP (x, 0) == var || (GET_CODE (XEXP (x, 0)) == SUBREG && SUBREG_REG (XEXP (x, 0)) == var)) 원래 코드가 다음과 같이 되어 있었다고 가정하면 (아래 주석은 두 줄로 되어 있습니다):
case ZERO_EXTRACT:
/* Note that in some cases * those types of expressions are altered by optimize_bit_field, and do not survive to get here. */ if (XEXP (x, 0) == var || (GET_CODE (XEXP (x, 0)) == SUBREG && SUBREG_REG (XEXP (x, 0)) == var)) 이 경우 주석의 중간 부분에서 M-q를 누르면 다음과 같이 바뀝니다:
case ZERO_EXTRACT:
/* Note that in some cases those types of expressions are * altered by optimize_bit_field, and do not survive to get * here. */ if (XEXP (x, 0) == var || (GET_CODE (XEXP (x, 0)) == SUBREG && SUBREG_REG (XEXP (x, 0)) == var)) 즉, 주석을 쓰는 스타일을 그대로 준수하여 단락을 채워줍니다! 신기하죠?
글쓴이는, 실제로 C 코드에 주석을 달 때 M-q를 매우 많이 씁니다. 여러분도 M-q를 잘 활용하시기 바랍니다.
끝 --
![]() |
Might as well be frank, monsieur. It would take a miracle to get you out of Casablanca. |