18774


Linux/BSD初心者です。  
`Ubuntu15.04`で`virtualbox`を利用し、ゲストマシンに`FreeBSD 10.2-stable`を入れて使っています。

`Ubuntu`の`GNOME端末`から`BSD`にログインし、そこから例えば`cat`でファイルの中身を表示させる場合、日本語であっても次のように表示されました。(エンコードは`UTF8`)

[code]

    $ cat test.txt
    あいうえお
    
[/code]

これが`vi`での表示だとこうなります。

[code]

    $ vi test.txt
    \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a
    
[/code]

`vi`のバージョン情報を表示させると以下でした。

[code]

    Version 2.1.2 (2012-11-02) The CSRG, University of California, Berkeley.
    
[/code]

`virtualbox`付属のターミナルから`BSD`にログインして同じことをすると、`cat`の日本語表示は文字化けしてしまうことから、`GNOME端末`には`UTF8`の文字コードをデコードする機能があるからだろう想像は付きます。しかし`vi`で表示する内容に関しては`virtualbox`のターミナルで見ても結果が変わりませんでした。

この違いはもちろん、`vi`自体のターミナル表示制御によるものだろうとは思います。  
それがマルチバイト文字に関して全くデコードできないということなのだろうと察することはできるのですが、ではそのデコード方法は存在するのだろうか？ということが知りたいです。  
例えばコンパイルオプションとして存在するのか？といったことです。

軽くソースコードの`Makefile`(ソースコード内のusr.bin/vi/Makefile)を見てはみたのですが、`iconv`のオプションがある（ようだ）、という以上のことはわからず、安易にコンパイルしなおしてみる度胸もないので、もしご存じの方がいらしたら教えてください。  
まるきり見当違いのことを尋ねていたらすみません。

(以下はviのMakefile)

[code]

    #
    # $FreeBSD: stable/10/usr.bin/vi/Makefile 262643 2014-03-01 03:09:16Z brooks $
    #
    
    .include <bsd.own.mk>
    
    SRCDIR=         ${.CURDIR}/../../contrib/nvi
    SUBDIR+=        catalog
    
    WARNS?= 0       # some warn issues on 32 bit machines
    
    VI=     nvi
    EX=     nex
    VIEW=   nview
    
    PROG=   nvi
    
    CFLAGS+=        -D__REGEX_PRIVATE
    
    LINKS=  ${BINDIR}/${VI} ${BINDIR}/${EX} ${BINDIR}/${VI} ${BINDIR}/${VIEW}
    LINKS+= ${BINDIR}/${VI} ${BINDIR}/vi ${BINDIR}/${EX} ${BINDIR}/ex
    LINKS+= ${BINDIR}/${VI} ${BINDIR}/view
    
    MAN=    ${SRCDIR}/docs/USD.doc/vi.man/vi.1
    MLINKS+=vi.1 ex.1 vi.1 view.1
    MLINKS+=vi.1 nex.1 vi.1 nview.1 vi.1 nvi.1
    
    .PATH:  ${SRCDIR}/common
    .PATH:  ${SRCDIR}/ex
    .PATH:  ${SRCDIR}/cl
    .PATH:  ${SRCDIR}/vi
    .PATH:  ${SRCDIR}/regex
    
    CFLAGS+=-I${.CURDIR} -I${SRCDIR} -I${SRCDIR}/regex
    
    DPADD=          ${LIBUTIL}
    LDADD=          -lutil
    
    .if defined(RESCUE) || defined(RELEASE_CRUNCH) || ${MK_NCURSESW} == "no"
    DPADD+=         ${LIBNCURSES}
    LDADD+=         -lncurses
    .else
    CFLAGS+=        -DUSE_WIDECHAR
    DPADD+=         ${LIBNCURSESW}
    LDADD+=         -lncursesw
    .endif
    
    .if ${MK_ICONV} == "yes" && !defined(RESCUE) && !defined(RELEASE_CRUNCH)
    CFLAGS+=        -DUSE_ICONV
    .endif
    
    CLEANFILES+=${EX}
    
    # Vi curses sources
    SRCS+=  cl_funcs.c cl_main.c cl_read.c cl_screen.c cl_term.c
    
    # General sources.
    SRCS+=  conv.c cut.c delete.c encoding.c exf.c key.c line.c log.c main.c mark.c msg.c options.c \
            options_f.c put.c recover.c screen.c search.c seq.c util.c
    
    # Ex source.
    SRCS+=  ex.c ex_abbrev.c ex_append.c ex_args.c ex_argv.c ex_at.c ex_bang.c \
            ex_cd.c ex_cmd.c ex_cscope.c ex_delete.c ex_display.c \
            ex_edit.c ex_equal.c ex_file.c ex_filter.c ex_global.c \
            ex_init.c ex_join.c ex_map.c ex_mark.c ex_mkexrc.c ex_move.c \
            ex_open.c ex_preserve.c ex_print.c ex_put.c ex_quit.c \
            ex_read.c ex_screen.c ex_script.c ex_set.c ex_shell.c \
            ex_shift.c ex_source.c ex_stop.c ex_subst.c ex_tag.c \
            ex_txt.c ex_undo.c ex_usage.c ex_util.c ex_version.c ex_visual.c \
            ex_write.c ex_yank.c ex_z.c
    
    # Vi source.
    SRCS+=  getc.c v_at.c v_ch.c v_cmd.c v_delete.c v_ex.c v_increment.c v_init.c \
            v_itxt.c v_left.c v_mark.c v_match.c v_paragraph.c v_put.c v_redraw.c \
            v_replace.c v_right.c v_screen.c v_scroll.c v_search.c v_section.c \
            v_sentence.c v_status.c v_txt.c v_ulcase.c v_undo.c \
            v_util.c v_word.c v_xchar.c v_yank.c v_z.c v_zexit.c vi.c
    
    # Vi screen source.
    SRCS+=  vs_line.c vs_msg.c vs_refresh.c vs_relative.c vs_smap.c vs_split.c
    
    # Wide char regex
    SRCS+=  regcomp.c regerror.c regexec.c regfree.c
    
    .include <bsd.prog.mk>
    
[/code]


CC BY-SA 3.0
2015-11-12T22:15:04.497
18761
2015-11-18T03:13:10.560
9403
question
freebsd
FreeBSDのviにUTF8の文字コードを理解させる方法


Linux の vi は vim ですが、FreeBSD の vi は nvi です。  
素の nvi は、マルチバイト文字には非対応です。

ports や pkg で vim をインストールすると良いと思います。


CC BY-SA 3.0
2015-11-13T00:38:23.373
18763
2015-11-13T00:38:23.373
5727
18761
answer


FreeBSD ではないのですが、Debian 系 Linux distribution で提供されている nvi では日本語の表示・編集が可能です。nvi
のバージョンは以下の通りです。

[code]

    Version nvi-1.81.6 (2007-11-18) The CSRG, University of California, Berkeley
    
[/code]

ビルドには configure を使っているのですが、そのオプションに、

[code]

    --enable-widechar     Build a wide character aware vi (experimental).
    
[/code]

があって、これを指定しています。


CC BY-SA 3.0
2015-11-13T01:02:22.560
18765
2015-11-13T01:02:22.560
18761
answer


コンソールのエンコーディングと同じエンコーディングのファイルの編集が出来ればよいのであれば、環境変数`LANG`をコンソールのエンコーディングに一致する値(たとえば`ja_JP.UTF-8`)に変更してください。

UTF-8環境でEUC-JPのファイルを編集したい、などだと、素のviだと面倒なのでvimでもインストールしてください。


CC BY-SA 3.0
2015-11-13T03:02:09.873
18774
2015-11-13T03:02:09.873
5793
18761
answer


すでに問題解決済みですが、この問題に関して[本家nviのFAQ](https://sites.google.com/a/bostic.com/keithbostic/vi/nvi-
faq#A1)に記載がありました。後で同じような疑問に突き当たった人の参考になるよう追記しておきます。

> Vi uses the C library routine isprint(3) to determine if a character is
> printable, or should be displayed as an octal or hexadecimal value on the
> screen. Generally, if vi is displaying printable characters in
> octal/hexadecimal forms, your environment is not configured correctly. Try
> looking at the man pages that allow you to configure your locale. For
> example, to configure an ISO 8859-1 locale under Solaris using csh, you
> would do:
[code]

>     setenv LANG C
>  
>     setenv LC_CTYPE iso_8859_1
>  
[/code]

（概訳)  
『Viはisprint(3)というC言語ライブラリ関数を使って表示可能な文字の判別を行い、表示できない文字については8進数か16進数の値をスクリーンに表示する。スクリーン上にviが8または16進数で文字を表示していることが見て取れるときは、大抵の場合、環境変数が正しく設定されていない。ロケール設定の仕方についてはmanを参照のこと。例えばSolarisでCシェルを使っておりロケールをISO8859-1にしたいのであれば以下のようにする。  
setenv LANG C  
setenv LC_CTYPE iso-8859_1』


CC BY-SA 3.0
2015-11-14T20:19:49.703
18825
2015-11-14T20:19:49.703
9403
18761
answer