Bagaimana memperlakukan garis bawah sebagai bagian dari kata?

34

Saya menggunakan evilmode Emacs + .

Ketika saya memposisikan kursor aktif e(dalam kondisi normal) dalam potongan teks seperti abc_def_ghi, ciw(ubah kata dalam) hanya mengubah defbagian dari string, sementara Vim akan mengubah keseluruhan abc_def_ghi.

Bagaimana saya bisa memaksa eviluntuk memperlakukan garis bawah seperti yang dilakukan Vim (yaitu, sebagai bagian dari kata)?

Kossak
sumber

Jawaban:

26

Solusi paling sederhana: gunakan ciWuntuk memilih kata yang dibatasi spasi.

Masalah yang lebih besar berkaitan dengan nilai _karakter dalam tabel sintaksis . Masalahnya adalah _, secara default, konstituen simbol dalam tabel sintaks, dan Anda ingin memperlakukannya sebagai konstituen kata.

Jika Anda menggunakan emacs 24.4, Anda bisa mencoba mengaktifkannya superword-mode. Saya belum mencobanya sendiri, jadi jarak tempuh Anda mungkin berbeda.

Alternatif lain adalah memodifikasi tabel sintaksis sendiri dan memberi tahu Emacs bahwa Anda ingin agar _karakter tersebut diperlakukan sebagai konstituen kata, seperti:

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

Setelah Anda melakukan itu, ciwberfungsi seperti yang Anda inginkan, sehingga akan memilih semua abc_def_ghidaripada hanya adil def.

Melakukannya dengan cara ini, bagaimanapun, mungkin berlebihan, terutama jika Anda hanya ingin _menghitung sebagai bagian dari kata untuk objek teks. Sebagai gantinya, Anda dapat memberi saran evil-inner-wordsebagai berikut:

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

Sekarang, _masih merupakan konstituen simbol untuk semuanya kecuali objek teks kata-dalam, jadi ciwakan melakukan apa yang Anda inginkan tanpa menyentuh fungsi dari hal lain.

Anda dapat membaca lebih lanjut tentang memodifikasi tabel sintaks pada node EmacsWiki .

Dan
sumber
Ini bekerja seperti pesona. Untuk mengubah semua gerakan ( w, aw, dll), Anda dapat melakukan hal yang sama dengan fungsi berikut juga: evil-forward-word-begin, evil-forward-word-end, evil-backward-word-begin, evil-backward-word-end, evil-a-word, evil-inner-word. Catatan: Anda harus berubah underscore-as-wordmenjadi nilai yang berbeda, unik (sewenang-wenang).
sitaktif
(modify-syntax-entry ?_ "w")tidak bekerja untuk saya karena suatu alasan. Melakukannya secara interaktif juga tidak berhasil. Adakah yang tahu mengapa atau bagaimana saya bisa men-debug ini? Saya menggunakan Spacemacs jika itu relevan.
Helder S Ribeiro
1
Ini menjelaskan masalah saya. Tampaknya Anda harus merujuk ke tabel sintaks target secara eksplisit. Dalam kasus saya yang saya gunakan (modify-syntax-entry ?_ "w" rust-mode-syntax-table), maka itu berhasil.
Helder S Ribeiro
Apa efek yang tidak diinginkan dari memodifikasi entri sintaks?
luntain
FTR: superword-modetidak memengaruhi pergerakan masuk evil-mode. Jadi bukan konstituen untuk memodifikasi tabel sintaks.
Hi-Angel
28

Cuplikan berikut akan membuat Evil memperlakukan simbol Emacs sebagai kata.

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

Ini memiliki keuntungan yang berubah tergantung pada bahasa:

foo-bar

adalah satu simbol lisp-modetetapi dua simbol (dipisahkan oleh -) dalam c-mode.

Erik
sumber
14

The spacemacs FAQ menawarkan solusi bahasa-spesifik berikut:

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

Ini juga berfungsi di emacs biasa. Dengan kejahatan, itu bekerja dengan semua perintah yang berhubungan dengan kata ( w, e, *, #, dll)

Secara umum, ini akan melakukannya untuk semua mode utama:

(add-hook 'after-change-major-mode-hook
          (lambda ()
            (modify-syntax-entry ?_ "w")))
ejoubaud
sumber
2
Apakah menggunakan 'prog-mode-hookopsi untuk mencakup setiap bahasa?
BallpointBen
2

Emacs 24 diperkenalkan superword-mode, mode minor yang memperlakukan garis bawah sebagai bagian dari kata-kata. evil-modemenghargai pengaturan ini.

Berikut dokumentasinya:

(superword-mode &optional ARG)

Alihkan gerakan dan pengeditan kata super (mode Superword). Dengan argumen awalan ARG, aktifkan mode Superword jika ARGpositif, dan nonaktifkan. Jika dipanggil dari Lisp, aktifkan mode jika ARGdihilangkan atau nihil.

Mode superword adalah mode minor buffer-lokal. Mengaktifkannya mengubah definisi kata sehingga simbol karakter diperlakukan sebagai bagian dari kata: misalnya, dalam superword-mode, "this_is_a_symbol"dihitung sebagai satu kata.

BallpointBen
sumber
Jika Anda menggunakan evil-mode, sayangnya, ada bug saat superword-modediaktifkan. Itu menyebabkan beberapa perilaku yang tidak menentu ketika evil-forward-word-begindipanggil: github.com/emacs-evil/evil/issues/721
modulitos
0

Saya sebenarnya cukup menyukai perilaku ini karena saya mungkin ingin hanya mengedit sebagian kata dan menjaga bagian lain tetap utuh. Jika saya ingin membahas seluruh kata saya selalu dapat menggunakan E, Watau B, varian huruf besar. Ini memberi saya kontrol yang lebih baik.

xji
sumber