I'm trying to get rid of Oh-my-zsh and currently my biggest challenge is getting incremental history search working. I've acked and grepped my way through the code and there's no clues in site. I get this error :
No such widget 'histrory-beginning-search-backward'
EDIT:
I've tried this with the absolute least possible code, it still doesn't work. here's the reduced test case:
# key bindings
bindkey -v
function zle-line-init zle-keymap-select {
RPS1="${${KEYMAP/vicmd/NORMAL}/(main|viins)/INSERT}"
RPS2=$RPS1
zle reset-prompt
}
zle -N zle-line-init
zle -N zle-keymap-select
bindkey -M vicmd '^R' histrory-beginning-search-backward
bindkey -M viins '^R' histrory-beginning-search-backward
Here's my config, taken from the zsh config wizzard, my current zshrc and oh-my-zsh:
autoload zkbd
# The following lines were added by compinstall
zstyle ':completion:*' completer _expand _complete _ignored _correct _approximate
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'zstyle ':completion:*' verbose true
zstyle :compinstall filename '/home/jonathan/.zshrc'
zstyle ':completion:*' list-colors ''
zstyle ':completion::complete:*' use-cache 1
zstyle ':completion::complete:*' cache-path $HOME/.cache/zsh
#load colorstuff
autoload -Uz compinit
autoload -U colors && colors
compinit
# End of lines added by compinstall
# Lines configured by zsh-newuser-install
HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
setopt extendedglob
unsetopt beep nomatch notify
# End of lines configured by zsh-newuser-install
setopt completealiases
# Ignore boring stuff
zstyle ':completion:*:*:*:users' ignored-patterns \
adm amanda apache at avahi avahi-autoipd beaglidx bin cacti canna \
clamav daemon dbus distcache dnsmasq dovecot fax ftp games gdm \
gkrellmd gopher hacluster haldaemon halt hsqldb ident junkbust kdm \
ldap lp mail mailman mailnull man messagebus mldonkey mysql nagios \
named netdump news nfsnobody nobody nscd ntp nut nx obsrun openvpn \
operator pcap polkitd postfix postgres privoxy pulse pvm quagga radvd \
rpc rpcuser rpm rtkit scard shutdown squid sshd statd svn sync tftp \
usbmux uucp vcsa wwwrun xfs '_*'
zstyle ':completion:*:functions' ignored-patterns '_*'
# Completion dots
expand-or-complete-with-dots() {
echo -n "\e[31m......\e[0m"
zle expand-or-complete
zle redisplay
}
zle -N expand-or-complete-with-dots
bindkey "^I" expand-or-complete-with-dots
# Prompt stuff *truncated*
# key bindings
bindkey -v
function zle-line-init zle-keymap-select {
RPS1="${${KEYMAP/vicmd/NORMAL}/(main|viins)/INSERT}"
RPS2=$RPS1
zle reset-prompt
}
zle -N zle-line-init
zle -N zle-keymap-select
bindkey -M vicmd '^R' histrory-beginning-search-backward
bindkey -M viins '^R' histrory-beginning-search-backward
function run-again {
zle up-history
zle accept-line
}
zle -N run-again
bindkey -M viins '^W' run-again
bindkey -M vicmd '^W' run-again
bindkey -M viins ' ' magic-space # [Space] - do history expansion
bindkey '^[[1;5C' forward-word # [Ctrl-RightArrow] - move forward one word
bindkey '^[[1;5D' backward-word # [Ctrl-LeftArrow] - move backward one word
if [[ "${terminfo[kcbt]}" != "" ]]; then
bindkey -M viins "${terminfo[kcbt]}" reverse-menu-complete # [Shift-Tab] - move through the completion menu backwards
fi
dirstackfile="$HOME/.cache/zsh/dirs"
if [[ -f dirstackfile ]] && [[ $#dirstack -eq 0 ]]; then
dirstack=( ${(f)"$(< $dirstackfile)"} )
[[ -d $dirstack[1] ]] && builtin cd $dirstack[1]
fi
chpwd() {
print -l $PWD ${(u)dirstack} > $dirstackfile
}
dirstacksize=20
setopt autopushd pushdsilent pushdtohome
# remove duplicate entries
setopt pushdignoredups
#revert plus and minus operators.
setopt pushdminus
#PATH info truncated
What am I doing wrong?
Whoops... I had a typo, now I feel dumb. I had it as histrory, when it should be history..
Related
I am using neovim and tmux (with tmuxinator) with the ultimate goal of getting https://github.com/christoomey/vim-tmux-navigator setup on my M1 Macbook with iTerm2 or Warp (https://www.warp.dev/)
I have mapped my left option key to be my meta key in my terminal. I would like to use <M-h/j/k/l> in order to navigate between neovim splits and tmux panes. Mapping my left option key to meta and using it with h/j/k/l works as expected in neovim (including neovim in tmux - i.e. i can navigate neovim splits and go from neovim to a tmux terminal pane). However, in a tmux terminal pane it either does nothing in iTerm2 or brings up alternate text (˙∆˚¬ for hjkl to be specific) in Warp.
Below are my configurations which were from https://github.com/christoomey/vim-tmux-navigator and i just updated them to use meta instead of ctrl:
init.vim
let g:tmux_navigator_no_mappings = 1
nnoremap <silent> <M-h> :TmuxNavigateLeft<cr>
nnoremap <silent> <M-j> :TmuxNavigateDown<cr>
nnoremap <silent> <M-k> :TmuxNavigateUp<cr>
nnoremap <silent> <M-l> :TmuxNavigateRight<cr>
nnoremap <silent> <M-\> :TmuxNavigatePrevious<cr>
.tmux.conf
unbind M-h
unbind M-j
unbind M-k
unbind M-l
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
bind-key -n 'M-h' if-shell "$is_vim" 'send-keys M-h' 'select-pane -L'
bind-key -n 'M-j' if-shell "$is_vim" 'send-keys M-j' 'select-pane -D'
bind-key -n 'M-k' if-shell "$is_vim" 'send-keys M-k' 'select-pane -U'
bind-key -n 'M-l' if-shell "$is_vim" 'send-keys M-l' 'select-pane -R'
tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")'
if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \
"bind-key -n 'M-\\' if-shell \"$is_vim\" 'send-keys M-\\' 'select-pane -l'"
if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \
"bind-key -n 'M-\\' if-shell \"$is_vim\" 'send-keys M-\\\\' 'select-pane -l'"
bind-key -T copy-mode-vi 'M-h' select-pane -L
bind-key -T copy-mode-vi 'M-j' select-pane -D
bind-key -T copy-mode-vi 'M-k' select-pane -U
bind-key -T copy-mode-vi 'M-l' select-pane -R
bind-key -T copy-mode-vi 'M-\' select-pane -l
How can i get this to work? I would be happy to get it working on either terminal.
I reckon there's already a widget for the g~ action in zle. So g~iw will invert the case of a word.
I read the zshzle manual and did not find a widget that would give me the behaviour of gU (capitalize action) in vim.
for example: for the word "path_variable", with the cursor on the v, gUiW would change the world to "PATH_VARIABLE", and so on and so forth.
the widget capitalize-word does not seem to be the answer. I've tested it.
I also found that the key U in visual mode does not capitalize the visually selected text/region. I did not find a widget in the manual that would give me the desired behaviour either.
Is this a matter of writing a custom widget, or would one have to submit a patch upstream with c code changes? How can I bind gU in normal and U in visual mode to achieve the desired behaviour in zle vi-mode?
ZSH 5.3 will have pre built widgets for that. But if you can't wait, here it is:
# credits go to Oliver Kiddle <opk#zsh.org>,
# who personally shared these upper/lower widgets.
# I just corrected a small bug.
vi-lowercase() {
local save_cut="$CUTBUFFER"
local save_cur="$CURSOR"
zle .vi-change || return
zle .vi-cmd-mode
CUTBUFFER="${CUTBUFFER:l}"
if [[ $CURSOR = '0' ]]; then
zle .vi-put-before -n 1
else
zle .vi-put-after -n 1
fi
CUTBUFFER="$save_cut"
CURSOR="$save_cur"
}
vi-uppercase() {
local save_cut="$CUTBUFFER"
local save_cur="$CURSOR"
zle .vi-change || return
zle .vi-cmd-mode
CUTBUFFER="${CUTBUFFER:u}"
if [[ $CURSOR = '0' ]]; then
zle .vi-put-before -n 1
else
zle .vi-put-after -n 1
fi
CUTBUFFER="$save_cut"
CURSOR="$save_cur"
}
# can safely disable this after commit zsh commit #a73ae70 (zsh-5.2-301- ga73ae70)
zle -N vi-lowercase
zle -N vi-uppercase
bindkey -a 'gU' vi-uppercase
bindkey -a 'gu' vi-lowercase
bindkey -M visual 'u' vi-lowercase
bindkey -M visual 'U' vi-uppercase
I run zsh in VI mode with a two-line prompt. Whenever I clear the line using 'cc' a line above my prompt is deleted. E.g. if I start with
magnus#tatooine 2502 ~
[I] %
magnus#tatooine 2502 ~
[I] %
Then I press escape and 'cc' I get
magnus#tatooine 2502 ~
magnus#tatooine 2502 ~
[I] %
It's very repeatable; I can clear the terminal by repeating the sequence multiple times. What do I need to do to get ZSH to clear the line without deleting the line above it?
My prompt is created using the following
zstyle ':vcs_info:*' enable git hg svn
zstyle ':vcs_info:(git*|hg*)' get-revision true
zstyle ':vcs_info:(git*|hg*)' check-for-changes true
zstyle ':vcs_info:git*' formats "(%s: %12.12i %c%u %b)" # hash changes branch
zstyle ':vcs_info:git*' actionformats "(%s(%F{yellow}%a%f): %12.12i %c%u %b)"
zstyle ':vcs_info:hg*:*' branchformat "%b" # only show branch
zstyle ':vcs_info:(hg*|git*):*' stagedstr "%F{green}S%f"
zstyle ':vcs_info:(hg*|git*):*' unstagedstr "%F{red}U%f"
zstyle ':vcs_info:git*+set-message:*' hooks git-st git-stash git-untracked
# improve the ZSH prompt in vi mode
function zle-line-init zle-keymap-select {
case ${KEYMAP} in
(main) prompt_vi_mode="%F{yellow}[I]%f"
;;
(vicmd) prompt_vi_mode="%F{red}[N]%f"
;;
esac
prompt_line1="%F{green}%n#%m%f %F{red}%h%f ${vcs_info_msg_0_} %F{blue}%~%f"
prompt_line2="${prompt_vi_mode} %B%#%b "
PS1="${prompt_line1}${prompt_newline}${prompt_line2}"
zle reset-prompt
}
zle -N zle-line-init
zle -N zle-keymap-select
I want to bind 'dd' in the zsh's vicmd into something like 'ddi', If i use:
bindkey -M vicmd -s dd 'ddi'
It will give me this output:
zsh: string inserting another one too many times
I found the answer already
function delete_then_insert(){
zle kill-whole-line
zle vi-insert
}
zle -N delete_then_insert
bindkey -M vicmd dd delete_then_insert
Is it possible to configure zsh to expand global aliases during tab completion? For example, I have the common aliases:
alias -g '...'='../..'
alias -g '....'='../../..'
but when I type, for example, cd .../some<tab> it won't expand to cd .../something or cd ../../something. Consequently, I frequently won't use these handy aliases because they are incompatible with tab completion.
I'm a user of Mikael Magnusson's rationalise-dot. From my zshrc:
# This was written entirely by Mikael Magnusson (Mikachu)
# Basically type '...' to get '../..' with successive .'s adding /..
function rationalise-dot {
local MATCH # keep the regex match from leaking to the environment
if [[ $LBUFFER =~ '(^|/| | |'$'\n''|\||;|&)\.\.$' ]]; then
LBUFFER+=/
zle self-insert
zle self-insert
else
zle self-insert
fi
}
zle -N rationalise-dot
bindkey . rationalise-dot
# without this, typing a . aborts incremental history search
bindkey -M isearch . self-insert
Try looking up zsh abbreviations. They allow you to enter an "abbreviation" which automatically gets replaced with its full form when you hit a magic key such as space. So you can create one which changes ...<SPACE> to ../...
For example, this is what you need in your profile:
typeset -A abbrevs
abbrevs=(
"..." "../.."
"...." "../../.."
)
#create aliases for the abbrevs too
for abbr in ${(k)abbrevs}; do
alias -g $abbr="${abbrevs[$abbr]}"
done
my-expand-abbrev() {
local MATCH
LBUFFER=${LBUFFER%%(#m)[_a-zA-Z0-9]#}
LBUFFER+=${abbrevs[$MATCH]:-$MATCH}
zle self-insert
}
bindkey " " my-expand-abbrev