2013-09-07 10 views
5

Preferowaną metodą wskazywania lokalizacji w dokumencie wymagającym uwagi są trzy gwiazdki: ***. Kiedy przychodzi czas, aby wybrać region zawierający trzy gwiazdki za pomocą shift+right-word lub shift+left-word, te funkcje pomijają trzy gwiazdki i przechodzą do następnego słowa. Kiedy zajrzałem do środka bindings.el, zobaczyłem, że left-word i right-word są adaptacjami forward-word i backward-word, które można śledzić w stosunku do wbudowanych funkcji w kodzie źródłowym C. Zasadniczo szukam left-word i right-word, która zawiera symbole, takie jak trzy gwiazdki ***.Alternatywa słowa przekierowanego do przodu/do tyłu w celu uwzględnienia symboli - np. ***

Czy ktoś może zaproponować sposób, aby przeskoczyć słowo lub symbole po lewej stronie, a słowo lub symbole po prawej stronie. Funkcja musiałaby zachowywać się podobnie do lewego i prawego słowa, aby móc wybrać więcej niż jedno słowo, jeśli klawisze strzałek są naciskane więcej niż jeden raz - np. left-word-or-symbols i right-word-or-symbols.


Poniżej znajduje się funkcja zwyczaj oparciu pomocny odpowiedzi poniżej:

(defvar lawlist-movement-syntax-table 
    (let ((st (make-syntax-table))) 
    ;; ` default = punctuation 
    ;; ' default = punctuation 
    ;; , default = punctuation 
    ;; ; default = punctuation 
    (modify-syntax-entry ?{ "." st) ;; { = punctuation 
    (modify-syntax-entry ?} "." st) ;; } = punctuation 
    (modify-syntax-entry ?\" "." st) ;; " = punctuation 
    (modify-syntax-entry ?\\ "_" st) ;; \ = symbol 
    (modify-syntax-entry ?\$ "_" st) ;; $ = symbol 
    (modify-syntax-entry ?\% "_" st) ;; % = symbol 
    st) 
    "Syntax table used while executing custom movement functions.") 

(defun lawlist-forward-entity() 
"http://stackoverflow.com/q/18675201/2112489" 
(interactive "^") 
    (with-syntax-table lawlist-movement-syntax-table 
    (cond 
     ((eolp) 
     (forward-char)) 
     ((and 
      (save-excursion (< 0 (skip-chars-forward " \t"))) 
      (not (region-active-p))) 
     (skip-chars-forward " \t")) 
     ((and 
      (save-excursion (< 0 (skip-chars-forward " \t"))) 
      (region-active-p)) 
     (skip-chars-forward " \t") 
     (cond 
      ((save-excursion (< 0 (skip-syntax-forward "w"))) 
      (skip-syntax-forward "w")) 
      ((save-excursion (< 0 (skip-syntax-forward "."))) 
      (skip-syntax-forward ".")) 
      ((save-excursion (< 0 (skip-syntax-forward "_()"))) 
      (skip-syntax-forward "_()")))) 
     ((save-excursion (< 0 (skip-syntax-forward "w"))) 
     (skip-syntax-forward "w") 
     (if (and 
       (not (region-active-p)) 
       (save-excursion (< 0 (skip-chars-forward " \t")))) 
      (skip-chars-forward " \t"))) 
     ((save-excursion (< 0 (skip-syntax-forward "."))) 
     (skip-syntax-forward ".") 
     (if (and 
       (not (region-active-p)) 
       (save-excursion (< 0 (skip-chars-forward " \t")))) 
      (skip-chars-forward " \t"))) 
     ((save-excursion (< 0 (skip-syntax-forward "_()"))) 
     (skip-syntax-forward "_()") 
     (if (and 
       (not (region-active-p)) 
       (save-excursion (< 0 (skip-chars-forward " \t")))) 
      (skip-chars-forward " \t")))))) 

(defun lawlist-backward-entity() 
"http://stackoverflow.com/q/18675201/2112489" 
(interactive "^") 
    (with-syntax-table lawlist-movement-syntax-table 
    (cond 
     ((bolp) 
     (backward-char)) 
     ((save-excursion (> 0 (skip-chars-backward " \t")) (bolp)) 
     (skip-chars-backward " \t")) 
     ((save-excursion (> 0 (skip-chars-backward " \t")) (> 0 (skip-syntax-backward "w"))) 
     (skip-chars-backward " \t") 
     (skip-syntax-backward "w")) 
     ((save-excursion (> 0 (skip-syntax-backward "w"))) 
     (skip-syntax-backward "w")) 
     ((save-excursion (> 0 (skip-syntax-backward "."))) 
     (skip-syntax-backward ".")) 
     ((save-excursion (> 0 (skip-chars-backward " \t")) (> 0 (skip-syntax-backward "."))) 
     (skip-chars-backward " \t") 
     (skip-syntax-backward ".")) 
     ((save-excursion (> 0 (skip-syntax-backward "_()"))) 
     (skip-syntax-backward "_()")) 
     ((save-excursion (> 0 (skip-chars-backward " \t")) (> 0 (skip-syntax-backward "_()"))) 
     (skip-chars-backward " \t") 
     (skip-syntax-backward "_()"))))) 
+0

dlaczego nie używać 'C-s' i' C-r', aby znaleźć gwiazdki i usunąć je w ten sposób? –

+0

@omouse Odkąd kilka miesięcy temu zapoznałem się z Emacsem, szukałem kilku podstawowych funkcji edycyjnych, które przyzwyczaiłem przez lata - "prawe słowo"/"lewe słowo" 'były dobrym początkiem, ale nie do końca. 'forward-symbol' i jego przeciwieństwo były znacznie bliższe, ale nie do końca. Ostatnia niestandardowa wersja 'listą-forward-entity' /' listą-back-back-entity' - prawie spełnia moje osobiste preferencje dotyczące przesuwania kursora. Zasadniczo lubię traktować symbole i interpunkcję oddzielnie od słów i pomijać odstępy. – lawlist

Odpowiedz

5

Dodaj do haka trybu trybu, w którym edytujesz tekst:

(modify-syntax-entry ?* "w") 

Przeczytaj here, aby uzyskać więcej informacji.

Zauważ, że to spowoduje, że inne funkcje będą traktować gwiazdki tak, jakby były składnikiem słowa (chociaż prawdopodobnie byś chciał, ponieważ wkrótce odkryjesz, że nie tylko polecenie ruchu zachowuje się wbrew temu, co chcesz) .

Innym sposobem przeciążenia tylko tych konkretnych poleceń byłoby doradzenie im przy pomocy defadvice i tymczasowe zmienianie tabeli składni tylko na czas trwania funkcji.

+0

To działa idealnie - dziękuję bardzo - bardzo docenione !!! :) – lawlist

+0

@listlista, to jeden sposób, aby to zrobić. –

+0

Wprowadziłem drobny błąd i poprawiłem go za pomocą znaku podkreślenia, aby przywrócić zachowanie symbolu: http://www.gnu.org/software/emacs/manual/html_node/elisp/Syntax-Class-Table.html # Składnia-klasa-tabela Edytowanie pytania teraz działa poprawnie jako rozwiązanie alternatywne. – lawlist

1

Być może spodoba Ci się Emacs-24.4, superword-mode.

+0

Dziękuję - sprawdzę to - być może ten kod da mi kilka nowych pomysłów na ulepszenie moich niestandardowych funkcji przetwarzania tekstu dla 'lawlist-kill-word' (http: // stackoverflow.com/questions/17958397/emacs-delete-whitespaces-or-a-word); 'lawlist-forward-entity' oraz' lawlist-backward-entity' (http://stackoverflow.com/questions/18675201/alternative-to-forward-word-backward-word-to-include-symbols-e-g); oraz, 'lawlist-forward-paragraph' oraz' lawlist-backward-paragraph' (http://superuser.com/questions/643618/how-to-jump-paragraph-up-down-placing-cursor-on-first- wizualna linia). – lawlist

Powiązane problemy