Добавить текст в другой файл из Vim

Я пытаюсь добавить текст из 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, почему бы не использовать его возможности? Откройте файл в буфере, перейдите к первой строке (в случае, если открытие файла восстанавливает другую позицию), добавьте текущую строку перед первой, сохраните, удалите буфер.

phd 13.03.2024 18:29

Я ищу способ сделать это быстро и многократно, с одним и тем же файлом. Предпочтительно, сопоставив его с комбинацией клавиш, как я уже упоминал.

user1788586 13.03.2024 18:39

Я не понимаю, как вызов sed из Vim будет быстрее, чем с использованием самого Vim. Конечно, точные сроки должны быть сопоставлены. Напишите функцию, вызовите ее из любого маппинга сто раз.

phd 13.03.2024 18:41

Я не знаком с функциями vim, но спасибо за совет, я подумаю!

user1788586 13.03.2024 18:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
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 13.03.2024 20:39

@Friedrich Я запускаю vim в rxvt терминалах, никогда не использую вкладки, никогда не использую окна, редко использую разделения. Обычно я открываю 1 или максимум 2 файла и переключаюсь между ними с помощью CTRL-^. Для меня vim — это программируемый текстовый редактор, а не IDE; Запускаю vim, редактирую файл, сохраняю и выхожу. Вместо мандата :update я использую :set hidden. :-)

phd 13.03.2024 21:40

Перемещение комментариев на строку над командами облегчит разборчивость.

romainl 14.03.2024 10:31

@romainl Готово, спасибо!

phd 14.03.2024 11:43

Чтобы предложить альтернативу, использующую буферные функции 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. Эта функция также позволяет избежать побочного эффекта записи текущего буфера.

Другие вопросы по теме