J'ai la ligne suivante init.el
:
(global-set-key [(control \;)] 'comment-region)
Cela fonctionne très bien dans la fenêtre GUI, mais si emacs
est invoqué avec l' -nw
option alors C-;ne commente pas la région, insère seulement le ;
caractère. M-x comment-region RETfonctionne bien cependant.
J'ai essayé de suivre cette réponse sur un problème similaire, mais C-q C-;revient juste ;
et je ne veux évidemment pas me lier nu ;
.
Comment obtenir l'effet souhaité?
key-bindings
terminal
WeSenseASoulInSearchOfAnswers
la source
la source
C-;
combo, puis utilisezM-x view-lossage
pour voir s'il arrive même à Emacs.gnome-terminal
etM-x view-lossage
renvoie:ESC [ > 1 ; 2 8 0 2 ; 0 c ; ESC x v i e w - l o s s a g e RET
C-;
plutôt àc ;
(ou, du moins, je reçoisC-;
).Réponses:
Tout d'abord, le problème plus général: les émulateurs de terminaux sont souvent limités dans les séquences de contrôle et d'échappement qu'ils peuvent envoyer. Donc: il se peut que le terminal avale vos caractères spéciaux avant qu'ils n'atteignent Emacs. En tant que diagnostic général, vous pouvez appuyer sur
C-h l
(ouM-x view-lossage
) pour voir si vos combinaisons de touches en font Emacs.Pour plus de discussion sur ce problème, consultez ce fil de débordement de pile et les liens qui s'y trouvent.
Pour résumer le va-et-vient dans les commentaires, votre problème spécifique suggère que c'est le terminal plutôt que Emacs qui est le problème. Lorsque vous avez essayé
C-;
puisM-x view-lossage
, vous avez obtenublah blah blah c ; ESC v i e w - l o s s a g e RET
. Cela ressemble à un problème de terminal: si la combinaison de touches atteignait Emacs, lac ;
pièce ressembleraitC-;
.la source
Dans Shift + Up n'est pas reconnu par Emacs dans un terminal, j'explique comment les terminaux traduisent la plupart des touches de fonction en séquences d'échappement, car l'interface entre les applications et les terminaux transmet des caractères (ou plutôt des octets), pas des clés. Seules quelques combinaisons modificateur + personnage ont leur propre caractère:
@[\]^_
tours en octets 0–31 (caractères de contrôle ASCII ).Qu'en est-il des autres combinaisons telles que Ctrl+ ;ou Ctrl+ Shift+ letter? Puisqu'il n'y a pas de caractère correspondant, le terminal doit soit réutiliser un caractère, soit envoyer une séquence d'échappement. De nombreux terminaux ignorent les modificateurs lorsqu'il n'y a pas de caractère correspondant, vous vous retrouvez donc avec Ctrl+ ;envoi
;
, Ctrl+ Shift+ letteréquivalent à Ctrl+ letter, etc.Les vendeurs de terminaux ont continué à faire la chose simple pendant longtemps. Il n'y avait pas de norme pour les séquences d'échappement, qui se perpétuait - les fournisseurs de terminaux ne l'implémentent pas, les applications ne la prennent pas en charge, les utilisateurs ne s'y attendent pas. Certains émulateurs de terminaux peuvent être configurés pour envoyer des séquences d'échappement arbitraires, donc si le vôtre le peut, vous pouvez le configurer et déclarer les séquences d'échappement à Emacs (plus de détails plus loin).
Dernièrement, la situation évolue, car il y a eu deux propositions de standardisation des séquences d'échappement. L'un est libtermkey de LeoNerd avec la syntaxe . Un autre est le xterm de Thomas Dickey avec la syntaxe . Les versions actuelles de xterm (≥216) peuvent être configurées pour l'une ou l'autre syntaxe en définissant la ressource; la fonction doit être activée en définissant le sur une valeur différente de zéro.
ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
Si votre émulateur de terminal ne prend pas en charge ces syntaxes mais peut être configuré, choisissez l'un ou l'autre.
Depuis Emacs 24.4, Emacs active automatiquement la
modifyOtherKeys
fonction lorsqu'il détecte que le terminal est la version xterm ≥216. La détection des séquences d'échappement par Emacs pour encoder les clés fonctionne via la variablelocal-function-key-map
. Depuis Emacs 24.4, toutes les séquences d'échappement ne sont pas prises en charge. Vous pouvez utiliser le code suivant dans votre fichier init pour terminer le travail.Si la
TERM
variable d'environnement n'est pas définie surxterm
ou une variante telle quexterm-256color
, Emacs n'activera pas ces séquences. Si Emacs prend déjà en charge votre valeur deTERM
, vous pouvez ajouter un support en définissant une fonction similaire à celle ci-dessus, à exécuter après le chargement du fichier Lisp dont le nom est la valeur deTERM
. Si Emacs ne dispose pas d'un tel support, vous pouvez l'ajouter en créant un sous-répertoire appeléterm
quelque part dans votreload-path
, et en créant un fichier Lisp appeléterm/$TERM.el
où$TERM
est la valeur deTERM
, en définissant une fonction appeléeterminal-init-$TERM
.Au moment où j'écris, il semble que peu d'émulateurs de terminaux autres que xterm aient adopté ces séquences d'échappement. Sous OSX, vous pouvez configurer iTerm2 en sélectionnant une séquence d'échappement pour chaque combinaison de touches, une par une.
la source
M-C-%
être reconnu àESC 5
modifyOtherKeys
fonction n'est pas active. Notez qu'il n'est pris en charge que dans les versions suffisamment récentes de xterm, et il n'est activé automatiquement que depuis Emacs 24.4. Je ne sais pas si OSX est livré avec des versions récentes. Si ce n'est pas le cas et que cela ne fonctionne pas pour vous, je vous suggère de poser une nouvelle question. Mentionnez les versions que vous utilisez.La réponse de Gilles a déclaré:
On OSX, you can configure iTerm2 by selecting an escape sequence for each key combination, one by one.
J'ai eu un peu de mal à y arriver, alors voici une explication détaillée au cas où vous seriez comme moi, confus.Si, lorsque vous exécutez Emacs dans un terminal (par exemple, Terminal.app par défaut de Mac),
C-x C-;
ne fonctionne pascomment-line
et que vous souhaitez cette fonctionnalité, vous devez basculer vers iTerm2 (Terminal.app n'a pas la capacité) et créer un mappage de clé sous Profils ... Clés comme suit:Ceci est accompli en cliquant sur le
+
bouton, qui fait apparaître une petite fenêtre appelée "Raccourci clavier"; cette fenêtre comporte initialement deux champs; le haut a une valeur de «Cliquez pour définir» et le bas a une valeur de «Ignorer». Cliquez sur le bouton du haut et tapezC-;
. Cela définit la combinaison de touches qui exécutera l'action et le code. Cliquez sur le champ du bas, "Action", et recherchez et cliquez sur "Send Escape Sequence", qui est un peu plus de la moitié du chemin. Après avoir cliqué sur cela, un troisième champ apparaîtra, appelé "Esc +". Dans ce champ, saisissez:C'est
59
le code ASCII décimal de la virgule et5
c'est le code deCtrl
. Appuyez ensuite sur "OK" pour terminer. Le combo de touches correct à la séquence de touches sera désormais inclus dans les préférences d'iTerm2. Lorsque vous démarrez Emacs dans iTerm, vous aurez désormais accès auxC-x C-;
fonctionnalités.la source