要約
Vimの+clipboardがオフになっている環境で、Vim内からクリップボードコピーを行うには以下のことをすればよいです。これをすることで、VimのコマンドモードからF8キーを押すだけで、Vimで書いたテキストがクリップボードへコピーされるようになります。
動機
弊学の学内環境にあるVimは、+clipboardがオフになっています。なので、Vimで書いたプログラムをクリップボードへコピーするには毎回Vimを閉じて別の操作でクリップボードへコピーする必要がありした。競技プログラミングなどのコンテスト中などは、できるだけそうした操作にかける時間を減らしたいです。この記事は、上記の問題に対する自分なりの答えをまとめたものです。
ファイルの内容をクリップボードに保存するJavaプログラムをつくる
以下のJavaプログラムをMain.javaに保存してください。このJavaプログラムは以下の2つのことを行います。
- 第二引数で指定されたパスにあるファイルの中身を読み込む
- 読み込んだファイルの中身をクリップボードへコピーする
- Enterキーが押されたらプログラムを終了する
ところで、このプログラムはEnterキーが押されないとプログラムが終了しないようにしてます。これは、クリップボードにデータを保存したプロセスが死ぬと、そのデータも死ぬというX Window Systemの仕様が要因となっています。
import java.awt.Toolkit;
import java.awt.datatransfer.*;
import java.io.IOException;
import java.nio.file.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
Path path = Paths.get(args[0]);
StringBuffer content = new StringBuffer();
try {
String readString = Files.readString(path);
content.append(readString);
} catch (IOException e) {
e.printStackTrace();
}
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection stringSelection = new StringSelection(content.toString());
clipboard.setContents(stringSelection, null);
Scanner scanner = new Scanner(System.in);
System.out.println("Press Enter key to continue");
scanner.nextLine();
}
}
Main.javaを保存したら、それをコンパイルします。
javac Main.java
コンパイルされたプログラムは、Main.classというファイル名で保存されます。私は分かりやすいように、Main.classをホームページディレクトリに移動しておきました。
.vimrcに先ほどのJavaプログラムを起動するautomodをつくる
ご自身の.vimrcに次のコードを追加してください。コードにあるXXXには、Main.classを保存したディレクトリに移動するコマンドを入力してください。Main.classをホームディレクトリに保存した場合は、cdだけで大丈夫です。(ターミナルでcdと入力すると、ホームディレクトリに移動するため)
autocmd nnoremap <F8> :w <bar> !XXX && java Main %:p:h/%:t && cd -<CR>
おわりに
これでVimのコマンドモードからF8キーを押すと、Vimで編集したテキストがクリップボードにコピーされるはずです。