Cum legez o expresie regulată unei combinații de taste în emacs?

Pentru context, eu sunt ceva de un newac emacs. Nu am folosit-o prea mult, dar am folosit-o tot mai mult (îmi place foarte mult). De asemenea, sunt confortabil cu lisp, dar nu prea familiarizat cu elisp.

Ceea ce trebuie să fac este legarea unei expresii regulate la o combinație de tastatură, deoarece folosesc atât de des acest regex special.

Ce am făcut:

M-C-s ^.*Table\(\(.*\n\)*?GO\)

Rețineți că am folosit linia nouă de mai sus, dar am descoperit că pentru isearch-forward-regexp , trebuie să înlocuiți \ n expresia regulată cu rezultatul Cq Qj . Aceasta introduce o linie nouă literală (fără a termina comanda), permițându-mi să pun un nou rând în expresie și să se potrivească între linii.

Cum pot lega acest lucru de o combinație de taste?

Am înțeles vag că trebuie să creez o funcție elisp care execută isearch-forward-regexp cu expresia, dar sunt fuzzy pe detalii. Am cautat pe Google si am gasit ca cea mai mare parte a documentatiei este o confuzie.

Cum pot lega o expresie regulată unei combinații de taste în emacs?


Mike Stone had the best answer so far -- not exactly what I was looking for but it worked for what I needed

Editați - acest tip de lucru a funcționat, dar după stocarea macro-ului, când m-am întors să îl folosesc mai târziu, nu l-am putut folosi cu C-x e . (de exemplu, dacă repornesc emacs și apoi tastați Mx macro-name , apoi Cx e , primesc un mesaj în minibuffer ca 'no last kbd macro' similare)


@Mike Stone - Vă mulțumim pentru informații. Am incercat sa creez o macrocomanda asa:

C-x( M-C-s ^.*Table\(\(.*C-q C-J\)*?GO\) C-x)

Acest lucru mi-a creat macro-ul, dar când mi-am executat macro-ul, nu am obținut aceeași evidențiere pe care o primesc de obicei când folosesc isearch-forward-regexp . În schimb, a sărit până la sfârșitul următorului meci al expresiei. Deci, asta nu funcționează pentru ceea ce am nevoie. Vreo idee?

Modificați: Se pare că pot utilizează macrocomenzi pentru a face ceea ce vreau, trebuie să mă gândesc în afara căsuței isearch-forward-regexp . Voi încerca ceea ce ați sugerat.

0
fr hi bn

3 răspunsuri

Puteți să utilizați macrocomenzi, doar să faceți Cx ( apoi să faceți totul pentru macro, apoi Cx) pentru a termina macrocomanda, apoi executați Cx e ultima macro definită. Apoi, puteți să-l numiți utilizând Mx name-last-kbd-macro care vă permite să îi atribuiți un nume, pe care îl puteți invoca cu Mx TESTIT utilizând Mx insert-kbd-macro care va pune macroul în buffer-ul curent și apoi îl puteți stoca în fișierul .emacs .

Exemplu:

C-x( abc *return* C-x)

Va defini o macrocomanda pentru a tasta "abc" si apasati Return.

C-xeee

Execută imediat macro-ul de mai sus, de 3 ori (primul e execută acest lucru, apoi 2 e-l va executa de două ori mai mult).

M-x name-last-kbd-macro testit

Numește macro-ul la "testit"

M-x testit

Execută macro-ul numit doar (printuri "abc" apoi întoarcere).

M-x insert-kbd-macro

Pune următoarele în buffer-ul curent:

(fset 'testit
   [?a ?b ?c return])

Ceea ce poate fi apoi salvat în fișierul .emacs pentru a folosi din nou macro-ul numit după ce reporniți emac-urile.

0
adăugat

@Justin:

Când executați o macrocomandă, este puțin diferită ... căutările incrementale se vor întâmpla o singură dată și va trebui să executați din nou macro-ul dacă doriți să căutați din nou. Cu toate acestea, puteți face lucruri mai puternice și mai complexe, cum ar fi căutarea unui cuvânt cheie, salt la începutul liniei, marcare, mers la sfârșitul liniei, Mw (pentru a copia), apoi salt la alt tampon, apoi Cy ), apoi săriți înapoi la celălalt tampon și terminați macrocomanda. Apoi, de fiecare dată când executați macrocomanda, veți copia o linie în tamponul următor.

Lucrul cu adevărat interesant despre macrocomenzile emacs se va opri când va vedea clopotul ... care se întâmplă atunci când nu reușiți să potriviți o căutare incrementală (printre altele). Deci, macro-ul de mai sus, puteți face C-u 1000 C-x e care va executa macro-ul de 1000 de ori ... dar din moment ce ați făcut o căutare, va copia doar 1000 de linii, SAU PÂNĂ ÎNCERCAREA CĂUTĂRILOR! Ceea ce înseamnă că dacă există 100 de potriviri, acesta va executa macroul de 100 de ori.

EDIT: Vedeți C-hf highlight-lines-matching-regexp care va arăta ajutorul unei comenzi care evidențiază tot ce corespunde unui reglaj ... Nu știu cum să descreșteți evidențiarea ... oricum ați putea folosi un macro stocat pentru a evidenția toate potrivirea regelui, și apoi o altă macro pentru a găsi următoarea ...?

FURTHER EDIT: M-x unhighlight-regexp va anula scoaterea în evidență, trebuie să introduceți ultimul regex deși (dar acesta este implicit la regexul pe care l-ați evidențiat)

0
adăugat

În general, pentru a defini o legare a cheilor personalizate în Emacs, ați scrie

(define-key global-map (kbd "C-c C-f") 'function-name)

define-key is, unsurprisingly, the function to define a new key. global-map is the global keymap, as opposed to individual maps for each mode. (kbd "C-c C-f") returns a string representing the key sequence C-c C-f. There are other ways of doing this, including inputting the string directly, but this is usually the most straightforward since it takes the normal written representation. 'function-name is a symbol that's the name of the function.

Acum, cu excepția cazului în care funcția dvs. este deja definită, veți dori să o definiți înainte de a utiliza aceasta. Pentru a face acest lucru, scrieți

(defun function-name (args)
  (interactive)
  stuff
  ...)

defun defines a function - use C-h f defun for more specific information. The (interactive) there isn't really a function call; it tells the compiler that it's okay for the function to be called by the user using M-x function-name and via keybindings.

Acum, în special în căutarea interactivă, acest lucru este dificil; modulul isearch nu pare să fie înființat pentru ceea ce încercați să faceți. Dar puteți folosi acest lucru pentru a face ceva similar.

0
adăugat