Переназначить стандартные комбинации

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

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

Аватара пользователя
VoidExp
Сообщения: 208
Статус: Lead guitar adept
ОС: Ubuntu

Переназначить стандартные комбинации

Сообщение VoidExp » 19.06.2010 21:42

Все никак не могу понять, а можно-ли стандартную какую-нибудь клавишную привязку переназначить на свой вкус? Вот например, в визуальном режиме выделения строки (SHIFT-V) когда что-то выделяешь, если нажать на CTRL-D, то курсор становится на страницу вниз и за ним выделяется весь текст. Мне это даром не нужно, я обычно выделяю тупо через SHIFT-V и потом соотвественно J/K, а комбинацией CTRL-D хотелось бы закомментировать выбранные строки... То есть, что-то типа этого:

vmap CTRL-D i/* <ESC>ea */<ESC>
Спасибо сказали:

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

Re: Переназначить стандартные комбинации

Сообщение /dev/random » 20.06.2010 10:24

1) CTRL-D -> <C-d>
2) у вас используются i и a, которые в визуальном режиме, естественно, не работают. Используйте :s/.../.../
Спасибо сказали:

Аватара пользователя
VoidExp
Сообщения: 208
Статус: Lead guitar adept
ОС: Ubuntu

Re: Переназначить стандартные комбинации

Сообщение VoidExp » 20.06.2010 10:45

О втором пункте как-то не особо задумался, извиняюсь за кривизну рук :) А вот первый не очень понятен, то есть чтобы переназначить стандартное CTRL-D (ну, например в нормальном режиме), то достаточно замаппить его на <C-D>?
Спасибо сказали:

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

Re: Переназначить стандартные комбинации

Сообщение ZyX » 20.06.2010 13:56

VoidExp писал(а):
20.06.2010 10:45
О втором пункте как-то не особо задумался, извиняюсь за кривизну рук :) А вот первый не очень понятен, то есть чтобы переназначить стандартное CTRL-D (ну, например в нормальном режиме), то достаточно замаппить его на <C-D>?

Нет, имеется ввиду, что сочетание клавиш Ctrl+D записывается как <C-d>, а не как CTRL-D.
Спасибо сказали:

oprah
Сообщения: 12

Re: Переназначить стандартные комбинации

Сообщение oprah » 13.02.2011 21:23

Здравствуйте! Как по-вашему, почему не удаётся применить назначенную комбинацию imap <C-Space> <C-^> (перекл. языка) во время работы команды r ? В инсерт-режиме работает, но очень нужно в режиме замены.
Заранее спасибо!
Спасибо сказали:

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

Re: Переназначить стандартные комбинации

Сообщение ZyX » 14.02.2011 06:04

oprah писал(а):
13.02.2011 21:23
Здравствуйте! Как по-вашему, почему не удаётся применить назначенную комбинацию imap <C-Space> <C-^> (перекл. языка) во время работы команды r ? В инсерт-режиме работает, но очень нужно в режиме замены.
Заранее спасибо!

r (маленькая) — это не режим замены.
Спасибо сказали:

oprah
Сообщения: 12

Re: Переназначить стандартные комбинации

Сообщение oprah » 14.02.2011 09:54

ZyX писал(а):
14.02.2011 06:04
r (маленькая) — это не режим замены.

Хорошо, пусть не режим, тогда можно к команде r относиться как к режиму ожидания?
Спасибо сказали:

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

Re: Переназначить стандартные комбинации

Сообщение ZyX » 14.02.2011 23:05

oprah писал(а):
14.02.2011 09:54
ZyX писал(а):
14.02.2011 06:04
r (маленькая) — это не режим замены.

Хорошо, пусть не режим, тогда можно к команде r относится как к режиму ожидания?

Нет. В отличие от различных операторов (например, y), после которых идёт т.н. operator-pending режим, после r технически никакого режима не идёт. Возможны способы обхода:

1. Использовать getchar() и maparg() (я не знаю, почему, но если просто трогать iminsert, то ничего не работает. Скорее всего, после r идёт что-то более сложное, чем getchar() и, соответственно, символ превращается во что-то другое до попадания оператору.):

(Created by format.vim)

function! Replace() let char=getchar() if type(char)==type(0) let char=nr2char(char) endif if char==#"\<C-^>" let &iminsert=!&iminsert return Replace() endif if &iminsert && !empty(maparg(char, 'l')) let char=maparg(char, 'l') endif return 's'.repeat(char, v:count1)."\e" endfunction nnoremap <expr> r Replace()


2. Использовать nnoremap r<C-^> i<C-^><Esc>r (но при этом вводить <C-^> придётся довольно быстро).
3. Использовать другую команду для замены на русский текст (например, моё дополнение translit3 определяет команду \tr).
Спасибо сказали:

oprah
Сообщения: 12

Re: Переназначить стандартные комбинации

Сообщение oprah » 15.02.2011 10:14

ZyX писал(а):
14.02.2011 23:05
2. Использовать nnoremap r<C-^> i<C-^><Esc>r (но при этом вводить <C-^> придётся довольно быстро).

Получается только ^^, как ни переставляй.

ZyX писал(а):
14.02.2011 23:05
1. Использовать getchar() и maparg() (я не знаю, почему, но если просто трогать iminsert, то ничего не работает. Скорее всего, после r идёт что-то более сложное, чем getchar() и, соответственно, символ превращается во что-то другое до попадания оператору.):

(Created by format.vim)

function! Replace() let char=getchar() if type(char)==type(0) let char=nr2char(char) endif if char==#"\<C-^>" let &iminsert=!&iminsert return Replace() endif if &iminsert && !empty(maparg(char, 'l')) let char=maparg(char, 'l') endif return 's'.repeat(char, v:count1)."\e" endfunction nnoremap <expr> r Replace()


Это работает чудесно, слов нет! Даже можно привыкнуть к прыганью курсора в ком. строку.
И, заменив char на C-Space, работает. Ещё одна мечта сбылась, спасибо!

________________________________________________________________________
Это, наверно, стоит донести до общественности. С такой формулировкой:
возможность переключения языка ввода во время работы команды r.

И добавить в прикреплённую тему.
Спасибо сказали: