Могу ли я сделать так, чтобы Vim также сохранял «небольшие удаления» в регистре «1?

14

Недавно я удалил плагин YankRing из моей установки отчасти потому, что он вызывал некоторые проблемы с макросами, но в основном потому, что я решил, что будет лучше научиться использовать регистры Vim вместо этого - в частности, способ, которым удаленный текст изначально сохраняется в регистре "1и затем сдвинуты вверх через "2, "3и т.д. , как сделаны дальнейшие делеции очень полезно.

Однако, когда удаление / изменение удаляет менее одной строки текста, оно вместо этого сохраняется в "-небольшом регистре удаления (с некоторыми исключениями для некоторых команд перемещения). Если последующие небольшие удаления сделаны, этот бит текста теряется.

Можно ли заставить Vim хранить все удаления в реестре "1?

nnoremap d "1d почти работает, но вы в конечном итоге с текстом в обоих регистрах "1 и "2 .

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

Богатый
источник

Ответы:

10

Раньше это работало в более старых версиях Vim 7.3, когда вы :set clipboard=unnamed(см. Это обсуждение Reddit , в результате ошибки, о которой я сообщил здесь) .

Эта ветка содержит патч Aryeh Leib Taurog, который вводит 'regone'опцию. Это вошло в (слишком длинный) список задач, но вряд ли скоро будет включено. Таким образом, в настоящее время у вас есть только возможность перейти на устаревшую версию Vim или собрать Vim самостоятельно с этим патчем (и добиваться принятия в списке рассылки vim_dev ).

Инго Каркат
источник
1
Интересный! (Особенно твое представление о пороге.) Спасибо за информацию. Собираюсь пока воздержаться от принятия / принятия, пытаясь убедить кого-то придумать какой-нибудь сумасшедший VimScript, чтобы сделать это в промежуточный период.
Rich
5

У меня есть пробное решение, которое работает для dкоманды с движениями и в визуальном режиме. Это еще не полностью надежное решение (например, d[count]dне работает и не работает [count]D), но оно почти полностью охватывает все мои реальные случаи использования.

Он работает, устанавливая функцию оператора клиента, которая:

  1. сохраняет содержимое регистров 1–8 в словаре,
  2. выполняет удаление в регистр 1,
  3. устанавливает регистры 2–9 на ранее сохраненное содержимое регистров 1–8.

Смотрите :help map-operatorобъяснение того, как работают операторские функции.

function! ShiftingDeleteOperator(type)
  let reg_dict = {}
  for k in range(1, 8)
    execute printf("let reg_dict[%d]=getreg('%d', 1)", k, k)
  endfor

  if a:type ==# 'v'
    execute 'normal! `<v`>d'
  elseif a:type ==# 'V'
    execute 'normal! `<V`>d'
  elseif a:type ==# "\<C-V>"
    execute "normal! `<\<C-V>`>d"
  elseif a:type ==# 'char'
    execute 'normal! `[v`]d'
  elseif a:type ==# 'line'
    execute "normal! '[V']d"
  else
    return
  endif

  let deleted = getreg('"', 1)
  call setreg(1, deleted)

  for [k, v] in items(reg_dict)
    execute printf("call setreg(%d, v)", k + 1)
  endfor
endfunction

" Call the function for d{motion} via operatorfunc
nnoremap <silent> d :set operatorfunc=ShiftingDeleteOperator<CR>g@
" Call the function when d or x are hit in visual mode
vnoremap d :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
vnoremap x :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
" Use the d{motion} as defined above to add limited support for `D` command
nmap D d$
" Use the standard dd command
nnoremap dd dd 
Богатый
источник
Извините за комментирование старого ответа. Я принял это решение yи, cно cмой nvim не входит в режим вставки после действия ... В настоящее время я должен, execute lи startinsertэто не является правильным исправлением (как c$бы поставить курсор в неправильное положение). Есть идеи?
Солнечный Пан
2

Посмотрите Запрос на извлечение в редакторе neovim :

[RFC] Добавить опцию для использования нумерованных регистров для небольших удалений # 8169

Я попытался добавить smalldelопцию, которая позволяет вам настроить минимальное количество удаленных символов, которые будут помещены в пронумерованные регистры "1 .." 9

Следующий выпуск neovim после слияния PR (если это произойдет) будет содержать эту опцию.

Himura
источник