Копировать и устанавливать метки в Bash как в Emacs?

16

Я хотел бы иметь возможность копировать и вставлять текст в командной строке Bash , используя те же привязки клавиша , что Emacs использует по умолчанию (то есть , используя C-spaceдля set-mark, M-wчтобы скопировать текст, C-y, M-yчтобы вставить его, и т.д.).

В документации GNU Bash говорится, что Bash поставляется с некоторыми из этих привязок клавиш, настроенных по умолчанию.

Например, yanking ( C-y) работает по умолчанию на моем терминале. Тем не менее, я не могу получить set-markи copyкоманды для работы, и они , кажется, не быть связаны с любыми ключами по умолчанию.

Обычно пользователь может определить свои собственные привязки клавиш, чтобы добавить их .inputrc. Поэтому я посмотрел и нашел следующие функции bash в документации, которая, как я полагаю, может помочь мне определить поведение, подобное Emacs, которое я хочу (то есть set-markс C-spaceи copyс M-w).

copy-region-as-kill ()

Скопируйте текст в области в буфер уничтожения, чтобы его можно было сразу же восстановить. По умолчанию эта команда не связана.

и

set-mark (C-@)

Установите отметку в точку. Если указан числовой аргумент, отметка устанавливается на эту позицию.

Если я правильно понимаю, вышеуказанные средства, copy-region-as-killне связанные с какой - либо последовательностью клавиатуры по умолчанию, в то время как set-markобязаны C-@по умолчанию.

Я попробовал C-@на своем терминале, но я не думаю, что он работает, set-markпотому что я не вижу никакого текста, выделенного, когда я двигаю свой курсор. В любом случае, я пытался добавить привязки клавиатуры ( M-wи C-) к функциям copy-region-as-killи set-markвыше в моем, .inputrcа затем перезагрузить его C-x C-r, но это не сработало. Я знаю, что мои другие записи в .inputrcработе, потому что у меня есть другие определенные пользователем сочетания клавиш, определенные в нем.

Что-то я делаю не так? Я что-то упустил?

Амелио Васкес-Рейна
источник
Какую версию bashи какую терминальную программу вы используете?
Микель
Я использую GNU bash, версия 3.1.17 (1) -релиз (x86_64-redhat-linux-gnu) на терминале gnome (также на терминаторе)
Амелио Васкес-Рейна

Ответы:

11

Это не выделяет выбор, но в остальном я думаю, что он работает нормально.

Попробуйте запустить

$ bind -p | grep copy-region-as-kill

чтобы убедиться, что на C-x C-rсамом деле работает.

Следует сказать:

"\ew": copy-region-as-kill

После этого все должно работать нормально.

Пример:

$ abc<C-Spc><C-a><M-w> def <C-y>

дает мне

$ abc def abc

Если вы когда-нибудь захотите узнать, где markнаходится, просто сделайте C-x C-x.

Пример:

$ <C-Spc>abc<C-x><C-x>

вернет курсор туда, где вы установите метку (начало строки).

Кроме того, я не думаю, что вам нужно добавлять set-markпривязку. Я не

$ bind -p | grep set-mark
"\C-@": set-mark
"\e ": set-mark
# vi-set-mark (not bound)

(обратите внимание, что большинство терминалов отправляет, C-@когда C-Spcнажата. Я полагаю, что ваш делает тоже.)

Если все это не удается:

  • делает Ctrl+ Spaceработу emacs -nwна том же терминале?
  • другие Alt/ Metaярлыки работают в Bash?
Mikel
источник
1
Благодарность! У меня было "Mw" вместо "\ ew" в .inputrc. Отсутствие подсветки также смутило меня. Кстати, спасибо за указатель на команду bind. Теперь это работает как шарм!
Амелио Васкес-Рейна
2
Добро пожаловать! Да, ты должен написать \eили \M-. Смотрите readline синтаксис файла инициализации .
Микель
Какой отличный ответ! Благодарю. Это прояснило подобные проблемы для меня: D
ephsmith
set-mark и copy-region-as-kill работают тихо, могу ли я выделить регион (как в emacs)?
мош
4

Я также связываю Cw для kill-region . Вот мой .inputrc:

# См. Http://lists.gnu.org/archive/html/bug-bash/2009-03/msg00033.html
отключить bind-tty-special-chars

# Определите мои любимые привязки клавиш Emacs.
"\ C- @": установить отметку
"\ Cw": kill-region
"\ Mw": копировать регион как убить
"\ M- /" dabbrev-expand
gavenkoa
источник