vim r!在光标位置


Answers:


16

使用“ :read”,Vim总是将输出插入新行。不幸的是,解决方案并不简单。

当您处于插入模式时,可以通过按ControlR然后键入来在当前光标位置插入命令的输出=system('command')Enter。不幸的是,如果命令的输出(大多数情况下)都将插入尾随换行符,那么您的行将被打断。

可以通过添加一条substitute()对带尾的换行符的调用来解决此问题,但这会使该命令比手动键入更为麻烦。

最终的解决方案是创建某种映射,但是由于Vim处理所谓的“预先输入”的方式而变得更加复杂。而您可以执行以下操作:

:nmap \e i<c-r>=substitute(system('date'),'[\r\n]*$','','')<cr><esc>

如果命令在映射中是“硬接线”的,则不能执行以下操作:

:nmap \e i<c-r>=substitute(system(input('Command: ')),'[\r\n]*$','','')<cr><esc>

试图提示用户运行命令的地方,因为Vim只会感到困惑,发出哔哔声并进入插入模式。

因此,您必须提示命令首先运行,将其存储在变量中,然后插入处理后的输出。在这一点上,可能需要一个辅助函数来防止映射本身变得难以管理的混乱,因此我们最终得到了这样的结果:

function InlineCommand()
    let l:cmd = input('Command: ')
    let l:output = system(l:cmd)
    let l:output = substitute(l:output, '[\r\n]*$', '', '')
    execute 'normal i' . l:output
endfunction

nmap <silent> \e :call InlineCommand()<CR>

请注意,nmap创建的映射仅在普通模式下键入时才执行。

顺便说一句,如果您只想插入日期或当前工作目录,则我给出的初始答案是可行的。只需进入插入模式并输入ControlR=strftime('%c')Enter或即可ControlR=getcwd()Enter


可以通过链接命令来解决此问题。:r!date | :-| J或i \ n \ n ^ [-:。!date \ n -JJ
Alexx Roche

4

如果您希望在当前行中尝试,则可以尝试一下,但是请记住,该行的旧内容将被删除:

:.!date

如果您想要精确的光标位置,则可以:

:let a=system("date") | let b=substitute(a,"[\r\n]*$","","g") | exec 'normal i'.b

长话短说:您需要替换,因为要摆脱^ @(空字符),也可以将其替换为.s / \%x00 // g。这是管道较少的较短版本:

:exec 'normal i'.substitute(system("date"),"[\n]*$","","")

如果要替换同一行中的各个点,还可以设置标签:

鉴于此第1行:

1 Date: <datehere> and also <datehere>

执行:

:let a=system("date") | exec ".s/<datehere>/".a."/g" | .s/\%x00//g

更换后:

1 Date: jue ago 9 02:34:52 ART 2012 and also jue ago 9 02:34:52 ART 2012

在Vim 7.2上测试


1

您可以在.vimrc中添加此类内容:

" Insert the date in YYYY-MM-DD format inline just before cursor position (normal mode)
nnoremap <Leader>di me:r !date +\%F<CR>A <Esc>0D`ePJx
  • me 标记当前位置。
  • :r !date +\%F<CR>看跌期权的日期在YYYY-MM-DD格式的下一行(你可以,只要你喜欢改变这一点,只是每个逃生%\)。
  • A <Esc> 在日期输出的末尾添加一个空格。
  • 0D 删除日期, `e将您带回到标记的位置,PJx并将日期放在光标之前,加入各行(以摆脱下面的空行)并杀死尾随空格。根据需要修改映射。

如果您想从插入模式进行操作,今天我会阅读 https://vimways.org/2018/the-mapping-business/

inoremap <C-g><C-t> <C-r>=strftime("%F")<CR>

您可以修改日期输出以适合您的需要(man date可以帮助您完成此操作)。


0

在普通模式(退出/提示模式)下粘贴

:exec 'normal i'.system("date \| tr '\n' ' '")

获取插入到当前位置的日期。如果用回车键复制该行,则Shift + Insert会成为您的DateTime-Here命令。

另外,您可以使用以下命令将F12绑定到命令

:inoremap <F12> <C-r>=system("date \| tr '\n' ' '")<CR>

那么您可以在插入模式处于活动状态时使用功能键12插入日期。我用

:inoremap DHRE <C-r>=system("date \| tr '\n' ' '")<CR>

(发现粘贴ADHERE触发后,我从DHERE更改了),因为我已经将F12用于其他用途。

我用

grep -iE "dhere" /usr/share/dict/words

检查与现有单词的明显冲突,这表明您使用起来相对安全:

:inoremap PWD <C-r>=system("pwd \| tr '\n' ' '")<CR>

(除非您正在编写某些文档。)

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.