2013-09-07 14 views
5

文書内の注意を必要とする場所を示すための私の好ましい方法は、3つのアスタリスク***です。 shift+right-wordまたはshift+left-wordを使用して3つのアスタリスクを含む領域を選択するときは、これらの機能が3つのアスタリスクをスキップして次の単語に移動します。 bindings.elを覗いたところ、left-wordright-wordは、forward-wordbackward-wordの適合であり、Cソースコードの組み込み関数にトレーサブルであることがわかりました。基本的には、私はleft-wordright-wordの3つのアスタリスクのようなシンボルを探しています***記号を含むために前方単語/後方単語に代わるもの - 例えば、***

誰でも、単語や記号を左に、単語や記号を右に移動する方法を提案できますか?矢印キーが2回以上押された場合(例えば、left-word-or-symbolsright-word-or-symbols)、複数の単語を選択できるように、関数は左ワードと右ワードと同様に動作する必要があります。


次は、以下の便利な答えに基づいてカスタム関数である:

(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

「C-s」と「C-r」を使用してアスタリスクを見つけてそれらを削除するのはなぜですか? –

+0

@omouse私は数ヶ月前にEmacsに紹介されて以来、長年に渡って慣れ親しんだ基本的なワープロ機能をいくつか用意しています。 「良いスタートだったが、それほどではなかった。 'forward-symbol'とその逆がはるかに近づいてきました。 'lawlist-forward-entity' /' lawlist-backward-entity'の最新のカスタムドラフトは、カーソルの移動に関する私の個人的な好みをちょうど満たしています。基本的には、単語とは別に記号や句読点を扱い、空白をスキップするのが好きです。 – lawlist

答えて

5

は、テキストを編集しているモードのモードフックに追加:

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

詳細はhereをお読みください。

これは、アスタリスクを単語構成要素として扱うようにします(ただし、モーションコマンドがあなたの望むように動作するだけでなく、 。

これらの特定のコマンドだけをオーバーロードするもう1つの方法は、defadviceを使用してそれらに助言し、機能の持続時間だけ一時的に構文テーブルを変更することです。

+0

それは完璧に動作します - 非常に感謝します - 大いに感謝! :) – lawlist

+0

@lawlistええ、それはそれを行う方法の一つです。 –

+0

私はわずかなエラーを作り、シンボル構成の振る舞いを復元するように、代わりにアンダースコアで修正しました:http://www.gnu.org/software/emacs/manual/html_node/elisp/Syntax-Class-Table.html #構文 - クラステーブル質問への編集は、代替ソリューションとして正しく動作するようになりました。 – lawlist

1

Emacs-24.4のsuperword-modeが好きかもしれません。

+0

ありがとうございます - 私はそれをチェックします - おそらくそのコードは私に、 'lawlist-kill-word'の私のカスタムワープロ機能をさらに改善するためのいくつかの新しいアイデアを与えます(http:// stackoverflow。com/questions/17958397/emacs-delete-whitespaces-or-a-word); 'lawlist-forward-entity'と' lawlist-backward-entity'(http://stackoverflow.com/questions/18675201/alternative-to-forward-word-backward-word-to-include-symbols-e-g)を参照してください。 Lawlist-forward-paragraph」と「lawlist-backward-paragraph」(http://superuser.com/questions/643618/how-to-jump-paragraph-up​​-down-placing-cursor-on-first-視線)。 – lawlist

関連する問題