6

Среди множества полезных сочетаний клавиш, доступных в оболочке bash, есть Ctrl - W, чтобы удалить слово слева от курсора. Давайте предположим, что моя командная строка выглядит следующим образом:

cp some-file /foo/bar/baz/copy

Теперь я ожидаю, что смогу нажать Ctrl - W и в итоге получится следующее:

cp some-file /foo/bar/baz/

В командной строке Vim это действительно работает следующим образом: только буквенно-цифровые символы рассматриваются как "слово", тогда как специальные символы (например, /) служат разделителями, обозначающими начало нового "слова".

Но, к сожалению, это не работает так во всех оболочках, которые я использовал до сих пор. Только пробелы будут разделять "слово", поэтому нажатие ярлыка с командной строкой, показанной выше, даст мне:

cp some-file

Есть ли способ заставить Bash вести себя как Vim? Какую-нибудь конфигурацию я могу вставить в мой .bashrc?

3 ответа3

11

Это не имеет никакого отношения к Vim, все редакторы ведут себя таким образом (включая emacs), они рассматривают несловарные символы как разделители. В любом случае, поведение, о котором вы говорите, контролируется readline и в его руководстве перечислены довольно много команд, которым вы можете назначить ярлыки. Я вставляю несколько соответствующих здесь, но я рекомендую вам прочитать man readline для получения дополнительной информации:

   backward-word (M-b)
          Move  back  to  the  start  of the current or previous word.  Words 
          are composed of alphanumeric characters (letters and digits).

   kill-line (C-k)
          Kill the text from point to the end of the line.
   kill-word (M-d)
          Kill from point the end of  the  current  word,  or  if  between
          words,  to  the  end  of the next word.  Word boundaries are the
          same as those used by forward-word.
   backward-kill-word (M-Rubout)
          Kill the word behind point.  Word boundaries  are  the  same  as
          those used by backward-word.
   unix-word-rubout (C-w)
          Kill  the  word behind point, using white space as a word bound‐
          ary.  The killed text is saved on the kill-ring.
   unix-filename-rubout
          Kill the word behind point, using  white  space  and  the  slash
          character  as  the word boundaries.  The killed text is saved on
          the kill-ring.

Таким образом, вы хотите использовать backward-kill-word , которое использует не буквенно-цифровые символы в качестве границ слов. По умолчанию он назначен Alt+Backspace, но вы можете изменить это с помощью глобального /etc/inputrc если вы хотите, чтобы они применялись ко всем пользователям, или (лучше) вашего локального $HOME/.inputrc .

Насколько я могу судить, Ctrl+W зарезервирован, и вы не можете использовать его, но вы можете выбрать другой ярлык, например, Ctrl+J. Создайте файл $HOME/.inputrc если он не существует, и добавьте в него следующую строку:

Control-J: backward-kill-word 

Этого должно быть достаточно для большинства современных эмуляторов терминала. Однако некоторые старые терминалы используют разные коды. Например, если вы используете xterm , строка выше должна быть записана как:

C-J: backward-kill-word 
5

Вы можете включить так называемый "режим vi" readline (и, следовательно, bash), поместив следующие строки в ~/.inputrc и запустив новую оболочку:

set editing-mode vi
set keymap vi-command

Но вы заметите, что <C-w> работает так же, как и в режиме Emacs по умолчанию: слова разделяются пробелом. Вы можете сделать dT/ или аналогичные команды, хотя. Это все еще эмуляция, а не реальная сделка. Доступные сопоставления перечислены в руководстве readline:

$ man readline
/VI

Смотрите также эту страницу в Вики Vim.

Но я не думаю, что режим vi в readline настолько полезен, если вам часто нужно серьезно редактировать командную строку… почему бы не использовать Vim по-настоящему?

<C-x><C-e>
1

Есть два варианта, о которых я знаю, хотя ни один из них не выполняет то, что вы просите.

  1. установите bash для использования режима vi, где подсказка ведет себя как строка в vi. Команда set -o vi . Ссылка: BASH Help - Руководство по Bash
  2. Добавьте карты ключей vi в текущее приглашение оболочки. Ссылка: StackOverflow: Что делает набор ключей VI?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .