Подтвердить что ты не робот

Расширенные функции редактирования 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 против любой войны, я прошу вас.

4b9b3361

Ответ 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" 'следующая ошибка)