Как удалить косую черту или слово в zsh?

20

Поведение Баш

Я только что мигрировал из bashв zsh. У bashменя была следующая строка ~/.inputrc.

"\e\C-?": unix-filename-rubout

Следовательно, Alt+ Backspaceудалит назад к предыдущему слешу, который был полезен для изменения введенных путей.

Кроме того, по bashумолчанию используется Ctrl+ w delete для предыдущего пробела, что полезно для удаления целых аргументов (при условии, что у них нет пробелов).

Zsh поведение

В zsh, как Alt+ Backspaceи Ctrl+ wделать то же самое. Они оба удаляют предыдущее слово, но они слишком либеральны с тем, что составляет разрыв слова, удаляя до предыдущего -или _. Есть ли способ заставить zshсебя вести себя так же bash? Если это важно, я oh-my-zshустановил.

Sparhawk
источник
1
Вы хотите изменить определение zsh того, что составляет слово? Если это так: unix.stackexchange.com/questions/48577/… Или вы хотите определить новую команду с другим определением слова?
Жиль "ТАК - перестань быть злым"
@ Жиль: Я думаю, сочетание обоих. В bash я бы регулярно использовал две разные команды: т.е. удалить до последнего /и удалить до последнего ``. У них разные функции.
Sparhawk
1
@Gilles Так что да, эта ссылка работает для моего- bashподобного поведения Alt + Backspace, но я все еще хотел бы (другое) bash-подобное поведение Ctrl + w, то есть удаление до последнего пробела.
Sparhawk

Ответы:

14

Изменить: следующий результат Google после вашего вопроса был этот с тем же решением: zsh: заставить ALT + BACKSPACE останавливаться на не буквенно-цифровых символов

Этот ответ был предоставлен /nick FoHиз #zsh на freenode.

backward-kill-dir () {
    local WORDCHARS=${WORDCHARS/\/}
    zle backward-kill-word
}
zle -N backward-kill-dir
bindkey '^[^?' backward-kill-dir

Таким образом, вы можете использовать ctrl+wдля удаления слова (в Vim Lingo) и alt+bkspcудалить слово

JunkMechanic
источник
Brilliant! Спасибо, что нашли время, чтобы исследовать и ответить.
Sparhawk
Re Google: за исключением того, что я задал свой вопрос девять месяцев назад, а они задали их менее месяца назад.
Sparhawk
1
время просто социальный конструкт человек! .. а если серьезно, то справедливо.
JunkMechanic
20

Аналогичный вопрос был задан здесь: zsh: stop backward-kill-word в разделителе каталогов

и приведенное реальное решение: добавьте эти настройки в zshrc:

autoload -U select-word-style
select-word-style bash
Томас Дики
источник
Спасибо за ответ. Однако ни один из этих ответов не работает для меня. (В частности, тот, который вы цитировали, не меняет.) Возможно, это потому, что я oh-my-zshустановил. В любом случае, это не относится к двум различным функциям и привязкам клавиш согласно моему вопросу. (И если бы мой вопрос был дураком, он должен быть закрыт как дурак. А это не так.)
Sparhawk
1
Вам нужно настроить переменную WORDCHARS. В zsh это простоvared WORDCHARS
Jshura
Это будет только дубликат, если мы сопоставим его с ответом на этом форуме.
Томас Дики
@ThomasDickey О да, извинения, я не заметил, что я поменялся местами с SE.
Sparhawk
@Jshura Нет, что касается вопроса, я бы хотел две разные функции, которые возможны в bash.
Sparhawk
5

Расширяя ответ JunkMechanic , я хотел, чтобы

  • существующие ЗШ ярлыки ( CtrlW, Ctrlа Ctrl) работает в ЗШ по умолчанию
  • Alt-На ярлыки ( AltW, Altи Alt) работают так же, но «тонкоуровневого», например , вплоть до ближайшего/

Вот что я использую сейчас:

# Alt+Backspace
backward-kill-dir () {
    local WORDCHARS=${WORDCHARS/\/}
    zle backward-kill-word
}
zle -N backward-kill-dir
bindkey '^[^?' backward-kill-dir


# Alt+Left
backward-word-dir () {
    local WORDCHARS=${WORDCHARS/\/}
    zle backward-word
}
zle -N backward-word-dir
bindkey "^[[1;3D" backward-word-dir

# Alt+Right
forward-word-dir () {
    local WORDCHARS=${WORDCHARS/\/}
    zle forward-word
}
zle -N forward-word-dir
bindkey "^[[1;3C" forward-word-dir
NH2
источник