Что такое правильное использование, чтобы обойти vim missing "вставить одну команду char"?
Это, возможно, не очень хороший вопрос для SO, но он прослушивал меня в течение многих лет, и Google не знал, поэтому дайте ему шанс, так как это влияет на мою работу по программированию еженедельно:
Я часто оказываюсь в ситуации, когда отсутствует один char, например "=" вместо "==", недостающее пространство, окружающее что-то с помощью кавычек/скобок и т.д.
Итак, почему vim не имеет правильной команды для вставки одного символа? Я имею в виду, что поддерживает подсчет и повторение с помощью .
.
В чем обоснование, и какова правильная модель использования, которую я пропускаю, что делает эту функцию ненужной? Кажется, мне все время нужно, поэтому должна быть какая-то причина, по которой он не был добавлен в оригинальный vi уже.
Я знаю, что добавление простого базового keybinding, такого как :nmap <Space> i_<Esc>r
, достаточно просто, но при выполнении простое редактирование в новой среде это довольно неудобно, и эта простая версия не работает должным образом.
PS. Если на самом деле это привязка по умолчанию, чтобы вставить только один char с общим количеством двух нажатий клавиш и оставаться в командном режиме, аналогично r
, чтобы заменить один char двумя нажатиями клавиш, я обещаю щедрость 100 к первому ответу который говорит мне, что это такое.
Ответы
Ответ 1
Нет. Для этого нет привязки по умолчанию (do :viusage
для полного списка команд нормального режима).
Если вы хотите знать, почему, вам, наверное, придется спросить Брэма Муленара или Билла Джой.
Но вот идея: r
и s
работают над символом под курсором. То, что они делают, довольно ограничено и одномерно, но как ваша команда будет работать?
Будет ли он работать как i
, вставив этот единственный символ перед текущим символом или он будет работать как a
, вставив этот единственный символ после текущего символа?
Поскольку "вставка текста" может произойти до или после текущего символа, у нас есть i
и a
и, скорее, нам нужны две команды для быстрой вставки одного символа.
Это делает проблему немного более сложной.
Какие ключи мы должны использовать, поскольку все алфавитные клавиши уже приняты? <C-something>
? <C-i>
, и также выполняется <C-a>
. <C-S-i>
и <C-S-a>
являются непрактичными и не гарантированно работают повсюду, и что? <M-something>
? Это не будет работать везде. Может быть, двухсимвольное отображение? Но какой из них и следуя какой мнемонической логике?
Ответ 2
Для меня i <Char> Esc (3 нажатия клавиш без клавиш-модификаторов) довольно короткий и встроенный. Вы уже обнаружили пользовательские сопоставления, которые уменьшают это до двух нажатий клавиш; Я также начал с вашего и со временем сделал его более продвинутым, чтобы удовлетворить моим потребностям, и добавил варианты отображения, чтобы вставить одно место в позицию или после позиции курсора.
Предположительно, нет встроенной команды, поскольку пространство клавиш (особенно для одиночных неперемещенных ключей) очень ограничено, это не оправдывает такое простое пространство, и любая альтернатива с несколькими ключами (например, Vim, которые начинаются с g
) будет бесполезным с точки зрения эффективности.
Ответ 3
Я также боролся с этим вопросом, и я нашел где-то в Интернете (я не могу вспомнить, где) кто-то, кто сделал это:
:nnoremap s :exec "normal i".nr2char(getchar())."\e"<CR>
Это не идеально, потому что он не поддерживает подсчет, но его можно повторить с помощью .
Я использую это сейчас, поэтому, возможно, другие пользователи тоже будут этому довольны.
Ответ 4
:nmap <Space> i_<Esc>r
Теперь, когда в обычном режиме просто нажмите пробел, а затем введите то, что вы хотите вставить.
(Повторение вставки с. не работает)
через