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

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 .


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.