Emacsify OSX przez: przewijanie słów (⌥ + F) i przewijanie słów (⌥ + B) zamiast „znaków specjalnych”?

8

Tak, OSX już obsługuje + i + do przesuwania kursora słowo do tyłu i do przodu, ale sięganie po klawisze strzałek jest denerwujące. Dlaczego więc raczej nie zrobić + Bi + F? Mam na myśli, że nie raz (celowo) napisałem znak integralny ∫ z + B(oprócz teraz).

Krótko mówiąc, wolałbym mieć zachowanie podobne do Emacsa (nie tylko, powiedzmy, ^+ Fdla przekazywania znaków) w całym OSX.


Powiązane pytanie: Przestań używać opcji klawiatury Mac jako modyfikatora znaków

Blaz
źródło

Odpowiedzi:

7

DefaultKeyBinding.dict

Utwórz ~/Library/KeyBindings/i zapisz listę właściwości w następujący sposób ~/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.dictnie działa w niektórych aplikacjach, takich jak Xcode lub Firefox. Metody wykorzystujące pierścień zabijania usuwają formatowanie z tekstu sformatowanego. Kombinacji klawiszy, które wprowadzają stany martwych klawiszy (jak opcja -u w układzie klawiatury USA), nie można przypisać ponownie.

Zobacz także http://www.hcs.harvard.edu/~jrus/site/KeyBindings/Emacs%20Opt%20Bindings.dict . transposeWords:nie działa w większości aplikacji. openDocument:i saveDocument:nie działają w aplikacjach korzystających z automatycznego zapisywania i performClose:nie działają też wszędzie.

Więcej informacji można znaleźć na stronie http://www.hcs.harvard.edu/~jrus/site/cocoa-text.html lub http://osxnotes.net/keybindings.html .

KeyRemap4MacBook

Jedną z opcji jest włączenie ustawień w predefiniowanej grupie trybów Emacsa :

Inną opcją jest zapisanie pliku takiego jak ten ~/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>

Następnie otwórz aplikację KeyRemap4MacBook, naciśnij przycisk ReloadXML i włącz ustawienie.

Zmień kody klawiszy, jeśli używasz układu klawiatury, takiego jak Dvorak lub Colemak.

Aby uzyskać więcej informacji, zobacz https://pqrs.org/macosx/keyremap4macbook/xml.html.en lub http://osxnotes.net/keyremap4macbook.html .

Lri
źródło
Niesamowity. Zmiana zachowania na stosunkowo niskim poziomie, a jednocześnie takie łatwe. Skok bliżej raju OS. Mamy nadzieję, że istnieje jeszcze lepsze, w 100% działające rozwiązanie, w przeciwnym razie jest to odpowiedź.
Blaz
Jak mówisz, nie działa we wszystkich aplikacjach. Xcode, na przykład, nie chce się do tego .dictdostosować (ale można to „rozwiązać” za pomocą niestandardowego skrótu klawiszowego, powiedzmy ⌘ + B i ⌘ + F). Mimo to bardzo potężne, aby mieć zachowanie podobne do Emacsa (prawie) w całym systemie operacyjnym.
Blaz
KeyRemap4MacBook ma grupę trybów emacs, która zmienia się na przykład ⌥F na ⌥ →, ale nie, gdy Terminal lub Emacs jest na pierwszym planie. Możesz go dostosować, tworząc plik private.xml na jego podstawie. Myślę, że prawdziwym rozwiązaniem jest uzyskanie klawiatury z klawiszami strzałek i klawiszami modyfikującymi w lepszych pozycjach.
Lri,
1
@courteous Tryb emacs w KeyRemap4MacBook robi to. Nie jest to możliwe w pliku keylayout lub DefaultKeyBinding.dict.
Lri,
1
@courteous Dodałem to również do odpowiedzi. Mam "~w" = selectWord:;w pliku DefaultKeyBinding.dict .
Lri,