Не работает команда :normal "+y (для клавиш Ctrl C)

и другие vi-подобные редакторы

Модератор: /dev/random

Аватара пользователя
ArkanJR
Сообщения: 1128

Не работает команда :normal "+y

Сообщение ArkanJR »

Назначил клавиши Ctrl A для выделения всего текста; Ctrl С для вставки выделенного текста в буфер обмена, Ctrl V для вставки текста из буфера обмена:

Код: Выделить всё

"Выделение всего текста клавишами Ctrl A
map! <C-A> <C-o>:normal ggVG<CR>
imap <C-A> <C-o>:normal ggVG<CR>

"Копирование выделенного текста в буфер обмена клавишами Ctrl C
map! <C-C> <C-o>:normal "+y<CR>
imap <C-C> <C-o>:normal "+y<CR>

"Вставка текста из буфера обмена клавишами Ctrl V
map! <C-V> <C-o>:normal "+gP<CR>
imap <C-V> <C-o>:normal "+gP<CR>

Но команда :normal "+y для клавиш Ctrl C почему-то не работает. Подскажите, пожалуйста, в чём тут дело?
— Да, это была ошибка, Кемп, огромная ошибка, что я взялся один за это дело. Напрасно потрачены силы, время, возможности. Один… Удивительно, как беспомощен человек, когда он один! Мелкая кража, потасовка — и всё.

© Г. Уэллс "Человек-невидимка"
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 5103
ОС: Gentoo

Re: Не работает команда :normal "+y

Сообщение /dev/random »

map! - это мэппинг для нормального режима для командного режима и вставки, imap - режима вставки. При этом если у вас что-то выделено, то вы находитесь в визуальном режиме.

Upd: как написали ниже, я неправильно указал значение "map!". Исправил.
Спасибо сказали:

Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Не работает команда :normal "+y

Сообщение ZyX »

Во‐первых, никогда не используйте map и normal, если не можете внятно объяснить, почему вы собираетесь использовать их, а не noremap и normal!. Во‐вторых, уберите map!, эта команда ничего полезного у вас не делает, поскольку в командном режиме <C-o> ничего не делает, а режим вставки уже будет покрыт inoremap. В‐третьих, прочитайте наконец про режимы. normal! запускает команду в нормальном режиме, V переходит в визуальный, а inoremap определяет команду в режиме вставки. Разумеется, ничего не работает. Не пытайтесь использовать привязку для режима вставки в визуальном режиме.

И не используйте <C-o>:normal "+gP<CR> для вставки: после <C-o> вы уже в нормальном режиме (точнее в нормальном режиме для одной команды), :normal вам не нужен совершенно: просто уберите и его, и <CR> и всё будет так же работать. В inoremap <C-a> <C-o>:normal! ggVG<CR> эта команда тоже в принципе не нужна: просто используйте два <C-o>:

(Created by format.vim)

inoremap <C-a> <C-o>gg<C-o>VG xnoremap <C-c> "+y inoremap <C-v> <C-o>"+gP



И ещё: если вам нужны эти привязки в режиме вставки, то вы совершенно точно используете Vim неправильно.

/dev/random писал(а):
09.01.2015 18:45
map! - это мэппинг для нормального режима, imap - режима вставки. При этом если у вас что-то выделено, то вы находитесь в визуальном режиме.

map! — это привязка для режима вставки и командного режима одновременно. Она абсолютно никак не относится к нормальному режиму. Без восклицательного знака эта команда тоже не для нормального режима, а сразу для четырёх: нормального, визуального, выделения и режима ожидания оператора.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 5103
ОС: Gentoo

Re: Не работает команда :normal "+y

Сообщение /dev/random »

ZyX писал(а):
09.01.2015 19:04
map! — это привязка для режима вставки и командного режима одновременно. Она абсолютно никак не относится к нормальному режиму. Без восклицательного знака эта команда тоже не для нормального режима, а сразу для четырёх: нормального, визуального, выделения и режима ожидания оператора.

Упс. Да, перепутал.
Спасибо сказали:

Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Не работает команда :normal "+y

Сообщение ZyX »

/dev/random писал(а):
09.01.2015 18:45
map! - это мэппинг для нормального режима, imap - режима вставки. При этом если у вас что-то выделено, то вы находитесь в визуальном режиме.

И у Vim есть режим выделения и визуальный режим. Если у человека что‐то выделено, то он может быть в любом из них, хотя визуальный и наиболее вероятен.
Спасибо сказали:

Аватара пользователя
ArkanJR
Сообщения: 1128

Re: Не работает команда :normal "+y

Сообщение ArkanJR »

ZyX писал(а):
09.01.2015 19:04
И ещё: если вам нужны эти привязки в режиме вставки, то вы совершенно точно используете Vim неправильно.

Можно поподробнее?
— Да, это была ошибка, Кемп, огромная ошибка, что я взялся один за это дело. Напрасно потрачены силы, время, возможности. Один… Удивительно, как беспомощен человек, когда он один! Мелкая кража, потасовка — и всё.

© Г. Уэллс "Человек-невидимка"
Спасибо сказали:

Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Не работает команда :normal "+y

Сообщение ZyX »

ArkanJR писал(а):
09.01.2015 19:17
ZyX писал(а):
09.01.2015 19:04
И ещё: если вам нужны эти привязки в режиме вставки, то вы совершенно точно используете Vim неправильно.

Можно поподробнее?

Основная идея Vim в том, что определённый тип работы должен выполняться в определённом режиме. Режим вставки нужен только для написания текста, визуальный режим — для операций над (выделенными) блоками текста, …. Навигация, копирование, вставка, удаление (за исключением удаления недавно введённого текста), … — это всё операции нормального режима. Vim несколько менее строг в этом отношении, чем Vi (в котором никакого <C-o> нету, судя по http://pubs.opengroup.org/onlinepubs/96999...ilities/vi.html, равно как и настройки 'insertmode'), но основная идея никуда не делась.
Спасибо сказали: