Чи є спосіб виявити, чи записую я в vimscript?


11

Чи є щось подібне

eval("is_recording()")

що я можу зателефонувати у свій vimscript, щоб дізнатись, чи записую я зараз макрос? Я б подумав, що це працює:

eval("mode(1)")

але це просто повертається "n".

Не впевнений, що це має значення, але я використовую neovim, так що якщо це виключно для neovim, це нормально.


3
IMHO, це було б поганою ідеєю - "запис" у такому випадку став би неправдивим ім'ям :) Не знаю, що ви намагаєтесь зробити, але, можливо, питання про це може запропонувати різні способи вирішення.
VanLaser

@VanLaser Що ви маєте на увазі під фальшивим іменем?
Джеймс

1
Якщо дія Vim відрізняється під час її запису, це означає, що сам процес запису впливає на дію, коли він повинен лише "зберігати" її для подальшого повторення. Що ви очікуєте, що станеться під час запуску макроса?
VanLaser

Відповіді:


4

По-перше, я думаю, що ваша проблема - це головним чином проблема XY . Ви повинні дати нам більше інформації про те, що ви намагаєтесь зробити в підсумку, і я думаю, що ми могли б знайти інше рішення.

Тепер ось вирішення, це, мабуть, не ідеально і, звичайно, не дуже надійно, але ви можете додати ці рядки до свого .vimrc:

let g:isRecording = 0
nnoremap Q :call ToggleRecording()<CR>q

function! ToggleRecording()
    let g:isRecording = !g:isRecording
    echo "is recording " . g:isRecording
endfunction

Ідея полягає в тому, що "режим запису" перемикається виключно при натисканні qв звичайному режимі.

Виходячи з цього, ви створюєте змінну, g:isRecordingяка буде перемикатися кожного разу при запуску або зупинці запису. Таким чином, коли ви починаєте записувати, g:isRecordingбуде встановлено значення 1та, 0коли ви припините запис. Потім ви можете отримати доступ до стану запису за допомогою значення змінної.

"Недолік" полягає в тому, що щоб уникнути рекурсивного відображення, вам доведеться використовувати Shit-q для запуску та припинення запису замість q. (Зауважте, що це не така велика проблема: я вже shift-qдеякий час використовую для перемикання режиму запису, оскільки мені не подобається оригінальна shift-qповедінка)

Основна проблема цього рішення полягає в тому, що якщо ви забули про нього і не використовуєте qзмінну, вона не буде змінена, але ви не можете її відключити q(наприклад, за допомогою nnoremap q <nop>), тому що якщо ви зробите це, shift-qбільше не працюватимете.


2

Це досить цікавий запит, оскільки немає "режиму" для запису макросу. Після перекопування деяких документів я знайшов наступне вusr_10

Ви починаєте з переходу до першого символу першого рядка. Далі ви виконайте такі команди:

qa Почніть запис макросу в регістр a .

^ Переміщення до початку рядка.

я # включаю "Вставити рядок #include" на початку рядка.

$ Перемістіть до кінця рядка.

a "Додайте символу подвійного лапки (") до кінця рядка.

j Перехід до наступного рядка.

q Зупиніть записувати макрос.

Мені важливим моментом був рядок про "Почати запис макросу в регістр"

Оскільки кожен макрос буде збережено до реєстру за замовчуванням, я сподівався, що ми зможемо побачити його у :regсписку. Виявляється, це працює як шарм!

Приклад:

У звичайному режимі: qaisomething<Esc>

а всередині :regми бачимо запис!

"a   isomething^[

Маючи ці знання, ви повинні мати можливість "шпигувати" за регістрами, щоб підтвердити, що макрос записується (використовуйте названий реєстр для кожного запису [карта qзавжди використовувати той самий реєстр (або щось подібне)]

Якщо у вас виникли проблеми, дайте мені знати, і я спробую допомогти вам (оскільки ця функціональність і для мене нова: D)

редагувати Для вирішення проблеми використання реєстру, який використовується під час yank, я б рекомендував переглянути спеціальний тип реєстру, який ви можете використовувати лише для vimLнаписаного вами запису (жоден yank ніколи не буде задіяний у реєстрі ( "ay))

Ось трохи інформації :help registersпро доступні регістри

Існує десять типів регістрів: регістри E354

  1. Неназваний реєстр ""

  2. 10 нумерованих регістрів "0 до" 9

  3. Невеликий регістр видалення "-

  4. 26 названих регістрів "a до" z або "A до" Z

  5. три регістри лише для читання ":,"., "%

  6. альтернативний регістр буфера "#

  7. вираз регістра "=

  8. Регістри вибору та падіння "*," + і "~

  9. Регістр чорної діри "_

  10. Останній реєстр шаблонів пошуку "/

Якщо припустити, що у вас є реєстр, який ви зараз будете використовувати, питання стає "як мені знати, коли запис припинився?". Для того, щоб подбати про це я взяти б поглянути на autocmd-eventдля CursorHold; примітка в довідкових документах виглядає досить багатообіцяючою (я б спробував розібратися, як я міг би диференціювати нормальний cursorHold від непрацюючого / неіснуючого події, що відбувається під час запису вашого реєстру для цілей макросу)

CursorHold

Якщо користувач не натискає клавішу протягом часу, визначеного "оновленням часу". Не повторюється, поки користувач не натисне клавішу (тобто не спрацьовує кожен "updatetime" мс, якщо ви залишаєте Vim робити каву. :) Див. | CursorHold-example | для попереднього перегляду тегів. Ця подія запускається лише у звичайному режимі. Він не спрацьовує під час очікування введення аргументу команди чи руху за оператором. Під час запису подія CursorHold не спрацьовує. | q |


Я насправді не бачу, як вона вирішує проблему: коли ви закінчуєте запис макросу, рядок зберігається в реєстрі, але як ви розмежуєте, коли реєстр містить макрос або коли він містить щось, що походить, наприклад, від команди yank. Також реєстр зберігається як один кадр, коли ви закінчуєте запис, тому коли ви бачите, що зміст регістра змінився, ви більше не перебуваєте в режимі запису.
statox

Я сподівався, що вам вдасться використовувати щось на кшталт реєстру чорної дуги (реєстр, який не збирається ніколи витягувати). Якщо у вас реєстр заблокований, тоді ви можете перевірити CursorHold, який має особливу поведінку в режимі запису (оновлю мою відповідь ще деякою інформацією, щоб побачити, чи це вам допомагає)
Ден Бредбері

додано інформацію про інші регістри (спосіб уникнути конфліктів з yank) та підказку про те, як ми могли б упіймати "запис", коли CursorHold не є активним під час запису макросу. Якщо ви все ще боретеся з цим після цих записок, дайте мені знати, і я можу спробувати це здійснити після закінчення роботи. Як зауваження, це blackhole registerзгадувалося лише як підказку та цікавий примхи, що може призвести до чогось (це не було б корисно використовувати під час запису макросів; оскільки @_ не є корисним.) Насправді ви навіть не можете намагатися зберегти макрос до неї ..
Ден Бредбері

Я витратив деякий час на цю останню ніч (повідомлення про розбиття клавіатури пива) і виявив, що неймовірно важко точно зрозуміти, коли запис відбувається і закінчується. Моя думка про, CursorHoldздається, неможлива мрія через відставання CursorHold фактично що відбувається (зробила простий глобальний приріст щоразу, щоб спостерігати за цим). Досі неймовірно зацікавлений придумати спосіб зробити це і продовжуватимуть розбивати моє обличчя проти клавіш, поки ми не знайдемо рішення ..
Ден Бредбері

На мою думку, у вас немає тисячі різних варіантів: ви повинні перекрити поведінку qта змусити її перемикати змінну та починати / зупиняти запис. Автокоманда тут не може бути надійною, оскільки жодне autocmd не спрацьовує при натисканні клавіші, і неможливо здійснити функцію опитування через монорежим Vim. Удачі в майбутніх експериментах :-)
statox
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.