Использование сопоставлений vim в обычном :терминальном режиме

Примерно так:

# `time` will give the total time
time parallel -j0 --joblog mylog rclone sync {} NoTDE_Mig1:IC_dbbackup_config_datapump_v00rcfh_iad3p2 ::: /u05/expdpdump/exppdb/dir{1,2}/*.dmp
# the log contains the time per file
cat mylog 

В зависимости от ваших дисков вы можете повысить производительность, если не будете выполнять все команды параллельно. Вы ограничиваете количество параллельно выполняемых заданий до 5, заменяя -j0на -j5.

2
17.05.2020, 17:01
1 ответ

Vim не может точно сказать, работает ли оболочка bash внутри его терминала в режиме вставки vi -или в обычном режиме vi -. Фактически, он даже не может сказать, использует ли он режим vi или emacs. Или в некоторые моменты, когда вы запускаете команду внутри bash, даже нет смысла говорить о том, находится ли bash в режиме вставки или в обычном режиме, поскольку технически он не находится ни в том, ни в другом...

Таким образом, для достижения такого рода интеграции, вам нужно, чтобы bash сообщал Vim о том, в каком режиме он находится , или аналогичным образом, чтобы bash интерпретировал привязки клавиш -и вызывал Vim команды из bash при нажатии специальных клавиш .

Лично я думаю, что последнее проще всего сделать привязкой клавиш в bash, так как в последний раз, когда я смотрел, не было действительно надежного способа подключиться к изменению режима из bash или даже надежно определить, когда новая команда была собираются казнить. (В этом смысле zsh кажется намного лучше, чем bash, у него больше хуков, и их, как правило, проще использовать.)

Другая часть, отсутствующая здесь, — это вызов команд Vim из оболочки, работающей внутри терминала Vim. Вы можете сделать это, используя терминал -API , который позволяет вам использовать управляющую последовательность из bash для вызова функции в Vim.

Для привязок bash см. команду bind. Думаю, вы можете передать ей -m, чтобы создать привязку для определенного режима (, например, vi -нормальный ), и вы можете использовать -xдля выполнения некоторого кода (или функции )при вводе определенной комбинации клавиш.

Например, это приведет к тому, что<Tab>(будет таким же, как Ctrl+I )вызывать функцию wincmd_next()при нажатии в режиме vi(, что соответствует «нормальному» режиму vi в строке чтения ):

. ]
bind -m vi -x '"\C-i": wincmd_next'

Для API терминала Vim можно экспортировать Tapi_wincmdфункцию, которую можно вызывать из оболочки.Затем из bash вы сможете использовать:

echo -ne '\e]51;["call","Tapi_wincmd",["w"]]\a'

Так что просто превратите это в функцию wincmd_next:

wincmd_next () {
    echo -ne '\e]51;["call","Tapi_wincmd",["w"]]\a'
}

Затем вы можете написать соответствующую функцию Vim:

function! Tapi_wincmd(bufnum, arglist)
    execute 'wincmd' a:arglist[0]
endfunction

Таким образом, приведенная выше команда bash заставит Vim перейти к следующему окну.

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

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


Альтернативой этому подходу является использование :tnoremapдля перехвата нажатий клавиш всякий раз, когда они отправляются приложению, запущенному на терминале, будь то bash в обычном режиме vi -, bash в vi -вставка режим или другое приложение в целом.

Как вы упомянули в вопросе, вы можете настроить это с помощью:

tnoremap <Tab> <C-w>w

Но это не оставляет вам возможности использовать настоящую вкладку в терминале, что может быть полезно при завершении в режиме vi -insert (или emacs ).

Это можно обойти, сопоставив другое нажатие клавиши для отправки фактической вкладки в терминальное приложение, например, одно из:

tnoremap <S-Tab> <Tab>      " Shift-Tab
tnoremap <C-v><Tab> <Tab>   " Ctrl-V, Tab
tnoremap <C-P> <Tab>        " Ctrl-P
2
28.04.2021, 23:13

Теги

Похожие вопросы