看板 Editor 關於我們 聯絡資訊
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
as23041248: 你要的是 <cword>?07/22 22:34
ssd860505da: 用* register? 可是某些情況會出bug,快被煩死了07/23 01:08
ssd860505da: 我後來用這兩個plugins07/23 01:08
ssd860505da: tmux-plugins/vim-tmux-focus-events07/23 01:08
ssd860505da: roxma/vim-tmux-clipboard07/23 01:08
ssd860505da: 目前沒出什麼問題07/23 01:08
as23041248: exe "normal! viw" | exe "'<,'>write !{cmd}"07/23 04:14
bootleq: map 裡可以用 <C-R>=expand('<cword>') 插字進去07/23 08:40
as23041248: 樓上 要寫到外部程式好像無法這樣使用07/23 13:12
感謝!你們說得我心癢癢的,感覺充滿希望 但是,試了再試, 發現我的 :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
as23041248: 寫進vimrc? 你想弄成key mapping07/23 21:57
as23041248: 越過inner word是什麼意思07/23 21:58
是的, 就像一開始提起的那樣,或是用<leader> 兩種情形似乎都有一些東西需要 escape... 我的意思是,它把整行都寫出去了,然後落入 visual mode 我游標在第2個字,它往前超出第2字範圍 連同第一個字,說 inner-word 是我看了之後趕緊上網惡補 看到他們把 yiw 叫做 yank inner word :) 因為以前不懂得 yiw 的奧妙跟好處,真是感謝!
siuoly: 你另外寫一個腳本測試也太辛苦了07/23 22:13
siuoly: 好奇是什麼情況要用stdin?我目前只用到cmd argument的情形07/23 22:19
siuoly: 測試<cword> 可用 :!echo <cword> 查看結果07/23 22:20
※ 編輯: 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
siuoly: vim內建echo用法 :echo expand("<cWORD>") 07/24 10:18
siuoly: 外部shell命令就會自己展開,我以前也踩過這坑= ="... 07/24 10:19
siuoly: 可能你已經知道了 提醒下 map 命令裡 | 符號要改成<bar> 07/24 10:21
我~並~不~知~道! 還好你大聲講了出來!不然我又要在那邊.... you know.... :)
siuoly: 否則vim 把 | 看成是map之後接續 新的命令 07/24 10:23
siuoly: 我也常常弄小東西花很多時間,我常懷疑這樣時間真的有賺嗎 07/24 10:32
siuoly: 弄出來是很爽沒錯,但可以我都盡量找現成工具來做事 07/24 10:33
siuoly: 你辛苦哩 07/24 10:34
※ 編輯: cuello (59.115.168.28 臺灣), 07/24/2021 13:06:48