Відповіді:
З " :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.
Якщо ви хочете його в поточному рядку, ви спробуйте просто, але майте на увазі, що старий вміст рядка буде стертий:
:.!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
Ви можете додати цю річ у свій .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
може допомогти у цьому).
У звичайному режимі (режим втечі / вимикання) вставте
: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>
(якщо ви не пишете певну документацію.)