/ / Иницииране на селекцията в замяна на Emacs - предната дума - emacs, elisp

Иницииране на селекцията в замяна на Emacs-предната дума - emacs, elisp

Искам да заместя Emacs "по подразбиране напред-дума и."назад-дума да работят по-скоро като Visual Studio "- което ми се струва по-подходящо за програмиране на Perl. Първо се опитах да хакна синтактичната таблица, без да постигна желания ефект. Тогава дойдох със следното:

(defconst perl-movement-stop-chars "a-zA-Z$@%_0-9"")
(defconst perl-movement-stop-pattern (concat "[" perl-movement-stop-chars "]"))
(defconst non-perl-movement-stop-pattern (concat "[^" perl-movement-stop-chars "]"))

(defun perl-forward-word ()
(interactive)
(if (looking-at perl-movement-stop-pattern)
(progn
(if (re-search-forward non-perl-movement-stop-pattern nil t)
(backward-char)))
(if (re-search-forward perl-movement-stop-pattern nil t)
(backward-char))))

(defun perl-backward-word ()
(interactive)
(backward-char)
(if (looking-at perl-movement-stop-pattern)
(progn
(if (re-search-backward non-perl-movement-stop-pattern nil t)
(forward-char)))
(if (re-search-backward perl-movement-stop-pattern nil t)
(forward-char))))

(add-hook "cperl-mode-hook
(lambda()
(local-set-key [C-right] "perl-forward-word)
(local-set-key [C-left] "perl-backward-word)
linum-mode))

Това прави това, което искам - почти: Все още трябва да се справя с случая, когато се движа назад от първата дума в буфера. Но това не е моят въпрос.

Проблемът с това е, че селекцията ене се стартира, когато пиша C-S-дясно, както е когато моята кука не е инсталирана (или в други режими). Ако инициирам селекцията (напр. Чрез натискане на първата S-дясна), функциите ми го разширяват.

Знам много, много малко за програмирането на elisp и просто познавам пътя си тук. Бих се радвал на малко помощ. Благодаря...

Отговори:

2 за отговор № 1

За да получите shift-select-mode трябва да използвате (interactive "^"), Опитвам C-h f interactive RET.

BTW, можете да опростите кода си значително: да се движат напред, просто (re-search-forward ".\(\_<\|\_>\)" nil t) и да се движат назад, използвайте (re-search-backward "\(\_<\|\_>\)." nil t).


1 за отговор № 2

Не съм сигурен точно какво искаш, но си мислех, че предлагам това. Имам пакет, който наричам синтаксис-subword (налице в Melpa). Това прави движението на словата по-фино, до точката, в която едва ли някога се движа по символи, и използвам други решения, като например търсене за преместване на по-големи разстояния.

От коментарите:

;; This package provides `syntax-subword" minor mode, which extends
;; `subword-mode" to make word editing and motion more fine-grained.
;; Basically, it makes syntax changes, CamelCaseWords, and the normal
;; word boundaries the boundaries for word operations.  Here"s an
;; example of where the cursor stops using `forward-word" in
;; `emacs-lisp-mode":
;;
;; (defun FooBar (arg) "doc string"
;; |     |      |    |     |      |  standard
;; |     |   |  |    |     |      |  subword-mode
;; ||    ||  |  |||  ||||  ||     || syntax-subword-mode
;; ||     |      ||  | ||   |     |  vim

Свързани въпроси


Коментари (0)

Добави коментар