Skopiować i ustawić w Bash jak w Emacsie?


16

Chciałbym być w stanie skopiować i wkleić tekst w wierszu poleceń w bash przy użyciu tych samych wiązań klawiaturowych że Emacs używa domyślnie (czyli używając C-spacedo set-mark, M-waby skopiować tekst C-y, M-yaby go wkleić, etc.).

Dokumentacja GNU Bash mówi, że Bash zawiera niektóre z tych domyślnych powiązań klawiszy.

Na przykład yanking ( C-y) działa domyślnie na moim terminalu. Nie mogę jednak sprawić, by polecenia set-marki copydziałały, i domyślnie nie wydają się być powiązane z żadnymi klawiszami.

Zwykle sposobem, w jaki użytkownik może zdefiniować własne powiązania klawiszy, jest ich dodanie .inputrc. Dlatego szukałem i znalazłem następujące funkcje bash w dokumentacji przypuszczam może mi pomóc określić Emacs-like zachowanie, które chcę (tj set-markz C-spacei copyz M-w).

copy-region-as-kill ()

Skopiuj tekst z regionu do bufora zabijania, aby można go było natychmiast zaciągnąć. Domyślnie to polecenie jest niezwiązane.

i

set-mark (C-@)

Ustaw znak na punkcie. Jeśli podany zostanie argument numeryczny, znak zostanie ustawiony na tę pozycję.

Jeśli dobrze rozumiem, powyższe oznacza, że copy-region-as-killdomyślnie nie jest związany z żadną sekwencją klawiatury, a domyślnie set-markjest związany C-@.

Próbowałem C-@na swoim terminalu, ale nie sądzę, aby działał, set-markponieważ nie widzę podświetlonego tekstu, gdy poruszam kursorem. W każdym razie próbowałem dodać powiązania klawiatury ( M-wi C-) do funkcji copy-region-as-killi set-markpowyżej w moim, .inputrca następnie ponownie je załadować C-x C-r, ale to nie zadziałało. Wiem, że moje inne wpisy w.inputrc działają, ponieważ mam zdefiniowane w nim inne skróty klawiaturowe zdefiniowane przez użytkownika.

Czy coś robię źle? Czy coś mi brakuje?


Jakiej wersji bashi jakiego programu terminalowego używasz?
Mikel

Używam GNU bash, wersja 3.1.17 (1) -release (x86_64-RedHat-linux-gnu) na gnome-terminal (także na Terminator)
Amelio Vazquez-Reina

Odpowiedzi:


11

Nie wyróżnia zaznaczenia, ale poza tym myślę, że działa dobrze.

Spróbuj uruchomić

$ bind -p | grep copy-region-as-kill

aby upewnić się, że C-x C-rfaktycznie działało.

Powinien powiedzieć:

"\ew": copy-region-as-kill

Następnie powinno działać dobrze.

Przykład:

$ abc<C-Spc><C-a><M-w> def <C-y>

daje mi

$ abc def abc

Jeśli kiedykolwiek chcesz wiedzieć, gdzie markjest, po prostu zrób C-x C-x.

Przykład:

$ <C-Spc>abc<C-x><C-x>

umieści kursor z powrotem w miejscu, w którym ustawiłeś znak (początek linii).

Ponadto nie sądzę, że musisz dodać set-markpowiązanie. Ja nie.

$ bind -p | grep set-mark
"\C-@": set-mark
"\e ": set-mark
# vi-set-mark (not bound)

(zwróć uwagę, że większość terminali wysyła C-@po C-Spcnaciśnięciu. Zakładam, że twój też.)

Jeśli to wszystko się nie powiedzie:

  • robi Ctrl+ Spacepracę w emacs -nwtym samym terminalu?
  • czy inne Alt/ Metaskróty działają w bash?

1
Dzięki! Miałem „Mw” zamiast „\ ew” w .inputrc. Zdezorientował mnie również brak wyróżnienia. Przy okazji, dzięki za wskaźnik do polecenia bind. Teraz działa jak urok!
Amelio Vazquez-Reina

2
Witamy! Tak, musisz pisać \elub \M-. Zobacz składnię pliku inicjującego readline .
Mikel

Co za świetna odpowiedź! Dzięki. To wyjaśniło mi podobne problemy: D
ephsmith

set-mark i copy-region-as-kill działają cicho, czy mogę wyróżnić region (jak w emacs)?
mosh

4

Wiążę również Cw dla zabicia regionu . Oto mój .inputrc:

# Patrz http://lists.gnu.org/archive/html/bug-bash/2009-03/msg00033.html
wyłącz bind-tty-special-chars

# Zdefiniuj moje ulubione klawisze Emacsa.
„\ C- @”: set-mark
„\ Cw”: region zabicia
„\ Mw”: copy-region-as-kill
„\ M- /” dabbrev-expand
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.