Come trattare il trattino basso come parte della parola?


34

Uso la evilmodalità Emacs + .

Quando posiziono il cursore su e(nello stato normale) in una porzione di testo come abc_def_ghi, ciw(cambia la parola interna) cambia solo la defparte della stringa, mentre Vim cambierebbe l'intero abc_def_ghi.

Come posso forzare evila trattare il carattere di sottolineatura come fa Vim (cioè come parte della parola)?

Risposte:


26

La soluzione più semplice: usare ciWper selezionare una parola delimitata da spazi bianchi.

Il problema più grande riguarda il valore del _carattere nella tabella della sintassi . Il problema è che _, per impostazione predefinita, è un componente simbolo nella tabella della sintassi e si desidera trattarlo come un componente parola.

Se stai usando emacs 24.4, potresti provare ad abilitare superword-mode. Non l'ho provato da solo, quindi il tuo chilometraggio può variare.

Un'alternativa è semplicemente modificare la tabella della sintassi da soli e dire a Emacs che vuoi che tratti il _personaggio come una parola costituente, in questo modo:

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

Dopo averlo fatto, ciwfunziona come desideri, in modo che selezionerà tutto abc_def_ghipiuttosto che solo def.

Farlo in questo modo, tuttavia, può essere eccessivo, soprattutto se si desidera _che contino solo come parte della parola per l'oggetto di testo. Invece, puoi consigliare evil-inner-wordcome segue:

(defadvice evil-inner-word (around underscore-as-word activate)
  (let ((table (copy-syntax-table (syntax-table))))
    (modify-syntax-entry ?_ "w" table)
    (with-syntax-table table
      ad-do-it)))

Ora, _è ancora un simbolo costitutivo di tutto tranne che per l'oggetto di testo della parola interna, quindi ciwfarà esattamente ciò che vuoi senza toccare la funzionalità di qualsiasi altra cosa.

Puoi leggere di più sulla modifica delle tabelle di sintassi sul nodo EmacsWiki .


Funziona come un fascino. Per modificare tutti i movimenti ( w, aw, ecc), si può fare lo stesso con le seguenti funzioni anche: evil-forward-word-begin, evil-forward-word-end, evil-backward-word-begin, evil-backward-word-end, evil-a-word, evil-inner-word. Nota: è necessario passare underscore-as-worda valori diversi, univoci (arbitrari).
sitaktif,

(modify-syntax-entry ?_ "w")non ha funzionato per me per qualche motivo. Farlo interattivamente non ha funzionato neanche. Qualche idea sul perché o come posso eseguire il debug di questo? Sono su Spacemacs nel caso sia rilevante.
Helder S Ribeiro,

1
Questo spiega il mio problema. Apparentemente devi fare riferimento esplicitamente alla tabella di sintassi di destinazione. Nel mio caso l'ho usato (modify-syntax-entry ?_ "w" rust-mode-syntax-table), poi ha funzionato.
Helder S Ribeiro,

Quali sono gli effetti indesiderati della modifica della voce di sintassi?
montagna,

FTR: superword-modenon influenza il movimento in evil-mode. Quindi non è un componente per modificare le tabelle di sintassi.
Hi-Angel,

28

Il frammento seguente farà sì che il Male tratti un simbolo Emacs come una parola.

(with-eval-after-load 'evil
    (defalias #'forward-evil-word #'forward-evil-symbol)
    ;; make evil-search-word look for symbol rather than word boundaries
    (setq-default evil-symbol-word-search t))

Questo ha il vantaggio che cambia a seconda della lingua:

foo-bar

è un simbolo in lisp-modema due simboli (separati da -) in c-mode.


14

Le FAQ di spacemacs offrono la seguente soluzione specifica per la lingua:

;; For python
(add-hook 'python-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))
;; For ruby
(add-hook 'ruby-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))
;; For Javascript
(add-hook 'js2-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))

Funziona anche in emacs regolari. Con il male su, funziona con tutti i comandi di parole correlate ( w, e, *, #, ecc)

Più in generale, questo lo farà per tutte le principali modalità:

(add-hook 'after-change-major-mode-hook
          (lambda ()
            (modify-syntax-entry ?_ "w")))

2
Sta usando 'prog-mode-hookun'opzione per coprire ogni lingua?
BallpointBen,

2

Emacs 24 ha introdotto superword-mode, una modalità minore che tratta i caratteri di sottolineatura come parte delle parole. evil-moderispetta questa impostazione.

Ecco la documentazione:

(superword-mode &optional ARG)

Attiva / disattiva il movimento e la modifica delle super parole (modalità Superword). Con un argomento prefisso ARG, abilita la modalità Superword se ARGè positiva e disabilita diversamente. Se chiamato da Lisp, abilitare la modalità se ARGè omessa o nulla.

La modalità Superword è una modalità secondaria locale buffer. Abilitarlo modifica la definizione di parole in modo tale che i caratteri dei simboli vengano trattati come parti di parole: ad esempio, in superword-mode, "this_is_a_symbol"conta come una parola.


Se stai usando evil-mode, sfortunatamente, c'è un bug quando superword-modeè abilitato. Causa un comportamento irregolare quando evil-forward-word-beginviene chiamato: github.com/emacs-evil/evil/issues/721
modulitos

0

In realtà mi piace molto questo comportamento poiché potrei voler solo modificare una parte della parola e mantenere intatte le altre parti. Se voglio ripassare l'intera parola, posso sempre usare E, Wo B, le varianti maiuscole. Questo mi dà un controllo più preciso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.