Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315187
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: LINUX

2010-02-25 20:01:25

下面的讨论假设Windows 与Unix之间的互操作, 由于至于Unix的流派, 经我测试过的解决方案是在RedHat 5.1上.

假设背景:
你需要同时在windows与Unix平台工作, 在windows上通过netterm, securecrt, Putty等 终端登录到linux上.
如果纯用Unix或windows一种, 目前你不需要继续看下去.

下面是整个方案的具体描述, 这是我最终试验出来的比较完美的解决方案, 此前还有花了我大量时间但最终放弃的失败的方案, 有空再去记述这些失败的案例, 从解决问题的角度看, 一样甚至更有用.

1. 前提: 目录共享, CIFS/samba
虽然是解决Unix中内容与windows 平台共享剪贴板, 但这个方案基于文件系统, 需要先让Unix无缝地访问到windows平台下的文件系统.

* 在windows共享一个专门的文件夹, 我的是 T:\zrf\.clipboard_share_working_folder, 需要有写权限
* 在unix用户目录下建立一个工作目录, 专司与windows剪贴板的共享事宜. 我的是 ~zrf/.clipboard_share_working_folder  保持一致是好事
* 编辑你的unix系统中的.bashrc 或等价的启动脚本, 添加下面的行:

if ! mount | grep -F ~/.clipboard_share_working_folder > /dev/null; then
    sudo mount -t cifs '//10.86.6.95/.clipboard_share_working_folder' ~/.clipboard_share_working_folder -o "user=Administrator,password=xxx,uid=zrf" --verbose
fi

(瞧, 你要问为什么需要把Unix下的东西共享到windows的系统剪贴板, 上面我copy的几行代码就是应用之一)

在你有能力运行这句话之前, 还需要保证你是 sudo users, 能以sudo 执行mount, 把你的windows 共享目录 mount 到unix下, 这需要以visudo 来把你的帐号进行适当配置.

至此, 你在unix下应该可以快速平滑地读写windows下的那个共享目录.

2. 配置vim, 以便在该编辑器中快捷地把任意内容复制到系统剪贴板.

nnoremap g :silent redir! > ~/.clipboard_share_working_folder/clipboard.txtsilent echo @vsilent redir ENDsilent !touch ~/.clipboard_share_working_folder/clipboard_changed.txt

这里定义一个键映射, 在触发了该键后, 将固定寄存器v中的内容写入文件
~/.clipboard_share_working_folder/clipboard.txt
同时用touch 命令更新
~/.clipboard_share_working_folder/clipboard_changed.txt
文件的最后更改日期, 这两个文件名均是固定了, 与后面windows下的代理程序相约而同的名称.

怎么随心所欲地把你想复制的内容放入寄存器v 属于 vim的操作, 这里不说它.

3. 写一个windows下的代理进程, 然后运行它, 该程序只做一件事: 监控文件clipboard_changed.txt 是否被改变, 一旦被改变, 就把文件
~/.clipboard_share_working_folder/clipboard.txt
的内容放入系统剪贴板, 目前我的实现是用一个60行的C#程序, 通过FileSystemWatcher 监控文件的改变, 这是实时/平滑地让unix下文本入驻windows 系统剪贴板的关键

4. 保证你的系统下有一个叫 clip.exe 的程序, 3中的程序之所以这么短, 是因为把文件的内容放入系统剪贴板这件事是通过clip.exe来做的, 这个程序是微软的windows的resource kit中的一份子, 在我的windows 2003系统中, 我发现不知何时系统已经有了, 这个程序的功能:
dir | clip
把dir 命令的输出放入系统剪贴板:
clip < log.txt
把log.txt文件的内容放入剪贴板, 这两个命令其它可以归为一句话: 把来自标准输出的内容放入剪贴板, 之所以介绍它的功能, 是因为下面要在5中让同样的功能运行在unix下:

5. 模拟 clip.exe进行shell环境下的操作

有了上面的基础, 实现简单得惊人:

function clip()
{
    cat > ~/.clipboard_share_working_folder/clipboard.txt
    touch ~/.clipboard_share_working_folder/clipboard_changed.txt
}

之后, 你可以在编译一个软件包时:

make >& log.txt
clip < log.txt
此时文件log.txt的内容已经复制到了windows系统剪贴板, 你可以把它放入UltraEdit之类的工具中分析.
或者
make 2>&1 | tee | clip
可以查看在终端上的输出的同时, 确保命令结束时, 所有信息包括错误信息都被放入了系统剪贴板.


下面是C# 代码对proxclip的实现, 同时包括了编译后的文件和前面提到的clip.exe
因为是C#实现的, 所以需要安装.Net framework 2.0

文件:proxyclip.rar
大小:14KB
下载:下载
proxyclip程序运行起来是一个空的窗口, 啥功能也没有, 但需要保持运行状态.


==============================================================
下面是更新后的程序, 不但可以象以前一样把Unix的内容copy到windows剪贴板. 而且也可以把来自windows剪贴板的内容让Unix 访问到.

基本想法是: 新张贴到Windows剪贴板的内容, 如果是text, 则把它的内容写到前述的文件 clipboard.txt中, 然后, 再通过bash/readline 配置文件.inputrc 实现:

"\e[2~": "$(cat ~/.clipboard_share_working_folder/clipboard.txt)\M-\C-e"

这个\e[2~  是SHIFT + INSERT的键码, 后面的$(cat ...)是一个命令, 再后面的\M-\C-e是将该命令执行结果就地展开的快捷键, 仍然是readline的功能.

最终效果就是, 你在windows的程序中, 如浏览器中, copy一段文字, 在VMWare 中直接通过console访问的控制台中, 你仍然可以通过按CTRL+INSERT 得到这段文字.


最后, 在unix 的 ~/.vimrc 配置文件中, 加上下面的定制可以让你在vim中更容易获得windows系统剪贴板的内容:

function! Two_worlds_smart_paste()
    let has_eol=system('od -t x1 ~/.clipboard_share_working_folder/clipboard.txt | grep 0a >& /dev/null; echo -n $?')
    if has_eol == "1"
        let @"=system('cat ~/.clipboard_share_working_folder/clipboard.txt')
        norm p
    else
        :r ~/.clipboard_share_working_folder/clipboard.txt
    endif
endfunction

nnoremap g :call Two_worlds_smart_paste()


费这半天劲, 主要是想让单行且不包含换行符的那些内容, 插入到当前光标之后, 而让那些多行的内容, 整个放在当前行之后.
对两边剪贴板的监控可以单独控制.

文件:ShareClipboard.zip
大小:37KB
下载:下载

阅读(1519) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~