обработка специальных символов при выполнении именованных буферов в vim - PullRequest
2 голосов
/ 11 июля 2010

Я использовал vi на протяжении десятилетий, и теперь я практикуюсь с использованием vim, ожидая, что в конечном итоге перейду на него полностью.У меня есть ряд вопросов, но я начну с того, который беспокоит меня больше всего.Что-то, что я давно сделал в vi, - это введите в файл, который я редактирую, команду нижней строки, перетащите ее в именованный буфер (например, с помощью клавиш "ayy) и выполните этот буфер (используя :@a^M).Это позволяет мне редактировать сложные команды, пока они не будут работать правильно, и сохранять команды, которые я буду использовать много раз при работе в файле.(В моем файле .exrc есть сопоставление, которое сводит это нажатие и выполнение к одному нажатию клавиши; но это не относится к моему вопросу.)

Я считаю, что в vim мне нужно многобольше ^V с чем в vi.Это означает, с одной стороны, что когда у меня есть какая-то командная строка в файле, которую я собираюсь использовать таким образом, мне теперь нужно сохранить ее в двух версиях, одной для vi и одной для vim.Кроме того, требование дополнительных ^V выглядит не элегантным: очевидно, различные специальные символы, которые интерпретируются один раз, когда именованный буфер выполняется в vi, интерпретируются дважды, когда он выполняется в vim - но почему?

Например, команда вида

map =f :w^V|e foo^M

(отображение последовательности нажатия клавиш =f для записи текущего файла и перехода к файлу foo) работает следующим образомв vi, но должен иметь форму

map =f :w^V^V|e foo^V^M

в vim.(Здесь в обеих командах ^ V получается путем ввода ^ V ^ V, а ^ M - путем ввода ^ V ^ M; поэтому для ввода первой версии нужно ввести три ^V s, а вторую - семь.)если быть точным: первая версия работает в vim, если она фактически введена в нижнюю строку (с указанными дополнительными ^V с);но последнее требуется в исполняемом именованном буфере.

Любое объяснение?Что-нибудь, что я могу установить, чтобы это исправить?(«Совместимый», похоже, не делает этого.) Есть ли надежда, что это будет исправлено в следующем выпуске?(Система, на которой я работаю, использует версию 7.0.)

(Я должен признаться, что я не программист; просто пользователь, который стал опытным в vi.)

Ответы [ 2 ]

2 голосов
/ 13 июля 2010

Лично я бы прекратил полностью использовать ^ V. В Vim (я понятия не имею о Vi) есть различные ключевые нотации, которые помогают обойти проблемы, которые у вас возникают. Для вашего конкретного примера я бы порекомендовал:

map =f :w<bar>e foo<CR>

, где <bar> означает «вставить сюда вертикальную черту», ​​а <CR> означает «вставить возврат каретки здесь». См:

:help key-notation

для получения дополнительной информации. Я считаю, <CR> гораздо проще понять, чем ^V^M.

0 голосов
/ 16 июля 2010

Это интересный способ использования :@, о котором я раньше не думал.Обычно я просто использую историю командной строки, когда мне нужно редактировать сложные команды, и я склонен сохранять общие или сложные команды в качестве отображений или команд в моем .vimrc (конечно, у меня есть отображение, которое откроет мой .vimrc вновая вкладка).Но, безусловно, есть преимущества в использовании обычного режима vim, а не режима командной строки для редактирования сложной команды.

Насколько я понимаю, вам нужно не только избегать такого количества символов <C-V>, вы также хотели быиметь возможность использовать одни и те же команды в vim и vi.К сожалению, это лишит вас возможности использовать (предпочтительно в vim) key-notation.Я думаю, что вы сможете использовать режим cmdline Ctrl - R Ctrl - R зарегистрируйтесь , чтобы помочь вам (:help c_<C-R>_<C-R>).Например,

map <Leader>e mm^"ay$`m:<C-R><C-R>a<CR>
  • mm - отметить местоположение курсора, чтобы мы могли вернуться позже
  • ^"ay$ - вернуть текущую строку в регистр a (игнорируя пробелы в начале и в новой строкев конце)
  • `` m` - вернуть курсор в начальную позицию
  • : - войти в режим командной строки
  • <C-R><C-R>a - установить литерал Содержимое регистра a в командной строке, где, похоже, возникла проблема с vim против vi.Я думаю, что <C-R>a даст вам то же поведение, которое вы наблюдаете сейчас с :@a.
  • - выполнить все это

Используя это отображение, я набрал ваш примериз map =f :w^V|e foo^M в файл, поместил мой курсор на эту строку, запустил мое отображение <Leader>e, проверил, правильно ли загружено ваше отображение =f, а затем запустил его.Очевидно, вы захотите настроить его под свои нужды, но я думаю, что игра с <C-R><C-R> в основном даст вам то, что вы хотите.

Все это говорит, если вы можете, я бы настоятельнорекомендую сделать решающий шаг и забыть о совместимости с vi.Тогда вы можете использовать гораздо более простой key-notation и множество других функций vim.: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...