MeadowUnicodeClipboard
MeadowでUnicodeをクリップボードとやり取りする
安直な方法で実現してみた。
以下のスクリプトをwclip.rbとして保存。
#!c:/cygwin/usr/local/bin/ruby ####################################################################### require 'dl' require 'dl/import' module W extend DL::Importable # winuser.h CF_UNICODETEXT = 13 dlload "user32" extern "BOOL OpenClipboard(HWND)" extern "BOOL CloseClipboard()" extern "HANDLE GetClipboardData(UINT)" extern "HANDLE SetClipboardData(UINT,HANDLE)" extern "BOOL EmptyClipboard()" # winbase.h GHND = 66 dlload "kernel32" extern "HANDLE GlobalAlloc(UINT, DWORD)" extern "void* GlobalLock(HANDLE)" extern "BOOL GlobalUnlock(HANDLE)" extern "DWORD GlobalSize(HANDLE)" end def global_lock(h) ptr = W.globalLock(h) begin yield ptr ensure W.globalUnlock(h) end end def open_clipboard sleep(0.1) while not W.openClipboard(0) begin yield ensure W.closeClipboard end end ####################################################################### require 'optparse' opt = OptionParser.new output = false opt.on('-o'){ output = true } opt.parse!(ARGV) if output open_clipboard{ h = W.getClipboardData(W::CF_UNICODETEXT) raise RuntimeError if h == 0 global_lock(h){|ptr| ary = ptr[0, W.globalSize(h)].unpack("S*") ary[ary.index(0)..(ary.length-1)] = nil s = ary.pack("S*") STDOUT.write(s) } } else s = ARGF.read s.concat("\0\0") h = W.globalAlloc(W::GHND, s.length) global_lock(h){|ptr| ptr[0, s.length] = s } open_clipboard{ W.emptyClipboard W.setClipboardData(W::CF_UNICODETEXT, h) } end
以下のelispを.emacsにでも書く。
(setq wclip-program "c:/cygwin/bin/wclip.rb") (defun copy-unicode (beg end) (interactive "r") (let ((coding-system-for-write 'utf-16-le-no-signature-dos)) (call-process-region beg end wclip-program nil 0 nil))) (defun yank-unicode () (interactive) (let ((coding-system-for-read 'utf-16-le-no-signature-dos)) (call-process wclip-program nil t nil "-o")))
Keyword(s):
References:[Meadow]