путание поведения привязок клавиш emacs-стиля в ударе

Я просто сделал это, в VMware, с CentOS 6.4. Ответ номер 1 корректен, но пропускает один шаг, который я обнаружил.

В Gparted мой также имел значок блокировки.

На строке с разделом, который имеет значок блокировки, щелкают правой кнопкой, и выбор "деактивируются". Это заставляет блокировку уйти.

Затем можно щелкнуть правой кнопкой и изменить размер раздела.

Затем примените изменение.

Затем щелкните правой кнопкой, и выбор "активируются".

5
25.06.2015, 05:49
3 ответа

В разных командах bash используются разные понятия слова. Проверьте описание каждой команды в руководстве .

C-w уничтожает предыдущий пробел. M-DEL (обычно Alt + BackSpace ) убивает границу предыдущего слова, где слова содержат только буквы и цифры (то же самое, что Mb ] и Mf ), и Md убивает нападающих аналогичным образом.

Bash использует библиотеку Readline для обработки пользовательского ввода и может быть настроен либо через ~ / .inputrc , либо через bind , встроенный в ~ / .bashrc ]. Вы можете привязать ключ к другой команде readline , если хотите. Вы также можете использовать bind -x для привязки ключа к функциям bash, которые изменяют переменную READLINE_LINE .

Например, чтобы заставить Md убить слово оболочки, привяжите его к shell-kill-word в вашем .bashrc :

bind '"\M-d": shell-kill-word'

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

delete_whitespace_word () {
  local suffix="${READLINE_LINE:$READLINE_POINT}"
  if [[ $suffix =~ ^[[:space:]]*[^[:space:]]+ ]]; then
    local -i s=READLINE_POINT+${#BASH_REMATCH[0]}
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${READLINE_LINE:$s}"
  fi
}
bind -x '"\ed": delete_whitespace_word'

Заставить M-d уничтожить слово, разделенное пробелами, сложнее, потому что, насколько мне известно, нет способа получить доступ к кольцу уничтожения из кода bash. Таким образом, для этого требуется функция, чтобы найти конец части, которую нужно убить, и макрос, чтобы следовать за этим фактическим уничтожением.

forward_whitespace_word () {
  local suffix="${READLINE_LINE:$READLINE_POINT}" 
  if [[ $suffix =~ ^[[:space:]]*[^[:space:]]+ ]]; then
    ((READLINE_POINT += ${#BASH_REMATCH[0]}))
  else
    READLINE_POINT=${#READLINE_LINE}
  fi
}
bind -x '"\C-xF": forward_whitespace_word'
bind '"\C-x\C-w": kill-region'
bind '"\ed": "\e \C-xF\C-x\C-w"'

Все это было бы намного проще в zsh.

5
27.01.2020, 20:36

Это результат того, как строка чтения обрабатывает «слова». Alt d - это сокращение для kill-word :

Убить от точки до конца текущего слова или, если между словами, до конца следующего слова . Границы слов такие же, как и в M-f (прямое слово).

Границы слов в переднем слове определены следующим образом:

Слова состоят из букв и цифр.

В то время как Ctrl w - это ярлык для unix-word-rubout :

Убить слово за точкой, используя пробел в качестве границы слова .

Итак, чтобы использовать ваш пример foo.bar , первая команда обрабатывает строку как два «слова», разделенных . , в то время как второй не видит пробелов, поэтому рассматривает его как одно «слово».

1
27.01.2020, 20:36

ReadLine уже имеет VI-FWORD и VI-BWORD , который использует пробел в качестве границ слов, поэтому нет необходимости в функциональности Word_WhiteSpace_words .

VI-FWORD , а затем Unix-Word-RUBOUT ( \ C-W ) Удаляет слово для разграниченного пробела в обратном направлении (включая конечные пробелы).

bind '"\eb":vi-bword'
bind '"\ef":vi-fword'
bind '"\ed":"\ef\C-w"'

VI-обратное слово - псевдоним для VI-BWORD , VI-Word-word - псевдоним VI-FWORD , VI-Backward-Bigword является псевдоним для VI-BWORD , а VI-Fiver-Bigword - псевдоним VI-FWORD Отказ

2
27.01.2020, 20:36

Теги

Похожие вопросы