作者siuoly (放空)
看板Editor
标题Re: [vim ] 把游标位置上的「字」写出去给外部程式?
时间Fri Jul 23 21:54:25 2021
1. '<,'>{cmd}
我测试过用write,yank,外部命令输出,都是整行,不是你的需求。
2. <cWORD> 用法如下:
: !echo <cWORD> #输出游标下的word
这是作为commnd argument,不是你的stdin需求
3. system() 用法如下
:echo system( "cat ", "stdin's something....." )
system()执行命令,并且把第二个参数作为stdin输入给命令。回传stdout输出。
如果用call system(..) 则看不到command 的stdout结果。
所以你可以用
map <c-j> :echo system( "命令" , expand("<cWORD>") )<cr>
来使用stdin。
参考:
:help :execute
:help <cWORD>
:help system()
stackoverlflow: How do I send the current buffer or line as stdin to system() in vim?
https://stackoverflow.com/q/21530456/12506676
※ 引述《cuello (cuello)》之铭言:
: Hi,
: 我在 .vimrc 里这麽做
: map <C-j> :.,/^[ \t]*$/ w !<外部程式><CR><CR>
: 就是定义 [Ctrl]-[J] 把 buffer 游标所在那一行开始往後
: 把整段(直到碰到空行),写出去给外部的程式,
: 这个程式则由 stdin 读入,接手处里这几行。
: 但是,我有进一步的需求,就是以上的方式是以行为单位,
: 问题是,可不可能只写出去游标所在的「那一个字」
: 「那一个字」可以是 "W/B" 或是 "w/b" 的「大字」或「小字」
: 我想过,例如,再编辑模式: B"ayW
: 可以把那个我要的「字」存到 named register a 去
: 但是,我不晓得要怎样才能在 .vimrc 把 "a 像上面那样
: 写出去给一个外部程式
: 请问这可以办到吗?
: 感谢指点迷津!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 219.85.141.196 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Editor/M.1627048467.A.CA2.html
※ 编辑: siuoly (219.85.141.196 台湾), 07/23/2021 22:05:48
※ 编辑: siuoly (219.85.141.196 台湾), 07/23/2021 22:09:09
1F:推 immerftp: 哈哈,结果你忘了去试後面加 |xless 07/24 01:46
2F:推 immerftp: 我当然也试过 echo, 但是是在"里面"试 :echo <cword> 07/24 01:53
3F:→ immerftp: 它并没有帮我把 <cword> expand 开来 07/24 01:53
4F:→ immerftp: 而且好像也没有成功写出去,还是有什麽错误的 07/24 01:53
5F:→ immerftp: 现在,你用的是"外面"的 echo, 它 expand 开来了! 07/24 01:53
6F:推 immerftp: 第三种,就等明天清醒一点在来好好地端个详 07/24 01:56
7F:→ immerftp: 再,再,再 07/24 01:57
8F:推 cuello: 抱歉,前面是我,躺在床上,案到家人的帐号 :) 07/24 20:47
9F:→ cuello: 结果第三种也很好用,更乾净,没有 Press ENTER 那一行 07/24 20:49
10F:推 cuello: 因为用 (2) 我前面要插入 silent 後面要加 <cr><c-l> 重画 07/24 20:52
11F:→ cuello: 变成 :silent !echo "<cWORD>" \|viewer <cr><cr><c-l> 07/24 20:53
12F:推 cuello: 忘了讲,我现在改用 nnoremap <leader>键 : silent.... 07/24 21:13
13F:→ siuoly: 对唉 我没想到用 | 来送stdin, 这招好用 07/25 01:21
14F:→ siuoly: 我刚刚才发现用silent加shell命令,画面会乱掉 07/25 01:23
15F:→ siuoly: 在background跑程式,system()是我唯一知道的办法 07/25 01:26
16F:→ siuoly: 当然还是会block住,只是画面不用刷新 07/25 01:27
17F:→ siuoly: 有帮到你就好 (赞 07/25 01:27