16

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

:r!date

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

:r!pwd

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

4 ответа4

16

С помощью « :read » Vim всегда вставляет вывод в новую строку. Решение, к сожалению, не простое.

Вы можете вставить вывод команды в текущую позицию курсора, когда находитесь в режиме вставки, нажав Control R, а затем напечатав =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 создает сопоставления, которые выполняются только при вводе в обычном режиме.

Кстати, если вы хотите вставить только дату или текущую рабочую директорию, первоначальный ответ, который я дал, выполним. Просто войдите в режим вставки и введите Control R =strftime('%c') Enter или Control R =getcwd() Enter.

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> помещает дату на следующую строку в формате ГГГГ-ММ-ДД (вы можете изменить это, как хотите, просто экранируйте каждый % с помощью \).
  • 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>

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .