Terkadang saya sering menemukan diri saya berganti-ganti antara dua fungsi yang saya edit bersama satu sama lain. Dalam situasi ini, sangat membosankan dan menyakitkan untuk terus melakukan C-s <functionname>
untuk beralih ke fungsi lain dan kemudian menemukan tempat yang tepat yang saya edit sebelumnya.
Bagaimana cara mengatur penanda dan kemudian melompat-lompat antara dua lokasi di buffer dengan mudah?
navigation
cycling
mark-ring
registers
Vedaad Shakib
sumber
sumber
Jawaban:
Jendela Emacs
C-x 2
akan membuka jendela lain (= pisahkan frame) di bawah yang sekarang, terpasang pada buffer yang sama. Anda dapat memindahkan titik di kedua jendela tanpa memengaruhi yang lain.Anda dapat berpindah dari satu jendela ke jendela lainnya menggunakan
C-x o
. Built-in windmove perpustakaan menyediakan beberapa fungsi yang membuat navigasi antara jendela lebih mudah.Jika metode ini cocok untuk Anda, Anda mungkin juga ingin melihat buffer tidak langsung .
sumber
Register:
C-xrSPCberjalan
point-to-register
C-xrjberjalan
jump-to-register
Ketikkan karakter apa saja untuk menentukan register saat diminta. 1
Bookmark:
C-xrmberjalan
bookmark-set
C-xrbberjalan
bookmark-jump
Tandai cincin:
C-SPCC-SPCmendorong posisi saat ini ke cincin tanda (tanpa membiarkannya aktif).
C-uC-SPCmuncul cincin tanda, melompat ke posisi sebelumnya. Anda dapat menggunakan ini berulang kali untuk menavigasi ke seluruh dering.
Perhatikan bahwa beberapa perintah (terutama yang dapat memindahkan Anda ke tempat yang tidak diketahui atau jarak sewenang-wenang dari lokasi asli Anda) akan secara otomatis mendorong ke tanda dering sehingga Anda dapat menggunakannya C-uC-SPCuntuk kembali setelahnya. Ini termasuk
isearch
, jadi setelah menggunakan C-suntuk pergi ke suatu tempat, Anda dapat dengan mudah melompat kembali.Tukar titik dan tandai:
Dan seperti komentar Tu Do, C-xC-xlari
exchange-point-and-mark
yang sangat berguna untuk melompat di antara dua lokasi. Ini juga mengaktifkan tanda / wilayah, tetapi Anda dapat menggunakan C-SPCuntuk menghapus sorotan.1 Jika Anda memanfaatkan fungsi register di elisp, gunakan simbol yang tidak bertentangan untuk nama, daripada char, sehingga Anda tidak dapat berkonflik dengan register yang diatur secara interaktif (kecuali, tentu saja, Anda ingin melakukan bahwa).
sumber
C-x C-x
juga, karena dapat melompat bolak-balik antara dua posisi.C-u C-SPC
muncul cincin tanda dan jalankan lagi akan memindahkan titik di tempat lain.Selain jawaban phils, ada beberapa opsi lagi:
helm-semantic-or-imenu : Daftar semua definisi yang tersedia di file saat ini. Jika kursor ada di dalam definisi, ketika mengaktifkan stabilo memilih dulu definisi itu.
sr-speedbar : Peramban file yang mencantumkan definisi di setiap file. Ini mirip dengan garis pohon di IDE.
sumber
Selain register dan spidol (lihat jawaban @ phils tentang keduanya dan yang lain, Icicles menjawab tentang spidol), bookmark , terutama bookmark otomatis atau temporer, dapat membantu untuk ini. Anda memerlukan Bookmark perpustakaan + untuk jenis bookmark khusus ini.
Sebuah autonamed bookmark adalah salah satu yang Anda tidak perlu nama. Cepat untuk membuat dan menghapus: cukup tekan tombol. Kunci yang sama membuat atau menghapus bookmark di titik. (Secara default, ini terikat
C-x p RET
, tetapi Anda tentu saja dapat menggunakan kunci apa saja.)Bookmark yang diautonisasi, seperti bookmark secara umum, persisten. Tapi Anda dapat menghapusnya secara otomatis.
Anda juga dapat membuat bookmark sementara atau membuat bookmark yang ada sementara. Anda dapat, misalnya, memilih untuk membuat penanda otomatis menjadi sementara.
Anda dapat dengan cepat menggilir satu set bookmark yang diberikan. Misalnya, untuk menggilir di antara penanda yang diautonkan, gunakan perintah
bmkp-next-autonamed-bookmark-repeat
danbmkp-previous-autonamed-bookmark-repeat
(ikat ke kunci).Anda dapat menyorot lokasi yang ditandai dengan berbagai cara, sehingga mudah dikenali.
sumber
Berkenaan dengan buffer tidak langsung yang disebutkan dalam jawaban yang diterima ...
M-x clone-indirect-buffer
akan membuat buffer tidak langsung untuk buffer saat ini. Nama buffer baru akan ditambahkan '<2>' (atau jumlah yang lebih besar jika Anda sudah memiliki nama buffer duplikat). Buffer baru dibuka di jendela baru. Anda dapat beralih kembali ke satu jendela menggunakanC-x 0
atauC-x 1
.Dengan
M-x winner-mode
Anda dapat dengan mudah beralih di antara dua lokasi.C-c <left>
/M-x winner-undo
danC-c <right>
/M-x winner-redo
beralih antar konfigurasi jendela. Dalam hal ini konfigurasi akan menjadi posisi di dua buffer yang melihat satu file.Catatan:
winner-undo
danwinner-redo
fungsinya berfungsi pada daftar konfigurasi. Jika konfigurasi diubah, mis. Titik bergerak, maka konfigurasi saat ini menjadi kepala daftar danwinner-redo
tidak valid, dalam hal iniwinner-undo
akan mengembalikan posisi sebelumnya.Untuk situasi OP ini mengarah ke proses berikut;
M-x winner-mode
M-x clone-indirect-buffer
(nama penyangga tidak langsung baru: File1.txt <2>)C-x 1
C-x b
(default akan menjadi buffer asli kecuali jika beralih ke buffer lain terjadi sejak langkah 3). Ini menciptakan konfigurasi baru agar pemenang dapat kembali.Beralih ke lokasi edit sebelumnya (konfigurasi jendela) tergantung pada apakah perubahan dibuat pada konfigurasi jendela di antara switch;
C-c <left>
/M-x winner-undo
.C-c <left>
/M-x winner-undo
untuk kembali danC-c <right>
/M-x winner-redo
untuk maju.Perubahan adalah apa pun selain yang lain
winner-undo
atauwinner-redo
.sumber
jika Anda menggunakan
evil-mode
, layer vim, makaC-o
danC-i
akan bekerja sama.Mereka menjalankan perintah
evil-jump-backward
/forward
.C-o
melompat ke posisi yang lebih lama di daftar lompat, yang diatur secara otomatis (tanda ditetapkan pada perintah gerak).C-i
berjalan terbalik Kita juga bisa menggunakanTAB
setelahC-o
alih-alihC-i
. Jadi menggunakan kedua fungsi akan membawa Anda bolak-balik di buffer Anda saat ini.Jika Anda ingin fitur ini menjadi cross-buffer, periksa
evil-jumpers
: http://melpa.org/#/evil-jumper«
Evil-jumper adalah add-on untuk mode kejahatan yang menggantikan implementasi daftar lompatan sedemikian rupa sehingga meniru lebih dekat dengan perilaku Vim. Secara khusus, itu akan melewati batas buffer dan menghidupkan kembali buffer yang mati jika perlu. Daftar lompatan juga dapat disimpan ke file dan dikembalikan di antara sesi. »
Catatan: Saya mempelajarinya di wiki ini
sumber
C-o
danC-i
lakukan?Jika Anda menggunakan Icicles maka Anda dapat dengan cepat menavigasi di antara penanda di
mark-ring
setiap buffer atauglobal-mark-ring
(yang memiliki satu penanda di setiap buffer).Anda melakukan ini menggunakan multi-perintah
C-- C-SPC
(untuk buffermark-ring
) atauC-- C-x C-SPC
(untukglobal-mark-ring
). Setelah menekan tombol satu kali, Anda menggunakan kunci bersepeda Icicles biasa , dll., Untuk bergerak di antara penanda cincin.(Kunci yang sama tanpa arg awalan mengatur tanda (
set-mark-command
) dan pop tanda global (pop-global-mark
), masing-masing, seperti yang mereka lakukan di vanilla Emacs.)Teks baris masing-masing penanda digunakan sebagai kandidat penyelesaian. Saat Anda mengetik, input minibuffer Anda mempersempit kandidat menjadi kandidat yang cocok (mis., Pencocokan substring atau regexp). Anda dapat dengan cepat berputar di antara marker yang cocok atau mengunjungi salah satu dari mereka secara langsung. Anda bahkan dapat mengubah urutan pengurutan (
C-,
) untuk bersepeda.sumber
Kemungkinan minimal tapi sering membantu - ketika Anda hanya ingin mengintip fungsi lainnya - adalah pengaturan
yang membawa Anda kembali ke posisi kursor awal yang tepat saat beralih di antara C-vdan M-v.
sumber
evil-mode
mengimplementasikan penanda gaya Vim . Anda dapat mengatur penanda dengan (m
, yaitu,evil-set-marker
) dan melompat ke tanda dengan backtick `(evil-goto-mark
) atau ke garis tanda'
(evil-goto-mark-line
).Oleh karena itu, Anda dapat membuat tanda "a" di lokasi pertama dengan
ma
, membuat tanda "b" di lokasi kedua denganma
, dan kemudian'a
melompat untuk menandai "a" dan'b
untuk melompat ke tanda "b".sumber
gunakan imenu dan kode di bawah ini
sumber
Selama 20 tahun terakhir, saya telah menggunakan dua permata ini:
Saya mengikat mereka ke C-. dan C-, masing-masing dan menggunakannya secara konstan tanpa menyadarinya lagi.
Ya, register dan spidol dan semacamnya jauh lebih fleksibel dan kuat, tetapi tetap saja, ini adalah salah satu dari mereka yang kecil, penolong cepat yang membuat saya tidak mungkin beralih ke editor lain.
sumber
Anda juga dapat memanfaatkan makro, karena mereka dapat dengan cepat terikat pada tombol yang mudah digunakan.
Misalnya, rekam lompatan ke posisi N menggunakan
<F3> M-g g N <F4>
dan tetapkan ke tombol F5 denganC-x C-k b <F5>
. Kemudian lakukan hal yang sama dengan posisi M dan F6. Mulai sekarang Anda dapat dengan mudah mengganti F5 dan F6 untuk melompat antara N dan M.Bahkan lebih sederhana, karena
<F4>
mengeksekusi makro yang terakhir direkam dan<C-u> F4
yang berikutnya, yang terakhir, Anda dapat melewati langkah pengikatan kunci dan cukup berganti posisi menggunakan<F4>
dan<C-u> F4
.Kemungkinan lain yang agak radikal adalah membuat buffer tidak langsung di jendela lain
<C-x> 4 c
. Buffer ini memiliki konten yang sama tetapi mungkin memiliki posisi titik yang berbeda. Sekarang cukup bergantian antara windows dengan<C-x> o
cara biasa.sumber