Emacsify OSX en todas partes: ¿palabra hacia adelante (⌥ + F) y palabra hacia atrás (⌥ + B) en lugar de 'caracteres especiales'?

8

Sí, el OSX ya admite + y + para mover el cursor hacia atrás y hacia adelante, pero buscar teclas de flecha es molesto. Entonces, ¿por qué no prefieres que + By + Fhagan esto? Quiero decir, ni una sola vez (intencionalmente) escribí el signo integral ∫ con + B(aparte de ahora).

En resumen, prefiero tener un comportamiento similar a Emacs (no solo, por ejemplo, ^+ Fpara el reenvío de caracteres) en todo el OSX.


Pregunta relacionada: Dejar de usar la opción de teclado Mac como modificador de caracteres

Blaz
fuente

Respuestas:

7

DefaultKeyBinding.dict

Cree ~/Library/KeyBindings/y guarde una lista de propiedades como esta como ~/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.dictno funciona en algunas aplicaciones como Xcode o Firefox. Los métodos que usan el anillo de eliminación eliminan el formato del texto enriquecido. Las combinaciones de teclas que ingresan estados de teclas muertas (como la opción-u en la distribución del teclado de EE. UU.) No pueden reasignarse.

Ver también http://www.hcs.harvard.edu/~jrus/site/KeyBindings/Emacs%20Opt%20Bindings.dict . transposeWords:no funciona en la mayoría de las aplicaciones. openDocument:y saveDocument:no funciona en aplicaciones que usan guardado automático, y performClose:tampoco funciona en todas partes.

Consulte http://www.hcs.harvard.edu/~jrus/site/cocoa-text.html o http://osxnotes.net/keybindings.html para obtener más información.

KeyRemap4MacBook

Una opción es habilitar la configuración en el grupo de modo Emacs predefinido :

Otra opción es guardar un archivo como este como ~/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>

Luego abra la aplicación KeyRemap4MacBook, presione el botón ReloadXML y habilite la configuración.

Cambie los códigos de tecla si usa una distribución de teclado como Dvorak o Colemak.

Consulte https://pqrs.org/macosx/keyremap4macbook/xml.html.en o http://osxnotes.net/keyremap4macbook.html para obtener más información.

Lri
fuente
Asombroso. Cambiar el comportamiento de nivel relativamente bajo y, sin embargo, tan fácil. Un salto más cerca de un paraíso del sistema operativo. Esperemos que haya una solución aún mejor, 100% de trabajo, de lo contrario, esta es la respuesta.
Blaz
Como dices, no funciona en todas las aplicaciones. Xcode, por .dictejemplo, no cederá a esto (pero eso se puede "resolver" con una combinación de teclas personalizada, por ejemplo, ⌘ + B y ⌘ + F). Aún así, es muy poderoso tener un comportamiento similar a Emacs (casi) en todo el sistema operativo.
Blaz
KeyRemap4MacBook tiene un grupo de modo emacs que cambia, por ejemplo, ⌥F a ⌥ →, pero no cuando Terminal o Emacs están en primer plano. Puede personalizarlo creando un private.xml basado en él. Creo que la solución real es obtener un teclado con las teclas de flecha y las teclas modificadoras en mejores posiciones.
Lri
1
@courteous El modo emacs en KeyRemap4MacBook hace eso. No es posible en un archivo keylayout o con DefaultKeyBinding.dict.
Lri
1
@courteous También agregué eso a la respuesta. Tengo "~w" = selectWord:;en mi DefaultKeyBinding.dict .
Lri