Giter Club home page Giter Club logo

crux's Introduction

License GPL 3 MELPA MELPA Stable

crux

A Collection of Ridiculously Useful eXtensions for Emacs. crux bundles many useful interactive commands to enhance your overall Emacs experience.

Most of the crux commands are related to the editing experience, but there are also a bunch of utility commands that are just very useful to have (e.g. crux-open-with and crux-reopen-as-root).

Origins of crux

Many of the functions in crux started life as blog posts on Emacs Redux, then were included in Emacs Prelude, before finally being extracted to crux. You can see a full list of blog posts on functions in crux on the tags page.

Installation

Available on all major package.el community maintained repos - MELPA Stable and MELPA repos.

MELPA Stable is recommended as it has the latest stable version. MELPA has a development snapshot for users who don't mind breakage but don't want to run from a git checkout.

You can install crux using the following command:

M-x package-install [RET] crux [RET]

If the installation doesn't work try refreshing the package list:

M-x package-refresh-contents

Alternatively, you can add the following code to your Emacs config:

(unless (package-installed-p 'crux)
  (package-refresh-contents)
  (package-install 'crux))

Keybindings

crux doesn't setup any keybindings for its commands out-of-the-box. There are several reasons for this:

  • Most users probably won't need all the commands, so it'd be an overkill to define a minor mode consuming a lot of valuable keybindings
  • Many of the optimal keybindings are in the user space anyways (e.g. C-c some-letter)
  • Everyone has their own preferences when it comes to keybindings

Here's the list of some suggested keybindings. Feel free to bind individual commands to whatever keybindings you prefer.

Command Suggested Keybinding(s) Description
crux-open-with C-c o Open the currently visited file with an external program.
crux-smart-kill-line C-k or Super-k First kill to end of line, then kill the whole line.
crux-smart-open-line-above C-S-RET or Super-o Insert an empty line above the current line and indent it properly.
crux-smart-open-line S-RET or M-o Insert an empty line and indent it properly (as in most IDEs).
crux-cleanup-buffer-or-region C-c n Fix indentation in buffer and strip whitespace.
crux-recentf-find-file C-c f or Super-r Open recently visited file.
crux-recentf-find-directory C-c F Open recently visited directory.
crux-view-url C-c u Open a new buffer containing the contents of URL.
crux-eval-and-replace C-c e Eval a bit of Emacs Lisp code and replace it with its result.
crux-transpose-windows C-x 4 t Transpose the buffers between two windows.
crux-delete-file-and-buffer C-c D Delete current file and buffer.
crux-copy-file-preserve-attributes C-c c Copy current file with file attributes preserved
crux-duplicate-current-line-or-region C-c d Duplicate the current line (or region).
crux-duplicate-and-comment-current-line-or-region C-c M-d Duplicate and comment the current line (or region).
crux-rename-file-and-buffer C-c r Rename the current buffer and its visiting file if any.
crux-visit-term-buffer C-c t Open a terminal emulator (ansi-term).
crux-kill-other-buffers C-c k Kill all open buffers except the one you're currently in.
crux-indent-defun C-M z Indent the definition at point.
crux-indent-rigidly-and-copy-to-clipboard C-c TAB Indent and copy region to clipboard
crux-find-user-init-file C-c I Open user's init file.
crux-find-user-custom-file C-c , Open user's custom file.
crux-find-shell-init-file C-c S Open shell's init file.
crux-top-join-line Super-j or C-^ Join lines
crux-kill-whole-line Super-k Kill whole line
crux-kill-line-backwards C-Backspace Kill line backwards
crux-kill-and-join-forward C-S-Backspace or C-k If at end of line, join with following; otherwise kill line.
crux-kill-buffer-truename C-c P Kill absolute path of file visited in current buffer.
crux-ispell-word-then-abbrev C-c i Fix word using ispell and then save to abbrev.
crux-upcase-region C-x C-u upcase-region when transient-mark-mode is on and region is active.
crux-downcase-region C-x C-l downcase-region when transient-mark-mode is on and region is active.
crux-capitalize-region C-x M-c capitalize-region when transient-mark-mode is on and region is active.
crux-other-window-or-switch-buffer M-o Select other window, or switch to most recent buffer if only one windows.

Here's how you'd bind some of the commands to keycombos:

(global-set-key [remap move-beginning-of-line] #'crux-move-beginning-of-line)
(global-set-key (kbd "C-c o") #'crux-open-with)
(global-set-key [(shift return)] #'crux-smart-open-line)
(global-set-key (kbd "s-r") #'crux-recentf-find-file)
(global-set-key (kbd "C-<backspace>") #'crux-kill-line-backwards)
(global-set-key [remap kill-whole-line] #'crux-kill-whole-line)

For crux-ispell-word-then-abbrev to be most effective you'll also need to add this to your config:

(setq save-abbrevs 'silently)
(setq-default abbrev-mode t)

Using the bundled advices

crux ships with some handy advises that can enhance the operation of existing commands.

(crux-with-region-or-buffer)

You can use crux-with-region-or-buffer to make a command acting normally on a region to operate on the entire buffer in the absence of a region. Here are a few examples you can stuff in your config:

(crux-with-region-or-buffer indent-region)
(crux-with-region-or-buffer untabify)

(crux-with-region-or-line)

Likewise, you can use crux-with-region-or-line to make a command alternately act on the current line if the mark is not active:

(crux-with-region-or-line comment-or-uncomment-region)

(crux-with-region-or-sexp-or-line)

Similarly, crux-with-region-or-sexp-or-line makes a command that acts on the active region, or else the current list (or string), or finally the current line:

(crux-with-region-or-sexp-or-line kill-region)

(crux-with-region-or-point-to-eol)

Sometimes you might want to act on the point until the end of the current line, rather than the whole line, in the absence of a region:

(crux-with-region-or-point-to-eol kill-ring-save)

Minor modes

(crux-reopen-as-root-mode)

Crux provides a crux-reopen-as-root command for reopening a file as root. This global minor mode changes find-file so all root files are automatically opened as root.

License

Copyright © 2015-2024 Bozhidar Batsov and contributors.

Distributed under the GNU General Public License; type C-h C-c to view it.

crux's People

Contributors

bbatsov avatar chasinglogic avatar danielcompton avatar deejayem avatar dgtized avatar dieggsy avatar fredericgiquel avatar jiegec avatar justbur avatar laampui avatar leungbk avatar meliache avatar mnewt avatar mpolden avatar mssola avatar oneness avatar p1llule avatar purcell avatar riccardomurri avatar rossabaker avatar silex avatar skuro avatar syohex avatar thdox avatar verdammelt avatar waymondo avatar wilfred avatar wscisme avatar wyuenho avatar yevgnen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

crux's Issues

Port to new advice mechanism

According to Porting Old Advice, advice such as crux-with-region-or-line may need to be updated.

  1. Here is a proposed new advice syntax.

    ;; This is the advising function
    (defun me--ad-with-region-or-line (&rest r)
    "Operate on line or region."
    (if (use-region-p)
        (list (region-beginning) (region-end))
      (list (line-beginning-position) (line-end-position))))

    Either (personally prefer this style)

    (defmacro crux-with-region-or-line (func)
    "When called with no active region, call FUNC on current line."
    `(advice-add ,func :filter-args #'me--ad-with-region-or-line))
    
    (crux-with-region-or-line #'comment-or-uncomment-region)

    Or

    (defmacro crux-with-region-or-line (func)
    "When called with no active region, call FUNC on current line."
    (advice-add func :filter-args #'me--ad-with-region-or-line))
    
    (crux-with-region-or-line comment-or-uncomment-region)
  2. On top of that, since crux-with-region-or-line adds advice, i.e., changes the behaviour of the function, it might be convenient to provide an option to remove the advice.

    (defmacro crux-with-region-or-line (func &optional remove)
    "If not REMOVE, add advice to FUNC, i.e., when called with no
    active region, call FUNC on current line.  Otherwise remove
    advice."
    (if remove
        `(advice-remove ,func #'me--ad-with-region-or-line)
      `(advice-add ,func :filter-args #'me--ad-with-region-or-line)))

    So (crux-with-region-or-line #'comment-or-uncomment-region) adds advice to this function while (crux-with-region-or-line #'comment-or-uncomment-region t) removes the advice.

crux-kill-other-buffers and special buffers

Excellent and useful package.

Quick question: It does not seem that crux-kill-other-buffers kills special buffers and those starting with space or *. Could you confirm this? I was looking for something that closes those buffers too. Thanks!

including dired in crux-kill-other-buffers

Hi,

I think it is good idea to consider dired buffers in crux-kill-other-buffers function:
Something like this:

(defun kill-dired-buffers ()
     (interactive)
     (mapc (lambda (buffer) 
           (when (eq 'dired-mode (buffer-local-value 'major-mode buffer)) 
             (kill-buffer buffer))) 
         (buffer-list)))

Thanks
Levis

crux-smart-open-line-above: unexpected behavior with orgmode links

Expected behavior

[[link1.org][name1]]
[[link2.org][name2]]

Actual behavior

[[link1.org][
name1]]
[[link2.org][name2]]

Steps to reproduce the problem

  1. Create .org file with two lines:

[[link1.org][name1]]
[[link2.org][name2]]

  1. Set point in the end of the first line (edit: in fact at any point of the first line) and call crux-smart-open-line-above

Environment & Version information

Emacs version

GNU Emacs 28.2 (build 2, x86_64-w64-mingw32)

crux version

20221121 859

Operating system

Windows 11

Emacs shift-selection with crux-move-beginning-of-line

Hey, hope things are well and thanks for this cool collection!

I'm trying to bind crux-move-beginning-of-line to a key, but it doesn't respect shift-selection. Is this expected?

I've tried the following:

(global-set-key (kbd "s-;")  'crux-move-beginning-of-line)
(global-set-key (kbd "s-;") (lambda () (interactive "^") (crux-move-beginning-of-line 1)))

Incorporate transpose-windows

https://www.emacswiki.org/emacs/TransposeWindows

crux has swap-windows, which is for two windows only, and appears to require some special tricks around window-start and the like.

I've had it in my .config for years, and it's quite useful (particularly on larger displays), but otherwise only seems to be directly referenced in the emacs wiki. I'm happy to make a PR to pull it in, but wanted to check if anyone had ideas on how to handle attribution correctly. This package seems an appropriate place to bring it in, but it's definitely one of those snippets that's tricky to determine who wrote it originally, so not sure if that is a concern.

[Feature Request] Add mark-lines' like feature.

https://www.emacswiki.org/emacs/mark-lines.el

I don't know how you use what command to complete the same edit operation, please point out if you think this is not so necessary.

Following is my usage, i write a function, named mark-next-line, which use mark-lines-next-line which defined in mark-lines.el

(defun mark-next-line ()
  "Mark next line continuously."
  (interactive)
  (if (use-region-p)
      (next-line nil)
    (if (eql (point-max) (line-end-position))
        (mark-lines-next-line nil)
      (mark-lines-previous-line nil)
      )))

(global-set-key [(meta k)] 'mark-next-line)

Now i can pressing Alt+K several times, to mark several lines like following screenshot.

image

Then i can do operation, like save-to-ring, delete etc..

Thank you.

Move to line begin is broken.

When this config:

(global-visual-line-mode +1) 
(use-package crux
   :bind (("C-a" . crux-move-beginning-of-line)
          ("M-'" . crux-duplicate-and-comment-current-line-or-region)
          ("C-c R" . crux-rename-file-and-buffer)
          ("C-k" . crux-kill-and-join-forward)))

C-a does not go to the beginning of the line the cursor is on, but to just before the previous newline.

Toggle split direction

I want a command that toggles split direction of windows. If there are two windows with horizontal split, one above, one below. Running the command will change the direction to be vertical so one will aligned to left, and the other to right. See below, can this be added?

(defun window-toggle-split-direction ()
  "Switch window split from horizontally to vertically, or vice versa.

i.e. change right window to bottom, or change bottom window to right."
  (interactive)
  (require 'windmove)
  (let ((done))
    (dolist (dirs '((right . down) (down . right)))
      (unless done
        (let* ((win (selected-window))
               (nextdir (car dirs))
               (neighbour-dir (cdr dirs))
               (next-win (windmove-find-other-window nextdir win))
               (neighbour1 (windmove-find-other-window neighbour-dir win))
               (neighbour2 (if next-win (with-selected-window next-win
                                          (windmove-find-other-window neighbour-dir next-win)))))
          ;;(message "win: %s\nnext-win: %s\nneighbour1: %s\nneighbour2:%s" win next-win neighbour1 neighbour2)
          (setq done (and (eq neighbour1 neighbour2)
                          (not (eq (minibuffer-window) next-win))))
          (if done
              (let* ((other-buf (window-buffer next-win)))
                (delete-window next-win)
                (if (eq nextdir 'right)
                    (split-window-vertically)
                  (split-window-horizontally))
                (set-window-buffer (windmove-find-other-window neighbour-dir) other-buf))))))))

crux-start-or-switch-to

When trying to use crux-start-or-switch-to with slime-connect function there is problem that slime-connect names its buffer according to the type of common lisp implementation that it connected to, so the resulting buffer can be named "slime-repl sbcl", "slime-repl ccl" etc. I slightly changed the function, adding a helper get-buffer-extended function:

(defun get-buffer-extended (buffer-name &optional match)
"Finds a buffer by its name. If the optional parameter MATCH is then call the standard
GET-BUFFER, if MATCH is :PREFIX, then it looks for buffers with names starting with BUFFER-NAME
and returns the first one that matches. When MATCH is :REGEXP does the same but BUFFER-NAME
is a regular expression."
    (cond ((null match) (get-buffer buffer-name))
          ((eq match :regexp)
           (catch 'done
             (dolist (buffer (buffer-list))
               (let ((name (buffer-name buffer)))
                 (when (string-match buffer-name name)
                   (throw 'done buffer))))))
          ((eq match :prefix)
           (catch 'done
             (dolist (buffer (buffer-list))
               (let ((name (buffer-name buffer)))
                 (when (string-prefix-p buffer-name name)
                   (throw 'done buffer))))))))

  (defun start-or-switch-to (function buffer-name &optional match)
    "Modified crux-start-or-switch-to from https://github.com/bbatsov/crux/blob/master/crux.el
  Add MATCH parameter that can be :prefix to find any buffer that starts with BUFFER-NAME or
  :REGEXP to use regular expressions in the search string."
    (let ((buf (get-buffer-extended buffer-name match)))
      (if (not buf)
          (progn
            (split-window-sensibly (selected-window))
            (other-window 1)
            (funcall function))
        (switch-to-buffer-other-window buf))))

There probably are other cases like this, where the names of the buffers can vary, so maybe such generalization may be of use.

How to open files in full windows

Expected behavior

Opening a file from crux-find-shell-init-file opens it in a half window. I would like to see it open in a full window. I did not find customization to tweak this. Perhaps you could help?

Crux Version: 0.4.0
Emacs 28.2

crux-move-beginning-of-line in ansi-term

In prelude, crux-move-beginning-of-line is mapped to C-a, which is great when editing code.

However, in an ansi-term character mode, this mapping breaks the behaviour of a normal C-a. In that, when I press it, the cursor jumps to the beginning of the right before the beginning of the prompt. When I then enter text, the cursor jumps forward and the text is added to the end of the line instead.

This is strange, because I thought that the characters should not be parsed by Emacs in character mode.

Get "The mark is not set now, so there is no region" when the first time open a buffer after latest restart use emacs daemon.

Debugger entered--Lisp error: (error "The mark is not set now, so there is no region")
region-beginning()
byte-code("\10\203\11\0ed\10E\207\301 \302 \303E\207" [current-prefix-arg region-beginning region-end nil] 3)
call-interactively(untabify)
(if (member major-mode crux-untabify-sensitive-modes) nil (call-interactively #'untabify))
crux-cleanup-buffer-or-region()
funcall-interactively(crux-cleanup-buffer-or-region)
command-execute(crux-cleanup-buffer-or-region)

Expected behavior

crux-cleanup-buffer-or-region should clean/indent buffer instead raise The mark is not set now, so there is no region

Steps to reproduce the problem

  1. require crux
  2. binding crux-clean-buffer-or-region to a hotkey.
  3. restart emacs with emacs --daemon
  4. open a file buffer, invoke this binding key immediately
  5. get this error message.

Environment & Version information

github latest 6bfd212

crux version information

Include here the version string displayed by M-x crux-version. Here's an example:

crux version: 0.4

Emacs version

GNU Emacs 28.0.91 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.31, cairo version 1.17.4) of 2022-01-22

Operating system

Arch Linux.

crux-move-beginning-of-line yields search failed "^[[:space:]]*" in minibuffer

In ido minibuffer, crux-move-beginning-of-line yields Search failed "^[[:space:]]*" although the cursor does move to the beginning of my typing.

e.g.

I have this in minibuffer
image

Then I type C-a (crux-move-beginning-of-line)

image

But after the error message, the cursor does move:

image

Is there a way to remove that error message?

crux-smart-open-line-above uses incorrect indentation

Given the following Python, where | is point:

if foo:
    bar()

|baz()

M-x crux-smart-open-line-above produces:

if foo:
    bar()

    |
    baz()

I imagine a similar problem exists for all indentation-sensitive languages (coffeescript etc).

crux-rename-file-and-buffer cannot be called repeatedly

crux-rename-file-and-buffer calls vc-rename-file if the file is associated with a VC backend.

If I try to rename a git-backed file twice, the second time just errors with vc-rename-file: Please update files before moving them.

write-as or "clone file"

One thing I'm frequently fighting with in Emacs (because it allows me to do crazy things like that) is how to synchronize file copies sent through TRAMP and local copies.

As a concrete example, I was doing a small hotfix on a Python library today, in /usr/lib/python3/dist-pacakges/npm2deb/mapper.py. The git source is in ~/src/npm2deb/npm2deb/mapper.py so I naturally started writing there. But then to test my changes, instead of rebuilding and reinstalling the whole thing, I cheat and write directly to the system lib with TRAMP (/:sudo:/usr/lib/python3/dist-pacakges/npm2deb/mapper.py or whatever that magic sauce is). Then I can tweak things there ("we'll do it live!") but what often happens is I forget to sync the file back into ~/src.

If there was a quick way to write a copy of the file without changing the buffer association, this would be much easier and intuitive. This SO thread has a few implementations, for example:

(defun my-clone-and-open-file (filename)
  "Clone the current buffer writing it into FILENAME and open it"
  (interactive "FClone to file: ")
  (save-restriction
    (widen)
    (write-region (point-min) (point-max) filename nil nil nil 'confirm))
  (find-file filename))

I would personally prefer that approach of keeping the other buffer in the background:

(defun crux-clone-file (filename)
  "Clone the current buffer writing it into FILENAME and open it in another buffer"
  (interactive "FClone to file: ")
  (save-restriction
    (widen)
    (write-region (point-min) (point-max) filename nil nil nil 'confirm))
  (find-file-no-select filename))

Obviously, for my use case, this would need to be added in a after-save-hook.

Would that make sense? would this be accepted as a PR?

Thanks!

crux-rename-file-and-buffer: move file into a different directory, without changing the filename

Expected behavior

When I use crux-rename-file-and-buffer, and I select a target directory but don't enter a new filename, then I expect the file to be moved to the new directory with the same filename, and the emacs buffer should track the renamed file, i.e. editing and saving the buffer should update the file in the new location.

Actual behavior

The file is moved to the new directory, but the minibuffer show an error message "Empty file name" and the buffer does not track the new file location.

Steps to reproduce the problem

  • Create a dummy file and dummy subdirectory in the same directory.
  • Visit the file in a buffer
  • Execute crux-rename-file-and-buffer
  • Enter the subdirectory name (or pick it from completion options), but do not type any new file name portion
  • Press enter

Proposed change to support the desired behavior

In crux-rename-file-and-buffer, insert the following as the first line inside the when-let* block:

    (if (string= (file-name-nondirectory new-name) "")
        (setq new-name (concat containing-dir (file-name-nondirectory filename))))

Environment & Version information

crux version information

crux version: 0.4.0

Emacs version

30.0.50 on macOS 13.4

crux-open-with silently fails

I'm switching some of my own functions over to crux ones. I was wondering if you knew the answer to this problem I've had with opening files externally.

crux-open-with does nothing for me in dired on a pdf for example. If I switch the start-process line to

    (call-process program nil 0 nil current-file-name)

then it works fine, meaning something is failing in start-process. I did some debugging but wasn't able to find anything. It just seems to silently fail.

My version string is
GNU Emacs 25.1.1 (x86_64-redhat-linux-gnu, GTK+ Version 3.22.4) of 2016-12-15

If you have any ideas, I'd appreciate it. xdg-open works fine from the command line and using call-process as above.

By the way, I don't think there is any downside to using call-process here, but I'd like to know why start-process is failing for me.

Perhaps tag a release?

There haven't been any changes in a few weeks, perhaps it's time to tag a new release?

[Feature request] Find `.dir-locals.el` file

Idea similar to crux-find-user-init-file, crux-find-shell-init-file, and crux-find-user-custom-file. Finding the .dir-locals.el file from current working directory is very useful.

`crux-duplicate<-and-comment>-current-line-or-region` using regions blends lines

Expected behavior

Given a region containing the following lines,

(message "the crux of the matter")
(message "hello from the magic tavern")

crux-duplicate-current-line-or-region yields:

(message "the crux of the matter")
(message "hello from the magic tavern")
(message "the crux of the matter")
(message "hello from the magic tavern")

Using crux-duplicate-and-comment-current-line-or-region yields:

;; (message "the crux of the matter")
;; (message "hello from the magic tavern")
(message "the crux of the matter")
(message "hello from the magic tavern")

Actual behavior

Using crux-duplicate-current-line-or-region I get:

(message "the crux of the matter")
(message "hello from the magic tavern")(message "the crux of the matter")
(message "hello from the magic tavern")

Using crux-duplicate-and-comment-current-line-or-region I get:

;; (message "the crux of the matter")
;; (message "hello from the magic tavern")(message "the crux of the matter")
(message "hello from the magic tavern")

Steps to reproduce the problem

Call the mentioned commands with active region.

Commenting out these line makes the commands work as before:

(unless (use-region-p)
        (newline))

Not sure if that is now the desired behavior but it confuses me.

Environment & Version information

crux version information

I can't find any crux-version command, but from the package:

;; Package-Version: 20210811.436
;; Package-Commit: 6bfd212a7f7ae32e455802fde1f9e3f4fba932a0
;; Version: 0.4.0

Emacs version

28.0.50

Operating system

gnu/linux (Ubuntu 21.04)

crux-reopen-as-root interactive?

For users who don't want to use crux-reopen-as-root-mode, perhaps an interactive invocation of crux-reopen-as-root would be helpful, so it could be called easily on-demand, rather than prompting on find-file.
Something as simple as (defun my/crux-reopen-as-root () "Reopen file as root." (interactive) (crux-reopen-as-root)) has been working for me.
Thanks for the great collection!

crux-smart-kill-line ignores visual-line-mode

Thanks for a wonderful package.

When I run crux-smart-kill-line with the point at the end of the line, it kills the entire line.

With visual-line-mode activated and (setq crux-move-visually t) I would expect it to kill just the visual line.

crux-move-beginning-of-line works as expected, moving to the beginning of the visual line.

Using the following environment:
crux-20231013.520
Gnu emacs 29.1
Windows 10

Crux fails wiith "crux-open-with: Wrong type argument: stringp, nil"

As the title says, crux-open-with doesn't work.

I have installed it via use-package.

This is the debug message:

Debugger entered--Lisp error: (wrong-type-argument stringp nil)
call-process("xdg-open" nil 0 nil nil)
crux-open-with(nil)
funcall-interactively(crux-open-with nil)
call-interactively(crux-open-with nil nil)
command-execute(crux-open-with)

Cut New Release?

Unless I'm missing something, the releases on Melpa and melpa-stable are five years out of date. Is there any chance you can cut a new release?

tagged release

README says MELPA Stable is recommended, but we'll need a stable release first 😁

Refine the keybinding advice in README.md.

crux-smart-open-line S-RET or M-o Insert an empty line and indent it properly (as in most IDEs).

i thought smart-open-line will binding to C-RET in most of IDEs, anyone else can prove this?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.