[vim ] 把游標位置上的「字」寫出去給外部程式?
看板Editor (編輯器(vim/emacs))作者cuello (cuello)時間3年前 (2021/07/22 19:25)推噓8(8推 0噓 13→)留言21則, 4人參與討論串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,
3年前
, 1F
07/22 22:34, 1F
推
07/23 01:08,
3年前
, 2F
07/23 01:08, 2F
→
07/23 01:08,
3年前
, 3F
07/23 01:08, 3F
→
07/23 01:08,
3年前
, 4F
07/23 01:08, 4F
→
07/23 01:08,
3年前
, 5F
07/23 01:08, 5F
→
07/23 01:08,
3年前
, 6F
07/23 01:08, 6F
推
07/23 04:14,
3年前
, 7F
07/23 04:14, 7F
推
07/23 08:40,
3年前
, 8F
07/23 08:40, 8F
推
07/23 13:12,
3年前
, 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,
3年前
, 10F
07/23 21:57, 10F
→
07/23 21:58,
3年前
, 11F
07/23 21:58, 11F
是的, 就像一開始提起的那樣,或是用<leader>
兩種情形似乎都有一些東西需要 escape...
我的意思是,它把整行都寫出去了,然後落入 visual mode
我游標在第2個字,它往前超出第2字範圍
連同第一個字,說 inner-word 是我看了之後趕緊上網惡補
看到他們把 yiw 叫做 yank inner word :)
因為以前不懂得 yiw 的奧妙跟好處,真是感謝!
推
07/23 22:13,
3年前
, 12F
07/23 22:13, 12F
→
07/23 22:19,
3年前
, 13F
07/23 22:19, 13F
→
07/23 22:20,
3年前
, 14F
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,
3年前
, 15F
07/24 10:18, 15F
→
07/24 10:19,
3年前
, 16F
07/24 10:19, 16F
→
07/24 10:21,
3年前
, 17F
07/24 10:21, 17F
我~並~不~知~道! 還好你大聲講了出來!不然我又要在那邊.... you know.... :)
→
07/24 10:23,
3年前
, 18F
07/24 10:23, 18F
→
07/24 10:32,
3年前
, 19F
07/24 10:32, 19F
→
07/24 10:33,
3年前
, 20F
07/24 10:33, 20F
→
07/24 10:34,
3年前
, 21F
07/24 10:34, 21F
※ 編輯: cuello (59.115.168.28 臺灣), 07/24/2021 13:06:48
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
Editor 近期熱門文章
PTT數位生活區 即時熱門文章