Alt çizgi sözcüğün bir parçası olarak nasıl tedavi edilir?


34

Emacs + evilmodunu kullanıyorum.

Ben imleci konumlandırmak zaman egibi metnin bir yığın (normal durumda) abc_def_ghi, ciw(değişim iç kelime) sadece değiştirir defVim bütününü değiştirmek istese de, dize parçası abc_def_ghi.

evilAlt çizgiyi Vim gibi (örneğin, kelimenin bir parçası olarak) nasıl ele almaya zorlayabilirim ?

Yanıtlar:


26

En basit geçici çözüm: ciWboşlukla ayrılmış bir sözcük seçmek için kullanın .

En büyük sorun, sözdizimi tablosundaki_ karakterin değeri ile ilgilidir . Mesele şu ki , varsayılan olarak, sözdizimi tablosundaki bir sembol ve bu kelimeyi bir sözcük olarak değerlendirmek istiyorsunuz._

Emacs 24.4 kullanıyorsanız, etkinleştirmeyi deneyebilirsiniz superword-mode. Kendim denemedim, bu yüzden kilometreniz değişebilir.

Bunun bir alternatifi, sözdizimi tablosunu kendiniz değiştirmeniz ve Emacs'a _karakteri şöyle bir sözcük olarak değerlendirmesini istediğinizi söylemektir :

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

Bunu yaptıktan sonra, ciwistediğiniz gibi çalışır, öyle ki, hepsini seçmek abc_def_ghiyerine hepsini seçer def.

Bununla birlikte, bu şekilde yapmak, özellikle _metin nesnesinin sözcüğünün bir parçası olarak sayılmasını istiyorsanız, fazladan olabilir . Bunun yerine, evil-inner-wordaşağıdaki gibi tavsiyelerde bulunabilirsiniz :

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

Şimdi, _yine de iç metin nesnesinin dışındaki her şey için bir sembol teşkil ediyor , bu yüzden ciwbaşka bir şeyin işlevselliğine dokunmadan istediğinizi tam olarak yapacaksınız.

EmacsWiki düğümündeki sözdizimi tablolarını değiştirme hakkında daha fazla bilgi edinebilirsiniz .


Bu bir cazibe gibi çalışır. Tüm hareketleri (değiştirmek için w, awvs.), çok aşağıdaki işlevlerin aynısını yapabilirsiniz: evil-forward-word-begin, evil-forward-word-end, evil-backward-word-begin, evil-backward-word-end, evil-a-word, evil-inner-word. Not: underscore-as-wordFarklı, benzersiz (keyfi) değerlere geçmeniz gerekir .
sitaktif 18:16

(modify-syntax-entry ?_ "w")nedense benim için işe yaramadı. Etkileşimli olarak yapmak da işe yaramadı. Neden ya da nasıl hata ayıklayabileceğim hakkında fikrin var mı? İlgili olması durumunda Spacemacs'tayım.
Helder S Ribeiro

1
Bu benim sorunumu açıklıyor. Görünüşe göre açıkça hedef sözdizimi tablosuna başvurmak zorunda. Benim durumumda kullandım (modify-syntax-entry ?_ "w" rust-mode-syntax-table), sonra işe yaradı.
Helder S Ribeiro

Sözdizimi girişini değiştirmenin istenmeyen etkileri nelerdir?
l

FTR: superword-modeiçindeki hareketi etkilemez evil-mode. Bu yüzden sözdizimi tablolarını değiştirmenin bir bileşeni değil.
Hi-Angel

28

Aşağıdaki kod parçası, Evil'in Emacs sembolünü bir kelime olarak ele almasını sağlayacaktır .

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

Bu dile bağlı olarak değişmesi avantajına sahiptir:

foo-bar

bir sembol lisp-modedeğil, iki sembol (ayrılmış -) c-mode.


14

Spacemacs SSS sunuyor aşağıdaki dile özgü çözüm:

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

Aynı zamanda düzenli emacs çalışır. Üzerinde şer ile, tüm kelime ile ilgili komutlar ile çalışır ( w, e, *, #, vs)

Daha genel olarak, bu tüm ana modlar için yapacaktır:

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

2
'prog-mode-hookHer dili kapsayan bir seçenek kullanıyor mu?
BallpointBen

2

Emacs 24 superword-mode, kelimelerin bir parçası olarak alt çizgileri ele alan küçük bir mod başlattı . evil-modebu ayara saygı duyar.

İşte belgeler:

(superword-mode &optional ARG)

Süper sözcük hareketini ve düzenlemeyi değiştirin (Süper sözcük modu). Önek bağımsız değişkeninde ARG, eğer pozitifse Süper Sözcük modunu etkinleştirin ARG, aksi takdirde devre dışı bırakın. Lisp'ten çağrılırsa ARG, atlanırsa veya sıfır olursa modu etkinleştirin .

Süper sözcük modu, tampon yerel bir küçük moddur. İçinde, örneğin: o etkinleştirilmesi semboller karakterler kelimelerin parçaları olarak kabul edilir, öyle ki kelimelerin tanımını değiştirir superword-mode, "this_is_a_symbol"bir kelime olarak sayar.


Kullanıyorsanız evil-mode, ne yazık ki, superword-modeetkinleştirildiğinde bir hata vardır . Çağrıldığında bazı düzensiz davranışlara neden olur evil-forward-word-begin: github.com/emacs-evil/evil/issues/721
modulitos 21

0

Aslında bu davranışı çok seviyorum, çünkü sadece kelimenin bir kısmını düzenlemek ve diğer kısımlarını sağlam tutmak isteyebilirim. Ben her zaman kullanabilirsiniz tüm kelimeyi üzerine gitmek isterseniz E, Wya B, büyük varyantları. Bu bana daha iyi ayarlanmış kontrol sağlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.