Re: [vim ] 把游標位置上的「字」寫出去給外部程式?

作者: siuoly (放空)   2021-07-23 21:54:25
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 像上面那樣
: 寫出去給一個外部程式
: 請問這可以辦到嗎?
: 感謝指點迷津!
作者: immerftp (immer)   2021-07-24 01:46:00
哈哈,結果你忘了去試後面加 |xless我當然也試過 echo, 但是是在"裡面"試 :echo <cword>它並沒有幫我把 <cword> expand 開來而且好像也沒有成功寫出去,還是有什麼錯誤的現在,你用的是"外面"的 echo, 它 expand 開來了!第三種,就等明天清醒一點在來好好地端個詳再,再,再
作者: cuello (cuello)   2021-07-24 20:47:00
抱歉,前面是我,躺在床上,案到家人的帳號 :)結果第三種也很好用,更乾淨,沒有 Press ENTER 那一行因為用 (2) 我前面要插入 silent 後面要加 <cr><c-l> 重畫變成 :silent !echo "<cWORD>" \|viewer <cr><cr><c-l>忘了講,我現在改用 nnoremap <leader>鍵 : silent....
作者: siuoly (放空)   2021-07-25 01:21:00
對唉 我沒想到用 | 來送stdin, 這招好用我剛剛才發現用silent加shell命令,畫面會亂掉在background跑程式,system()是我唯一知道的辦法當然還是會block住,只是畫面不用刷新有幫到你就好 (讚

Links booklink

Contact Us: admin [ a t ] ucptt.com