Comment puis-je supprimer une barre oblique ou un mot en zsh?

19

Comportement bash

Je viens de migrer de bashvers zsh. Dans bash, j'avais la ligne suivante ~/.inputrc.

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

Par conséquent, Alt+ Backspacesupprimerait la barre oblique précédente, ce qui était utile pour modifier les chemins d'accès entrés.

De plus, la valeur par bashdéfaut est de faire Ctrl+ w supprimer à l'espace précédent, ce qui est utile pour supprimer des arguments entiers (en supposant qu'ils n'ont pas d'espace).

Comportement Zsh

Dans zsh, Alt+ Backspaceet Ctrl+ wfont la même chose. Ils suppriment tous les deux le mot précédent, mais ils sont trop libéraux avec ce qui constitue un saut de mot, supprimant jusqu'au précédent -ou _. Existe-t-il un moyen de se zshcomporter de manière similaire à bash? Si c'est important, je l'ai oh-my-zshinstallé.

Sparhawk
la source
1
Voulez-vous changer la définition de zsh de ce qui constitue un mot? Si oui: unix.stackexchange.com/questions/48577/… Ou voulez-vous définir une nouvelle commande avec une définition différente du mot?
Gilles 'SO- arrête d'être méchant'
@ Gilles, je suppose une combinaison des deux. En bash, j'utiliserais régulièrement les deux commandes distinctes: c'est-à-dire supprimer jusqu'au dernier /et supprimer jusqu'au dernier ''. Ils ont des fonctions différentes.
Sparhawk
1
@Gilles Alors oui, ce lien fonctionne pour mon bashcomportement Alt + Retour arrière semblable à celui-ci, mais j'aimerais toujours le bashcomportement (différent) semblable à Ctrl + w, c'est-à-dire supprimer jusqu'au dernier espace.
Sparhawk

Réponses:

14

Edit: Le résultat Google suivant après votre question était celui-ci avec la même solution: zsh: arrêtez ALT + RETOUR ARRIÈRE aux caractères non alphanumériques

Cette réponse a été fournie par /nick FoH#zsh sur freenode.

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

De cette façon, vous pouvez utiliser ctrl+wpour supprimer un mot (dans le jargon vim) et alt+bkspcpour supprimer un mot

JunkMechanic
la source
Brillant! Merci d'avoir pris le temps d'enquêter et de répondre.
Sparhawk du
Re Google: sauf que j'ai posé ma question il y a neuf mois, et ils ont posé la leur il y a moins d'un mois.
Sparhawk
1
le temps est juste un homme de construction sociale! .. mais sérieusement, juste point.
JunkMechanic
20

Une question similaire a été posée ici: zsh: stop backward-kill-word on directory delimiter

et une solution réalisable donnée: ajoutez ces paramètres à votre zshrc:

autoload -U select-word-style
select-word-style bash
Thomas Dickey
la source
Merci d'avoir répondu. Cependant, aucune de ces réponses ne fonctionne pour moi. (Plus précisément, celui que vous avez cité ne change rien.) C'est peut-être parce que je l'ai oh-my-zshinstallé. En tout cas, cela ne semble pas aborder les deux fonctions différentes et les raccourcis clavier selon ma question. (Et si ma question était dupe, elle devrait être fermée comme dupe. Ce qui n'est pas le cas.)
Sparhawk
1
Vous devez modifier la variable WORDCHARS. Dans zsh c'est facilevared WORDCHARS
Jshura
Ce ne serait qu'un doublon si nous le comparions à une question avec réponse dans ce forum.
Thomas Dickey
@ThomasDickey Oh oui, excuses, je n'ai pas remarqué que j'avais échangé des sites SE.
Sparhawk
@Jshura Non, selon la question, j'aimerais deux fonctions différentes, ce qui est possible dans bash.
Sparhawk
5

En développant la réponse de JunkMechanic , je voulais que

  • les raccourcis zsh existants ( CtrlW, Ctrlet Ctrl) fonctionnent comme dans les paramètres par défaut de zsh
  • Altbasés sur les raccourcis ( AltW, Altet Alt) fonctionnent de la même manière, mais "à grain plus fin", par exemple jusqu'au/

Voici ce que j'utilise maintenant:

# 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
la source