Bagaimana cara mencari di hasil pencarian

8

Ketika saya C-sbisa mencari. Bagaimana saya harus melakukan fungsi yang saya dapat ikat misalnya C-ryang akan membiarkan saya mencari di hasil beberapa permintaan pencarian yang telah ditentukan?

Seperti isi jendela adalah:

function xyz(a, b)
  return a + b
end

Saya bisa C-M-sdengan function.*permintaan dan hasilnya akan function xyz(a, b).

Saya ingin memiliki fungsi tempat saya dapat memasukkan kueri dan mencari di hasil tersebut (yang akan dihasilkan di belakang mata saya secara otomatis).

MEMPERBARUI

Terima kasih atas solusinya. occur, helm-occurjuga bekerja dengan sangat baik, tetapi saya telah menerima jawaban Jordon Biondo karena dia memberikan kode yang saya butuhkan untuk menjawab pertanyaan saya sepenuhnya.

lukas.pukenis
sumber
Saya agak bingung tentang tujuan Anda: sepertinya Anda ingin menerapkan beberapa fitur khusus Lua helm-swoop, tetapi pertanyaan Anda (dan terutama judulnya) tidak terlalu jelas mengenai hal ini. Mungkin saya tidak mendapatkan pertanyaan Anda karena saya tidak terbiasa dengan helm.
paprika
@ paprika lihat pertanyaan terbaru :)
lukas.pukenis
bukankah ini persis seperti apa yang sudah dilakukan oleh helm-swoop?
Jordon Biondo
@JordonBiondo Saya bisa melihat fungsinya dalam daftar helm-swoop. Tetapi imenubekerja dengan baik untuk saya! Kecuali saya mencari solusi umum untuk pertanyaan saya
lukas.pukenis
Hanya ingin tahu apakah Anda sudah mempertimbangkan "Cx c i" menjalankan perintah "helm-semantic-or-imenu", karena Anda sudah menggunakan helm.
rimero

Jawaban:

5

Pendekatan sederhana adalah dengan hanya menggunakan rgrep.

gunakan M-xrgrepdan tentukan pencarian "fungsi" dalam file saat ini di direktori saat ini. Anda dapat menyelesaikan ini dalam sebuah perintah sehingga Anda tidak perlu menentukan opsi setiap kali seperti ini:

(defun rgrep-lua-functions ()
  "run `rgrep` searching for 'function' in the current file."
  (interactive)
  (rgrep "function" (file-name-nondirectory (buffer-file-name)) "."))

Ini akan menghasilkan buffer yang dapat ditelusuri dengan tanda tangan fungsi dan Anda dapat melompat ke definisi jika Anda mau.

Jordon Biondo
sumber
grep, rgrep, occur, Dan sejenisnya pencari hanya baris demi baris . Artinya, konteks pencarian adalah satu baris. Saya pikir OP meminta untuk mencari definisi fungsi. Tetapi karena jawaban ini diterima, saya kira pertanyaan yang diajukan tidak benar-benar apa yang diinginkan.
Drew
dalam pertanyaan dia menentukan bahwa dia ingin garis seperti function xyz(a, b)itu, jika lua Anda diformat dengan benar adalah persis apa yang akan Anda dapatkan.
Jordon Biondo
Tidak jelas bagiku. Ya, dia bilang dia akan puas jika garis seperti itu ditemukan, untuk dicari. Tetapi dalam contohnya dia menunjukkan seluruh definisi fungsi sebagai " isi jendela " yang dia ingin dapat mencari. Konteks garis tunggal tidak memberi Anda konten seperti itu untuk dicari (baik di "jendela" atau lainnya). Mereka hadir Anda dengan hanya satu baris: function xyz(a, b).
Drew
7

Akan occurbekerja untukmu

M-x occuratau M-s okemudian memasukkan kueri Anda akan memberi Anda daftar baris yang cocok dengan regexp itu. Anda kemudian dapat menggunakan C-suntuk mencari di dalam buffer Occur untuk mempersempit pencarian Anda dalam baris yang cocok.

Jonathan Leech-Pepin
sumber
Ups. Saya menghabiskan begitu lama menulis jawaban saya sehingga saya tidak melihat ada yang memukul saya sampai habis.
nispio
4

Emacs memiliki perintah yang disebut occursangat cocok untuk jenis tugas ini. Jika Anda memasang Helm, maka Anda dapat menggunakannya helm-occur.


Terjadi

The occurPerintah merupakan bagian dari emacs vanili, dan terikat untuk M-s osecara default. Occur akan meminta Anda untuk mencari regexp, dan kemudian akan membuka jendela baru yang menunjukkan semua baris di buffer saat ini yang berisi kecocokan. *Occur*Buffer yang dihasilkan dapat dicari menggunakan isearch( C-s).

  • M-s o function RET untuk menampilkan semua baris yang cocok dengan "fungsi"
  • C-x ountuk memindahkan fokus ke *Occur*buffer
  • C-s untuk memulai pencarian dalam hasil pencarian

Helm Terjadi

Jika Anda sudah memasang helm, Anda dapat menggunakannya helm-occuruntuk melakukan hal serupa. Dalam hal ini, *Helm Occur*buffer tidak akan dapat dicari secara langsung C-s. Di Helm Anda dapat mencari beberapa istilah pencarian hanya dengan memisahkannya dengan spasi.

  • M-x helm-occur RET untuk membuka jendela Helm Occur
  • function untuk menampilkan semua baris yang mengandung "fungsi"
  • SPC foo untuk mempersempit hasil ke garis juga mengandung foo

Dalam salah satu mode ini, memilih kecocokan dalam buffer yang terjadi dan menekan enter akan mengarahkan Anda ke baris dalam kode.

nispio
sumber
3

Jika Anda menggunakan perpustakaan Icicles maka Anda dapat dengan mudah melakukan hal semacam ini. Apa yang Anda minta (jika saya mengerti dengan benar), adalah mencari hanya dalam konteks pencarian tertentu .

Misalnya, seperti dalam kasus ini, Anda mungkin ingin mencari hanya di dalam definisi fungsi - konteks pencarian adalah definisi fungsi. Dalam Lisp, ini akan menjadi seperti defuns.

Icicles memiliki beberapa perintah pencarian Icicles yang telah ditentukan untuk mencari definisi seperti ini. Ini secara kolektif disebut perintah Icicles Imenu .

Untuk mencari hanya definisi perintah, Anda dapat menggunakan perintah icicle-imenu-command-full. Untuk mencari hanya definisi fungsi non-interaktif, gunakan perintah icicle-imenu-non-interactive-function-full.

Di luar mencari definisi, Anda dapat dengan mudah menentukan segala jenis konteks yang akan dicari. Cara paling sederhana adalah dengan menyediakan regexp. Perintah icicle-searchmeminta Anda untuk regexp mendefinisikan konteks pencarian. Anda juga dapat menggunakan fungsi untuk menentukan konteks pencarian.

Kemungkinan lain termasuk:

  • Mencari teks dari berbagai jenis HAL (misalnya, sexps, kalimat, daftar, string, komentar, elemen XML, ...), yaitu, mengabaikan teks lain di luar HAL.

  • Mencari zona teks yang telah memberikan teks atau properti overlay, yaitu mengabaikan teks lain.


CATATAN:

Jawaban lain di sini yang menyebutkan occurdan sejenisnya ( helm-occur) menyediakan jenis pencarian konteks yang terbatas: konteks pencarian hanyalah garis - garis buffer.

Itu jauh lebih terbatas itu, katakanlah, mencari dalam definisi fungsi keseluruhan, yang adalah apa yang saya pikir Anda minta. Dengan Icicles , perintah icicle-occur(terikat ke C-c ') memungkinkan Anda mencari di dalam baris sebagai konteks pencarian.

Drew
sumber
1

Dengan Isearch + :

  1. C-M-s .+function.+, untuk mencari seluruh baris yang berisi function.

  2. C-z .diikuti oleh regexp untuk sesuatu yang ingin Anda cari di baris yang berisi function.

(Opsional) Ulangi # 2 dengan pola lain (regexps) agar sesuai dengan baris yang sama. Pertandingan bisa dalam urutan apa pun di dalam garis.

Alih-alih langkah # 1, Anda bisa mulai dengan C-M-s .+ C-z . function. Intinya adalah untuk mencari seluruh garis yang berisi functionbersama dengan pola lain yang Anda suka.

Cara C-z .kerjanya: Ini meminta Anda untuk mencocokkan pola inline (misalnya function). Itu membungkus itu dengan .*di setiap sisi, untuk mendapatkan pola garis penuh (misalnya .*function.*). Ini menambahkan predikat filter yang mensyaratkan bahwa string pencarian Anda saat ini ( .+) juga cocok dengan pola itu (misalnya .*function.*).

Lihat Penyaringan Pencarian dinamis untuk informasi lebih lanjut.

Drew
sumber