Расширенные функции редактирования Emacs
Там много шума о супер удивительных особенностях Emacs. Будь то org-mode, Gnus или Cx Mc butterfly. Я использовал Emacs в течение многих лет, поэтому не нужно меня убеждать.
Я лично нашел, что никто не говорит о... тексте редактирования. Вы знаете, что
Emacs - отличная ОС, но в нем нет достойного редактора.
шутка? Я действительно не понял это, пока не нащупывал Вима.
Теперь я написал свою диссертацию, используя Emacs в качестве текстового редактора, так что мое сердце все еще привязано к ней. Я также очень завидую орг-режиме. Поэтому я задавался вопросом, могут ли быть функции, которые я все время пропускал?
Я приведу несколько примеров, которые я использую все время:
-
o
/o
открывает новую строку выше/ниже текущей и помещает меня в режим вставки независимо от того, в какой позиции находится мой курсор.
-
ci'
удаляет содержимое текущей/следующей строки -string и помещает меня в режим вставки.
-
dat
удаляет текущий тег HTML. cit
удалит содержимое и поместит меня в режим вставки. cstt
позволит мне отредактировать тег (например, сделать <span>
в <div>
)
-
cs([
изменяет окружающие "(" и ")" на "[" и "]".
- Расширение позволяет мне обращаться к отстукам Python:
dai
удаляет текущий отложенный блок, \\ai
будет комментировать его (\\ является расширением).
Есть ли какие-то супертипные ярлыки, но легко доступные ярлыки для подобных вещей в Emacs? Sublime Text 2 имеет несколько функций "expand selection", которые идут аналогичным образом, хотя и не так точно, но все же это очень полезно.
P.S. Пожалуйста, не поднимайте эмуляцию vi, просто не делайте этого.
P.P.S. Кроме того, ради бога, нет Emacs vs. Vim против любой войны, я прошу вас.
Ответы
Ответ 1
Посмотрите эту страницу вики. У нее много и много трюков. Большинство из них я нашел (вдруг) для себя перед чтением, но эту статью стоит прочитать.
Попробуйте C-h k
каждый C-<key> M-<key>
. Мне кажется что-то вроде M-c, M-l, M-u
, M-z
для zap-to-char
. Платиновый ответ будет "научиться использовать i-search". C-w, C-M-y, M-r
являются супер-полезными в режиме i-search.
Я не знаю никаких пакетов, которые помогают мне редактировать что-то, что окружает мою точку зрения. Однажды я написал один для себя, но это оказалось бесполезным. Если я буду возражать, напишу что-нибудь еще, первое, что я сделаю - подумай, что мне писать. Как насчет их поведения? Разве это было N отдельных команд для каждого типа скобок, или одного, но умного? Как это должно работать? Убить для брелока? (Обсуждения приветствуются).
Для ~ lisp я использую команды редактирования sexp.
Я написал для себя что-то.
(defun cm-fast-step-upward ()
"Step 3 lines up, recenteres the screen."
(interactive)
(forward-line -3)
(recenter))
(defun cm-fast-step-downward ()
"Step 3 lines down, recenteres the screen."
(interactive)
(forward-line 3)
(recenter))
(defun cm-find-any-bracket-forward()
"Search for \"_}_]_'_>_)_end forward"
(interactive)
(re-search-forward "[\"}'>)]\\|\\(end\\)\\|\\]"))
(defun cm-find-any-bracket-backward()
"Search for \"_{_[_'_<_(_begin forward"
(interactive)
(re-search-backward "[\"{'<(]\\|\\(begin\\)\\|\\["))
(defun cm-find-nonspace-backward()
"Search for non tab, space, newline symbol backward."
(interactive)
(if (and
(search-backward-regexp "[
]" (point-min) t)
(search-backward-regexp "[^
]" (point-min) t))
(forward-char)
(goto-char (point-min))))
(defun cm-find-nonspace-forward()
"Search for non tab, space, newline symbol backward."
(interactive)
(if (and
(search-forward-regexp "[
]" (point-max) t)
(search-forward-regexp "[^
]" (point-max) t))
(backward-char)
(goto-char (point-max))))
(defun cm-backward-delete-word(&optional arg)
"DELETE word before cursor. Warning, this word cannot be yanked."
(interactive "p")
(let ((beg (point)))
(backward-word arg)
(delete-region beg (point))) )
(defun cm-delete-word(&optional arg)
"DELETE word after cursor. Warning, this word cannot be yanked."
(interactive "p")
(let ((beg (point)))
(forward-word arg)
(delete-region beg (point))) )
(defun cm-delete-line(&optional arg)
"DELETE line after cursor. Warning, this line cannot be yanked."
(interactive "P")
(if (equal arg '-) (setq arg -1))
(let ((beg (point)))
(if arg (forward-line arg)
(goto-char (point-at-eol)))
(if (= beg (point))
(delete-char 1 nil)
(delete-region beg (point)))))
(defun cm-reverse-region (&optional arg)
"Reverse current region, like this: \"a(bc) d\" -> \"d )cb(a\"."
(interactive "P")
(let ((reversed (apply 'string (reverse (string-to-list (buffer-substring-no-properties (region-beginning) (region-end)))))))
(delete-region (region-beginning) (region-end))
(insert reversed)))
(provide 'cmmove)
Я никогда не делил (должен ли я?) эту вещь раньше, вы можете оставлять комментарии.
Связи по умолчанию используют гипер-ключ
(global-set-key [?\H-f] 'cm-find-nonspace-forward)
(global-set-key [?\H-b] 'cm-find-nonspace-backward)
(global-set-key [?\H-\]] 'cm-find-any-bracket-forward)
(global-set-key [?\H-\[] 'cm-find-any-bracket-backward)
(global-set-key [?\H-p] 'cm-fast-step-upward)
(global-set-key [?\H-n] 'cm-fast-step-downward)
(global-set-key (kbd "H-t") 'cm-reverse-region)
Я также хочу узнать, какое поведение вам нравится для этих команд. Если они ничего не могут найти, должны ли они сообщать или бросать ошибку?
Ответ 2
Поскольку никто не сказал так прямо, я буду.
Причина, по которой emacs не хватает "достойного редактора", заключается в том, что большая часть точки emacs позволяет вам сделать идеальный редактор для себя. Это не тривиальное обязательство, и есть много вещей, которые другие люди написали, и достаточно людей нашли полезными для включения в стандартные дистрибутивы.
Он не предназначен для использования по умолчанию. В самом деле. Это не предназначалось для того, чтобы быть частью программного обеспечения, которое ты ткнул и подтолкнул немного и кое-где кое-где, как редактор, который можно оторвать от поведения, чтобы сделать то, что ты хочешь.
Итак, да, да есть либо существующий эквивалент $feature
от $editor
, либо если предположить, что никто не написал его, но вы можете быть в безопасности, зная, что его можно реализовать.
Ответ 3
На ваш вопрос нет ответа.
Это непрерывное путешествие, которое вы можете начать с ввода M-x help и делать это часто.
У каждого свой набор функций, без которых они не могут жить. Таким образом, помимо простого перечисления всех доступных функций редактирования текста, попробуйте (повторно) прочитать тур по Emacs, FAQ, а руководство Emacs. Наиболее активными местами для поиска информации о плагинах являются Emacs Wiki и Emacs Lisp Архив пакетов (для распространения с Emacs 24).
99% функций, о которых вы не знаете, будут найдены в приведенных выше ссылках.
Конечно, вы также можете посмотреть стандартный вопрос и ответить на вопрос: какая самая полезная функция....
Ответ 4
- Команда vim
o/O
представляет собой две ключевые команды в emacs. Для o
, C-e <return>
(конец строки вернитесь для создания новой строки). Для o
, C-a C-o
(начало строки, открытая строка).
-
ffap-copy-string-as-kill
(не привязанный к ключу по умолчанию, но легко фиксированный) делает что-то похожее на ваш ci'
. В emacs нет понятия "режим вставки".
Я не изменяю "(" ")" до "[" "]" достаточно, чтобы изучить последовательность клавиш для него. Если бы мне пришлось это сделать, я сначала обратился бы к query-replace-regexp
(C-M-%
).
Я не очень часто редактирую python или HTML, но я уверен, что в ваших режимах есть умные трюки в соответствующих режимах.
Отредактировано в ответ на комментарии.
Дополнительные функции редактирования, которые я часто использую:
- Макросы клавиатуры. Это широкая категория трюков, но если есть много подобных изменений, которые я должен выполнить во всем буфере, я записываю макрос и повторяю его. Если макрос очень полезен, его можно сохранить для будущих сеансов. Это может быть очень мощным, когда поиск является частью макроса. Примером использования является определение
enum
в C и быстрое выключение оператора switch из него. Подробнее см. http://www.emacswiki.org/emacs/KeyboardMacros и http://www.emacswiki.org/emacs/KeyboardMacrosTricks.
- Всякий раз, когда я использую vim, я всегда пропускаю инкрементный поиск. Не продвинутый, но я нахожу его намного проще в использовании, чем поиск в vim, особенно когда я не уверен в написании того, что я пытаюсь найти.
- Marks. Каждый раз, когда вы начинаете инкрементный поиск, текущая позиция помещается в стек меток, чтобы быстро вернуться в предыдущую позицию. Вы можете нажать маркер в любое время и поместить стек меток, чтобы вернуться через интересные точки в буфере. См. http://www.emacswiki.org/emacs/MarkCommands.
- Режим TRAMP для редактирования файлов на удаленных компьютерах. См. http://www.emacswiki.org/emacs/TrampMode.
- Редактирование прямоугольника.
string-insert-rectangle
и rectangle-delete
являются моими хорошими друзьями.
Трудно понять, что вы найдете полезным. У каждого пользователя будет другая любимая функция. Функция, которая заставила меня начать использовать emacs, была M-x compile
. Используйте M-g n
, чтобы перейти к расположению файла следующей ошибки или предупреждения на выходе компиляции.
Ответ 5
Я не эксперт Emacs, но https://sites.google.com/site/steveyegge2/effective-emacs, похоже, содержит некоторые полезные примеры. Особенно важно запоминать элементы 6 (буферный контроль) и 7 (потерять пользовательский интерфейс). Кроме того, раздел комментариев охватывает некоторые советы читателей.
Ответ 6
Вы можете взглянуть на
thing-at-point-utils.el
Он предоставляет такие вещи:
-
ar-brace-or-copy-atpt
"Если область выделена, поставьте THING в точке с помощью скобок (-ов),
иначе скопируйте скобу (ed) в точке.
С NO-DELIMITERS скопируйте скобки (ed) без разделителей.
С отрицательным аргументом kill brace (ed) в точке. "
-
ar-bracket-or-copy-atpt
"Если область выделена, поставьте THING в точке с помощью скобок (ов),
в противном случае скобка копирования (ed) в точке.
С NO-DELIMITERS скопируйте скобок (ed) без разделителей.
С отрицательным аргументом kill bracket (ed) в точке. "
-
ar-lesser-angle-or-copy-atpt
"Если область выделена, укажите THING в точке с меньшим углом (углами),
иначе скопируйте меньший угол (ed) в точке.
С NO-DELIMITERS скопируйте меньший угол (ed) без разделителей.
С отрицательным аргументом убивают меньший угол (ed) в точке. "
Используемые здесь ключи:
(global-set-key [(control c)(<)] 'ar-lesser-angle-or-copy-atpt)
(global-set-key [(control c)(>)] 'ar-greater-angle-or-copy-atpt)
(global-set-key [(control c)(\")] 'ar-doublequote-or-copy-atpt)
(global-set-key [(control c)(\')] 'ar-singlequote-or-copy-atpt)
(global-set-key [(control c)(\))] 'ar-parentize-or-copy-atpt)
(global-set-key [(control c)(\\)] 'ar-backslash-or-copy-atpt)
(global-set-key [(control c)(\])] 'ar-bracket-or-copy-atpt)
(global-set-key [(control c)(\})] 'ar-brace-or-copy-atpt)
(global-set-key [(control c)(_)] 'ar-underscore-or-copy-atpt)
(global-set-key [(control c)(super \})] 'ar-brace-or-copy-atpt)
(global-set-key [(control c)(\/)] 'ar-slash-or-copy-atpt)
Источник:
https://launchpad.net/s-x-emacs-werkstatt
Ответ 7
Я знаю, что вы сказали, что не упоминайте какие-либо режимы эмуляции vi, но если вы этого не сделали, вы должны действительно Evil посмотреть так как это действительно дает вам в основном полную силу текстового манипулирования vi внутри Emacs. Лучшее из обоих миров - Emacs - потрясающая расширяемость с мощными текстовыми манипуляциями.
Ответ 8
ОК, это, наверное, не супер секрет, но я использую его постоянно.
Своя встречающая команда
< Показать все строки в текущем буфере, содержащие соответствие для REGular EXPression >
Например, это очень полезно для отображения всех строк, в которых используется конкретная переменная.
M-x появляется <Enter> < type в вашей целевой цели поиска > затем <Enter>
Это откроет новый буфер, показывающий согласованные строки.
Вы можете перемещать курсор в каждом случае с помощью команды:
следующий ошибка
Для меня это совсем не удобно, если вы не переустанавливаете ключи для запуска команд.
Итак, я сопоставляю control-o с командой execute и control-n с командой следующей ошибки.
Чтобы сделать это (или ваш собственный ключ (ы))
поместите это в свой файл .emacs:
(глобальный набор-ключ "\ C-o" ')
(глобальная-set-key "\ C-n" 'следующая ошибка)