Чи можу я змусити 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, щоб це зробити тимчасово.
Багатий

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 (якщо це станеться) міститиме цю опцію.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.