:在光标之后而不是在行之后读取


11

:r !uuidgen经常使用新的uuid插入缓冲区。这可行,但我通常试图在引号之间插入uuid,并:r !uuidgen在新行上打印uuid。

为了解决这个问题,我目前正在使用一个简单的键盘映射:

nnoremap <C-u> mm:r!uuidgen<CR>dW"_dd`mp

此宏设置标记mm,插入uuid r!uuidgen,删除插入的uuid dW,删除多余的行"_dd,返回标记BACKTICKm,最后粘贴uuid p

:r在没有此宏/键绑定的情况下,是否有一种方法可以将光标移到游标之后呢?


1
SU问题,也具有这种解决方法。
muru

Answers:


8

您可以使用表达式寄存器"=system()

<C-r>=system("uuidgen | tr -d '\n'")<CR>

在插入模式映射中看起来像这样:

inoremap <key> <C-r>=system("uuidgen | tr -d '\n'")<CR>

或者,使用表达式映射:

inoremap <expr> <key> system("uuidgen \| tr -d '\n'")

5

在插入模式下,您可以点击Ctrl-R,然后键入:

=system('uuidgen')

注意,这将添加尾随换行符,因为这是uuidgen输出;要解决此问题,我们可以使用:

=system('uuidgen')[:-2]

删除换行符。

来自:help i_CTRL-R

插入寄存器的内容。在键入CTRL-R和第二个字符之间,将显示'“',表明您需要输入寄存器的名称。

[..]

'='表达式寄存器:提示您输入表达式(请参见表达式)

要将其绑定为Ctrl-u您的示例,可以使用:

nnoremap <C-u> i<C-r>=system('uuidgen')[:-2]<CR><Esc>

2

还有一个,带有:python

:py import uuid, vim; vim.command(':normal i' + str(uuid.uuid1()))

您可以映射为:

:inoremap <key> <esc>:py import uuid, vim; vim.command(':normal a' + str(uuid.uuid1()))<cr>a

UUID由Python UUID模块生成。


1
但是,这是一种相当扭曲的方法。
muru

0

这可能不如使用纯vim解决方案更可取,但是,如果使用片段管理器(例如Ultisnips),则可以尝试添加以下片段

snippet uuid "insert new uuid" w
`uuidgen`
endsnippet

这样,您就可以uuid在插入模式下键入并点击扩展触发器,并将uuid其替换为相关shell命令的输出。当然,这可以很容易地适应其他命令,并且可以通过Ultisnips文档中概述的强大方式进行扩展。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.