/ / Iniciando a seleção em substituição à palavra avançada do Emacs - emacs, elisp

Iniciando a seleção em substituição à palavra avançada do Emacs - emacs, elisp

Eu quero substituir Emacs "default forward-word ebackward-word para operar mais como o Visual Studio "s - que eu acho mais adequado para a programação Perl. Primeiro tentei hackear a tabela de sintaxe, sem conseguir o efeito que eu queria. Então eu fiz o seguinte:

(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))

Isso faz o que eu quero - quase: eu ainda tenho que lidar com o caso quando me movo para trás de dentro da primeira palavra no buffer. Mas essa não é a minha pergunta.

O problema com isto é que a seleção énão iniciado quando eu digito C-S-right, como é quando meu gancho não está instalado (ou em outros modos). Se eu iniciar a seleção embora (por exemplo, atingindo primeiro S-right), minhas funções o estendem.

Eu sei muito pouco sobre programação elisp e estou apenas supondo meu caminho até aqui. Eu apreciaria um pouco de ajuda. Obrigado...

Respostas:

2 para resposta № 1

Para obter shift-select-mode trabalhando, você precisará usar (interactive "^"). Experimentar C-h f interactive RET.

BTW, você pode simplificar seu código consideravelmente: para avançar, apenas (re-search-forward ".\(\_<\|\_>\)" nil t) e para trás, use (re-search-backward "\(\_<\|\_>\)." nil t).


1 para resposta № 2

Eu não tenho certeza exatamente o que você quer, mas eu pensei em oferecer isso. Eu tenho um pacote que eu chamo sintaxe-sub-palavra (disponível em Melpa). Ele torna o movimento das palavras mais refinado, a ponto de eu quase nunca me mover por personagens, e usar outras soluções como a busca por distâncias maiores.

Dos comentários:

;; 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

Perguntas relacionadas


Comentários (0)

Adicione um comentário