Я пытаюсь добавить текст из Vim в другой файл. В частности, текущая строка, но визуальное выделение тоже было бы неплохо. В конце концов я хотел бы сопоставить это с чем-то вроде <leader>i.
В bash для этого я могу использовать следующую команду sed:
sed -i '1i some new text' myfile.md
Итак, я попробовал это изнутри vim:
:execute "!sed -i '1i" .getline('.') "' myfile.md"
Это работает, но когда в текущей строке есть !: shell returned 2.
Затем я узнал о Shellescape и заставил работать следующую команду. Теперь кажется, что я делаю что-то неправильно, экранируя символы, поскольку это добавит одинарные кавычки вокруг строки.
:execute "!sed -i \"1i " . shellescape(getline('.'), 1) . "\" myfile.m
Что мне не хватает? Есть ли способ лучше?
Я ищу способ сделать это быстро и многократно, с одним и тем же файлом. Предпочтительно, сопоставив его с комбинацией клавиш, как я уже упоминал.
Я не понимаю, как вызов sed из Vim будет быстрее, чем с использованием самого Vim. Конечно, точные сроки должны быть сопоставлены. Напишите функцию, вызовите ее из любого маппинга сто раз.
Я не знаком с функциями vim, но спасибо за совет, я подумаю!





function! PrependLine()
" Save the current file to avoid problems with switching buffers
update
" Copy the current line to the default register
yank
" Open a new buffer or switch to exiting one
edit myfile.md
" Paste content of the default register before the 1st line
1put!
" Save the file
update
" Return to the previous file
edit #
endfunction
map <leader>i :call PrependLine()<CR>
Единственная проблема — имя файла фиксировано. Макросы Vim не имеют параметров. Функции есть.
Я бы порекомендовал выработать привычку использовать :nnoremap по умолчанию. И :tabedit может позволить вам открыть второй файл без необходимости :update сначала.
@Friedrich Я запускаю vim в rxvt терминалах, никогда не использую вкладки, никогда не использую окна, редко использую разделения. Обычно я открываю 1 или максимум 2 файла и переключаюсь между ними с помощью CTRL-^. Для меня vim — это программируемый текстовый редактор, а не IDE; Запускаю vim, редактирую файл, сохраняю и выхожу. Вместо мандата :update я использую :set hidden. :-)
Перемещение комментариев на строку над командами облегчит разборчивость.
@romainl Готово, спасибо!
Чтобы предложить альтернативу, использующую буферные функции Vim, вы можете немного изменить пример, приведенный в :help bufadd() . Я взял на себя смелость позаимствовать имя функции из отличного ответа доктора наук.
Я бы предпочел использовать имя файла назначения в качестве аргумента функции, но это во многом зависит от личного вкуса.
function PrependLine(filename) abort
let dstbuf = bufadd(a:filename)
call bufload(dstbuf)
call appendbufline(dstbuf, 0, getline('.'))
endfunction
nnoremap <leader>i <Cmd>call PrependLine('myfile.md')<CR>
Обратите внимание, что это не приведет к записи файла на диск прямо сейчас, а сохранит его открытым как незарегистрированный буфер. Он будет записан только в том случае, если вы это сделаете явно, например. через :wall. Эта функция также позволяет избежать побочного эффекта записи текущего буфера.
Зачем использовать
sedотvim? Вы находитесь в Vim, почему бы не использовать его возможности? Откройте файл в буфере, перейдите к первой строке (в случае, если открытие файла восстанавливает другую позицию), добавьте текущую строку перед первой, сохраните, удалите буфер.