현재의 티스토리 에디터는 직접 markdown 편집도 지원을 하고 있지만, 구 버전의 편집기 사용시에 다음과 같은 markdown 소스를 작성하여 HTML 변환을 한 후 티스토리 소스에 붙여넣을 경우,


## 제목1
본문

## 제목2
- 리스트1
- 리스트2

본문

## 제목2
본문

- 리스트1
- 리스트2


아래와 같이 깔끔하지 않게 나오지 않는 경우가 있는데, (특히, 단락 앞뒤에 공백 옵션을 사용하지 않았을 경우. 적용되는 스킨의 CSS에 따라 차이는 있을 수 있음.)


제목1

본문

제목2

  • 리스트1
  • 리스트2

본문

제목2

본문

  • 리스트1
  • 리스트2


이 변환기를 사용할 경우, 다음과 같이 추가적인 줄바꿈을 넣어줘서,


## 제목1
<p><br></p>
본문
 
<p><br></p>
<p><br></p>
## 제목2
- 리스트1
- 리스트2
 
본문
 
<p><br></p>
<p><br></p>
## 제목2
<p><br></p>
본문
 
- 리스트1
- 리스트2


HTML 변환후에, 아래 결과와 같이 보기좋게(?) 표시될 수 있게합니다.


제목1


본문



제목2

  • 리스트1
  • 리스트2

본문



제목2


본문

  • 리스트1
  • 리스트2


변환기 소스


md_convert.py:

# -*- coding: utf-8 -*-
#!/usr/bin/python

import sys

DOUBLE_BR_BEFORE_HEADER = True

STATUS_START = 0
STATUS_NONE = 1
STATUS_LIST = 2
STATUS_PRE = 3
STATUS_HEADER = 4

LINE_BR = "<p><br></p>\n"

def print_usage():
    print("usage: python md_convert.py [option]")
    print("Options:")
    print("-i input-file : 지정된 입력 파일을 사용하여 변환을 하고 입력 파일을 덮어씁니다.")
    print("-i input-file output-file : 지정된 입력 파일과 출력 파일을 사용하여 변환을 합니다.")

def is_ol_item(str):
    pos = str.find(". ")
    if pos == -1:
        return False
    return str[:pos].isdigit()

def go_convert(config):
    filename_in = config["filename_in"]
    filename_out = config["filename_in"]
    if "filename_out" in config:
        filename_out = config["filename_out"]

    print("\nconverting %s.." % filename_in)

    file_in = open(filename_in, 'r', encoding = "utf-8")

    all_line = []
    for line in file_in:
        all_line.append(line)
    file_in.close()

    all_line_new = []
    insidePre = False
    status = STATUS_START
    status_old = status

    for line in all_line:
        status_old = status

        line_strip = line.lstrip()
        if len(line_strip) > 0:
            if insidePre:
                if line_strip[:5] == "</pre":
                    insidePre = False
            else:
                if line_strip[:4] == "<pre":
                    insidePre = True
                    status = STATUS_PRE
                elif line_strip[:1] == "-" or is_ol_item(line_strip):
                    status = STATUS_LIST
                elif line_strip[:1] == "#":
                    status = STATUS_HEADER
                else:
                    status = STATUS_NONE
                    
            if DOUBLE_BR_BEFORE_HEADER and status == STATUS_HEADER and status_old != STATUS_START:
                all_line_new.append(LINE_BR)
                
            if status_old == STATUS_NONE:
                if status == STATUS_HEADER:
                    all_line_new.append(LINE_BR)
            elif status_old == STATUS_HEADER:
                if status == STATUS_NONE:
                    all_line_new.append(LINE_BR)
                if status == STATUS_HEADER:
                    all_line_new.append(LINE_BR)
        all_line_new.append(line)

    file_out = open(filename_out, 'w', encoding = "utf-8")
    for line in all_line_new:
        file_out.write(line)
    file_out.close()

    print("end")

config = {}

if len(sys.argv) >= 2:
    if sys.argv[1] == "-i":
        if len(sys.argv) == 3:
            config['filename_in'] = sys.argv[2]
            go_convert(config)
        else:
            config['filename_in'] = sys.argv[2]
            config['filename_out'] = sys.argv[3]
            go_convert(config)
    else:
        print_usage()
else:
    print_usage()






사용 방법


사용 방법: python md_convert.py [옵션]
옵션:
-i input-file             : 지정된 입력 파일을 사용하여 변환을 하고 입력 파일을 덮어씁니다.
-i input-file output-file : 지정된 입력 파일과 출력 파일을 사용하여 변환을 합니다.


PS1. pre 태그 내에서 소스 코드에 html 관련 코드를 사용할 경우, 충돌이 나서 (특히 pre 태그 관련, 당연한가?) 소스내 모든 <와 >를 &lt;와 &gt;로 바꿔줄 수 밖에 없었습니다.
PS2. 추가 작업 후보 : 소스 md에 줄바꿈이 있을 때만 추가적인 줄바꿈 삽입
,

간단 비교


Setq

Setf

더 적은 용도

더 넓은 용도

Setq를 사용한 모든 곳에 Setf를 사용할 수 있다. 하지만 반대는 안된다.

Low level

High level

Setf는 Setq를 사용하여 구현되어 있다.



결론


특별한 이유가 없으면 Setf를 쓰면 된다!!

,

emacsclient를 통해서 이막수군을 실행하다보면 다음과 같은 메세지창이 뜨는 경우가 있다.

대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다.

이는 이전 실행시에 비정상 종료가 되어 서버 파일이 남아있어서 발생하는데 여기서 확인을 누르고 들어가면 Emacs 내부에서 다시 다음과 같은 메세지를 볼 수 있는데

Warning: desktop file appears to be in use by PID ***. Using it may cause conflicts. Use it anyway? (y or n)

여기서 y를 누르면 대부분의 경우 정상동작으로 복귀되지만 가끔씩 복원되지 않는 경우도 있다. 이 경우 emacsclient를 통해 파일을 열 경우 기존의 창을 사용하지 않고 계속해서 새 창이 생성되게 된다.


해결책은 <사용자 폴더>/AppData/Roaming/.emacs.d/server 밑에 있는 server 파일을 삭제하면 된다.


<테스트 환경>
- OS : Windows 7
- Emacs 버전 : Emacs 24.3 윈도우


,
;; 1) 외부에서 파일이 수정되었을 때 자동으로 다시 읽어들이도록 하는 설정
(global-auto-revert-mode t)

;; 2) <f5>키에 수동으로 파일을 다시 읽어들이는 기능을 설정 (1번 설정을 하지 않았을 경우 사용)
(global-set-key (kbd "<f5>") 'revert-buffer)

;; 3) 탭 문자 대신 스페이스 문자를 사용. 스페이스 사이즈는 4로 함.
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)

;; 4) <f5>키에 선택한 블럭에 대해 탭 문자를 스페이스로 바꾸는 기능을 설정
(global-set-key (kbd "<f5>") 'untabify)

;; 5) <f5>키에 탭 문자의 사이즈를 4<->8로 토글하는 기능을 설정 (탭 문자 사용시)
(global-set-key (kbd "<f5>") 'tf-toggle-tab-width-setting) ; ' "fix" highlighting
(defun tf-toggle-tab-width-setting ()
    (interactive)
    (setq tab-width (if (= tab-width 8) 4 8))
    (message (number-to-string tab-width))
    (redraw-display))

;; 6) <f5>키에 이전 버퍼로 전환(C-x 왼쪽) 기능을 설정
(global-set-key (kbd "<f5>") 'previous-buffer)

;; 7) <f6>키에 다음 버퍼로 전환(C-x 오른쪽) 기능을 설정
(global-set-key (kbd "<f6>") 'next-buffer)

;; 8) <f5>키에 다른 창으로 전환(C-x o) 기능을 설정
(global-set-key (kbd "<f5>") 'other-window)

;; 9) Alt + 화살표 키를 사용하여 다른 창으로 이동하도록 설정
(windmove-default-keybindings 'meta)

;; 10) 세션 저장하도록 설정
(desktop-save-mode 1)

;; 11) 버퍼 리스트(C-x C-b)에서 버퍼 선택시 같은 창에서 열리도록 설정
(global-set-key "\C-x\C-b" 'buffer-menu)

;; 12) 버퍼 선택(C-x b)시에 가로로 버퍼 리스트를 표시하며 좌우 커서로 스크롤하여 선택가능하게 한다.
;; 파일 선택(C-x f) 모드에서는 폴더내 모든 파일(열지 않았더라도) 사이에서 스크롤하여 선택할 수 있다.
(ido-mode)

;; 13) C-x C-u 시 확인창 안 뜨게 설정
(put 'upcase-region 'disabled nil)

;; 14) C-x C-l 시 확인창 안 뜨게 설정
(put 'downcase-region 'disabled nil)

* <f5> 등 펑션키는 겹쳐지지 않게 적당한 값으로 조정하여 사용한다.


<테스트 환경>
- OS : Windows 7
- Emacs 버전 : Emacs 24.3 윈도우
,
format 명령을 사용하면 된다. (Vista 이후 사용 가능)
format <드라이브 문자>: /p:<횟수>

디스크의 모든 섹터에 대해 처음에는 0으로, 그 후에는 랜덤한 값으로 p옵션 뒤에 지정한 횟수만큼 덮어쓰게 된다.

,