В VIM, как мне написать все (: ва), но только для не скрытых буферов? - PullRequest
0 голосов
/ 05 октября 2018

Иногда я переключаю ветки Git, не закрывая буфера VIM для файлов, уникальных для текущей ветки.Эти буферы будут скрыты, и я открою новые буферы в разделениях и начну вносить изменения для новой ветви.Вместо :w по отдельности для этих новых буферов, я бы хотел :wa, но это записывает все буферы, включая старые, которые теперь скрыты.

Это расстраивает, потому что записывает эти старые буферы в новые файлы, поскольку они не существуют, загрязняя мою ветку.

Как мне :wa, но только для не скрытых буферовкоторые активно открыты в моих расколах?

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Нет встроенной команды для этого, но создать свою собственную не очень сложно.Буферы имеют атрибуты, и вы ищете те, которые считаются активными , для которых флаг hidden имеет значение false.

Вы можете получить список буферов с помощью getbufinfo().Эта функция возвращает массив словарей, содержащих информацию о буфере.Затем необходимо выполнить итерацию по этим записям и, если они не представляют собой скрытый буфер, выполнить запись (или :update).

Насколько я знаю, нет собственного способа выполнить командув другой буфер без переключения на него.Таким образом, мы вынуждены переключиться на другой буфер для выполнения команды.Это может испортить ваш текущий буфер, но его можно решить, сохранив его перед циклом и восстановив позже.

Следующая функция делает это, и сопровождающая пользовательская команда :Wa просто вызывает его.

function! WriteActiveBuffers()
  " Save current buffer number
  let current = bufnr('%')
  for buffer in getbufinfo({'buflisted':1})
    if !buffer["hidden"]
      " Found an active buffer
      " Switch to it
      execute 'buffer' buffer["bufnr"]
      " Write if modified
      update
    endif
  endfor
  " Restore current buffer
  execute 'buffer' current
endfunction

command! Wa call WriteActiveBuffers()
0 голосов
/ 05 октября 2018

Поскольку все буферы, которые вы хотите записать, отображаются в окнах, вы можете:

:windo w

или немного умнее:

:windo update

См. :help :windo и :help :update.

0 голосов
/ 05 октября 2018

Хм.Немного изменив буквальный вопрос и принимая во внимание вариант использования, я бы посоветовал вам использовать:

autocmd BufEnter * setlocal bufhidden=delete

в вашем .vimrc.Возможно, немного ограничьте *, а затем просто используйте чистый :wa, так как у вас больше не будет скрытых буферов.: |Это может сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...