Berhenti di awal kata pada `kata depan`

17

Saya sering menggunakan banyak doa forward-worddiikuti oleh satu backward-worduntuk memindahkan titik ke awal kata pada satu baris. Saya kira saya tidak pernah terbiasa dengan cara yang forward-wordberbeda dari vim wdan bahkan setelah bertahun-tahun menggunakan Emacs saya tidak bisa terbiasa dengan perbedaannya.

Apakah ada fungsi yang bisa saya gunakan alih-alih forward-wordtidak melompati kata tetapi berhenti di awal kata juga? Apakah ada strategi lain untuk pindah ke awal kata ketika bergerak maju yang tidak melibatkan eksekusi berulang kali forward-char?

rekado
sumber
Anda mungkin (pada titik tertentu) tertarik untuk menulis maju / mundur kata / paragraf Anda dan fungsi kill-word yang terkait. Berikut ini adalah tiga tautan ke beberapa fungsi khusus yang saya gunakan setiap hari - perilaku tersebut sangat mirip dengan pengolah kata tertentu yang telah saya gunakan selama bertahun-tahun: stackoverflow.com/a/20456861/2112489 | stackoverflow.com/q/18675201/2112489 | superuser.com/a/685604/206164
lawlist

Jawaban:

24

The miscpaket (dikirim dengan emacs) memiliki built-in fungsi forward-to-word, yang melakukan apa yang saya pikir Anda inginkan:

forward-to-word is an interactive compiled Lisp function in `misc.el'.

It is bound to M-f.

(forward-to-word ARG)

Move forward until encountering the beginning of a word.
With argument, do this that many times.

Untuk menggunakannya, pertama-tama tambahkan (require 'misc)ke file konfigurasi Anda.

usang
sumber
Terima kasih, ini berguna. Sayangnya, hal ini tidak juga berhenti di akhir kata, meskipun.
rekado
1
Benar, tetapi juga tidak vim w. Sejauh yang saya bisa lihat, ada pemetaan vim-to-emacs yang hampir sempurna: w= forward-to-word; e= forward-word; b= backward-word; ge= backward-to-word. Tapi saya bukan pengguna ahli vim, jadi mungkin ada beberapa kehalusan saya hilang.
usang
Heh, kamu sebenarnya benar. Saya kira setiap kali aku di vim w, edan bhanya mengaburkan pergi dan aku hanya bergerak di sekitar. Aneh. Saya yakin wberhenti di kedua titik! Jadi, saya akan menerima jawaban Anda, karena persis sesuai dengan pertanyaan saya :)
rekado
4

Anda dapat mengikat fungsi di bawah ini M-fdan mengikat aslinya forward-wordke M-F. Fungsi ini hanya mengambil argdan meneruskannya ke forward-wordfungsi. Jadi argumen universal akan bekerja sama baiknya dengan fungsi aslinya.

(defun modi/forward-word-begin (arg)
  "Move forward a word and end up with the point being at the beginning of the
next word.  Move point forward ARG words (backward if ARG is negative).
If ARG is omitted or nil, move point forward one word."
  (interactive "p")
  (forward-word arg)
  (forward-word 1)
  (backward-word 1))

Meskipun demikian, perlu diingat bahwa fungsi di atas mungkin tidak selalu melakukan hal yang benar ; itu sangat tergantung pada apakah intinya sudah di awal kata atau tidak.


Inilah cara lain untuk mengimplementasikan hal di atas di mana kata batas tidak sesuai dengan tabel sintaksis tetapi secara ketat pada pemisahan spasi putih:

(defun modi/forward-word-begin (arg)
  "Move forward ARG (defaults to 1) number of words.
Here 'words' are defined as characters separated by whitespace."
  (interactive "p")
  (dotimes (_ arg)
    (forward-whitespace 1)))

Kredit diberikan ke @glucas untuk ide ini.

Kaushal Modi
sumber
1

Setelah pencarian yang panjang dan menyakitkan untuk fungsi 'maju / mundur-kata' yang sempurna, saya menemukan hal-hal berikut yang membuat saya sangat bahagia:

(progn
  (defun boundary ()
    (and      (= (char-syntax (char-after))  ?w)
         (not (= (char-syntax (char-before)) ?w))))
  (defun my-forward-word ()
    (interactive) 
    (while (progn (forward-char)  (not (boundary)))))
  (defun my-backward-word ()
    (interactive) 
    (while (progn (backward-char) (not (boundary)))))
  (global-set-key [M-right] 'my-forward-word)
  (global-set-key [M-left]  'my-backward-word)
  )
Ruy
sumber
0

Jika Anda ingin menggunakan evil, wdalam keadaan normal terikat evil-forward-word-begin, yang merupakan fungsi gaya Vim yang Anda cari.

Dan
sumber
Saya dulu menggunakan evilwaktu yang lama, tetapi sejak beberapa saat saya menggunakan god-modedan mengikat Emacs biasa.
rekado
0

Saya sering menggunakan beberapa pemanggilan kata depan diikuti oleh satu kata mundur untuk memindahkan titik ke awal kata pada sebuah baris.

Seperti yang Anda sebutkan, caranya adalah maju dua kata ke depan, lalu satu kata ke belakang.

Berikut ini harus melakukan trik dan harus menghormati mode lain seperti mode subword.

(define-key global-map (kbd  "M-f")
  (lambda ()
    (interactive)
    (forward-word)
    (forward-word)
    (backward-word)))

Ini adalah versi dasar /emacs//a/4272/508 yang tidak mencakup beberapa kasus, tetapi lebih mudah dipahami.

ustun
sumber