Emacsify OSX em todo: avanço da palavra (⌥ + F) e retorno da palavra (⌥ + B) em vez de 'caracteres especiais'?

8

Sim, o OSX já suporta + e + para mover o cursor palavra para trás e para frente, mas alcançar as teclas de seta é irritante. Então, por que não preferir + Be + Ffazer isso? Quero dizer, nenhuma vez eu (intencionalmente) escrevi o sinal integral ∫ com + B(além do agora).

Em suma, eu prefiro ter um comportamento semelhante ao Emacs (não apenas, digamos, ^+ Fpara encaminhamento de caracteres) em todo o OSX.


Pergunta relacionada: Pare de usar a opção do teclado do Mac como um modificador de caractere

Blaz
fonte

Respostas:

7

DefaultKeyBinding.dict

Crie ~/Library/KeyBindings/e salve uma lista de propriedades 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.dictnão funciona em alguns aplicativos como Xcode ou Firefox. Os métodos que usam o anel de interrupção removem a formatação do rich text. As combinações de teclas que entram nos estados de teclas inativas (como a opção-u no layout do teclado dos EUA) não podem ser reatribuídas.

Consulte também http://www.hcs.harvard.edu/~jrus/site/KeyBindings/Emacs%20Opt%20Bindings.dict . transposeWords:não funciona na maioria dos aplicativos. openDocument:e saveDocument:não funciona em aplicativos que usam o salvamento automático e performClose:também não funciona em qualquer lugar.

Consulte http://www.hcs.harvard.edu/~jrus/site/cocoa-text.html ou http://osxnotes.net/keybindings.html para obter mais informações.

KeyRemap4MacBook

Uma opção é ativar as configurações no grupo de modos Emacs predefinidos :

Outra opção é salvar um arquivo 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>

Em seguida, abra o aplicativo KeyRemap4MacBook, pressione o botão ReloadXML e ative a configuração.

Altere os códigos das teclas se você usar um layout de teclado como Dvorak ou Colemak.

Consulte https://pqrs.org/macosx/keyremap4macbook/xml.html.en ou http://osxnotes.net/keyremap4macbook.html para obter mais informações.

Lri
fonte
Surpreendente. Mudar o comportamento de nível relativamente baixo e ainda assim tão fácil. Um salto mais perto de um paraíso de SO. Espero que exista uma solução 100% de trabalho ainda melhor, caso contrário, esta é a resposta.
Blaz
Como você diz, não funciona em todos os aplicativos. O Xcode, por exemplo, não vai mudar isso .dict(mas isso pode ser "resolvido" com uma combinação de teclas personalizada, digamos, ⌘ + B e ⌘ + F). Ainda assim, é muito poderoso ter um comportamento semelhante ao Emacs (quase) em todo o sistema operacional.
Blaz
O KeyRemap4MacBook possui um grupo de modos emacs que muda, por exemplo, ⌥F para ⌥ →, mas não quando o Terminal ou o Emacs está na frente. Você pode personalizá-lo criando um private.xml com base nele. Eu acho que a solução real é conseguir um teclado com as setas e as teclas modificadoras em melhores posições.
Lri
1
@courteous O modo emacs no KeyRemap4MacBook faz isso. Não é possível em um arquivo de layout de teclas ou com DefaultKeyBinding.dict.
Lri
1
@ cortês eu adicionei isso à resposta também. Eu tenho "~w" = selectWord:;no meu DefaultKeyBinding.dict .
Lri