Emacsify OSX partout: mot en avant (⌥ + F) et mot en arrière (⌥ + B) au lieu de 'caractères spéciaux'?

8

Oui, l'OSX prend déjà en charge + et + pour déplacer le curseur mot en arrière et mot en avant, mais atteindre les touches fléchées est ennuyeux. Alors pourquoi ne pas plutôt faire + Bet + Ffaire ça? Je veux dire, pas une fois je n'ai (intentionnellement) écrit le signe intégral ∫ avec + B(à part maintenant).

En bref, je préfère avoir un comportement semblable à Emacs (pas seulement, disons, ^+ Fpour le transfert de caractère) dans l'OSX.


Question connexe: arrêtez d'utiliser l'option du clavier Mac comme modificateur du caractère

Blaz
la source

Réponses:

7

DefaultKeyBinding.dict

Créez ~/Library/KeyBindings/et enregistrez une liste de propriétés comme celle-ci ~/Library/KeyBindings/DefaultKeyBinding.dict:

{
  "^ " = setMark:;
  "^/" = undo:;
  "^l" = selectParagraph:;
  "^u" = deleteToBeginningOfParagraph:;
  "^w" = deleteToMark:;
  "^x" = {
    "^x" = swapWithMark:;
    "^m" = selectToMark:;
  };
  "^V" = pageDownAndModifySelection:;
  "~@" = selectWord:;
  "~b" = moveWordBackward:;
  "~c" = (capitalizeWord:, moveForward:, moveForward:);
  "~d" = deleteWordForward:;
  "~f" = moveWordForward:;
  "~l" = (lowercaseWord:, moveForward:, moveForward:);
  "~r" = centerSelectionInVisibleArea:;
  "~u" = (uppercaseWord:, moveForward:, moveForward:);
  "~v" = pageUp:;
  "~w" = (deleteToMark:, setMark:, yank:, swapWithMark:);
  "~B" = moveWordForwardAndModifySelection:;
  "~F" = moveWordForwardAndModifySelection:;
  "~V" = pageUpAndModifySelection:;
}

DefaultKeyBinding.dictne fonctionne pas dans certaines applications comme Xcode ou Firefox. Les méthodes qui utilisent l'anneau de suppression suppriment la mise en forme du texte enrichi. Les combinaisons de touches qui entrent dans des états de touches morts (comme l'option-u dans la disposition du clavier américain) ne peuvent pas être réaffectées.

Voir également http://www.hcs.harvard.edu/~jrus/site/KeyBindings/Emacs%20Opt%20Bindings.dict . transposeWords:ne fonctionne pas dans la plupart des applications. openDocument:et saveDocument:ne fonctionnent pas dans les applications qui utilisent la sauvegarde automatique, et performClose:ne fonctionnent pas non plus partout.

Voir http://www.hcs.harvard.edu/~jrus/site/cocoa-text.html ou http://osxnotes.net/keybindings.html pour plus d'informations.

KeyRemap4MacBook

Une option consiste à activer les paramètres dans le groupe de modes Emacs prédéfini :

Une autre option consiste à enregistrer un fichier comme celui-ci sous ~/Library/Application Support/KeyRemap4MacBook/private.xml:

<?xml version="1.0"?>
<root>
  <appdef>
    <appname>EMACSMODEIGNORE</appname>
    <equal>com.gnu.Emacs</equal>
    <equal>com.apple.Terminal</equal>
    <equal>com.googlecode.iterm2</equal>
    <equal>com.vmware.fusion</equal>
    <prefix>com.vmware.proxyApp.</prefix>
  </appdef>
  <item>
    <name>emacs</name>
    <identifier>private.emacs</identifier>
    <not>EMACSMODEIGNORE</not>
    <autogen>__KeyToKey__ KeyCode::P, VK_CONTROL | ModifierFlag::NONE, KeyCode::CURSOR_UP</autogen>
    <autogen>__KeyToKey__ KeyCode::N, VK_CONTROL | ModifierFlag::NONE, KeyCode::CURSOR_DOWN</autogen>
    <autogen>__KeyToKey__ KeyCode::B, VK_CONTROL | ModifierFlag::NONE, KeyCode::CURSOR_LEFT</autogen>
    <autogen>__KeyToKey__ KeyCode::F, VK_CONTROL | ModifierFlag::NONE, KeyCode::CURSOR_RIGHT</autogen>
    <autogen>__KeyToKey__ KeyCode::P, VK_CONTROL | VK_SHIFT | ModifierFlag::NONE, KeyCode::CURSOR_UP, VK_SHIFT</autogen>
    <autogen>__KeyToKey__ KeyCode::N, VK_CONTROL | VK_SHIFT | ModifierFlag::NONE, KeyCode::CURSOR_DOWN, VK_SHIFT</autogen>
    <autogen>__KeyToKey__ KeyCode::B, VK_CONTROL | VK_SHIFT | ModifierFlag::NONE, KeyCode::CURSOR_LEFT, VK_SHIFT</autogen>
    <autogen>__KeyToKey__ KeyCode::F, VK_CONTROL | VK_SHIFT | ModifierFlag::NONE, KeyCode::CURSOR_RIGHT, VK_SHIFT</autogen>
    <autogen>__KeyToKey__ KeyCode::B, VK_OPTION | ModifierFlag::NONE, KeyCode::CURSOR_LEFT, VK_OPTION</autogen>
    <autogen>__KeyToKey__ KeyCode::F, VK_OPTION | ModifierFlag::NONE, KeyCode::CURSOR_RIGHT, VK_OPTION</autogen>
    <autogen>__KeyToKey__ KeyCode::B, VK_OPTION | VK_SHIFT | ModifierFlag::NONE, KeyCode::CURSOR_LEFT, VK_OPTION | VK_SHIFT</autogen>
    <autogen>__KeyToKey__ KeyCode::F, VK_OPTION | VK_SHIFT | ModifierFlag::NONE, KeyCode::CURSOR_RIGHT, VK_OPTION | VK_SHIFT</autogen>
    <autogen>__KeyToKey__ KeyCode::D, VK_OPTION | ModifierFlag::NONE, KeyCode::FORWARD_DELETE, VK_OPTION</autogen>
    <autogen>__KeyToKey__ KeyCode::V, VK_OPTION | ModifierFlag::NONE, KeyCode::PAGEUP</autogen>
    <autogen>__KeyToKey__ KeyCode::V, VK_OPTION | VK_SHIFT | ModifierFlag::NONE, KeyCode::PAGEUP, VK_SHIFT</autogen>
    <autogen>__KeyToKey__ KeyCode::V, VK_CONTROL | VK_SHIFT | ModifierFlag::NONE, KeyCode::PAGEDOWN, VK_SHIFT</autogen>
    <autogen>__KeyToKey__ KeyCode::U, VK_CONTROL | ModifierFlag::NONE, KeyCode::DELETE, VK_COMMAND</autogen>
  </item>
</root>

Ouvrez ensuite l'application KeyRemap4MacBook, appuyez sur le bouton ReloadXML et activez le paramètre.

Modifiez les codes de touche si vous utilisez une disposition de clavier comme Dvorak ou Colemak.

Voir https://pqrs.org/macosx/keyremap4macbook/xml.html.en ou http://osxnotes.net/keyremap4macbook.html pour plus d'informations.

Lri
la source
Incroyable. Changer un comportement de bas niveau et pourtant si facile. Un pas de plus vers le paradis des OS. Espérons qu'il existe une solution encore meilleure et 100% fonctionnelle, sinon c'est la réponse.
Blaz
Comme vous le dites, cela ne fonctionne pas dans toutes les applications. Xcode, pour sa part, ne changera pas .dict(mais cela peut être "résolu" avec une liaison de touches personnalisée, par exemple, ⌘ + B et ⌘ + F). Pourtant, très puissant pour avoir un comportement semblable à Emacs (presque) dans tout le système d'exploitation.
Blaz
KeyRemap4MacBook possède un groupe de modes emacs qui change par exemple ⌥F en ⌥ →, mais pas lorsque Terminal ou Emacs est au premier plan. Vous pouvez le personnaliser en créant un private.xml basé sur celui-ci. Je pense que la vraie solution est de simplement obtenir un clavier avec les touches fléchées et les touches de modification à de meilleures positions.
Lri
1
@courteous Le mode emacs dans KeyRemap4MacBook fait cela. Ce n'est pas possible dans un fichier keylayout ou avec DefaultKeyBinding.dict.
Lri
1
@courteous J'ai également ajouté cela à la réponse. J'ai "~w" = selectWord:;dans mon DefaultKeyBinding.dict .
Lri