vim의 Ex mode실행으로 2html 실행할 때 터미널 문제가...

raymundo의 이미지

vim6.3.82를 쓰는 서버에서 7.0.237을 쓰는 서버로 옮겨왔는데 말이죠..

vim 으로 예를 들어 다음의 Perl 소스코드 파일을 연 다음에,

#!/usr/bin/perl
if ($condition) {
    print "Hello, World!\n";
}

이 소스를 syntax highlighting된 형태의 html 문서로 만들고 싶어서

:ru! syntax/2html.vim

하면 아래와 같은 html파일이 생성됩니다.

<html>
<head>
<title>~/temp/test.pl.html</title>
<meta name="Generator" content="Vim/7.0">
<meta http-equiv="content-type" content="text/html; charset=EUC-KR">
</head>
<body bgcolor="#ffffff" text="#000000">
<pre>
<font color="#ff40ff">#!/usr/bin/perl</font>
<font color="#ffff00">if</font> (<font color="#00ffff">$condition</font>) {
    <font color="#ffff00">print</font> <font color="#ff6060">&quot;</font><font color="#ff6060">Hello, World!</font><font color="#ff40ff">\n</font><font color="#ff6060">&quot;</font>;
}
</pre>
</body>
</html>

그런데, 이걸 수작업이 아니라 한번에 일괄작업을 하기 위해서 다음과 같이 실행하면

vim -T xterm -e -s ./test.pl +"set enc=UTF-8" +"syntax on" +"set syntax=perl" +"ru! syntax/2html.vim" +"wq! test.html" +q

test.pl 파일을 열어서 2html 작업을 하고 test.html 파일로 결과를 저장하고 끝내는 배치 작업을 수행을 잘 하는데.. 저장된 html 파일을 열어보면

<html>
<head>
<title>~/temp/test.pl.html</title>
<meta name="Generator" content="Vim/7.0">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body bgcolor="#ffffff" text="#000000">
<pre>
<font color="#c000c0"><u>#!/usr/bin/perl</u></font>
<font color="#008080"><b>if</b></font> (<font color="#804000"><u>$condition</u></font>) {
    <font color="#008080"><b>print</b></font> <font color="#0000c0"><u>&quot;</u></font><font color="#0000c0"><u>Hello, World!</u></font><font color="#c000c0"><b>\n</b></font><font color="#0000c0"><u>&quot;</u></font>;
}
</pre>
</body>
</html>

이렇게 나옵니다. 비슷해 보이는데 각 font태그의 color값이 달라요... 게다가 u 태그가 곳곳에 끼어 있어서 거의 모든 부분에 밑줄이 그어져 나옵니다...

수작업으로 할 때도 :set term 해보면 터미널은 xterm으로 나옵니다. 동일한 xterm에서 출력을 하는데 왜 수작업으로 할 때와 ex모드로 일괄 작업을 할 때 html출력이 달라지는지 모르겠습니다. 6.3.82에서는 똑같이 나왔거든요?? -_-;;;;

"-T xterm" 옵션을 없애봐도 마찬가지..

일괄 작업할 때 "set term=xterm"을 추가해도 마찬가지..

사실 저 일괄작업 코드는 모니위키의 vim 플러그인을 보고 따라서 한 건데.. 모니위키 쓰시는 분 중에 vim7.0이 있는 서버에서 쓰면 같은 문제를 겪는 분은 안 계시려나 모르겠네요..

도대체 뭐가 문제일까요??

wkpark의 이미지

네 엉망으로 나오지요?ㅋ

이것때문에 몇달 전에 삽질했었는데, 결론은...

vim7.1 이상일때, vim을 명령행으로 실행하면 터미널의 컬러값을 이상하게 설정해버려서, 2html이 제대로 작동하지 않는다는 결론을 내렸습니다. Win32에서 실행결과와 Linux에서 실행결과조차 다릅니다.

해결방법은 2html.vim 파일의 색상테이블을 임의로 바꿔버리는 겁니다. vim7.1의 버그가 고쳐지지 않는 이상
임시로 2html.vim의 색상테이블을 고치는 수 밖에 없습니다.
(vim 저자에게 두번이나 자세히 버그리포팅 했는데 문제 없다고 무시함.)

고친 2html.vim: http://chem.skku.ac.kr/~wkpark/2html.vim

문제: http://chem.skku.ac.kr/~wkpark/main/VimTestOrig

고친 후: http://chem.skku.ac.kr/~wkpark/main/VimTest

모니위키 cvs를 쓰신다면 data 디렉토리 밑으로 2html.vim을 다운로드 받아서 넣으신 후에.. config.php에...

$vim_2html=realpath($data_dir).'/2html.vim';

cvs버전이 아니라면 vim 실행옵션을 조정하시거나 기존 2html.vim 덮어쓴다.

주의: 2html.vim파일을 덮어써서 교체해버리면 vim상에서 ":"프롬프트로 직접실행하는 경우에 제대로 된 실행 결과가 안나옵니다. 명령행에서만 실행결과가 제대로 나옵니다.

온갖 참된 삶은 만남이다 --Martin Buber

raymundo의 이미지

그렇잖아도 'vim7.*의 문제라면 틀림없이 모니위키 쪽에서도 문제가 되어서 박원규님이 미리 해결해두셨을 법 한데...'하고 생각하고 있었는데 ^^;;;;

vim저자가 무시했다니 거 참 희한하군요 -_-;

일단 링크해주신 2html.vim 을 받아서 해봤는데, 전에 것은 pre 태그를 집어넣던데 이건 아니더군요. 그래서 적당히 "let html_no_pre=1"라는 줄을 주석처리했더니 그건 해결된 듯 하고요.

말씀하신 "색상테이블을 고치는" 것이... 각각의 색을 다 일일이 바꿔줘야 하는 건가요? 그게 아니라면 조금만 밝게(?) 고치고픈데, vim 신택스 파일 같은 건 생전 처음 만져보는터라...;;; 조금만 더 도움받고자 합니다ㅠ,.ㅠ

이전 출력과 현재 출력 비교: http://gypark.pe.kr/wiki/VimPluginTest

좋은 하루 되세요!

wkpark의 이미지

vim7.x의 문제 맞구요. (터미널의 색상 개수를 잘못 설정하는 문제)

터미널 색상개수는 t_Co라는 변수값에 저장되는데, 그냥 vim상태에서는 t_Co=8이 나옵니다.
(vim 상태에서 혹은 Vim -E 실행상태에서 :set t_Co 해보면 값이 나옵니다)

명령모드에서는 다음과 같이 해보면 값이 나오는데

vim -E -s +"exe \"normal! a\" &t_Co" +"wq! /dev/stdout" +'qall'

vim6.x에서는 8이나 16이 나오는것이.. vim7.1에서는 그 값이 아예 안나옵니다.

색상값은 2html.vim 파일을 잘 보시면 그냥 ##aabbcc 형식이라 고치는데는 어려움이 없으실겁니다. 원하는 색을 얻으려면 여러번 고치셔야...ㅋ

온갖 참된 삶은 만남이다 --Martin Buber

raymundo의 이미지

음.. 결국 일일이 색코드를 고쳐야 하는 거군요... 그냥 지금처럼 구버전 vim따로 설치해서 쓰렵니다.. 미술은 체질이 아니라서 OTL

좋은 하루 되세요!

raymundo의 이미지

vim.org 에서 vim63 을 받아서 계정 아래에 설치하고는 그걸 사용하도록 홈페이지를 고쳐버렸습니다 -_-; 일단은 잘 되는 듯...

좋은 하루 되세요!

bushi의 이미지

ex mode 가 문제가 아니라 silent mode 에 문제가 있거나 정책이 바뀐 것 같습니다.

windows 는 터미널 개념 자체가 unix 와는 전혀 다르니 상관없는 것 같고요.

트릭이긴 하지만,
-s 옵션을 주지 않고  > /dev/null 를 붙이면 동작하는군요.

[bushi@rose net]$ 
[bushi@rose net]$ vim -E +"exe \"normal! a\" &t_Co" +"wq! /proc/self/fd/0" +'qall' > /dev/null
 16
[bushi@rose net]$ 
[bushi@rose net]$ vim -E -s +"exe \"normal! a\" &t_Co" +"wq! /proc/self/fd/0" +'qall' > /dev/null
 
[bushi@rose net]$ 

덧:

실제로 터미널이 없는 상황에서도 동작하는 지 알아보기 위해 at 에 등록해서 실행시켜봤습니다.
-s 옵션을 줬을 때와 마찬가지더군요.

bushi@rose net]$ 
[bushi@rose net]$ cat test_job 
/usr/bin/vim -e /home/bushi/net/test.pl +"set enc=UTF-8" +"set syntax=perl" +"syntax on" +"ru! syntax/2html.vim" +"wq! test.html" +q > /dev/null 2>/tmp/err.log
[bushi@rose net]$ date
2008. 08. 27. (수) 01:12:18 KST
[bushi@rose net]$ at -f `pwd`/test_job "now + 1 minutes"
job 4 at Wed Aug 27 01:13:00 2008
[bushi@rose net]$ date
2008. 08. 27. (수) 01:13:05 KST
[bushi@rose net]$ cat /tmp/err.log
[bushi@rose net]$ cat test.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>~/net/test.pl.html</title>
<meta name="Generator" content="Vim/7.1">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body bgcolor="#ffffff" text="#000000"><font face="monospace">
<font color="#c000c0"><u>#!/usr/bin/perl</u></font><br>
<font color="#008080"><b>if</b></font>&nbsp;(<font color="#804000"><u>$condition</u></font>) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080"><b>print</b></font>&nbsp;<font color="#0000c0"><u>&quot;</u></font><font color="#0000c0"><u>Hello, World!</u></font><font color="#c000c0"><b>\n</b></font><font color="#0000c0"><u>&quot;</u></font>;<br>
}<br>
</font></body>
</html>
[bushi@rose net]$ 

'터미널이 없는 상황' 에서 일관되게 이렇게 동작하는 것을 보면 버그라기 보단 정책 같습니다.

정책의 변화가 맞다면, 오히려 bold, underline 등의 기본적인 syntax 가 작동하는 것이 버그겠죠.
2html.vim 이 적용되기 이전에 이미 syntax 가 잘못되어 있기 때문에
2html.vim 의 수정으론 해결이 안 될 것 같은데요 ?

OTL

dg의 이미지

음... 저는 vim 7.1 사용하는데.. 제가 해봐도 그렇군요..
근데 :ru! syntax/2html.vim 대신에 :TOhtml 을 사용하니까 수작업으로 할때랑 똑같이 나오네요..

vim -c 'TOhtml' -c 'w test.html' -c 'qa!' test.pl
raymundo의 이미지

이제 보니 문제의 원인이... -e 가 아니라 순전히 -s 때문이 아닌가 싶습니다.

일단 dg님 글에 대한 얘길 하면... 제가 알기로는 2html.vim 이 먼저 나오고, TOhtml 플러그인은 좀 나중 버전에 나와서, 직접 2html.vim을 호출하는(so나 ru로) 건 되는데 TOhtml 명령은 인식을 못하던 vim 버전이 있었던 걸로 압니다. (몇년전 기억이라 확실치는 않지만) 제 첫 글에서 적은 코드도 그래서 TOhtml 대신 ru를 썼던 건데...

어쨌거나, "아니 TOhtml로 부른 것과 ru로 부른 것이 다르단 말인가, dg님이 쓴 코드에는 -e 옵션이 빠져 있는데 그것 때문이 아니었을까"하면서 테스트를 해 봤습니다.

(공통으로 들어가는 +"set enc=UTF-8" +"syntax on" +"set syntax=perl" 부분은 생략)

vim -T xterm -e -s ./test.pl +"ru! syntax/2html.vim" +"wq! test.html" +q
  ==> 이게 첫 글에 있던 것.. 이상하게 출력됨
 
vim -T xterm -e -s ./test.pl +"TOhtml"               +"wq! test.html" +q
  ==> ru 대신 TOhtml 사용. 이 경우는 아예 전혀 html변환이 안 됨 -_-?
 
vim -T xterm -e    ./test.pl +"TOhtml"               +"wq! test.html" +q
  ==> -s 옵션을 제거. 수작업과 동일하게 나옴
 
vim -T xterm -e    ./test.pl +"ru! syntax/2html.vim" +"wq! test.html" +q
  ==> 다시 TOhtml 대신 ru를 사용. 역시 제대로 나옴
 
(이하, -e 옵션까지 제거하고 다시 반복.. 전부 제대로 나옴)

즉 -s (silence) 옵션을 빼면 다 잘 되더라는 거죠... (위에 박원규님이 t_Co 값 출력을 하는 예에서는 -s 옵션을 빼도 여전히 출력이 안 되더군요.. 그걸 보면 -e도 꼭 그렇지만도 않다는 얘기 같긴 한데)

"-e -s" 옵션을 같이 주면, 표준출력으로 아무것도 내보내지 않으니까, CGI 프로그램 상에서 호출하기에 좋았는데... 없애면 문제가 되려나요? 어차피 표준출력을 저장해서 처리하는 건 아니고 html파일로 저장한 결과를 다시 읽어서 처리하니까 눈으로 보기에는 별 문제 없어보입니다만...

좋은 하루 되세요!

raymundo의 이미지

위의 테스트는 전부 다 putty로 로그인해서 쉘에서 직접 한 거였고...

정작 위키 내에서 적용했을 때는 -s 만 뺀 걸로는 효과가 없고 -e 까지 없애줘야만 하더군요. -_-;;;

진짜 알다가도 모르겠습니다.

---

게다가, -e -s 를 다 빼고 했더니만... 역시나 표준 출력이 나와버려서 그런지 웹브라우저로 CGI를 실행하면 한창 버벅대더만 Server Error를 내어버리는군요 ㅠ,.ㅠ (vim 실행 직전에 표준 출력과 표준 에러를 파일로 내보내게 돌려놨는데도...)

결국은 모든 게 원점으로 돌아갔습니다. 아 한시간 반 동안 콘솔에서 이래저래 해보고 신난다고 적용했는데 OTL

좋은 하루 되세요!

wkpark의 이미지

bushi님의 말씀을 보고 확인해보니, 6.3까지 정상적으로 작동하다가 6.4부터 silent_mode를 사용하면 문제가 발생하는군요.

term.c에서 보면 set_termname()에서 set_color_count()를 호출하는데 7.x에서는 set_color_count()를 silent mode에서 호출하지 않고, 6.4이후로는 main.c에서 set_termname()을 호출하는 termcapinit()을 호출하지 않네요.

이 두 파일을 고치면 6.3처럼 syntax/2html.vim이 정상 작동하게 됩니다.

버그보고 다시해봐야겠네요

--- term.c.orig 2008-08-29 07:45:42.000000000 +0900
+++ term.c      2008-08-29 07:46:09.000000000 +0900
@@ -1604,10 +1604,6 @@
     char_u     *error_msg = NULL;
     char_u     *bs_p, *del_p;
 
-    /* In silect mode (ex -s) we don't use the 'term' option. */
-    if (silent_mode)
-       return OK;
-
     detected_8bit = FALSE;             /* reset 8-bit detection */
 
     if (term_is_builtin(term))
--- main.c.orig 2008-08-29 07:44:57.000000000 +0900
+++ main.c      2008-08-29 07:47:05.000000000 +0900
@@ -509,7 +509,7 @@
     if (GARGCOUNT > 1 && !silent_mode)
        printf(_("%d files to edit\n"), GARGCOUNT);
 
-    if (params.want_full_screen && !silent_mode)
+    if (params.want_full_screen)
     {
        termcapinit(params.term);       /* set terminal name and get terminal
                                   capabilities (will set full_screen) */

온갖 참된 삶은 만남이다 --Martin Buber

bushi의 이미지

게을러서 직접 소스를 찾아볼 생각까진 못해봤는데....

좀 헷갈리는군요.

active silent mode: -s 옵션을 사용해서 강제로 silent mode 로 만드는 것.
passive silent mode: 사용할 수 있는 터미널이 없어서 저절로 silent mode 로 전환되는 것.

이 둘의 결과가 같으려면 silent mode 에서는 터미널에 관한 어떤 접근도 해서는 안됩니다.

제가 생각하는 버그는

silent mode 인데도 기본적인 bold, underline 등의 터미널과 관련된 syntax 들이 여전히 표현되는 것.

수정해줬으면 하고 생각하는 것은

active silent mode 와 passive silent mode 를 구분해달라는 것

정도.
명령행에서 ex mode 를 사용해 2html.vim 을 이용하는 경우뿐만이 아니라,
실제로 터미널이 없는 상태지만 강제로 지정을 해서라도 2html.vim 을 사용하고 싶은 경우까지도 고려해줬으면 하는 바램이죠.

OTL

wkpark의 이미지

위의 패치는 vim6.3과 완전히 같은 동작을 하게 만들 뿐입니다.

bushi wrote:

이 둘의 결과가 같으려면 silent mode 에서는 터미널에 관한 어떤 접근도 해서는 안됩니다.

그렇다면 2html.vim은 전혀 작동되지 않아야 옳다는 말씀이신지요?
예를 들어 터미널을 dumb로 해버리면 syntax 컬러링이 전혀 작동하지 않게됩니다.

온갖 참된 삶은 만남이다 --Martin Buber

bushi의 이미지

현재는,
-s 옵션을 줘서 강제로 silent mode 로 만들거나,
터미널이 없는 상태에서의 실행으로 자동 silent mode 로 들어갔을 때나,
bold, undeline 등의 기본적인 syntax 가 여전히 작동한다는 갑니다.

-s 옵션은 -T 옵션을 같이 사용해서 psudo 터미널을 지정할 수 있도록 바뀌어야 하고,
-s 옵션을 준 것도 아니고, 터미널이 있지도 않다면 모든 syntax 가 꺼져야 옳지 않습니까 ?

2html.vim 은 syntax expression 만 변환해 줄 뿐이니,
이놈에겐 아무런 잘못이 없다 생각합니다.

OTL

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.