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

看板Editor (編輯器(vim/emacs))作者 (cuello)時間2年前 (2021/07/22 19:25), 2年前編輯推噓8(8013)
留言21則, 4人參與, 2年前最新討論串1/2 (看更多)
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), 來自: 59.115.193.195 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Editor/M.1626953154.A.AC5.html ※ 編輯: cuello (59.115.193.195 臺灣), 07/22/2021 19:26:37

07/22 22:34, 2年前 , 1F
你要的是 <cword>?
07/22 22:34, 1F

07/23 01:08, 2年前 , 2F
用* register? 可是某些情況會出bug,快被煩死了
07/23 01:08, 2F

07/23 01:08, 2年前 , 3F
我後來用這兩個plugins
07/23 01:08, 3F

07/23 01:08, 2年前 , 4F
tmux-plugins/vim-tmux-focus-events
07/23 01:08, 4F

07/23 01:08, 2年前 , 5F
roxma/vim-tmux-clipboard
07/23 01:08, 5F

07/23 01:08, 2年前 , 6F
目前沒出什麼問題
07/23 01:08, 6F

07/23 04:14, 2年前 , 7F
exe "normal! viw" | exe "'<,'>write !{cmd}"
07/23 04:14, 7F

07/23 08:40, 2年前 , 8F
map 裡可以用 <C-R>=expand('<cword>') 插字進去
07/23 08:40, 8F

07/23 13:12, 2年前 , 9F
樓上 要寫到外部程式好像無法這樣使用
07/23 13:12, 9F
感謝!你們說得我心癢癢的,感覺充滿希望 但是,試了再試, 發現我的 :echo has('clipboard') 是 0 而且我的 :reg 只有 " 0 1 ... a b ... - % / 抱歉! 是我的錯! 沒有說明我這邊的環境: 我在 Debian Linux 上, 是陽春的 vim 跟 X11 (沒 desktop) 我循著大家給的線索, 覺得就是卡在 1. <cword> 寫不出去 2. register 就是寫不出去... :( :( ※ 編輯: cuello (59.115.193.195 臺灣), 07/23/2021 16:22:42 喔對了,為了方便檢查 vim 到底寫出來什麼東西, 還寫了個短短的 script xless(1) 來充當 <外部程式> 所以都用 :甚麼東西 w !xless hd dump 出16進位碼來 debug... --------xless ----------- #!/bin/sh RECEPTOR="cat" if [ "$1" ] ; then [ -f "$1" ] || { RECEPTOR="$1" && shift ; } fi #$RECEPTOR $1 | ( # ^^^^^ 這樣檔案不能有空白 $RECEPTOR ${1+"$1"} | ( exec 6<&0 xterm -e sh -c 'exec 0<&6 less -r' ) exit $? ------------------------- ※ 編輯: cuello (59.115.193.195 臺灣), 07/23/2021 16:36:00 ※ 編輯: cuello (59.115.193.195 臺灣), 07/23/2021 16:36:51 我剛剛改了一行上面那個 xless 程式. 對不起,我先前沒看懂,as23041248 最後一行用手打真的寫得出去 :exe "normal! viw" | exe "'<,'>write !xless hd" 但出去的是一整行, 它往前越過了 "inner-word", 跑到前一個「字」去 而且好像是進了 visual mode,還是怎樣?(我幾乎沒用過 visual mode) 而且那一行寫不進 .vimrc, 老是在 "E?? mark not set" 不曉得那些符號該 escape... 我想上網把 exe 搞清楚,結果... 資料好難找... 剛剛還誤會這搞不好是 windows-specific... 真不好意思... ※ 編輯: cuello (59.115.193.195 臺灣), 07/23/2021 19:44:22 ※ 編輯: cuello (59.115.193.195 臺灣), 07/23/2021 19:45:33

07/23 21:57, 2年前 , 10F
寫進vimrc? 你想弄成key mapping
07/23 21:57, 10F

07/23 21:58, 2年前 , 11F
越過inner word是什麼意思
07/23 21:58, 11F
是的, 就像一開始提起的那樣,或是用<leader> 兩種情形似乎都有一些東西需要 escape... 我的意思是,它把整行都寫出去了,然後落入 visual mode 我游標在第2個字,它往前超出第2字範圍 連同第一個字,說 inner-word 是我看了之後趕緊上網惡補 看到他們把 yiw 叫做 yank inner word :) 因為以前不懂得 yiw 的奧妙跟好處,真是感謝!

07/23 22:13, 2年前 , 12F
你另外寫一個腳本測試也太辛苦了
07/23 22:13, 12F

07/23 22:19, 2年前 , 13F
好奇是什麼情況要用stdin?我目前只用到cmd argument的情形
07/23 22:19, 13F

07/23 22:20, 2年前 , 14F
測試<cword> 可用 :!echo <cword> 查看結果
07/23 22:20, 14F
※ 編輯: cuello (59.115.193.195 臺灣), 07/24/2021 00:24:13 剛剛初步測試 :!echo <cWORD> | xless 真的可以耶! 所以,用外面的 echo 它會 expand! (這算是「外面的」嗎?) 我稍後,或明天再繼續把它弄清楚 事情是這樣的, 我平常私下很緊湊地在用純文字檔作流水帳 每行的開頭自動插入一個 epoch time, 例如現在是 1627058355 然後,不管做了什麼事,就丟進去就是了,事後想追查就 grep 那麼裡邊不免會夾雜一些影音檔案,或 http, 或本地檔案 後來就有上我在一開頭描述的做法. 一直不滿意的地方就是 每個影音檔必須占用單獨的一行, 而不能跟文字混在一起. 所以, 這是個遲早要去解決的事... 例如, 我放了 aaa.jpg bbb.jpg ccc.jpg 只要我游標在 bbb.jpg 那一行, [Ctrl]-[J] 就會叫出我的 image viewer, 例如, 從 stdin, 經由 xargs 同塞給它 bbb.jpg 跟 ccc.jpg 然後我可以在 bbb.jpg 跟 ccc.jpg 快速來回跳動比較. 還算順利. 但是,有一天,不管怎麼弄,我那個 image viewer 都只給我錯誤訊息! 快氣瘋! 本來事情夠多了,突然又多了件事要解決,情急之下.... 當然沒解決 為甚麼?因為沒有好用的,用得順手的工具! 所以,待改天心平氣和了之後,就坐下來,把 xless 先弄對 讓它可以接受 $1 而且也可以接受 stdin, 而且還可以插入個 hd(1). 然後,就看到了, 我所編輯的那個純文字檔裡,含有古早時代留下來的 0d 0a (i.e. CR LF i.e. \r \n) 所以,工具還是很重要啊~ (嘆氣~) 但是,後來我並沒有去移除那些 0x0d,而是在<外部程式>的前端過濾 0d. ※ 編輯: cuello (59.115.193.195 臺灣), 07/24/2021 01:04:15

07/24 10:18, 2年前 , 15F
vim內建echo用法 :echo expand("<cWORD>")
07/24 10:18, 15F

07/24 10:19, 2年前 , 16F
外部shell命令就會自己展開,我以前也踩過這坑= ="...
07/24 10:19, 16F

07/24 10:21, 2年前 , 17F
可能你已經知道了 提醒下 map 命令裡 | 符號要改成<bar>
07/24 10:21, 17F
我~並~不~知~道! 還好你大聲講了出來!不然我又要在那邊.... you know.... :)

07/24 10:23, 2年前 , 18F
否則vim 把 | 看成是map之後接續 新的命令
07/24 10:23, 18F

07/24 10:32, 2年前 , 19F
我也常常弄小東西花很多時間,我常懷疑這樣時間真的有賺嗎
07/24 10:32, 19F

07/24 10:33, 2年前 , 20F
弄出來是很爽沒錯,但可以我都盡量找現成工具來做事
07/24 10:33, 20F

07/24 10:34, 2年前 , 21F
你辛苦哩
07/24 10:34, 21F
※ 編輯: cuello (59.115.168.28 臺灣), 07/24/2021 13:06:48
文章代碼(AID): #1W-LN2h5 (Editor)
文章代碼(AID): #1W-LN2h5 (Editor)