選択領域用レジスタを使ってvimからGTKのクリップボードへコピー.1

ある端末のvimから,別の端末のvimにコピーしたいときは :wv!と:rv!を使えばよいのですが,
ブラウザのフォームなどのGUIアプリケーションに渡したいときには,
viminfoを参照するはずないので,もちろんこれではうまくいきません.


vimで:h registersを読むと項目7に選択領域用レジスタというものがありました.
以前の日記(id:pneumaster:20081128:1227812368)でレジスタのヘルプを読む
機会があったので,その時のことをまとめておこうと思います.
ちなみにvimgnome-terminal上,必要あるかわかりませんが,
:echo $TERMはxterm,
GUIアプリケーションにはgedit(GNOME標準のテキストエディタ;windowsのNotepad.exeのようなもの)を使うことにします.

xterm_clipboardというfeatureが必要

まず,先の選択領域用レジスタには

7. Selection and drop registers "*, "+ and "~
Use these register for storing and retrieving the selected text for the GUI.
See |quotestar| and |quoteplus|. When the clipboard is not available or not
working, the unnamed register is used instead. For Unix systems the clipboard
is only available when the |+xterm_clipboard| feature is present. {not in Vi}

とあります(:h change.txt).
"*と"+レジスタの区別はよくわかりませんでしたが,
とにかく,vimで行選択後に"+yをしても,geditの方には貼り付けられませんでした.
("*yも同様でした.)
これは上記引用部の「When the clipboard is not available or not working,
the unnamed register is used instead.」となっているようです.
# そもそもyコマンドが無名レジスタを使うようなので,
# 問題の切り分けができていないかもしれませんが.
ということで,xterm_clipboardが有効じゃないということなんでしょう.


xterm_clipboardは:versionで確認できます.
わたしの環境を下に記しておきます.

$ vim --version
VIM - Vi IMproved 7.1 (2007 May 12, compiled Jun  7 2008 00:45:08)
適用済パッチ: 1-266
Compiled by 'http://www.opensuse.org/'
Huge 版 without GUI.  機能の一覧 有効(+)/無効(-)
+arabic +autocmd -balloon_eval -browse ++builtin_terms +byte_offset +cindent 
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments 
+cryptv +cscope +cursorshape +dialog_con +diff +digraphs -dnd -ebcdic 
+emacs_tags +eval +ex_extra +extra_search +farsi +file_in_path +find_in_path 
+folding -footer +fork() +gettext -hangul_input +iconv +insert_expand +jumplist
 +keymap +langmap +libcall +linebreak +lispindent +listcmds +localmap +menu 
+mksession +modify_fname +mouse -mouseshape +mouse_dec -mouse_gpm 
-mouse_jsbterm +mouse_netterm +mouse_xterm +multi_byte +multi_lang -mzscheme 
-netbeans_intg -osfiletype +path_extra -perl +postscript +printer +profile 
-python +quickfix +reltime +rightleft -ruby +scrollbind +signs +smartindent 
+sniff +statusline -sun_workshop +syntax +tag_binary +tag_old_static 
-tag_any_white -tcl +terminfo +termresponse +textobjects +title -toolbar 
+user_commands +vertsplit +virtualedit +visual +visualextra +viminfo +vreplace 
+wildignore +wildmenu +windows +writebackup -X11 -xfontset -xim -xsmp 
-xterm_clipboard -xterm_save 
      システム vimrc: "/etc/vimrc"
        ユーザ vimrc: "$HOME/.vimrc"
         ユーザ exrc: "$HOME/.exrc"
       省略時の $VIM: "/etc"
省略時の $VIMRUNTIME: "/usr/share/vim/current"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H     -O2 -march=i586 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -g -Wall -pipe -fno-strict-aliasing -fstack-protector-all        
リンク: gcc   -L/usr/local/lib -o vim       -lncurses -lacl 

やはり,わたしのvimではxterm_clipboardが無効になっていたようです.
:h version(various.txt)にあるように,

To change this, you have to edit feature.h and recompile Vim.

コンパイルし直さないと機能を有効にできないみたいです.
わたしには難易度が高いです...

コンパイルする前にfeature.hを編集

xterm_clipboardを有効にする以外は,現在使っている状態をできる限り保ちたいと思います.


opensuseのレポジトリにはソースが置いていなかったので,
vim.orgからダウンロードしてきたtarballを展開してできたvim-72/src/feature.hを編集します.
53行目あたりに,Normal/Big/Hugeパッケージのどれを使うのかを定義する部分があります.

/*
 * Uncomment one of these to override the default.  For unix use a configure
 * argument, see Makefile.
 */
#if !defined(FEAT_TINY) && !defined(FEAT_SMALL) && !defined(FEAT_NORMAL) \
	&& !defined(FEAT_BIG) && !defined(FEAT_HUGE)
/* #define FEAT_TINY */
/* #define FEAT_SMALL */
/* #define FEAT_NORMAL */
/* #define FEAT_BIG */
/* #define FEAT_HUGE */
#endif

先ほどの:version(以下,「現在環境」と呼ぶ)の結果,Huge版でした.
一応,:h +feature-listからHugeの時しか使えないコマンドが:profileとあるので,
このコマンドがあるか確認したところ,使えました.
とりあえず,Huge版ということにしておきます.そうしましょう XD.
# ディストリについているものですし,色々チューンしてるのかも知れませんが;
ということで,

/* #define FEAT_HUGE */

のコメントをはずします.


他にも色々変更点があります.
長くなりますので,以下気になったところを列挙します.(といっても個人的なメモに近くなってしまいました.)

まず,Optional code(ソースのコメントより)から.

  1. 367行目: OK: tag_any_whiteがあるが,現在環境にはない.そのまま無効にしておく.
  2. 379行目: OK: floatがあるが,現在環境にはない.しかし,新しい機能のようなので有効にしておく.
  3. 416行目: OK: completefuncがあるが,現在環境にはない.しかし,補完機能っぽいのでアンコメントし,有効にしておくことにする.
  4. 532行目: OK: spellがあるが,現在環境にはない.そのまま無効にしておく.
  5. 538行目から: OK: 現在環境での++builtin_termsに関して.++と何故2つなのかわからないが,HugeパッケージではALL_BUILTIN_TCAPSになるようだ.この状態にしておく.
  6. 638行目: OK: multi_byte_ime.コメントを読む限りwindows環境での話.不要である.コメントしておく.(つまり,そのまま)
  7. 654行目: OK: 多分ここがiconvの定義場所.とりあえずこのままにしておく.
  8. 661行目から: ??: ximとhangul_expand.現在環境にはない.ximはそのままでも定義されないので,いじらない.hangul_expandはよくわからない.保留.
  9. 694行目: ??: HAVE_X11がdefineされ,HAVE_GTK2がdefineされていなければ,機能がONになるようだが,よくわからない.保留.
  10. 733行目: ??: XPM?保留.
  11. 740行目: OK: toolbarがあるが,コメントを読む限りwindows環境での話.不要.そのままにしておく.
  12. 758行目: OK: GUI tabline.多分windowsGTKとかも見えるが,多分defineされない.
  13. 768行目: ??: browse.:browseコマンドの可否に関わるっぽいが,今の環境で:browseできる.しかし現在環境には-browseとある.どっち?とりあえず保留.
  14. 776行目から: ??: dialog_guiとdialog_conについて.dialog_guiは不要.dialog_conは必要.条件が長くて読むのが疲れてきた.保留.多分大丈夫,きっと.
  15. 805行目: OK: CodewarriorMACと書いてあるし,きっと不要.そのまま.


ここまででOptional codeの終了.
とりあえず,現在の状態を書いておくことにする.
アスタリスクのついたものが確認済みなもの.
現在環境で無効なオプションには,無効だと分かった上で確認したことを示すために「OK.」とかなんとか書いておいた.
「???」は保留.コンパイル後,問題があったら,ifdefの条件を見直す.

+arabic			*
+autocmd		*
-balloon_eval
-browse			*
++builtin_terms		* ALL_BUILTIN_TCAPSをdefineされる状態(いじってない)
+byte_offset		*
+cindent 		*
-clientserver
-clipboard
+cmdline_compl		*
+cmdline_hist		* cmdhistという名前で存在する
+cmdline_info		*
+comments 		*
+cryptv			*
+cscope			*
+cursorshape
+dialog_con		*
+diff			*
+digraphs		*
-dnd
-ebcdic
+emacs_tags		*
+eval			*
+ex_extra		*
+extra_search		*
+farsi			*
+file_in_path		*
+find_in_path		*
+folding		*
-footer
+fork()
+gettext		*
-hangul_input		???
+iconv			*
+insert_expand		*
+jumplist		*
+keymap			*
+langmap		*
+libcall		*
+linebreak		*
+lispindent		*
+listcmds		*
+localmap		*
+menu			*
+mksession		*
+modify_fname		*
+mouse
-mouseshape
+mouse_dec
-mouse_gpm
-mouse_jsbterm
+mouse_netterm
+mouse_xterm
+multi_byte		*
+multi_lang		*
-mzscheme
-netbeans_intg
-osfiletype		* OK. 定義されない
+path_extra		*
-perl
+postscript		*
+printer		*
+profile		*
-python
+quickfix		*
+reltime		*
+rightleft		*
-ruby
+scrollbind		*
+signs
+smartindent		*
+sniff
+statusline		*
-sun_workshop
+syntax			*
+tag_binary		*
+tag_old_static		*
-tag_any_white		* OK. 定義されない
-tcl
+terminfo
+termresponse
+textobjects		*
+title			*
-toolbar		* OK.
+user_commands		*
+vertsplit
+virtualedit		*
+visual			*
+visualextra		*
+viminfo		*
+vreplace		*
+wildignore		*
+wildmenu		*
+windows		*
+writebackup
-X11
-xfontset		???
-xim			* OK. 定義されない
-xsmp
-xterm_clipboard
-xterm_save


次にPreferences.

  1. 843行目: OK: STARTUPTIME.現在環境にはない.スタートアップ時の時間計測?デバッグ用?コメント状態保持.
  2. 854行目: OK: VIMRC_FILE.コメント部「Name of the .vimrc file in current dir.」関係ない.きっと.コメント状態保持.

上記のSTARTUPTIMEのような現在環境にないものが多い(というか多分featureではない)上,
変更してよいのかわからないものも多いので,Preferencesもほとんどが保留.


次にMachine dependent.

  1. 978行目: OK: forkかsystemか.forkが有る場合にはsystemは利用されない.systemは現在環境にないので,ちょうどよい.
  2. 985行目: ??: 現在環境にはないし,ソースではコメントされているが,コメント部には次のようにある.「Unix only. Include code for xterm title saving and X clipboard. Only works if HAVE_X11 is also defined.」.ちょっと怪しいので保留.
  3. 1009行目: ??: mouse_xterm,mouse_dec,mouse_jsbterm,mouse_netterm,mouse_gpm,mouse_pterm,mouse_sysmouse,mouseの8項目についてのスイッチ.現在環境でONなのはmouse_xterm mousedec mouse_nettrem mouse.HAVE_GPMを定義しなければ,mouse_gpmはONにならないようだ.mouse_xterm mousedec mouse_nettremは確実にONになる.mouseはよくわからない.FEAT_GUIが定義されていれば,mouseがONになるようだ.
  4. 1061行目: ??: clipboardとxterm_clipboard.やっとたどり着いた.
  5. 1105行目: OK: clientserverは現在環境にないので,コメントアウトする.
  6. 1176行目: ??: terminfoは現在環境にない.コメント部にはautomatically detectedとある.どこに設定項目があるのかわからない.保留.


この後Makefileを修正し,コンパイルまでしました.
vimが読みにいくヘルプファイルやシンタックスファイルなどのディレクトリが違っていたり,
いくつかの問題点が出てきました.
これらに関しては,記事が長くなってきましたし次回書くことにします.