VIM R! в позиции курсора

17

с VIM, если я использую

:r!date

vim вставьте дату в следующую строку, аналогично

:r!pwd

Как я могу вставить выходную команду в позиции курсора и нет в новой строке?

Хуан Пабло
источник
1
vi.stackexchange.com/questions/862/…
Сиро Сантилли 新疆 改造 中 at 法轮功 六四 事件

Ответы:

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.

Heptite
источник
Можно ли связать команды для решения этой проблемы? : г! дата | : - | J or i \ n \ n ^ [-:.! Date \ n -JJ
Роше
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

Crisboot
источник
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>

(Я изменил с DHERE после того, как обнаружил, что вставлено ADHERE), потому что я уже использую F12 для других вещей.

я использую

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

чтобы проверить очевидные конфликты с существующими словами, которые предполагают, что вы относительно безопасны в использовании:

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

(если вы не пишете определенную документацию.)

Алекс Рош
источник